WIP: Začátek kódu odevzdávátka
This commit is contained in:
		
							parent
							
								
									f5871457c9
								
							
						
					
					
						commit
						90c7b181c1
					
				
					 1 changed files with 93 additions and 0 deletions
				
			
		
							
								
								
									
										93
									
								
								seminar/views/odevzdavatko.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								seminar/views/odevzdavatko.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,93 @@ | ||||||
|  | from django.views.generic import ListView, DetailView | ||||||
|  | from django.views.generic.base import TemplateView | ||||||
|  | 
 | ||||||
|  | from dataclasses import dataclass | ||||||
|  | import datetime | ||||||
|  | 
 | ||||||
|  | import seminar.models as m | ||||||
|  | from seminar.utils import aktivniResitele, resi_v_rocniku | ||||||
|  | 
 | ||||||
|  | # Co chceme? | ||||||
|  | # - "Tabulku" aktuální řešitelé x zveřejněné problémy, v buňkách počet řešení | ||||||
|  | # 	- TabulkaOdevzdanychReseniView | ||||||
|  | # - Detail konkrétního problému a řešitele -- přehled všech řešení odevzdaných k tomuto problému | ||||||
|  | # 	- ReseniProblemuView | ||||||
|  | # - Detail konkrétního řešení -- všechny soubory, datum, ... | ||||||
|  | # 	- DetailReseniView | ||||||
|  | # | ||||||
|  | # Taky se může hodit: | ||||||
|  | # - Tabulka všech řešitelů x všech problémů? | ||||||
|  | 
 | ||||||
|  | @dataclass | ||||||
|  | class SouhrnReseni: | ||||||
|  | 	"""Dataclass reprezentující data o odevzdaných řešeních pro zobrazení v tabulce.""" | ||||||
|  | 	pocet_reseni : int | ||||||
|  | 	posledni_odevzdani : datetime.datetime | ||||||
|  | 	body : float | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class TabulkaOdevzdanychReseniView(TemplateView): | ||||||
|  | 	template_name = 'TODO' | ||||||
|  | 
 | ||||||
|  | 	def get_context_data(self, *args, **kwargs): | ||||||
|  | 		akt_rocnik = m.Nastaveni.get_solo().aktualni_rocnik	# .get_solo() vrátí tu jedinou instanci, asi... | ||||||
|  | 		resitele = resi_v_rocniku(akt_rocnik) | ||||||
|  | 		zadane_problemy = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY) | ||||||
|  | 		 | ||||||
|  | 		ctx = dict() | ||||||
|  | 		ctx['problemy'] = zadane_problemy | ||||||
|  | 		ctx['resitele'] = resitele | ||||||
|  | 		 | ||||||
|  | 		# Zkonstruujeme jednotlivé řádky | ||||||
|  | 		# Řádky budou indexované řešiteli a budou obsahovat SouhrnyReseni | ||||||
|  | 		# TODO: Tohle se asi nějak dá urychlit / zpřehlednit... | ||||||
|  | 		ctx['radky'] = dict() | ||||||
|  | 		for resitel in resitele: | ||||||
|  | 			ctx['radky'][resitel] = [] | ||||||
|  | 			for problem in zadane_problemy: | ||||||
|  | 				reseni_k_tomuto_problemu = m.Reseni.objects.filter( | ||||||
|  | 						resitele__in=[resitel],	# Snad funguje i takhle | ||||||
|  | 						hodnoceni__problem__in=[problem],	# ditto | ||||||
|  | 						) | ||||||
|  | 					.order_by('-cas_doruceni') | ||||||
|  | 				pocet_reseni = reseni_k_tomuto_problemu.count() | ||||||
|  | 				nejnovejsi = reseni_k_tomuto_problemu.first().cas_doruceni | ||||||
|  | 				pocet_bodu = max( | ||||||
|  | 					[h.body for h in m.Hodnoceni.objects.filter( | ||||||
|  | 							reseni__in=reseni_k_tomuto_problemu, | ||||||
|  | 							problem=problem, | ||||||
|  | 							) | ||||||
|  | 						] | ||||||
|  | 					) | ||||||
|  | 				ctx['radky'][resitel].append( | ||||||
|  | 					SouhrnReseni( | ||||||
|  | 						pocet_reseni=pocet_reseni, | ||||||
|  | 						posledni_odevzdani=nejnovejsi, | ||||||
|  | 						body=pocet_bodu, | ||||||
|  | 						) | ||||||
|  | 		return ctx | ||||||
|  | 
 | ||||||
|  | class ReseniProblemuView(ListView): | ||||||
|  | 	model = m.Reseni | ||||||
|  | 	template_name = 'TODO' | ||||||
|  | 	 | ||||||
|  | 	def get_queryset(self): | ||||||
|  | 		qs = super().get_queryset() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Přehled všech řešení kvůli debugování | ||||||
|  | 
 | ||||||
|  | class SeznamReseniView(ListView): | ||||||
|  | 	model = m.Reseni | ||||||
|  | 	template_name = 'TODO' | ||||||
|  | 
 | ||||||
|  | class SeznamAktualnichReseniView(SeznamReseniView): | ||||||
|  | 	def get_queryset(self): | ||||||
|  | 		qs = super().get_queryset() | ||||||
|  | 		akt_rocnik = m.Nastaveni.get_solo().aktualni_rocnik	# .get_solo() vrátí tu jedinou instanci, asi... | ||||||
|  | 		resitele = resi_v_rocniku(akt_rocnik) | ||||||
|  | 		qs = qs.filter(resitele__in=resitele)	# Doufám, že tohle najde řešení, která maji alespoň jednoho řešitele řešícího v aktuálním ročníku | ||||||
|  | 		return qs | ||||||
		Loading…
	
		Reference in a new issue
	
	 Pavel 'LEdoian' Turinsky
						Pavel 'LEdoian' Turinsky