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="
Bohužel vám hvězdy nebyly nakloněny. Rozumějte máte to blbě.
", 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 `
- má :py:class:`Nápovědu/y `
- může být v :py:class:`SeznamechŠifer `
- a lze ji řešit:
:py:class:`OdpověďÚčastníka `
:py:class:`NapovezenoUcastnikovi `
"""
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}"