diff --git a/seminar/views/vysledkovka.py b/seminar/views/vysledkovka.py index 575e0a09..f98cad28 100644 --- a/seminar/views/vysledkovka.py +++ b/seminar/views/vysledkovka.py @@ -278,36 +278,29 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): slovnik[ar.id] = "" hlavni_problemy_slovnik[-1][ar.id] = "" - - # vezmeme všechna řešení s body do daného čísla - reseni_do_cisla = m.Reseni.objects.prefetch_related('problem', 'resitele', - 'hodnoceni_set').filter(hodnoceni__cislo_body=cislo) - reseni_do_cisla = set(reseni_do_cisla) # odstranění duplikátů (pokud má řešení více ohodnocení) + hodnoceni_do_cisla = m.Hodnoceni.objects.prefetch_related('problem', 'resitele', + 'hodnoceni_set').filter(cislo_body=cislo) - start = time.time() - # projdeme všechna řešení do čísla a přičteme body každému řešiteli do celkových - # bodů i do bodů za problém - for reseni in reseni_do_cisla: - - # řešení může mít více hodnocení - for hodn in list(reseni.hodnoceni_set.all()): - prob = hodn.problem - nadproblem = hlavni_problem(prob) - if ne_clanek_ne_konfera(nadproblem): - nadproblem_slovnik = hlavni_problemy_slovnik[nadproblem.id] - else: - nadproblem_slovnik = hlavni_problemy_slovnik[-1] - - body = hodn.body - - # a mít více řešitelů - for resitel in list(reseni.resitele.all()): - if resitel not in aktivni_resitele: - print("Skipping {}".format(resitel.id)) - continue - pricti_body(cislobody, resitel, body) - pricti_body(nadproblem_slovnik, resitel, body) + start = time.time() + + for hodnoceni in hodnoceni_do_cisla: + prob = hodnoceni.problem + nadproblem = hlavni_problem(prob) + if ne_clanek_ne_konfera(nadproblem): + nadproblem_slovnik = hlavni_problemy_slovnik[nadproblem.id] + else: + nadproblem_slovnik = hlavni_problemy_slovnik[-1] + + body = hodnoceni.body + + # a mít více řešitelů + for resitel in hodnoceni.reseni.resitele.all(): + if resitel not in aktivni_resitele: + print("Skipping {}".format(resitel.id)) + continue + pricti_body(cislobody, resitel, body) + pricti_body(nadproblem_slovnik, resitel, body) end = time.time() print("for cykly:", end-start) return hlavni_problemy_slovnik, cislobody @@ -341,35 +334,27 @@ def secti_body_za_cislo_podle_temat(cislo, aktivni_resitele, podproblemy=None, t temata = set(t.id for t in temata) - # vezmeme všechna řešení s body do daného čísla - reseni_do_cisla = m.Reseni.objects.prefetch_related('problem', 'resitele', - 'hodnoceni_set').filter(hodnoceni__cislo_body=cislo) - - reseni_do_cisla = set(reseni_do_cisla) # odstranění duplikátů (pokud má řešení více ohodnocení) + hodnoceni_do_cisla = m.Hodnoceni.objects.prefetch_related('problem', 'resitele', + 'hodnoceni_set').filter(cislo_body=cislo) - # projdeme všechna řešení do čísla a přičteme body každému řešiteli do celkových - # bodů i do bodů za problém - for reseni in reseni_do_cisla: - - # řešení může mít více hodnocení - for hodn in list(reseni.hodnoceni_set.all()): - prob = hodn.problem - nadproblem = hlavni_problem(prob) - if nadproblem.id in temata: - nadproblem_slovnik = body_slovnik[nadproblem.id] - else: - nadproblem_slovnik = body_slovnik[-1] + 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] + problem_slovnik = nadproblem_slovnik[prob.id] - body = hodn.body + body = hodnoceni.body - # a mít více řešitelů - for resitel in reseni.resitele.all(): - if resitel not in aktivni_resitele: - print("Skipping {}".format(resitel.id)) - continue - pricti_body(problem_slovnik, resitel, body) + # a mít více řešitelů + for resitel in hodnoceni.reseni.resitele.all(): + if resitel not in aktivni_resitele: + print("Skipping {}".format(resitel.id)) + continue + pricti_body(problem_slovnik, resitel, body) return body_slovnik