62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
import logging
|
|
|
|
from django.db import models
|
|
from django.utils.functional import cached_property
|
|
|
|
from treenode import treelib
|
|
|
|
from .problem import Problem
|
|
from .rocnik import Rocnik
|
|
|
|
|
|
class Tema(Problem):
|
|
class Meta:
|
|
db_table = 'seminar_temata'
|
|
verbose_name = 'Téma'
|
|
verbose_name_plural = 'Témata'
|
|
|
|
TEMA_TEMA = 'tema'
|
|
TEMA_SERIAL = 'serial'
|
|
TEMA_CHOICES = [
|
|
(TEMA_TEMA, 'Téma'),
|
|
(TEMA_SERIAL, 'Seriál'),
|
|
]
|
|
tema_typ = models.CharField(
|
|
'Typ tématu', max_length=16, choices=TEMA_CHOICES,
|
|
blank=False, default=TEMA_TEMA,
|
|
)
|
|
|
|
rocnik = models.ForeignKey(
|
|
Rocnik, verbose_name='ročník', related_name='temata',
|
|
blank=True, null=True, on_delete=models.PROTECT,
|
|
)
|
|
|
|
abstrakt = models.TextField('Abstrakt na rozcestník', blank=True)
|
|
obrazek = models.ImageField('Obrázek na rozcestník', null=True, blank=True)
|
|
|
|
@cached_property
|
|
def kod_v_rocniku(self):
|
|
if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY:
|
|
if self.nadproblem:
|
|
return self.nadproblem.kod_v_rocniku+".t{}".format(self.kod)
|
|
return "t{}".format(self.kod)
|
|
logger = logging.getLogger(__name__)
|
|
logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.")
|
|
return '<Není zadaný>'
|
|
|
|
def save(self, *args, **kwargs):
|
|
super().save(*args, **kwargs)
|
|
# *Node.save() aktualizuje název *Nodu.
|
|
for tvcn in self.temavcislenode_set.all():
|
|
tvcn.save()
|
|
|
|
def cislo_node(self):
|
|
tema_node_set = self.temavcislenode_set.all()
|
|
tema_cisla_vyskyt = []
|
|
from treenode.models import CisloNode
|
|
for tn in tema_node_set:
|
|
tema_cisla_vyskyt.append(
|
|
treelib.get_upper_node_of_type(tn, CisloNode).cislo)
|
|
tema_cisla_vyskyt.sort(key=lambda x: x.datum_vydani)
|
|
prvni_zadani = tema_cisla_vyskyt[0]
|
|
return prvni_zadani.cislonode
|