diff --git a/seminar/views/odevzdavatko.py b/seminar/views/odevzdavatko.py index 214893af..d1cedb1b 100644 --- a/seminar/views/odevzdavatko.py +++ b/seminar/views/odevzdavatko.py @@ -12,6 +12,7 @@ import logging import seminar.models as m import seminar.forms as f +from seminar.forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm from seminar.utils import aktivniResitele, resi_v_rocniku logger = logging.getLogger(__name__) @@ -41,28 +42,55 @@ class TabulkaOdevzdanychReseniView(ListView): def inicializuj_osy_tabulky(self): """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 # TODO: Prefetches, Select related, ... self.resitele = m.Resitel.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") + - def get_queryset(self): - 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) + # 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 = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic() + 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): + self.inicializuj_osy_tabulky() 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 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.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() + # self.resitele, self.reseni a self.problemy jsou již nastavené ctx = super().get_context_data(*args, **kwargs) ctx['problemy'] = self.problemy @@ -100,8 +128,7 @@ class TabulkaOdevzdanychReseniView(ListView): hodnoty.append(resiteluv_radek) ctx['radky'] = list(zip(self.resitele, hodnoty)) - from seminar.forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm - ctx['filtr'] = FiltrForm() + ctx['filtr'] = FiltrForm(initial=self.request.GET) # Pro použití hacku na automatické {{form.media}} v template: ctx['form'] = ctx['filtr']