From 0d7ec1d90ab6b731bb4cf9d9eb4e9162405089ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=C3=A1=C5=A1=20Havelka?= Date: Wed, 5 Oct 2022 21:02:18 +0200 Subject: [PATCH] =?UTF-8?q?P=C5=99eps=C3=A1na=20s=C4=8D=C3=ADtac=C3=AD=20f?= =?UTF-8?q?unkce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vysledkovky/utils.py | 87 +++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 50 deletions(-) diff --git a/vysledkovky/utils.py b/vysledkovky/utils.py index 19163e93..5a22a447 100644 --- a/vysledkovky/utils.py +++ b/vysledkovky/utils.py @@ -258,86 +258,73 @@ class VysledkovkaCisla(Vysledkovka): ) @cached_property - def problemy_s_body_za_cislo(self): + def sectene_body(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š.) + Sečte body za číslo, hlavní problémy a podproblémy """ - hlavni_problemy_slovnik = dict() - for hp in self.hlavni_problemy: - hlavni_problemy_slovnik[hp.id] = {} - - hlavni_problemy_slovnik[-1] = {} - - # zakládání prázdných záznamů pro řešitele - cislobody = {} - for ar in self.aktivni_resitele: - # řešitele převedeme na řetězec pomocí unikátního id - cislobody[ar.id] = "" - for hp in self.temata_a_spol: - slovnik = hlavni_problemy_slovnik[hp.id] - slovnik[ar.id] = "" - - hlavni_problemy_slovnik[-1][ar.id] = "" - + # Body za číslo + body_za_cislo = {ar.id: "" for ar in self.aktivni_resitele} + + # Body za hlavní problémy + body_za_temata = { + hp.id: {ar.id: "" for ar in self.aktivni_resitele} + for hp in self.temata_a_spol + } + body_za_temata[-1] = {ar.id: "" for ar in self.aktivni_resitele} + + # Body za podproblémy + body_za_problemy = { + tema.id: { + problem.id: {ar.id: "" for ar in self.aktivni_resitele} + for problem in self.podproblemy[tema.id] + } + for tema in self.temata_a_spol + } + body_za_problemy[-1] = { + problem.id: {ar.id: "" for ar in self.aktivni_resitele} + for problem in self.podproblemy[-1] + } + + # Mapování podproblémů na problémy 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] = "" - + # Získáme query všech sčítaných hodnocení hodnoceni_do_cisla = self.hodnoceni_do_cisla + # Sečteme hodnocení for hodnoceni in hodnoceni_do_cisla: prob = hodnoceni.problem nadproblem = problem2nadproblem[prob.id] - nadproblem_slovnik = hlavni_problemy_slovnik[nadproblem] - body = hodnoceni.body + problem_slovnik = body_za_problemy[nadproblem][prob.id] + nadproblem_slovnik = body_za_temata[nadproblem] - problem_slovnik = body_slovnik[nadproblem][prob.id] + body = hodnoceni.body - # a mít více řešitelů + # Může 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(body_za_cislo, resitel, body) self.pricti_body(nadproblem_slovnik, resitel, body) self.pricti_body(problem_slovnik, resitel, body) - return hlavni_problemy_slovnik, cislobody, body_slovnik + return body_za_cislo, body_za_temata, body_za_problemy @cached_property def hlavni_problemy_slovnik(self) -> dict[int, dict[int, str]]: - return self.problemy_s_body_za_cislo[0] + return self.sectene_body[1] @cached_property def body_za_cislo(self) -> dict[int, str]: - return self.problemy_s_body_za_cislo[1] + return self.sectene_body[0] @cached_property def problemy_slovnik(self): - return self.problemy_s_body_za_cislo[2] + return self.sectene_body[2] @cached_property def temata_a_spol(self) -> list[m.Problem]: