-
Tomáš Valenta authoredTomáš Valenta authored
models.py 4.36 KiB
from datetime import timedelta
from django.contrib.auth.models import Group
from django.core.exceptions import ValidationError
from django.db import models
from django.utils import timezone
from markdownx.models import MarkdownxField
from shared.models import NameStrMixin
# Create your models here.
class LectureGroup(NameStrMixin, models.Model):
name = models.CharField(
max_length=128,
verbose_name="Jméno",
)
description = MarkdownxField(
null=True,
blank=True,
verbose_name="Popis",
help_text="Můžeš použít Markdown.",
)
user_groups = models.ManyToManyField(
Group,
blank=True,
verbose_name="Uživatelské skupiny",
help_text="Pokud nedefinuješ žádné, lekce ve skupině jsou dostupné všem.",
)
class Meta:
verbose_name = "Výuková skupina"
verbose_name_plural = "Výukové skupiny"
ordering = ("name",)
class Lecture(NameStrMixin, models.Model):
is_current_treshold = timedelta(hours=8)
timestamp = models.DateTimeField(
verbose_name="Datum a čas konání",
blank=True,
null=True,
) # If undefined, assume this event was in the past
class TypeChoices(models.TextChoices):
RECOMMENDED = "recommended", "Doporučené"
OPTIONAL = "optional", "Volitelné"
groups = models.ManyToManyField(
LectureGroup,
blank=True,
related_name="lectures",
verbose_name="Výukové skupiny",
)
type = models.CharField(
choices=TypeChoices.choices,
max_length=11,
verbose_name="Typ",
)
name = models.CharField(
max_length=128,
verbose_name="Název",
)
description = MarkdownxField(
blank=True,
null=True,
verbose_name="Popis",
help_text="Můžeš použít Markdown.",
)
@property
def is_current(self) -> bool:
# On or after the current time, minus 8 hours
return self.timestamp >= (timezone.now() - self.is_current_treshold)
class Meta:
verbose_name = "Lekce"
verbose_name_plural = verbose_name
ordering = ("-timestamp", "-name")
class LectureLector(NameStrMixin, models.Model):
lecture = models.ForeignKey(
"Lecture",
on_delete=models.CASCADE,
related_name="lectors",
verbose_name="Lekce",
)
name = models.CharField(
max_length=128,
verbose_name="Jméno",
)
link = models.URLField(
max_length=256,
blank=True,
null=True,
verbose_name="Odkaz",
)
class Meta:
verbose_name = "Lektor"
verbose_name_plural = "Lektoři"
class LectureRecording(NameStrMixin, models.Model):
lecture = models.ForeignKey(
"Lecture",
on_delete=models.CASCADE,
related_name="recordings",
verbose_name="Lekce",
)
name = models.CharField(
max_length=128,
verbose_name="Název",
)
link = models.URLField(
max_length=256,
blank=True,
null=True,
verbose_name="Odkaz",
)
class Meta:
verbose_name = "Nahrávka"
verbose_name_plural = "Nahrávky"
class LectureMaterial(NameStrMixin, models.Model):
lecture = models.ForeignKey(
"Lecture",
on_delete=models.CASCADE,
related_name="materials",
verbose_name="Lekce",
)
name = models.CharField(
max_length=128,
verbose_name="Název",
)
link = models.URLField(
max_length=256,
blank=True,
null=True,
verbose_name="Odkaz",
help_text="Pokud máš zadaný odkaz, nemůžeš definovat soubor.",
)
file = models.FileField(
blank=True,
null=True,
verbose_name="Soubor",
help_text="Pokud máš vložený soubor, nemůžeš definovat odkaz.",
)
def clean(self) -> None:
BOTH_FILE_AND_LINK_DEFINED_ERROR = (
"Definuj prosím pouze odkaz, nebo soubor. Nemůžeš mít oboje najednou."
)
if self.file and self.link:
raise ValidationError(
{
"link": BOTH_FILE_AND_LINK_DEFINED_ERROR,
"file": BOTH_FILE_AND_LINK_DEFINED_ERROR,
}
)
class Meta:
verbose_name = "Materiál"
verbose_name_plural = "Materiály"