Skip to content
Snippets Groups Projects
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"