Browse Source

Odevzdávací tabulka v0.5

middleware_test
Pavel "LEdoian" Turinsky 4 years ago
parent
commit
e3b8ff716e
  1. 53
      seminar/views/odevzdavatko.py

53
seminar/views/odevzdavatko.py

@ -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…
Cancel
Save