73 lines
2 KiB
Python
73 lines
2 KiB
Python
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 '<Není zadaný>'
|
|
|
|
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)
|