Odevzdávací tabulka v0.5
This commit is contained in:
parent
cd6ae46570
commit
e3b8ff716e
1 changed files with 40 additions and 13 deletions
|
@ -12,6 +12,7 @@ import logging
|
||||||
|
|
||||||
import seminar.models as m
|
import seminar.models as m
|
||||||
import seminar.forms as f
|
import seminar.forms as f
|
||||||
|
from seminar.forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm
|
||||||
from seminar.utils import aktivniResitele, resi_v_rocniku
|
from seminar.utils import aktivniResitele, resi_v_rocniku
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -41,28 +42,55 @@ class TabulkaOdevzdanychReseniView(ListView):
|
||||||
|
|
||||||
def inicializuj_osy_tabulky(self):
|
def inicializuj_osy_tabulky(self):
|
||||||
"""Vyrobí prvotní querysety pro sloupce a řádky, tj. seznam všech řešitelů a problémů"""
|
"""Vyrobí prvotní querysety pro sloupce a řádky, tj. seznam všech řešitelů a problémů"""
|
||||||
|
# FIXME: jméno metody není vypovídající...
|
||||||
# NOTE: Tenhle blok nemůže být přímo ve třídě, protože před vyrobením databáze neexistují ty objekty (?). TODO: Otestovat
|
# NOTE: Tenhle blok nemůže být přímo ve třídě, protože před vyrobením databáze neexistují ty objekty (?). TODO: Otestovat
|
||||||
# TODO: Prefetches, Select related, ...
|
# TODO: Prefetches, Select related, ...
|
||||||
self.resitele = m.Resitel.objects.all()
|
self.resitele = m.Resitel.objects.all()
|
||||||
self.problemy = m.Problem.objects.all()
|
self.problemy = m.Problem.objects.all()
|
||||||
|
self.reseni = m.Reseni.objects.all()
|
||||||
|
|
||||||
|
form = FiltrForm(self.request.GET)
|
||||||
|
if form.is_valid():
|
||||||
|
fcd = form.cleaned_data
|
||||||
|
resitele = fcd["resitele"]
|
||||||
|
problemy = fcd["problemy"]
|
||||||
|
reseni_od = fcd["reseni_od"]
|
||||||
|
reseni_do = fcd["reseni_do"]
|
||||||
|
else:
|
||||||
|
resitele = FiltrForm.get_initial_for_field(FormFiltr.resitele, "resitele")
|
||||||
|
problemy = FiltrForm.get_initial_for_field(FormFiltr.problemy, "problemy")
|
||||||
|
resitele_od = FiltrForm.get_initial_for_field(FormFiltr.resitele_od, "resitele_od")
|
||||||
|
resitele_do = FiltrForm.get_initial_for_field(FormFiltr.resitele_do, "resitele_do")
|
||||||
|
|
||||||
|
|
||||||
|
# Filtrujeme!
|
||||||
|
aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci
|
||||||
|
if resitele == FiltrForm.RESITELE_RELEVANTNI:
|
||||||
|
logger.warning("Někdo chtěl v tabulce jen relevantní řešitele a měl smůlu :-(")
|
||||||
|
resitele = FiltrForm.RESITELE_LETOSNI # Fall-through
|
||||||
|
elif resitele == FiltrForm.RESITELE_LETOSNI:
|
||||||
|
self.resitele = resi_v_rocniku(aktualni_rocnik)
|
||||||
|
|
||||||
|
if problemy == FiltrForm.PROBLEMY_MOJE:
|
||||||
|
org = m.Organizator.objects.get(osoba__user=self.request.user)
|
||||||
|
from django.db.models import Q
|
||||||
|
self.problemy = self.problemy.filter(Q(autor=org)|Q(garant=org)|Q(opravovatele=org), stav=m.Problem.STAV_ZADANY)
|
||||||
|
elif problemy == FiltrForm.PROBLEMY_LETOSNI:
|
||||||
|
self.problemy = self.problemy.filter(stav=m.Problem.STAV_ZADANY)
|
||||||
|
#self.problemy = list(filter(lambda problem: problem.rocnik() == aktualni_rocnik, self.problemy)) # DB HOG? # FIXME: některé problémy nemají ročník....
|
||||||
|
# NOTE: Protože řešení odkazuje přímo na Problém a QuerySet na Hodnocení je nepolymorfní, musíme porovnávat taky s nepolymorfními Problémy.
|
||||||
|
self.problemy = self.problemy.non_polymorphic()
|
||||||
|
|
||||||
|
self.reseni = self.reseni.filter(cas_doruceni__date__gte=reseni_od, cas_doruceni__date__lte=reseni_do)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
self.inicializuj_osy_tabulky()
|
self.inicializuj_osy_tabulky()
|
||||||
self.akt_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi...
|
|
||||||
self.resitele = resi_v_rocniku(self.akt_rocnik)
|
|
||||||
# NOTE: Protože řešení odkazuje přímo na Problém a QuerySet na Hodnocení je nepolymorfní, musíme porovnávat taky s nepolymorfními Problémy.
|
|
||||||
self.problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic()
|
|
||||||
|
|
||||||
qs = super().get_queryset()
|
qs = super().get_queryset()
|
||||||
qs = qs.filter(problem__in=self.problemy).select_related('reseni', 'problem').prefetch_related('reseni__resitele__osoba')
|
qs = qs.filter(problem__in=self.problemy, reseni__in=self.reseni, reseni__resitele__in=self.resitele).select_related('reseni', 'problem').prefetch_related('reseni__resitele__osoba')
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
def get_context_data(self, *args, **kwargs):
|
def get_context_data(self, *args, **kwargs):
|
||||||
# FIXME: Tenhle blok nemůže být přímo ve třídě, protože před vyrobením databáze neexistuje Nastavení.
|
# self.resitele, self.reseni a self.problemy jsou již nastavené
|
||||||
self.akt_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci, asi...
|
|
||||||
self.resitele = resi_v_rocniku(self.akt_rocnik)
|
|
||||||
# NOTE: Protože řešení odkazuje přímo na Problém a QuerySet na Hodnocení je nepolymorfní, musíme porovnávat taky s nepolymorfními Problémy.
|
|
||||||
self.problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic()
|
|
||||||
|
|
||||||
ctx = super().get_context_data(*args, **kwargs)
|
ctx = super().get_context_data(*args, **kwargs)
|
||||||
ctx['problemy'] = self.problemy
|
ctx['problemy'] = self.problemy
|
||||||
|
@ -100,8 +128,7 @@ class TabulkaOdevzdanychReseniView(ListView):
|
||||||
hodnoty.append(resiteluv_radek)
|
hodnoty.append(resiteluv_radek)
|
||||||
ctx['radky'] = list(zip(self.resitele, hodnoty))
|
ctx['radky'] = list(zip(self.resitele, hodnoty))
|
||||||
|
|
||||||
from seminar.forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm
|
ctx['filtr'] = FiltrForm(initial=self.request.GET)
|
||||||
ctx['filtr'] = FiltrForm()
|
|
||||||
# Pro použití hacku na automatické {{form.media}} v template:
|
# Pro použití hacku na automatické {{form.media}} v template:
|
||||||
ctx['form'] = ctx['filtr']
|
ctx['form'] = ctx['filtr']
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue