Browse Source

Zrychlení výsledkovky čísla sjednocením sčítání bodů.

zadavatko_problemu
Jonas Havelka 2 years ago
parent
commit
b9875b5a1a
  1. 93
      vysledkovky/utils.py

93
vysledkovky/utils.py

@ -259,6 +259,13 @@ class VysledkovkaCisla(Vysledkovka):
@cached_property
def problemy_s_body_za_cislo(self):
"""
TODDO okomentovat a zpřehlednit. Vzniklo slepením dvou funkcí
(výpočet bodů hlavních problémů a výpočet bodů podproblémů)
pro zrychlení výpočtu bodů ve výsledkovce.
Což asi zpomalilo výsledkovku v TeXu. Co s tím? (Tu nevidí řeš.)
"""
hlavni_problemy_slovnik = dict()
for hp in self.hlavni_problemy:
@ -277,25 +284,48 @@ class VysledkovkaCisla(Vysledkovka):
hlavni_problemy_slovnik[-1][ar.id] = ""
problem2nadproblem = dict()
body_slovnik = {}
for tema in self.temata_a_spol:
body_slovnik[tema.id] = {}
for problem in self.podproblemy[tema.id]:
body_slovnik[tema.id][problem.id] = {}
problem2nadproblem[problem.id] = tema.id
body_slovnik[-1] = {}
for problem in self.podproblemy[-1]:
body_slovnik[-1][problem.id] = {}
problem2nadproblem[problem.id] = -1
# zakládání prázdných záznamů pro řešitele
for ar in self.aktivni_resitele:
for tema in self.temata_a_spol:
for problem in self.podproblemy[tema.id]:
body_slovnik[tema.id][problem.id][ar.id] = ""
for problem in self.podproblemy[-1]:
body_slovnik[-1][problem.id][ar.id] = ""
hodnoceni_do_cisla = self.hodnoceni_do_cisla
for hodnoceni in hodnoceni_do_cisla:
prob = hodnoceni.problem
nadproblem = hlavni_problem(prob)
if self.ne_clanek_ne_konfera(nadproblem):
nadproblem_slovnik = hlavni_problemy_slovnik[nadproblem.id]
else:
nadproblem_slovnik = hlavni_problemy_slovnik[-1]
nadproblem = problem2nadproblem[prob.id]
nadproblem_slovnik = hlavni_problemy_slovnik[nadproblem]
body = hodnoceni.body
problem_slovnik = body_slovnik[nadproblem][prob.id]
# a mít více řešitelů
for resitel in hodnoceni.reseni.resitele.all():
if resitel not in self.aktivni_resitele:
continue
self.pricti_body(cislobody, resitel, body)
self.pricti_body(nadproblem_slovnik, resitel, body)
return hlavni_problemy_slovnik, cislobody
self.pricti_body(problem_slovnik, resitel, body)
return hlavni_problemy_slovnik, cislobody, body_slovnik
@cached_property
def hlavni_problemy_slovnik(self) -> dict[int, dict[int, str]]:
@ -305,6 +335,10 @@ class VysledkovkaCisla(Vysledkovka):
def body_za_cislo(self) -> dict[int, str]:
return self.problemy_s_body_za_cislo[1]
@cached_property
def problemy_slovnik(self):
return self.problemy_s_body_za_cislo[2]
@cached_property
def temata_a_spol(self) -> list[m.Problem]:
if self.rocnik.rocnik < ROCNIK_ZRUSENI_TEMAT:
@ -328,53 +362,6 @@ class VysledkovkaCisla(Vysledkovka):
def podproblemy_iter(self) -> FixedIterator:
return FixedIterator(self.podproblemy_seznam.__iter__())
@cached_property
def problemy_slovnik(self):
# získáme body u jednotlivých témat
""" Spočítá u řešitelů body za číslo za úlohy v jednotlivých hlavních
problémech (témata). """
body_slovnik = {}
for tema in self.temata_a_spol:
body_slovnik[tema.id] = {}
for problem in self.podproblemy[tema.id]:
body_slovnik[tema.id][problem.id] = {}
body_slovnik[-1] = {}
for problem in self.podproblemy[-1]:
body_slovnik[-1][problem.id] = {}
# zakládání prázdných záznamů pro řešitele
for ar in self.aktivni_resitele:
for tema in self.temata_a_spol:
for problem in self.podproblemy[tema.id]:
body_slovnik[tema.id][problem.id][ar.id] = ""
for problem in self.podproblemy[-1]:
body_slovnik[-1][problem.id][ar.id] = ""
temata = set(t.id for t in self.temata_a_spol)
hodnoceni_do_cisla = self.hodnoceni_do_cisla
for hodnoceni in hodnoceni_do_cisla:
prob = hodnoceni.problem
nadproblem = hlavni_problem(prob)
if nadproblem.id in temata:
nadproblem_slovnik = body_slovnik[nadproblem.id]
else:
nadproblem_slovnik = body_slovnik[-1]
problem_slovnik = nadproblem_slovnik[prob.id]
body = hodnoceni.body
# a mít více řešitelů
for resitel in hodnoceni.reseni.resitele.all():
if resitel not in self.aktivni_resitele:
continue
self.pricti_body(problem_slovnik, resitel, body)
return body_slovnik
class RadekVysledkovkyCisla(object):
"""Obsahuje věci, které se hodí vědět při konstruování výsledkovky.
Umožňuje snazší práci v templatu (lepší, než seznam)."""

Loading…
Cancel
Save