import logging from django.db import models from django.utils.functional import cached_property from django.core.exceptions import ObjectDoesNotExist from treenode import treelib from .problem import Problem from .cislo import Cislo class Uloha(Problem): class Meta: db_table = 'seminar_ulohy' verbose_name = 'Úloha' verbose_name_plural = 'Úlohy' cislo_zadani = models.ForeignKey( Cislo, verbose_name='číslo zadání', blank=True, null=True, related_name='zadane_ulohy', on_delete=models.PROTECT, ) cislo_deadline = models.ForeignKey( Cislo, verbose_name='číslo deadlinu', blank=True, null=True, related_name='deadlinove_ulohy', on_delete=models.PROTECT, ) cislo_reseni = models.ForeignKey( Cislo, verbose_name='číslo řešení', blank=True, null=True, related_name='resene_ulohy', help_text='Číslo s řešením úlohy, jen pro úlohy', on_delete=models.PROTECT, ) max_body = models.DecimalField( max_digits=8, decimal_places=1, verbose_name='maximum bodů', blank=True, null=True, ) # má OneToOneField s: # UlohaZadaniNode # UlohaVzorakNode @cached_property def kod_v_rocniku(self): if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY: name = "{}.u{}".format(self.cislo_zadani.poradi, self.kod) if self.nadproblem: return self.nadproblem.kod_v_rocniku+name return name 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 '' def save(self, *args, **kwargs): super().save(*args, **kwargs) # *Node.save() aktualizuje název *Nodu. try: self.ulohazadaninode.save() except ObjectDoesNotExist: # Neexistující *Node nemá smysl aktualizovat. pass try: self.ulohavzoraknode.save() except ObjectDoesNotExist: # Neexistující *Node nemá smysl aktualizovat. pass def cislo_node(self): zadani_node = self.ulohazadaninode from treenode.models import CisloNode return treelib.get_upper_node_of_type(zadani_node, CisloNode)