Filtrování: frontend
This commit is contained in:
		
							parent
							
								
									4a930542b8
								
							
						
					
					
						commit
						cd6ae46570
					
				
					 3 changed files with 87 additions and 0 deletions
				
			
		|  | @ -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]) | ||||||
|  |  | ||||||
|  | @ -4,6 +4,14 @@ | ||||||
| 
 | 
 | ||||||
| {% block content %} | {% block content %} | ||||||
| 
 | 
 | ||||||
|  | <form method=get action=.> | ||||||
|  | {{ filtr.resitele }} | ||||||
|  | {{ filtr.problemy }} | ||||||
|  | Od: {{ filtr.reseni_od }} | ||||||
|  | Do: {{ filtr.reseni_do }} | ||||||
|  | <input type=submit value="→"> | ||||||
|  | </form> | ||||||
|  | 
 | ||||||
| <table> | <table> | ||||||
| 	<tr> | 	<tr> | ||||||
| 		<td></td> {# Prázdná buňka v levém horním rohu #} | 		<td></td> {# Prázdná buňka v levém horním rohu #} | ||||||
|  |  | ||||||
|  | @ -100,6 +100,11 @@ class TabulkaOdevzdanychReseniView(ListView): | ||||||
| 			hodnoty.append(resiteluv_radek) | 			hodnoty.append(resiteluv_radek) | ||||||
| 		ctx['radky'] = list(zip(self.resitele, hodnoty)) | 		ctx['radky'] = list(zip(self.resitele, hodnoty)) | ||||||
| 
 | 
 | ||||||
|  | 		from seminar.forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm | ||||||
|  | 		ctx['filtr'] = FiltrForm() | ||||||
|  | 		# Pro použití hacku na automatické {{form.media}} v template: | ||||||
|  | 		ctx['form'] = ctx['filtr'] | ||||||
|  | 
 | ||||||
| 		return ctx | 		return ctx | ||||||
| 
 | 
 | ||||||
| # Velmi silně inspirováno zdrojáky, FIXME: Nedá se to udělat smysluplněji? | # Velmi silně inspirováno zdrojáky, FIXME: Nedá se to udělat smysluplněji? | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky