From ffaf7d5d5946e4597f4bb0e821ff727151186466 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 2 Mar 2021 23:15:15 +0100 Subject: [PATCH 1/6] =?UTF-8?q?Odevzd=C3=A1v=C3=A1tko:=20ve=20t=C5=99?= =?UTF-8?q?=C3=ADd=C4=9B=20nem=C3=A1=20b=C3=BDt=20k=C3=B3d,=20jinak=20to?= =?UTF-8?q?=20rozb=C3=ADj=C3=AD=20testdata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/forms.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/seminar/forms.py b/seminar/forms.py index 39714fae..800b8e35 100644 --- a/seminar/forms.py +++ b/seminar/forms.py @@ -382,11 +382,15 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): return result + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # choices jako parametr Select widgetu neumí brát callable, jen iterable, takže si pro jednoduchost můžu rovnou uložit výsledek sem... + # A "sem" znamená do libovolné metody, protože jinak se jedná o kód, který django spustí při inicializaci a protože potřebujeme databázi, tak by spadnul při vyrábění testdat... + self.terminy = self.gen_terminy() + # NOTE: Initial definuji pro jednotlivé fieldy, aby to bylo tady a nebylo potřeba to řešit ve views... resitele = forms.ChoiceField(choices=RESITELE_CHOICES, initial=RESITELE_RELEVANTNI) problemy = forms.ChoiceField(choices=PROBLEMY_CHOICES, initial=PROBLEMY_MOJE) - # choices jako parametr Select widgetu neumí brát callable, jen iterable, takže si pro jednoduchost můžu rovnou uložit výsledek sem... - terminy = gen_terminy() reseni_od = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=terminy), initial=terminy[-2]) reseni_do = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=terminy), initial=terminy[-1]) From 90fb41e8626dc302b0e3d6c7bd9efff94fd86268 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 9 Mar 2021 20:28:34 +0100 Subject: [PATCH 2/6] =?UTF-8?q?Opravil=20jsem=20initial=20v=C4=9Bci,=20aby?= =?UTF-8?q?=20nepadaly=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/forms.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/seminar/forms.py b/seminar/forms.py index 800b8e35..ba27c2df 100644 --- a/seminar/forms.py +++ b/seminar/forms.py @@ -347,7 +347,8 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): # TODO: Typy problémů (problémy, úlohy, ostatní, všechny)? Jen některá řešení (obodovaná/neobodovaná, víc řešitelů, ...)? - def gen_terminy(): + @classmethod + def gen_terminy(cls): import datetime from time import strftime @@ -382,15 +383,26 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): return result + @classmethod + def gen_initial(cls): + terminy = cls.gen_terminy() + initial = { + 'resitele': cls.RESITELE_RELEVANTNI, + 'problemy': cls.PROBLEMY_MOJE, + 'reseni_od': terminy[-2], + 'reseni_do': terminy[-1], + } + return initial + def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + super().__init__(initial=self.gen_initial(), *args, **kwargs) # choices jako parametr Select widgetu neumí brát callable, jen iterable, takže si pro jednoduchost můžu rovnou uložit výsledek sem... # A "sem" znamená do libovolné metody, protože jinak se jedná o kód, který django spustí při inicializaci a protože potřebujeme databázi, tak by spadnul při vyrábění testdat... self.terminy = self.gen_terminy() # NOTE: Initial definuji pro jednotlivé fieldy, aby to bylo tady a nebylo potřeba to řešit ve views... - resitele = forms.ChoiceField(choices=RESITELE_CHOICES, initial=RESITELE_RELEVANTNI) - problemy = forms.ChoiceField(choices=PROBLEMY_CHOICES, initial=PROBLEMY_MOJE) + resitele = forms.ChoiceField(choices=RESITELE_CHOICES) + problemy = forms.ChoiceField(choices=PROBLEMY_CHOICES) - reseni_od = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=terminy), initial=terminy[-2]) - reseni_do = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=terminy), initial=terminy[-1]) +# reseni_od = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=self.terminy)) + reseni_do = forms.DateField(input_formats=[DATE_FORMAT]) From 75742b72645f9e4b2a0e903551848e1857a3d85e Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 9 Mar 2021 20:38:47 +0100 Subject: [PATCH 3/6] s/FormFiltr/FiltrForm --- seminar/views/odevzdavatko.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/seminar/views/odevzdavatko.py b/seminar/views/odevzdavatko.py index d1cedb1b..14305b10 100644 --- a/seminar/views/odevzdavatko.py +++ b/seminar/views/odevzdavatko.py @@ -57,10 +57,10 @@ class TabulkaOdevzdanychReseniView(ListView): 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") + resitele = FiltrForm.get_initial_for_field(FiltrForm.resitele, "resitele") + problemy = FiltrForm.get_initial_for_field(FiltrForm.problemy, "problemy") + resitele_od = FiltrForm.get_initial_for_field(FiltrForm.resitele_od, "resitele_od") + resitele_do = FiltrForm.get_initial_for_field(FiltrForm.resitele_do, "resitele_do") # Filtrujeme! From 4f04efd51908f939630918f4737f96cd3392a1ab Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 9 Mar 2021 21:33:53 +0100 Subject: [PATCH 4/6] =?UTF-8?q?P=C3=A1r=20fix=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Initial nemá dostat lidské řetězce - Zahozeno get_initial_for_field --- seminar/forms.py | 12 +++++++++--- seminar/views/odevzdavatko.py | 9 +++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/seminar/forms.py b/seminar/forms.py index ba27c2df..5fbd54a3 100644 --- a/seminar/forms.py +++ b/seminar/forms.py @@ -389,13 +389,17 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): initial = { 'resitele': cls.RESITELE_RELEVANTNI, 'problemy': cls.PROBLEMY_MOJE, - 'reseni_od': terminy[-2], - 'reseni_do': terminy[-1], + 'reseni_od': terminy[-2][0], + 'reseni_do': terminy[-1][0], } return initial def __init__(self, *args, **kwargs): - super().__init__(initial=self.gen_initial(), *args, **kwargs) + if 'initial' not in kwargs: + super().__init__(initial=self.gen_initial(), *args, **kwargs) + else: + super().__init__(*args, **kwargs) + # choices jako parametr Select widgetu neumí brát callable, jen iterable, takže si pro jednoduchost můžu rovnou uložit výsledek sem... # A "sem" znamená do libovolné metody, protože jinak se jedná o kód, který django spustí při inicializaci a protože potřebujeme databázi, tak by spadnul při vyrábění testdat... self.terminy = self.gen_terminy() @@ -405,4 +409,6 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): problemy = forms.ChoiceField(choices=PROBLEMY_CHOICES) # reseni_od = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=self.terminy)) +# reseni_do = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=self.terminy)) + reseni_od = forms.DateField(input_formats=[DATE_FORMAT]) reseni_do = forms.DateField(input_formats=[DATE_FORMAT]) diff --git a/seminar/views/odevzdavatko.py b/seminar/views/odevzdavatko.py index 14305b10..7cc95d77 100644 --- a/seminar/views/odevzdavatko.py +++ b/seminar/views/odevzdavatko.py @@ -57,10 +57,11 @@ class TabulkaOdevzdanychReseniView(ListView): reseni_od = fcd["reseni_od"] reseni_do = fcd["reseni_do"] else: - resitele = FiltrForm.get_initial_for_field(FiltrForm.resitele, "resitele") - problemy = FiltrForm.get_initial_for_field(FiltrForm.problemy, "problemy") - resitele_od = FiltrForm.get_initial_for_field(FiltrForm.resitele_od, "resitele_od") - resitele_do = FiltrForm.get_initial_for_field(FiltrForm.resitele_do, "resitele_do") + initial = FiltrForm.gen_initial() + resitele = initial['resitele'] + problemy = initial['problemy'] + reseni_od = initial['reseni_od'] + reseni_do = initial['reseni_do'] # Filtrujeme! From 428d1c5db9178e54401aff07d88da61b6cfb094d Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 16 Mar 2021 20:06:45 +0100 Subject: [PATCH 5/6] =?UTF-8?q?Odevzd=C3=A1v=C3=A1tko:=20Implementov=C3=A1?= =?UTF-8?q?ni=20"Relevantn=C3=AD=20=C5=99e=C5=A1itel=C3=A9"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/views/odevzdavatko.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/seminar/views/odevzdavatko.py b/seminar/views/odevzdavatko.py index 7cc95d77..5458a8ca 100644 --- a/seminar/views/odevzdavatko.py +++ b/seminar/views/odevzdavatko.py @@ -66,9 +66,10 @@ class TabulkaOdevzdanychReseniView(ListView): # Filtrujeme! aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci + self.chteni_resitele = resitele # Zapamatování pro get_context_data 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 + # TODO: Zkontrolovat, že resi_v_rocniku vrací QuerySet (jinak asi bude žrát spoustu zdrojů zbytečně) + self.resitele = resi_v_rocniku(aktualni_rocnik) # Prvotní sada, pokud nebude mít body, odstraní se v get_context_data elif resitele == FiltrForm.RESITELE_LETOSNI: self.resitele = resi_v_rocniku(aktualni_rocnik) @@ -119,16 +120,20 @@ class TabulkaOdevzdanychReseniView(ListView): pridej_reseni(hodnoceni.problem, resitel, hodnoceni.body, hodnoceni.reseni.cas_doruceni) hodnoty = [] + resitele_do_tabulky = [] for resitel in self.resitele: + dostal_body = False resiteluv_radek = [] for problem in self.problemy: if problem in tabulka and resitel in tabulka[problem]: resiteluv_radek.append(tabulka[problem][resitel]) + dostal_body = True else: resiteluv_radek.append(None) - hodnoty.append(resiteluv_radek) - ctx['radky'] = list(zip(self.resitele, hodnoty)) - + if self.chteni_resitele != FiltrForm.RESITELE_RELEVANTNI or dostal_body: + hodnoty.append(resiteluv_radek) + resitele_do_tabulky.append(resitel) + ctx['radky'] = list(zip(resitele_do_tabulky, hodnoty)) ctx['filtr'] = FiltrForm(initial=self.request.GET) # Pro použití hacku na automatické {{form.media}} v template: ctx['form'] = ctx['filtr'] From cf175a50b2ff8a7a6e0f8ee0ebaa7fb115af7e4d Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 16 Mar 2021 21:37:58 +0100 Subject: [PATCH 6/6] =?UTF-8?q?Odevzd=C3=A1v=C3=A1tko:=20skoro=20spr=C3=A1?= =?UTF-8?q?vn=C4=9B=20formul=C3=A1=C5=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/forms.py | 22 +++++++++++++++++----- seminar/views/odevzdavatko.py | 4 ++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/seminar/forms.py b/seminar/forms.py index 5fbd54a3..7018c1e9 100644 --- a/seminar/forms.py +++ b/seminar/forms.py @@ -383,14 +383,25 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): return result + @classmethod + def gen_terminy_safe(cls): + "Při prvotních migracích / nasazeních webu neexistuje nastavení, takže to hodí výjimku, kterou musíme požrat..." + try: + return cls.gen_terminy() + except NotImplementedError: + return [ + ('1970-01-01', "Je to rozbitý"), + ('2012-12-12', "Svět skončil v roce 2012") + ] + @classmethod def gen_initial(cls): terminy = cls.gen_terminy() initial = { 'resitele': cls.RESITELE_RELEVANTNI, 'problemy': cls.PROBLEMY_MOJE, - 'reseni_od': terminy[-2][0], - 'reseni_do': terminy[-1][0], + 'reseni_od': terminy[-2], + 'reseni_do': terminy[-1], } return initial @@ -399,16 +410,17 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): super().__init__(initial=self.gen_initial(), *args, **kwargs) else: super().__init__(*args, **kwargs) - # choices jako parametr Select widgetu neumí brát callable, jen iterable, takže si pro jednoduchost můžu rovnou uložit výsledek sem... # A "sem" znamená do libovolné metody, protože jinak se jedná o kód, který django spustí při inicializaci a protože potřebujeme databázi, tak by spadnul při vyrábění testdat... self.terminy = self.gen_terminy() + self.fields['reseni_od'].widget = forms.Select(choices=self.gen_terminy_safe()) + self.fields['reseni_od'].initial = self.terminy[-2] + self.fields['reseni_do'].widget = forms.Select(choices=self.gen_terminy_safe()) + self.fields['reseni_do'].initial = self.terminy[-1] # NOTE: Initial definuji pro jednotlivé fieldy, aby to bylo tady a nebylo potřeba to řešit ve views... resitele = forms.ChoiceField(choices=RESITELE_CHOICES) problemy = forms.ChoiceField(choices=PROBLEMY_CHOICES) -# reseni_od = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=self.terminy)) -# reseni_do = forms.DateField(input_formats=[DATE_FORMAT], widget=forms.Select(choices=self.terminy)) reseni_od = forms.DateField(input_formats=[DATE_FORMAT]) reseni_do = forms.DateField(input_formats=[DATE_FORMAT]) diff --git a/seminar/views/odevzdavatko.py b/seminar/views/odevzdavatko.py index 5458a8ca..5c64bc11 100644 --- a/seminar/views/odevzdavatko.py +++ b/seminar/views/odevzdavatko.py @@ -60,8 +60,8 @@ class TabulkaOdevzdanychReseniView(ListView): initial = FiltrForm.gen_initial() resitele = initial['resitele'] problemy = initial['problemy'] - reseni_od = initial['reseni_od'] - reseni_do = initial['reseni_do'] + reseni_od = initial['reseni_od'][0] + reseni_do = initial['reseni_do'][0] # Filtrujeme!