vysledkovka | Optimalizace pristupu k DB
This commit is contained in:
parent
f443a8cd2e
commit
3504d5788e
2 changed files with 30 additions and 18 deletions
|
@ -522,7 +522,7 @@ def spravne_novinky(request):
|
||||||
user = request.user
|
user = request.user
|
||||||
# Využíváme líné vyhodnocování QuerySetů
|
# Využíváme líné vyhodnocování QuerySetů
|
||||||
qs = Novinky.objects.all()
|
qs = Novinky.objects.all()
|
||||||
if not user.je_org:
|
if not user.je_org():
|
||||||
qs = qs.filter(zverejneno=True)
|
qs = qs.filter(zverejneno=True)
|
||||||
return qs.order_by('-datum')
|
return qs.order_by('-datum')
|
||||||
|
|
||||||
|
@ -644,29 +644,25 @@ class RocnikView(generic.DetailView):
|
||||||
def get_object(self, queryset=None):
|
def get_object(self, queryset=None):
|
||||||
if queryset is None:
|
if queryset is None:
|
||||||
queryset = self.get_queryset()
|
queryset = self.get_queryset()
|
||||||
rocnik_arg = self.kwargs.get('rocnik')
|
|
||||||
queryset = queryset.filter(rocnik=rocnik_arg)
|
|
||||||
|
|
||||||
try:
|
return get_object_or_404(queryset,rocnik=self.kwargs.get('rocnik'))
|
||||||
obj = queryset.get()
|
|
||||||
except queryset.model.DoesNotExist:
|
|
||||||
raise Http404(_("No %(verbose_name)s found matching the query") %
|
|
||||||
{'verbose_name': queryset.model._meta.verbose_name})
|
|
||||||
return obj
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
|
start = time.time()
|
||||||
context = super(RocnikView, self).get_context_data(**kwargs)
|
context = super(RocnikView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
# vysledkovka = True zajistí vykreslení,
|
# vysledkovka = True zajistí vykreslení,
|
||||||
# zkontrolovat, kdy se má a nemá vykreslovat
|
# zkontrolovat, kdy se má a nemá vykreslovat
|
||||||
context['vysledkovka'] = True
|
context['vysledkovka'] = True
|
||||||
context['cisla_s_neverejnymi'] = cisla_rocniku(context["rocnik"], jen_verejne=False)
|
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['cisla'] = cisla_rocniku(context["rocnik"])
|
context['cisla'] = cisla_rocniku(context["rocnik"])
|
||||||
context['radky_vysledkovky'] = vysledkovka_rocniku(context["rocnik"])
|
context['radky_vysledkovky'] = vysledkovka_rocniku(context["rocnik"])
|
||||||
context['radky_vysledkovky_s_neverejnymi'] = vysledkovka_rocniku(
|
|
||||||
context["rocnik"], jen_verejne=False)
|
|
||||||
context['hlavni_problemy_v_rocniku'] = hlavni_problemy_rocniku(context["rocnik"])
|
context['hlavni_problemy_v_rocniku'] = hlavni_problemy_rocniku(context["rocnik"])
|
||||||
context['hlavni_problemy_v_rocniku_s_neverejnymi'] = hlavni_problemy_rocniku(context["rocnik"], jen_verejne=False)
|
end = time.time()
|
||||||
|
print("Kontext:", end-start)
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
@ -689,7 +685,7 @@ class ProblemView(generic.DetailView):
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
# Musí se používat context['object'], protože nevíme, jestli dostaneme úložku, téma, článek, .... a tyhle věci vyrábějí různé klíče.
|
# Musí se používat context['object'], protože nevíme, jestli dostaneme úložku, téma, článek, .... a tyhle věci vyrábějí různé klíče.
|
||||||
if not context['object'].verejne() and not self.request.user.je_org:
|
if not context['object'].verejne() and not self.request.user.je_org():
|
||||||
raise PermissionDenied()
|
raise PermissionDenied()
|
||||||
if isinstance(context['object'], Clanek):
|
if isinstance(context['object'], Clanek):
|
||||||
context['reseni'] = Reseni.objects.filter(problem=context['object']).select_related('resitel').order_by('resitel__prijmeni')
|
context['reseni'] = Reseni.objects.filter(problem=context['object']).select_related('resitel').order_by('resitel__prijmeni')
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import seminar.models as m
|
import seminar.models as m
|
||||||
from django.db.models import Q, Sum, Count
|
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_problemy_rocniku, hlavni_problem, hlavni_problemy_cisla, problemy_cisla, podproblemy_v_cislu
|
||||||
|
import time
|
||||||
### Výsledky
|
### Výsledky
|
||||||
|
|
||||||
def sloupec_s_poradim(setrizene_body):
|
def sloupec_s_poradim(setrizene_body):
|
||||||
|
@ -126,15 +127,16 @@ class RadekVysledkovkyRocniku(object):
|
||||||
|
|
||||||
def setrid_resitele_a_body(slov_resitel_body):
|
def setrid_resitele_a_body(slov_resitel_body):
|
||||||
setrizeni_resitele_id = [dvojice[0] for dvojice in slov_resitel_body]
|
setrizeni_resitele_id = [dvojice[0] for dvojice in slov_resitel_body]
|
||||||
setrizeni_resitele = [m.Resitel.objects.get(id=i) for i in setrizeni_resitele_id]
|
|
||||||
setrizene_body = [dvojice[1] for dvojice in slov_resitel_body]
|
setrizene_body = [dvojice[1] for dvojice in slov_resitel_body]
|
||||||
return setrizeni_resitele_id, setrizeni_resitele, setrizene_body
|
return setrizeni_resitele_id, setrizene_body
|
||||||
|
|
||||||
def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
||||||
""" Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve
|
""" Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve
|
||||||
formě vhodné pro šablonu "seminar/vysledkovka_rocniku.html"
|
formě vhodné pro šablonu "seminar/vysledkovka_rocniku.html"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
start = time.time()
|
||||||
|
|
||||||
## TODO možná chytřeji vybírat aktivní řešitele
|
## 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í
|
# 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
|
# u alespoň jedné hodnoty něco jiného než NULL
|
||||||
|
@ -150,7 +152,7 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
||||||
resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele)
|
resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele)
|
||||||
|
|
||||||
# setřídíme řešitele podle počtu bodů a získáme seznam s body od nejvyšších po nenižší
|
# setřídíme řešitele podle počtu bodů a získáme seznam s body od nejvyšších po nenižší
|
||||||
setrizeni_resitele_id, setrizeni_resitele, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn)
|
setrizeni_resitele_id, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn)
|
||||||
poradi = sloupec_s_poradim(setrizene_body)
|
poradi = sloupec_s_poradim(setrizene_body)
|
||||||
|
|
||||||
# získáme body odjakživa
|
# získáme body odjakživa
|
||||||
|
@ -159,6 +161,10 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
||||||
# vytvoříme jednotlivé sloupce výsledkovky
|
# vytvoříme jednotlivé sloupce výsledkovky
|
||||||
radky_vysledkovky = []
|
radky_vysledkovky = []
|
||||||
i = 0
|
i = 0
|
||||||
|
setrizeni_resitele_dict = {} # Tento slovnik se vyrab
|
||||||
|
for r in m.Resitel.objects.filter(id__in=setrizeni_resitele_id).select_related('osoba'):
|
||||||
|
setrizeni_resitele_dict[r.id] = r
|
||||||
|
|
||||||
for ar_id in setrizeni_resitele_id:
|
for ar_id in setrizeni_resitele_id:
|
||||||
# seznam počtu bodů daného řešitele pro jednotlivá čísla
|
# seznam počtu bodů daného řešitele pro jednotlivá čísla
|
||||||
body_cisla_sezn = []
|
body_cisla_sezn = []
|
||||||
|
@ -168,7 +174,7 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
||||||
# vytáhneme informace pro daného řešitele
|
# vytáhneme informace pro daného řešitele
|
||||||
radek = RadekVysledkovkyRocniku(
|
radek = RadekVysledkovkyRocniku(
|
||||||
poradi[i], # pořadí
|
poradi[i], # pořadí
|
||||||
m.Resitel.objects.get(id=ar_id), # řešitel (z id)
|
setrizeni_resitele_dict[ar_id], # řešitel (z id)
|
||||||
body_cisla_sezn, # seznam bodů za čísla
|
body_cisla_sezn, # seznam bodů za čísla
|
||||||
setrizene_body[i], # body za ročník (spočítané výše s pořadím)
|
setrizene_body[i], # body za ročník (spočítané výše s pořadím)
|
||||||
resitel_odjakzivabody_slov[ar_id], # body odjakživa
|
resitel_odjakzivabody_slov[ar_id], # body odjakživa
|
||||||
|
@ -176,7 +182,11 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True):
|
||||||
radky_vysledkovky.append(radek)
|
radky_vysledkovky.append(radek)
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
|
end = time.time()
|
||||||
|
print("Vysledkovka rocniku",end-start)
|
||||||
|
|
||||||
return radky_vysledkovky
|
return radky_vysledkovky
|
||||||
|
|
||||||
class RadekVysledkovkyCisla(object):
|
class RadekVysledkovkyCisla(object):
|
||||||
"""Obsahuje věci, které se hodí vědět při konstruování výsledkovky.
|
"""Obsahuje věci, které se hodí vědět při konstruování výsledkovky.
|
||||||
Umožňuje snazší práci v templatu (lepší, než seznam)."""
|
Umožňuje snazší práci v templatu (lepší, než seznam)."""
|
||||||
|
@ -225,6 +235,9 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None):
|
||||||
# TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé
|
# TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé
|
||||||
# pro každý hlavní problém zavedeme slovník s body za daný hlavní problém
|
# pro každý hlavní problém zavedeme slovník s body za daný hlavní problém
|
||||||
# pro jednotlivé řešitele (slovník slovníků hlavních problémů)
|
# pro jednotlivé řešitele (slovník slovníků hlavních problémů)
|
||||||
|
|
||||||
|
print("Scitam cislo",cislo)
|
||||||
|
|
||||||
if hlavni_problemy is None:
|
if hlavni_problemy is None:
|
||||||
hlavni_problemy = hlavni_problemy_cisla(cislo)
|
hlavni_problemy = hlavni_problemy_cisla(cislo)
|
||||||
|
|
||||||
|
@ -257,6 +270,7 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None):
|
||||||
reseni_do_cisla = m.Reseni.objects.prefetch_related('problem', 'resitele',
|
reseni_do_cisla = m.Reseni.objects.prefetch_related('problem', 'resitele',
|
||||||
'hodnoceni_set').filter(hodnoceni__cislo_body=cislo)
|
'hodnoceni_set').filter(hodnoceni__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
|
# 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
|
# bodů i do bodů za problém
|
||||||
for reseni in reseni_do_cisla:
|
for reseni in reseni_do_cisla:
|
||||||
|
@ -280,6 +294,8 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None):
|
||||||
continue
|
continue
|
||||||
pricti_body(cislobody, resitel, body)
|
pricti_body(cislobody, resitel, body)
|
||||||
pricti_body(nadproblem_slovnik, resitel, body)
|
pricti_body(nadproblem_slovnik, resitel, body)
|
||||||
|
end = time.time()
|
||||||
|
print("for cykly:", end-start)
|
||||||
return hlavni_problemy_slovnik, cislobody
|
return hlavni_problemy_slovnik, cislobody
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue