Funkce použité pouze ve výsledkovce přesunuty do výsledkovky
This commit is contained in:
parent
0e92526a8a
commit
623124e833
4 changed files with 49 additions and 83 deletions
|
@ -7,8 +7,6 @@ from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModel
|
||||||
from solo.admin import SingletonModelAdmin
|
from solo.admin import SingletonModelAdmin
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
|
||||||
from seminar.utils import hlavni_problem
|
|
||||||
|
|
||||||
# Todo: reversion
|
# Todo: reversion
|
||||||
|
|
||||||
import seminar.models as m
|
import seminar.models as m
|
||||||
|
@ -99,7 +97,7 @@ class CisloAdmin(admin.ModelAdmin):
|
||||||
ch.stav = m.Problem.STAV_ZADANY
|
ch.stav = m.Problem.STAV_ZADANY
|
||||||
ch.save()
|
ch.save()
|
||||||
|
|
||||||
hp = hlavni_problem(ch)
|
hp = ch.hlavni_problem
|
||||||
if hp.stav not in (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY):
|
if hp.stav not in (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY):
|
||||||
hp.stav = m.Problem.STAV_ZADANY
|
hp.stav = m.Problem.STAV_ZADANY
|
||||||
hp.save()
|
hp.save()
|
||||||
|
|
|
@ -24,7 +24,6 @@ from taggit.managers import TaggableManager
|
||||||
from reversion import revisions as reversion
|
from reversion import revisions as reversion
|
||||||
|
|
||||||
from seminar.utils import roman
|
from seminar.utils import roman
|
||||||
from seminar.utils import hlavni_problem
|
|
||||||
from treenode import treelib
|
from treenode import treelib
|
||||||
|
|
||||||
from unidecode import unidecode # Používám pro získání ID odkazu (ještě je to někde po někom zakomentované)
|
from unidecode import unidecode # Používám pro získání ID odkazu (ještě je to někde po někom zakomentované)
|
||||||
|
@ -98,7 +97,7 @@ class Rocnik(SeminarModelBase):
|
||||||
return vc[-1] if vc else None
|
return vc[-1] if vc else None
|
||||||
|
|
||||||
def verejne_vysledkovky_cisla(self):
|
def verejne_vysledkovky_cisla(self):
|
||||||
vc = list(self.cisla.filter(verejna_vysledkovka=True))
|
vc = list(self.cisla.filter(deadline_v_cisle__verejna_vysledkovka=True))
|
||||||
vc.sort(key=lambda c: c.poradi)
|
vc.sort(key=lambda c: c.poradi)
|
||||||
return vc
|
return vc
|
||||||
|
|
||||||
|
@ -483,7 +482,10 @@ class Problem(SeminarModelBase,PolymorphicModel):
|
||||||
@cached_property
|
@cached_property
|
||||||
def hlavni_problem(self):
|
def hlavni_problem(self):
|
||||||
""" Pro daný problém vrátí jeho nejvyšší nadproblém."""
|
""" Pro daný problém vrátí jeho nejvyšší nadproblém."""
|
||||||
return hlavni_problem(self)
|
problem = self
|
||||||
|
while not (problem.nadproblem is None):
|
||||||
|
problem = problem.nadproblem
|
||||||
|
return problem
|
||||||
|
|
||||||
# FIXME - k úloze
|
# FIXME - k úloze
|
||||||
def body_v_zavorce(self):
|
def body_v_zavorce(self):
|
||||||
|
|
|
@ -248,77 +248,6 @@ def viewMethodSwitch(get, post):
|
||||||
|
|
||||||
return NewView.as_view()
|
return NewView.as_view()
|
||||||
|
|
||||||
def cisla_rocniku(rocnik, jen_verejne=True):
|
|
||||||
"""
|
|
||||||
Vrátí všechna čísla daného ročníku.
|
|
||||||
Parametry:
|
|
||||||
rocnik (Rocnik): ročník semináře
|
|
||||||
jen_verejne (bool): zda se mají vrátit jen veřejná, nebo všechna čísla
|
|
||||||
Vrátí:
|
|
||||||
seznam objektů typu Cislo
|
|
||||||
"""
|
|
||||||
if jen_verejne:
|
|
||||||
return rocnik.verejne_vysledkovky_cisla()
|
|
||||||
else:
|
|
||||||
return rocnik.cisla.all().order_by('poradi')
|
|
||||||
|
|
||||||
def hlavni_problem(problem):
|
|
||||||
""" Pro daný problém vrátí jeho nejvyšší nadproblém."""
|
|
||||||
while not(problem.nadproblem == None):
|
|
||||||
problem = problem.nadproblem
|
|
||||||
return problem
|
|
||||||
|
|
||||||
def problemy_rocniku(rocnik, jen_verejne=True):
|
|
||||||
return m.Problem.objects.filter(hodnoceni__in = m.Hodnoceni.objects.filter(deadline_body__cislo__in = cisla_rocniku(rocnik, jen_verejne))).distinct().select_related('nadproblem').select_related('nadproblem__nadproblem')
|
|
||||||
|
|
||||||
def problemy_cisla(cislo):
|
|
||||||
""" Vrátí seznam všech problémů s body v daném čísle. """
|
|
||||||
return m.Problem.objects.filter(hodnoceni__in = m.Hodnoceni.objects.filter(deadline_body__cislo = cislo)).distinct().non_polymorphic().select_related('nadproblem').select_related('nadproblem__nadproblem')
|
|
||||||
|
|
||||||
|
|
||||||
def hlavni_problemy_f(problemy=None):
|
|
||||||
""" Vrátí seznam všech problémů, které již nemají nadproblém. """
|
|
||||||
# hlavní problémy čísla
|
|
||||||
# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém)
|
|
||||||
hlavni_problemy = set()
|
|
||||||
for p in problemy:
|
|
||||||
hlavni_problemy.add(hlavni_problem(p))
|
|
||||||
|
|
||||||
# zunikátnění
|
|
||||||
hlavni_problemy = list(hlavni_problemy)
|
|
||||||
hlavni_problemy.sort(key=lambda k: k.kod_v_rocniku) # setřídit podle t1, t2, c3, ...
|
|
||||||
|
|
||||||
return hlavni_problemy
|
|
||||||
|
|
||||||
|
|
||||||
def podproblemy_v_cislu(cislo, problemy=None, hlavni_problemy=None):
|
|
||||||
""" Vrátí seznam všech problémů s body v daném čísle v poli 'indexovaném' tématy. """
|
|
||||||
if problemy is None:
|
|
||||||
problemy = problemy_cisla(cislo)
|
|
||||||
if hlavni_problemy is None:
|
|
||||||
hlavni_problemy = hlavni_problemy_f(problemy)
|
|
||||||
|
|
||||||
podproblemy = dict((hp.id, []) for hp in hlavni_problemy)
|
|
||||||
hlavni_problemy = set(hlavni_problemy)
|
|
||||||
podproblemy[-1] = []
|
|
||||||
|
|
||||||
for problem in problemy:
|
|
||||||
h_problem = hlavni_problem(problem)
|
|
||||||
if h_problem in hlavni_problemy:
|
|
||||||
podproblemy[h_problem.id].append(problem)
|
|
||||||
else:
|
|
||||||
podproblemy[-1].append(problem)
|
|
||||||
|
|
||||||
for podproblem in podproblemy.keys():
|
|
||||||
def int_or_zero(p):
|
|
||||||
try:
|
|
||||||
return int(p.kod)
|
|
||||||
except ValueError:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
podproblemy[podproblem] = sorted(podproblemy[podproblem], key=int_or_zero)
|
|
||||||
|
|
||||||
return podproblemy
|
|
||||||
|
|
||||||
class TypDeadline(Enum):
|
class TypDeadline(Enum):
|
||||||
PredDeadline = auto()
|
PredDeadline = auto()
|
||||||
|
|
|
@ -3,8 +3,7 @@ from functools import cached_property
|
||||||
|
|
||||||
import seminar.models as m
|
import seminar.models as m
|
||||||
from django.db.models import Q, Sum
|
from django.db.models import Q, Sum
|
||||||
from seminar.utils import resi_v_rocniku, cisla_rocniku,\
|
from seminar.utils import resi_v_rocniku
|
||||||
hlavni_problemy_f, problemy_cisla, podproblemy_v_cislu
|
|
||||||
|
|
||||||
ROCNIK_ZRUSENI_TEMAT = 25
|
ROCNIK_ZRUSENI_TEMAT = 25
|
||||||
|
|
||||||
|
@ -154,7 +153,11 @@ class VysledkovkaRocniku(Vysledkovka):
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def cisla_rocniku(self) -> list[m.Cislo]:
|
def cisla_rocniku(self) -> list[m.Cislo]:
|
||||||
return cisla_rocniku(self.rocnik, self.jen_verejne)
|
""" Vrátí všechna čísla daného ročníku. """
|
||||||
|
if self.jen_verejne:
|
||||||
|
return self.rocnik.verejne_vysledkovky_cisla()
|
||||||
|
else:
|
||||||
|
return self.rocnik.cisla.all().order_by('poradi')
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def body_za_cisla_slovnik(self) -> dict[int, dict[int, int]]:
|
def body_za_cisla_slovnik(self) -> dict[int, dict[int, int]]:
|
||||||
|
@ -239,11 +242,26 @@ class VysledkovkaCisla(Vysledkovka):
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def problemy(self) -> list[m.Problem]:
|
def problemy(self) -> list[m.Problem]:
|
||||||
return problemy_cisla(self.cislo)
|
""" Vrátí seznam všech problémů s body v daném čísle. """
|
||||||
|
return m.Problem.objects.filter(
|
||||||
|
hodnoceni__in=m.Hodnoceni.objects.filter(deadline_body__cislo=self.cislo)
|
||||||
|
).distinct().non_polymorphic().select_related('nadproblem').select_related('nadproblem__nadproblem')
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def hlavni_problemy(self) -> list[m.Problem]:
|
def hlavni_problemy(self) -> list[m.Problem]:
|
||||||
return hlavni_problemy_f(self.problemy)
|
""" Vrátí seznam všech problémů, které již nemají nadproblém. """
|
||||||
|
# hlavní problémy čísla
|
||||||
|
# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém)
|
||||||
|
hlavni_problemy = set()
|
||||||
|
for p in self.problemy:
|
||||||
|
hlavni_problemy.add(p.hlavni_problem)
|
||||||
|
|
||||||
|
# zunikátnění
|
||||||
|
hlavni_problemy = list(hlavni_problemy)
|
||||||
|
hlavni_problemy.sort(
|
||||||
|
key=lambda k: k.kod_v_rocniku) # setřídit podle t1, t2, c3, ...
|
||||||
|
|
||||||
|
return hlavni_problemy
|
||||||
|
|
||||||
# Není cached, protože si myslím, že queryset lze použít ve for jen jednou.
|
# Není cached, protože si myslím, že queryset lze použít ve for jen jednou.
|
||||||
@property
|
@property
|
||||||
|
@ -337,7 +355,26 @@ class VysledkovkaCisla(Vysledkovka):
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def podproblemy(self) -> list[list[m.Problem]]:
|
def podproblemy(self) -> list[list[m.Problem]]:
|
||||||
return podproblemy_v_cislu(self.cislo, self.problemy, self.temata_a_spol)
|
podproblemy = {hp.id: [] for hp in self.hlavni_problemy}
|
||||||
|
hlavni_problemy = set(self.hlavni_problemy)
|
||||||
|
podproblemy[-1] = []
|
||||||
|
|
||||||
|
for problem in self.problemy:
|
||||||
|
h_problem = problem.hlavni_problem
|
||||||
|
if h_problem in hlavni_problemy:
|
||||||
|
podproblemy[h_problem.id].append(problem)
|
||||||
|
else:
|
||||||
|
podproblemy[-1].append(problem)
|
||||||
|
|
||||||
|
for podproblem in podproblemy.keys():
|
||||||
|
def int_or_zero(p):
|
||||||
|
try:
|
||||||
|
return int(p.kod)
|
||||||
|
except ValueError:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
podproblemy[podproblem] = sorted(podproblemy[podproblem], key=int_or_zero)
|
||||||
|
return podproblemy
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def podproblemy_seznam(self) -> list[list[m.Problem]]:
|
def podproblemy_seznam(self) -> list[list[m.Problem]]:
|
||||||
|
|
Loading…
Reference in a new issue