97 lines
4.3 KiB
Python
97 lines
4.3 KiB
Python
from django.db import models
|
|
from django.utils import timezone
|
|
|
|
from personalni.models import Resitel
|
|
|
|
class Sifrovacka(models.Model):
|
|
class Meta:
|
|
verbose_name = 'Šifrovačka'
|
|
verbose_name_plural = 'Šifrovačky'
|
|
ordering = ['aktivni', 'jmeno']
|
|
|
|
jmeno = models.CharField("Jméno seznamu", max_length=255, blank=False, null=False)
|
|
aktivni = models.BooleanField("Lze odevzdávat šifry z tohoto seznamu?", default=True, blank=False, null=False)
|
|
oznameni_spatne = models.TextField("Oznámení při špatné odpovědi", default="<h1>Bohužel vám hvězdy nebyly nakloněny. Rozumějte <i>máte to blbě</i>.</h1>", blank=False, null=False)
|
|
|
|
def __str__(self): return f"{'☢' if self.aktivni else '🗑'} {self.jmeno}"
|
|
|
|
class Sifra(models.Model):
|
|
"""
|
|
Reprezentuje jednu šifru, která:
|
|
- má :py:class:`Tajenku/y <sifrovacka.models.Tajenka>`
|
|
- má :py:class:`Nápovědu/y <sifrovacka.models.Napoveda>`
|
|
- může být v :py:class:`SeznamechŠifer <sifrovacka.models.SeznamSifer>`
|
|
- a lze ji řešit:
|
|
:py:class:`OdpověďÚčastníka <sifrovacka.models.OdpovedUcastnika>`
|
|
:py:class:`NapovezenoUcastnikovi <sifrovacka.models.OdpovedUcastnika>`
|
|
"""
|
|
class Meta:
|
|
verbose_name = 'Šifra'
|
|
verbose_name_plural = 'Šifry'
|
|
ordering = ['sifrovacka', 'cislo', 'nazev']
|
|
|
|
sifrovacka = models.ForeignKey(Sifrovacka, related_name="sifry", on_delete=models.CASCADE, blank=False, null=False)
|
|
cislo = models.IntegerField("Číslo šifry", blank=True, null=True)
|
|
nazev = models.CharField("Název šifry", max_length=255, blank=True, null=True)
|
|
preskocitelna = models.BooleanField(default=False, blank=False, null=False)
|
|
skryty_text = models.TextField("Text zobrazený při přeskočení (pokud prázdný, pak se zobrazují skryté texty všech tajenek k této šifře)", blank=True, null=True)
|
|
|
|
def __str__(self): return f"{self.cislo}. {self.nazev}"
|
|
|
|
def clean(self):
|
|
if self.cislo is None and self.nazev is None:
|
|
raise models.exceptions.ValidationError()
|
|
|
|
|
|
class Tajenka(models.Model):
|
|
class Meta:
|
|
verbose_name = 'Tajenka'
|
|
verbose_name_plural = 'Tajenky'
|
|
ordering = ['sifra']
|
|
|
|
sifra = models.ForeignKey(Sifra, related_name="tajenky", on_delete=models.CASCADE, blank=False, null=False)
|
|
tajenka = models.TextField("Tajenka bez diakritiky", blank=False, null=False)
|
|
skryty_text = models.TextField("Text zobrazený po zadání tajenky", blank=False, null=False)
|
|
|
|
def __str__(self): return f"{self.sifra}: {self.tajenka}"
|
|
|
|
|
|
class Napoveda(models.Model):
|
|
class Meta:
|
|
verbose_name = 'Nápověda'
|
|
verbose_name_plural = 'Nápovědy'
|
|
ordering = ["sifra", "uroven"]
|
|
|
|
sifra = models.ForeignKey(Sifra, related_name="napovedy", on_delete=models.CASCADE, blank=False, null=False)
|
|
text = models.TextField("Text nápovědy (zobrazený, když si účastník vezme nápovědu)", blank=False, null=False)
|
|
uroven = models.IntegerField("Úroveň jak moc (nebo který krok) nápověda napoví, nejvýše jedna nápověda dané úrovně k dané šifře!", default=1, blank=False, null=False)
|
|
|
|
def __str__(self): return f"{self.sifra} ({self.uroven}): {self.text}"
|
|
|
|
|
|
class OdpovedUcastnika(models.Model):
|
|
class Meta:
|
|
verbose_name = 'Odpověď účastníka'
|
|
verbose_name_plural = 'Odpovědi účastníků'
|
|
ordering = ["-timestamp"]
|
|
|
|
sifra = models.ForeignKey(Sifra, related_name="odpovedi", on_delete=models.CASCADE, blank=False, null=False)
|
|
timestamp = models.DateTimeField("Timestamp", default=timezone.now, blank=False, null=False)
|
|
odpoved = models.TextField("Tajenka bez diakritiky", blank=False, null=False,)
|
|
uspech = models.BooleanField("Zda byla odpověď správná", default=False, blank=False, null=False)
|
|
resitel = models.ForeignKey(Resitel, blank=False, null=False, on_delete=models.CASCADE)
|
|
|
|
def __str__(self): return f"{self.timestamp}: {'✓' if self.uspech else '❌'} {self.resitel} praví {self.odpoved} na {self.sifra}"
|
|
|
|
|
|
class NapovezenoUcastnikovi(models.Model):
|
|
class Meta:
|
|
verbose_name = 'Napovězeno účastníkovi'
|
|
verbose_name_plural = 'Napovězeno účastníkům'
|
|
ordering = ["-timestamp"]
|
|
|
|
napoveda = models.ForeignKey(Napoveda, related_name="napovezeno", on_delete=models.CASCADE, blank=False, null=False)
|
|
resitel = models.ForeignKey(Resitel, blank=False, null=False, on_delete=models.CASCADE)
|
|
timestamp = models.DateTimeField("Timestamp", blank=False, null=False, default=timezone.now)
|
|
|
|
def __str__(self): return f"{self.timestamp}: {self.resitel} bere {self.napoveda}"
|