From cc50f459a7ded6362fdc3ab3038e2ad14bb0226f Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 26 Jan 2021 19:12:01 +0100 Subject: [PATCH] =?UTF-8?q?=C3=9Aprava=20k=C3=B3du=20k=20dod=C4=9Bl=C3=A1n?= =?UTF-8?q?=C3=AD=20filtrovateln=C3=A9=20tabulky?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/views/odevzdavatko.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/seminar/views/odevzdavatko.py b/seminar/views/odevzdavatko.py index 0647b770..d93b4c15 100644 --- a/seminar/views/odevzdavatko.py +++ b/seminar/views/odevzdavatko.py @@ -35,15 +35,22 @@ class TabulkaOdevzdanychReseniView(ListView): template_name = 'seminar/odevzdavatko/tabulka.html' model = m.Hodnoceni + def inicializuj_osy_tabulky(self): + """Vyrobí prvotní querysety pro sloupce a řádky, tj. seznam všech řešitelů a problémů""" + # 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() + def get_queryset(self): - # FIXME: Tenhle blok nemůže být přímo ve třídě, protože před vyrobením databáze neexistuje Nastavení. + 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.zadane_problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic() + self.problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic() qs = super().get_queryset() - qs = qs.filter(problem__in=self.zadane_problemy).select_related('reseni', 'problem').prefetch_related('reseni__resitele__osoba') + qs = qs.filter(problem__in=self.problemy).select_related('reseni', 'problem').prefetch_related('reseni__resitele__osoba') return qs def get_context_data(self, *args, **kwargs): @@ -51,10 +58,10 @@ class TabulkaOdevzdanychReseniView(ListView): 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.zadane_problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic() + self.problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic() ctx = super().get_context_data(*args, **kwargs) - ctx['problemy'] = self.zadane_problemy + ctx['problemy'] = self.problemy ctx['resitele'] = self.resitele tabulka = dict() @@ -81,7 +88,7 @@ class TabulkaOdevzdanychReseniView(ListView): hodnoty = [] for resitel in self.resitele: resiteluv_radek = [] - for problem in self.zadane_problemy: + for problem in self.problemy: if problem in tabulka and resitel in tabulka[problem]: resiteluv_radek.append(tabulka[problem][resitel]) else: