|
@ -316,3 +316,77 @@ class JednoHodnoceniForm(forms.ModelForm): |
|
|
OhodnoceniReseniFormSet = formset_factory(JednoHodnoceniForm, |
|
|
OhodnoceniReseniFormSet = formset_factory(JednoHodnoceniForm, |
|
|
extra = 0, |
|
|
extra = 0, |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
# FIXME: Ideálně by mělo být součástí třídy níž, ale neumím to udělat |
|
|
|
|
|
DATE_FORMAT = '%Y-%m-%d' |
|
|
|
|
|
|
|
|
|
|
|
class OdevzdavatkoTabulkaFiltrForm(forms.Form): |
|
|
|
|
|
"""Form pro filtrování přehledové odevzdávátkové tabulky |
|
|
|
|
|
|
|
|
|
|
|
Inspirováno https://kam.mff.cuni.cz/mffzoom/""" |
|
|
|
|
|
|
|
|
|
|
|
# Věci definované níž se importují i ve views pro odevzdávátko (Inspirováno https://docs.djangoproject.com/en/3.1/ref/models/fields/#field-choices) |
|
|
|
|
|
|
|
|
|
|
|
RESITELE_RELEVANTNI = 'relevantni' |
|
|
|
|
|
RESITELE_LETOSNI = 'letosni' |
|
|
|
|
|
RESITELE_CHOICES = [ |
|
|
|
|
|
(RESITELE_RELEVANTNI, 'Relevantní řešitelé'), # I.e. nezobrazovat prázdné řádky tabulky |
|
|
|
|
|
(RESITELE_LETOSNI, 'Všichni letošní'), |
|
|
|
|
|
# Možná: všechny vč. historických? |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
PROBLEMY_MOJE = 'moje' |
|
|
|
|
|
PROBLEMY_LETOSNI = 'letosni' |
|
|
|
|
|
PROBLEMY_CHOICES = [ |
|
|
|
|
|
(PROBLEMY_MOJE, 'Moje problémy'), # Letošní problémy, které mají v sobě nebo v nadproblémech přiřazeného daného orga |
|
|
|
|
|
(PROBLEMY_LETOSNI, 'Všechny letošní'), |
|
|
|
|
|
# TODO: *hlavní problémy, možná všechny... |
|
|
|
|
|
# XXX: Chtělo by to i "aktuálně zadané... |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
# TODO: Typy problémů (problémy, úlohy, ostatní, všechny)? Jen některá řešení (obodovaná/neobodovaná, víc řešitelů, ...)? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def gen_terminy(): |
|
|
|
|
|
import datetime |
|
|
|
|
|
from time import strftime |
|
|
|
|
|
|
|
|
|
|
|
aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik |
|
|
|
|
|
aktualni_cislo = m.Nastaveni.get_solo().aktualni_cislo |
|
|
|
|
|
|
|
|
|
|
|
result = [] |
|
|
|
|
|
|
|
|
|
|
|
for cislo in m.Cislo.objects.filter( |
|
|
|
|
|
rocnik=aktualni_rocnik, |
|
|
|
|
|
poradi__lte=aktualni_cislo.poradi, |
|
|
|
|
|
).reverse(): # Standardně se řadí od nejnovějšího čísla |
|
|
|
|
|
# Předem je mi líto kohokoliv, kdo tyhle řádky bude číst... |
|
|
|
|
|
if cislo.datum_vydani is not None and cislo.datum_vydani <= datetime.date.today(): |
|
|
|
|
|
result.append(( |
|
|
|
|
|
strftime(DATE_FORMAT, cislo.datum_vydani.timetuple()), |
|
|
|
|
|
f"Vydání {cislo.poradi}. čísla")) |
|
|
|
|
|
if cislo.datum_preddeadline is not None and cislo.datum_preddeadline <= datetime.date.today(): |
|
|
|
|
|
result.append(( |
|
|
|
|
|
strftime(DATE_FORMAT, cislo.datum_preddeadline.timetuple()), |
|
|
|
|
|
f"Předdeadline {cislo.poradi}. čísla")) |
|
|
|
|
|
if cislo.datum_deadline_soustredeni is not None and cislo.datum_deadline_soustredeni <= datetime.date.today(): |
|
|
|
|
|
result.append(( |
|
|
|
|
|
strftime(DATE_FORMAT, cislo.datum_deadline_soustredeni.timetuple()), |
|
|
|
|
|
f"Sous. deadline {cislo.poradi}. čísla")) |
|
|
|
|
|
if cislo.datum_deadline is not None and cislo.datum_deadline <= datetime.date.today(): |
|
|
|
|
|
result.append(( |
|
|
|
|
|
strftime(DATE_FORMAT, cislo.datum_deadline.timetuple()), |
|
|
|
|
|
f"Finální deadline {cislo.poradi}. čísla")) |
|
|
|
|
|
result.append(( |
|
|
|
|
|
strftime(DATE_FORMAT, datetime.date.today().timetuple()), f"Dnes")) |
|
|
|
|
|
|
|
|
|
|
|
return result |
|
|
|
|
|
|
|
|
|
|
|
# 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]) |
|
|