from django.db import models from soustredeni.models import Soustredeni from personalni.models import Organizator, Osoba class Seznam(models.Model): """ Spojuje :py:class:`Přednášky ` se :py:class:`Soustředěními `, kde by mohly zaznít, nebo zazní/zazněly. """ class Meta: db_table = "prednasky_seznam" verbose_name = "Seznam přednášek" verbose_name_plural = "Seznamy přednášek" ordering = ["soustredeni", "stav"] class Stav(models.IntegerChoices): """ Stav seznamu přednášek (NAVRH se používá k hlasování viz :py:func:`daný view `). """ NAVRH = 1, "Návrh" BUDE = 2, "Bude" id = models.AutoField(primary_key=True) soustredeni = models.ForeignKey(Soustredeni, null=True, default=None, on_delete=models.PROTECT) stav = models.IntegerField("Stav", choices=Stav.choices, default=Stav.NAVRH) #: :py:class:`Stav ` Seznamu def __str__(self): return f"Seznam {'návrhů ' if self.stav == Seznam.Stav.NAVRH else ''}přednášek na {self.soustredeni}" class Prednaska(models.Model): """ Reprezentuje přednášku, kterou si org může vypsat a účastník o ní hlasovat. (Viz :py:class:`Hlasování `.) """ class Meta: db_table = "prednasky_prednaska" verbose_name = "Přednáška" verbose_name_plural = "Přednášky" ordering = ["org", "nazev"] class Obtiznost(models.IntegerChoices): LEHKA = 1, "Lehká" STREDNI = 2, "Střední" TEZKA = 3, "Těžká" id = models.AutoField(primary_key=True) nazev = models.CharField("Název", max_length=300) org = models.ForeignKey(Organizator, on_delete=models.PROTECT) popis = models.TextField("Popis pro orgy", null=True, blank=True, help_text="Neveřejný popis pro ostatní orgy") anotace = models.TextField("Anotace", null=True, blank=True, help_text="Veřejná anotace v hlasování") obtiznost = models.IntegerField("Obtížnost", choices=Obtiznost.choices) #: :py:class:`Obtížnost ` Přednášky obor = models.CharField("Obor", max_length=5, help_text="Podmnožina MFIOB") klicova = models.CharField("Klíčová slova", max_length=200, null=True, blank=True) seznamy = models.ManyToManyField(Seznam) def __str__(self): return f"{self.nazev} ({self.org})" class Hlasovani(models.Model): """ Reprezentuje hlasování jednoho účastníka o jedné :py:class:`Přednášce ` v jednom :py:class:`Seznamu ` (účastníkův pohled se totiž mezi sousy změnit) """ class Meta: db_table = "prednasky_hlasovani" verbose_name = "Hlasování" verbose_name_plural = "Hlasování" ordering = ["ucastnik", "prednaska"] class Body(models.IntegerChoices): """ Ohodnocení přednášky v daném Hlasování (větší číslo = víc chci) """ NECHCI = -1, "rozhodně nechci" JEDNO = 0, "je mi to jedno" CHCI = 1, "rozhodně chci" id = models.AutoField(primary_key=True) prednaska = models.ForeignKey(Prednaska, on_delete=models.CASCADE) #: Příslušné hlasování: :py:class:`Body ` body = models.IntegerField("Body", default=Body.JEDNO, choices=Body.choices) #: Účastník, který hlasoval. Pouze string: #: *(přechod z jména na objekt Osoby nějak kape na tom, #: že všechna předchozí hlasování zde mají náhodný string…) #: TODO Změnit to na Osobu* ucastnik = models.CharField("Účastník", max_length=100) seznam = models.ForeignKey(Seznam, null=True, on_delete=models.SET_NULL) def __str__(self): return f"{self.ucastnik} dal {self.body} bodů {self.prednaska} v seznamu {self.seznam}" class Znalost(models.Model): """ Reprezentuje znalost, na kterou se můžeme účastníka ptát (nechat je hlasovat). (Viz :py:class:`HlasováníOZnalostech `.) """ class Meta: db_table = "prednasky_znalost" verbose_name = "Znalost k přednáškám" verbose_name_plural = "Znalosti k přednáškám" nazev = models.CharField("Nadpis", max_length=200, blank=False, null=False, help_text="Např. Neuronové sítě") text = models.TextField("Detailní popis", blank=True, null=True, help_text="Např. Perceptron, vrstevnatá síť, forward a backward propagation") seznamy = models.ManyToManyField(Seznam) def __str__(self): return self.nazev class HlasovaniOZnalostech(models.Model): """ Reprezentuje hlasování jednoho účastníka o jedné :py:class:`Znalosti ` v jednom :py:class:`Seznamu ` (účastníkův pohled se totiž mezi sousy změnit) """ class Odpoved(models.IntegerChoices): """ Na kolik danou znalost účastník ovládá v daném Hlasování (větší číslo = víc zná) """ UMIM = 1, "Tohle celkem umím" CIRCA = 0, "Už jsem o tom slyšel, ale neřekl bychm, že to úplně umím" NEUMIM = -1, "Tohle vůbec neznám" odpoved = models.IntegerField(u"odpověď", choices=Odpoved.choices, blank=False, null=False) #: :py:class:`Odpověď ` na HlasováníOZnalostech znalost = models.ForeignKey(Znalost, on_delete=models.CASCADE, blank=False, null=False) ucastnik = models.ForeignKey(Osoba, on_delete=models.CASCADE, blank=False, null=False) seznam = models.ForeignKey(Seznam, on_delete=models.SET_NULL, blank=True, null=True) def __str__(self): return f"{self.ucastnik} dal {self.znalost} bodů {self.znalost} v seznamu {self.seznam}"