@ -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,6 +128,10 @@ 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 ) )
ctx [ ' filtr ' ] = FiltrForm ( initial = self . request . GET )
# Pro použití hacku na automatické {{form.media}} v template:
ctx [ ' form ' ] = ctx [ ' filtr ' ]
return ctx
return ctx
# Velmi silně inspirováno zdrojáky, FIXME: Nedá se to udělat smysluplněji?
# Velmi silně inspirováno zdrojáky, FIXME: Nedá se to udělat smysluplněji?