Browse Source

Tabulka řešení: Další varianty pro různé ročníky

middleware_test
Pavel "LEdoian" Turinsky 3 years ago
parent
commit
ca495456db
  1. 17
      seminar/forms.py
  2. 1
      seminar/urls.py
  3. 11
      seminar/views/odevzdavatko.py

17
seminar/forms.py

@ -347,7 +347,7 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form):
@classmethod @classmethod
def gen_terminy(cls): def gen_terminy(cls, rocnik=None):
import datetime import datetime
from time import strftime from time import strftime
@ -362,6 +362,11 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form):
logger.error("Rozbitá databáze (před počátečními migracemi?)") logger.error("Rozbitá databáze (před počátečními migracemi?)")
return [('broken', 'Je to rozbitý'), ('fubar', 'Nefunguje to')] return [('broken', 'Je to rozbitý'), ('fubar', 'Nefunguje to')]
# FIXME: Tohle je hnusný monkey patch, mělo by to být nějak zahrnuto výš.
if rocnik is not None:
aktualni_rocnik = rocnik
aktualni_cislo = m.Cislo.objects.filter(rocnik=rocnik).order_by('poradi').last()
result = [] result = []
for cislo in m.Cislo.objects.filter( for cislo in m.Cislo.objects.filter(
@ -391,8 +396,8 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form):
return result return result
@classmethod @classmethod
def gen_initial(cls): def gen_initial(cls, rocnik=None):
terminy = cls.gen_terminy() terminy = cls.gen_terminy(rocnik)
initial = { initial = {
'resitele': cls.RESITELE_RELEVANTNI, 'resitele': cls.RESITELE_RELEVANTNI,
'problemy': cls.PROBLEMY_MOJE, 'problemy': cls.PROBLEMY_MOJE,
@ -402,14 +407,14 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form):
} }
return initial return initial
def __init__(self, *args, **kwargs): def __init__(self, *args, rocnik=None, **kwargs):
if 'initial' not in kwargs: if 'initial' not in kwargs:
super().__init__(initial=self.gen_initial(), *args, **kwargs) super().__init__(initial=self.gen_initial(rocnik), *args, **kwargs)
else: else:
super().__init__(*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... # 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... # 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.terminy = self.gen_terminy(rocnik)
self.fields['reseni_od'].widget = forms.Select(choices=self.gen_terminy()) self.fields['reseni_od'].widget = forms.Select(choices=self.gen_terminy())
self.fields['reseni_od'].initial = self.terminy[-2] self.fields['reseni_od'].initial = self.terminy[-2]
self.fields['reseni_do'].widget = forms.Select(choices=self.gen_terminy()) self.fields['reseni_do'].widget = forms.Select(choices=self.gen_terminy())

1
seminar/urls.py

@ -173,6 +173,7 @@ urlpatterns = [
# name='seminar_autocomplete_organizator') # name='seminar_autocomplete_organizator')
path('org/reseni/', org_required(views.TabulkaOdevzdanychReseniView.as_view()), name='odevzdavatko_tabulka'), path('org/reseni/', org_required(views.TabulkaOdevzdanychReseniView.as_view()), name='odevzdavatko_tabulka'),
path('org/reseni/rocnik/<int:rocnik>/', org_required(views.TabulkaOdevzdanychReseniView.as_view()), name='odevzdavatko_tabulka'),
path('org/reseni/<int:problem>/<int:resitel>/', org_required(views.ReseniProblemuView.as_view()), name='odevzdavatko_reseni_resitele_k_problemu'), path('org/reseni/<int:problem>/<int:resitel>/', org_required(views.ReseniProblemuView.as_view()), name='odevzdavatko_reseni_resitele_k_problemu'),
path('org/reseni/<int:pk>', org_required(viewMethodSwitch(get=views.DetailReseniView.as_view(), post=views.hodnoceniReseniView)), name='odevzdavatko_detail_reseni'), path('org/reseni/<int:pk>', org_required(viewMethodSwitch(get=views.DetailReseniView.as_view(), post=views.hodnoceniReseniView)), name='odevzdavatko_detail_reseni'),
path('org/reseni/all', org_required(views.SeznamReseniView.as_view())), path('org/reseni/all', org_required(views.SeznamReseniView.as_view())),

11
seminar/views/odevzdavatko.py

@ -53,7 +53,11 @@ class TabulkaOdevzdanychReseniView(ListView):
self.problemy = m.Problem.objects.all() self.problemy = m.Problem.objects.all()
self.reseni = m.Reseni.objects.all() self.reseni = m.Reseni.objects.all()
form = FiltrForm(self.request.GET) aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci
if 'rocnik' in self.kwargs:
aktualni_rocnik = m.Rocnik.objects.get(rocnik=self.kwargs['rocnik'])
form = FiltrForm(self.request.GET, rocnik=aktualni_rocnik)
if form.is_valid(): if form.is_valid():
fcd = form.cleaned_data fcd = form.cleaned_data
resitele = fcd["resitele"] resitele = fcd["resitele"]
@ -62,7 +66,7 @@ class TabulkaOdevzdanychReseniView(ListView):
reseni_do = fcd["reseni_do"] reseni_do = fcd["reseni_do"]
jen_neobodovane = fcd["neobodovane"] jen_neobodovane = fcd["neobodovane"]
else: else:
initial = FiltrForm.gen_initial() initial = FiltrForm.gen_initial(aktualni_rocnik)
resitele = initial['resitele'] resitele = initial['resitele']
problemy = initial['problemy'] problemy = initial['problemy']
reseni_od = initial['reseni_od'][0] reseni_od = initial['reseni_od'][0]
@ -70,9 +74,6 @@ class TabulkaOdevzdanychReseniView(ListView):
jen_neobodovane = initial["neobodovane"] jen_neobodovane = initial["neobodovane"]
# Filtrujeme!
aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik # .get_solo() vrátí tu jedinou instanci
# Chceme jen letošní problémy # Chceme jen letošní problémy
# FIXME: Neexistuje metoda, jak dostat starší problémy… # FIXME: Neexistuje metoda, jak dostat starší problémy…
self.problemy = self.problemy.filter(Q(Tema___rocnik=aktualni_rocnik) | Q(Uloha___cislo_zadani__rocnik = aktualni_rocnik) | Q(Clanek___cislo__rocnik = aktualni_rocnik) | Q(Konfera___soustredeni__rocnik = aktualni_rocnik)) self.problemy = self.problemy.filter(Q(Tema___rocnik=aktualni_rocnik) | Q(Uloha___cislo_zadani__rocnik = aktualni_rocnik) | Q(Clanek___cislo__rocnik = aktualni_rocnik) | Q(Konfera___soustredeni__rocnik = aktualni_rocnik))

Loading…
Cancel
Save