diff --git a/seminar/views/vysledkovka.py b/seminar/views/vysledkovka.py index 86b5d8f1..279e088e 100644 --- a/seminar/views/vysledkovka.py +++ b/seminar/views/vysledkovka.py @@ -282,31 +282,32 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): # 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í) + 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 řešit více problémů - for prob in list(reseni.problem.all()): + # ř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] - - # a mít více hodnocení - for hodn in list(reseni.hodnoceni_set.all()): - 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) + + 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) end = time.time() print("for cykly:", end-start) return hlavni_problemy_slovnik, cislobody