|
|
@ -3,8 +3,7 @@ from functools import cached_property |
|
|
|
|
|
|
|
import seminar.models as m |
|
|
|
from django.db.models import Q, Sum |
|
|
|
from seminar.utils import resi_v_rocniku, cisla_rocniku,\ |
|
|
|
hlavni_problemy_f, problemy_cisla, podproblemy_v_cislu |
|
|
|
from seminar.utils import resi_v_rocniku |
|
|
|
|
|
|
|
ROCNIK_ZRUSENI_TEMAT = 25 |
|
|
|
|
|
|
@ -154,7 +153,11 @@ class VysledkovkaRocniku(Vysledkovka): |
|
|
|
|
|
|
|
@cached_property |
|
|
|
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 |
|
|
|
def body_za_cisla_slovnik(self) -> dict[int, dict[int, int]]: |
|
|
@ -239,11 +242,26 @@ class VysledkovkaCisla(Vysledkovka): |
|
|
|
|
|
|
|
@cached_property |
|
|
|
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 |
|
|
|
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. |
|
|
|
@property |
|
|
@ -337,7 +355,26 @@ class VysledkovkaCisla(Vysledkovka): |
|
|
|
|
|
|
|
@cached_property |
|
|
|
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 |
|
|
|
def podproblemy_seznam(self) -> list[list[m.Problem]]: |
|
|
|