mamweb/tvorba/models/uloha.py

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)