Odevzdávací tabulka v0.5
This commit is contained in:
		
							parent
							
								
									cd6ae46570
								
							
						
					
					
						commit
						e3b8ff716e
					
				
					 1 changed files with 40 additions and 13 deletions
				
			
		|  | @ -12,6 +12,7 @@ import logging | |||
| 
 | ||||
| import seminar.models as m | ||||
| import seminar.forms as f | ||||
| from seminar.forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm | ||||
| from seminar.utils import aktivniResitele, resi_v_rocniku | ||||
| 
 | ||||
| logger = logging.getLogger(__name__) | ||||
|  | @ -41,28 +42,55 @@ class TabulkaOdevzdanychReseniView(ListView): | |||
| 
 | ||||
| 	def inicializuj_osy_tabulky(self): | ||||
| 		"""Vyrobí prvotní querysety pro sloupce a řádky, tj. seznam všech řešitelů a problémů""" | ||||
| 		# FIXME: jméno metody není vypovídající... | ||||
| 		# 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() | ||||
| 		self.reseni = m.Reseni.objects.all() | ||||
| 
 | ||||
| 		form = FiltrForm(self.request.GET) | ||||
| 		if form.is_valid(): | ||||
| 			fcd = form.cleaned_data | ||||
| 			resitele = fcd["resitele"] | ||||
| 			problemy = fcd["problemy"] | ||||
| 			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") | ||||
| 			 | ||||
| 
 | ||||
| 		# Filtrujeme! | ||||
| 		aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik	# .get_solo() vrátí tu jedinou instanci | ||||
| 		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 | ||||
| 		elif resitele == FiltrForm.RESITELE_LETOSNI: | ||||
| 			self.resitele = resi_v_rocniku(aktualni_rocnik) | ||||
| 
 | ||||
| 		if problemy == FiltrForm.PROBLEMY_MOJE: | ||||
| 			org = m.Organizator.objects.get(osoba__user=self.request.user) | ||||
| 			from django.db.models import Q | ||||
| 			self.problemy = self.problemy.filter(Q(autor=org)|Q(garant=org)|Q(opravovatele=org), stav=m.Problem.STAV_ZADANY) | ||||
| 		elif problemy == FiltrForm.PROBLEMY_LETOSNI: | ||||
| 			self.problemy = self.problemy.filter(stav=m.Problem.STAV_ZADANY) | ||||
| 			#self.problemy = list(filter(lambda problem: problem.rocnik() == aktualni_rocnik, self.problemy)) # DB HOG? # FIXME: některé problémy nemají ročník.... | ||||
| 		# 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.problemy = self.problemy.non_polymorphic() | ||||
| 
 | ||||
| 		self.reseni = self.reseni.filter(cas_doruceni__date__gte=reseni_od, cas_doruceni__date__lte=reseni_do) | ||||
| 
 | ||||
| 	def get_queryset(self): | ||||
| 		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.problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic() | ||||
| 
 | ||||
| 		qs = super().get_queryset() | ||||
| 		qs = qs.filter(problem__in=self.problemy).select_related('reseni', 'problem').prefetch_related('reseni__resitele__osoba') | ||||
| 		qs = qs.filter(problem__in=self.problemy, reseni__in=self.reseni, reseni__resitele__in=self.resitele).select_related('reseni', 'problem').prefetch_related('reseni__resitele__osoba') | ||||
| 		return qs | ||||
| 
 | ||||
| 	def get_context_data(self, *args, **kwargs): | ||||
| 		# FIXME: Tenhle blok nemůže být přímo ve třídě, protože před vyrobením databáze neexistuje Nastavení. | ||||
| 		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.problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY).non_polymorphic() | ||||
| 		# self.resitele, self.reseni a self.problemy jsou již nastavené | ||||
| 
 | ||||
| 		ctx = super().get_context_data(*args, **kwargs) | ||||
| 		ctx['problemy'] = self.problemy | ||||
|  | @ -100,8 +128,7 @@ class TabulkaOdevzdanychReseniView(ListView): | |||
| 			hodnoty.append(resiteluv_radek) | ||||
| 		ctx['radky'] = list(zip(self.resitele, hodnoty)) | ||||
| 
 | ||||
| 		from seminar.forms import OdevzdavatkoTabulkaFiltrForm as FiltrForm | ||||
| 		ctx['filtr'] = FiltrForm() | ||||
| 		ctx['filtr'] = FiltrForm(initial=self.request.GET) | ||||
| 		# Pro použití hacku na automatické {{form.media}} v template: | ||||
| 		ctx['form'] = ctx['filtr'] | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky