diff --git a/seminar/utils.py b/seminar/utils.py index 19815cd8..a02c317c 100644 --- a/seminar/utils.py +++ b/seminar/utils.py @@ -240,38 +240,16 @@ def hlavni_problem(problem): problem = problem.nadproblem return problem -def hlavni_problemy_rocniku(rocnik, jen_verejne=True): - """ Pro zadaný ročník vrátí hlavní problémy ročníku, - tj. ty, které už nemají nadproblém.""" - hlavni_problemy = [] - for cislo in cisla_rocniku(rocnik, jen_verejne): - for problem in hlavni_problemy_cisla(cislo): - hlavni_problemy.append(problem) - hlavni_problemy_set = set(hlavni_problemy) - hlavni_problemy = list(hlavni_problemy_set) - hlavni_problemy.sort(key=lambda k:k.kod_v_rocniku) # setřídit podle pořadí - - return hlavni_problemy +def problemy_rocniku(rocnik, jen_verejne=True): + return m.Problem.objects.filter(hodnoceni__in = m.Hodnoceni.objects.filter(cislo_body__in = cisla_rocniku(rocnik, jen_verejne))).distinct().select_related('nadproblem').select_related('nadproblem__nadproblem') def problemy_cisla(cislo): """ Vrátí seznam všech problémů s body v daném čísle. """ - return m.Problem.objects.filter(hodnoceni__in = m.Hodnoceni.objects.filter(cislo_body = cislo)).distinct().select_related('nadproblem') - -# hodnoceni = cislo.hodnoceni.select_related('problem').all() - # hodnocení, která se vážou k danému číslu - -# problemy = [h.problem for h in hodnoceni] -# problemy_set = set(problemy) # chceme každý problém unikátně, -# problemy = (list(problemy_set)) # převedení na množinu a zpět to zaručí + return m.Problem.objects.filter(hodnoceni__in = m.Hodnoceni.objects.filter(cislo_body = cislo)).distinct().select_related('nadproblem').select_related('nadproblem__nadproblem') -# return problemy - - -def hlavni_problemy_cisla(cislo, problemy=None): - """ Vrátí seznam všech problémů s body v daném čísle, které již nemají nadproblém. """ - if problemy is None: - problemy = problemy_cisla(cislo) +def hlavni_problemy_f(problemy=None): + """ Vrátí seznam všech problémů, které již nemají nadproblém. """ # hlavní problémy čísla # (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) hlavni_problemy = set() @@ -290,7 +268,7 @@ def podproblemy_v_cislu(cislo, problemy=None, hlavni_problemy=None): if problemy is None: problemy = problemy_cisla(cislo) if hlavni_problemy is None: - hlavni_problemy = hlavni_problemy_cisla(cislo, problemy) + hlavni_problemy = hlavni_problemy_f(problemy) podproblemy = dict((hp.id, []) for hp in hlavni_problemy) hlavni_problemy = set(hlavni_problemy) diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index dabfbc2b..22b6a743 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -49,7 +49,7 @@ import csv import logging import time -from seminar.utils import aktivniResitele, resi_v_rocniku, hlavni_problemy_rocniku, cisla_rocniku, hlavni_problemy_cisla +from seminar.utils import aktivniResitele, resi_v_rocniku, problemy_rocniku, cisla_rocniku, hlavni_problemy_f # ze starého modelu #def verejna_temata(rocnik): @@ -657,10 +657,10 @@ class RocnikView(generic.DetailView): if self.request.user.je_org: context['cisla_s_neverejnymi'] = cisla_rocniku(context["rocnik"], jen_verejne=False) context['radky_vysledkovky_s_neverejnymi'] = vysledkovka_rocniku(context["rocnik"], jen_verejne=False) - context['hlavni_problemy_v_rocniku_s_neverejnymi'] = hlavni_problemy_rocniku(context["rocnik"], jen_verejne=False) + context['hlavni_problemy_v_rocniku_s_neverejnymi'] = hlavni_problemy_f(problemy_rocniku(context["rocnik"], jen_verejne=False)) context['cisla'] = cisla_rocniku(context["rocnik"]) context['radky_vysledkovky'] = vysledkovka_rocniku(context["rocnik"]) - context['hlavni_problemy_v_rocniku'] = hlavni_problemy_rocniku(context["rocnik"]) + context['hlavni_problemy_v_rocniku'] = hlavni_problemy_f(problemy_rocniku(context["rocnik"])) end = time.time() print("Kontext:", end-start) diff --git a/seminar/views/vysledkovka.py b/seminar/views/vysledkovka.py index 637a3398..f4fa5edb 100644 --- a/seminar/views/vysledkovka.py +++ b/seminar/views/vysledkovka.py @@ -1,6 +1,6 @@ import seminar.models as m from django.db.models import Q, Sum, Count -from seminar.utils import aktivniResitele, resi_v_rocniku, cisla_rocniku, hlavni_problemy_rocniku, hlavni_problem, hlavni_problemy_cisla, problemy_cisla, podproblemy_v_cislu +from seminar.utils import aktivniResitele, resi_v_rocniku, cisla_rocniku, hlavni_problem, hlavni_problemy_f, problemy_cisla, podproblemy_v_cislu import time ### Výsledky @@ -239,7 +239,7 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): print("Scitam cislo",cislo) if hlavni_problemy is None: - hlavni_problemy = hlavni_problemy_cisla(cislo) + hlavni_problemy = hlavni_problemy_f(problemy_cisla(cislo)) def ne_clanek_ne_konfera(problem): inst = problem.get_real_instance() @@ -300,7 +300,7 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): def secti_body_za_cislo_podle_temat(cislo, aktivni_resitele, podproblemy=None, temata=None): """ Spočítá u řešitelů body za číslo za úlohy v jednotlivých hlavních problémech (témata).""" if temata is None: - temata = hlavni_problemy_cisla(cislo) + temata = hlavni_problemy_f(problemy_cisla(cislo)) if podproblemy is None: podproblemy_v_cislu(cislo, hlavni_problemy=temata) @@ -370,7 +370,7 @@ def vysledkovka_cisla(cislo, context=None): if context is None: context = {} problemy = problemy_cisla(cislo) - hlavni_problemy = hlavni_problemy_cisla(cislo, problemy) + hlavni_problemy = hlavni_problemy_f(problemy) ## TODO možná chytřeji vybírat aktivní řešitele # aktivní řešitelé - chceme letos něco poslal, TODO později vyfiltrujeme ty, kdo mají # u alespoň jedné hodnoty něco jiného než NULL