From b9875b5a1a5ab41781b296268d13d74f8a197667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Wed, 5 Oct 2022 19:31:49 +0200 Subject: [PATCH] =?UTF-8?q?Zrychlen=C3=AD=20v=C3=BDsledkovky=20=C4=8D?= =?UTF-8?q?=C3=ADsla=20sjednocen=C3=ADm=20s=C4=8D=C3=ADt=C3=A1n=C3=AD=20bo?= =?UTF-8?q?d=C5=AF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vysledkovky/utils.py | 93 +++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 53 deletions(-) diff --git a/vysledkovky/utils.py b/vysledkovky/utils.py index 450fbb69..53ef126b 100644 --- a/vysledkovky/utils.py +++ b/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)."""