diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 5a7025d6..3d31dfc4 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -407,36 +407,12 @@ def hlavni_problemy_cisla(cislo): # vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník def body_resitelu_odjakziva(rocnik, resitele): - body_odjakziva = {} - - for r in resitele: - body_odjakziva[r.id] = 0 -######################################################################### -# POZOR! Aktuálně počítá jen za posledních 10 let od zadaného ročníku # -######################################################################### - # Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka - # s aktivními řešiteli) - - #body_pred_roky = [] - #rok = rocnik.prvni_rok - #rocniky = Rocnik.objects.filter(prvni_rok__gt=rok-11) - #for roc in rocniky: - # body_pred_roky.append(body_resitelu_za_rocnik(roc, resitele)) - # - #for r in resitele: - # for i in range(0,10): - # body_odjakziva[r.id] += body_pred_roky[i][r.id] - - -# Nasledující řešení je sice správné, ale moc pomalé: -# (důsledek toho, že dotazy na joinování databázových tabulek jsou kvadratické) - for res in Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').all(): - for r in res.resitele.all(): - # daný řešitel nemusí být v naší podmnožině - if r not in resitele: continue - - for hodn in res.hodnoceni_set.all(): - pricti_body(body_odjakziva, r, hodn.body) + # Následující řádek přidá ke každému řešiteli údaj ".body" se součtem jejich bodů + resitele_s_body = Resitel.objects.annotate(body=Sum('reseni__hodnoceni__body')) + # Teď jen z QuerySetu řešitelů anotovaných body vygenerujeme slovník indexovaný řešitelským id obsahující body + # ... ale jen ro řešitele, které dostaneme jako parametr. + # TODO: Zjistit, co ten parametr říká a proč je potřeba + body_odjakziva = {int(res.id) : res.body for res in resitele_s_body if res in resitele} return body_odjakziva # vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník