Výsledkovka čísla přesunuta do funkce a rozsekána na menší kusy, optimalizace kódu.
This commit is contained in:
		
							parent
							
								
									ec670a627e
								
							
						
					
					
						commit
						3b328e4b00
					
				
					 1 changed files with 152 additions and 160 deletions
				
			
		|  | @ -61,7 +61,7 @@ class VlozBodyView(generic.ListView): | ||||||
| 		print(self.tema) | 		print(self.tema) | ||||||
| 		self.problemy = Problem.objects.filter(nadproblem = self.tema) | 		self.problemy = Problem.objects.filter(nadproblem = self.tema) | ||||||
| 		print(self.problemy) | 		print(self.problemy) | ||||||
| 		self.reseni = Reseni.objects.filter(problem__in=self.problemy) | 		self.reseni = Reseni.objects.filter(problem__in=self.problemy)	 | ||||||
| 		print(self.reseni) | 		print(self.reseni) | ||||||
| 		return self.reseni | 		return self.reseni | ||||||
| 
 | 
 | ||||||
|  | @ -80,7 +80,7 @@ class ObalkovaniView(generic.ListView): | ||||||
| 	def get_context_data(self, **kwargs): | 	def get_context_data(self, **kwargs): | ||||||
| 		context = super(ObalkovaniView, self).get_context_data(**kwargs) | 		context = super(ObalkovaniView, self).get_context_data(**kwargs) | ||||||
| 		print(self.cislo) | 		print(self.cislo) | ||||||
| 		context['cislo'] = self.cislo | 		context['cislo'] = self.cislo  | ||||||
| 		return context | 		return context | ||||||
| 
 | 
 | ||||||
| class TNLData(object): | class TNLData(object): | ||||||
|  | @ -106,18 +106,22 @@ class TreeNodeView(generic.DetailView): | ||||||
| 		return context | 		return context | ||||||
| 	 | 	 | ||||||
| 
 | 
 | ||||||
| class AktualniZadaniView(TreeNodeView): |  | ||||||
| 	def get_object(self): |  | ||||||
| 		nastaveni = get_object_or_404(Nastaveni) |  | ||||||
| 		return nastaveni.aktualni_cislo.cislonode |  | ||||||
| 
 |  | ||||||
| 	def get_context_data(self,**kwargs): |  | ||||||
| 		nastaveni = get_object_or_404(Nastaveni) |  | ||||||
| 		context = super().get_context_data(**kwargs) |  | ||||||
| 		verejne = nastaveni.aktualni_cislo.verejne() |  | ||||||
| 		context['verejne'] = verejne	 |  | ||||||
| 		return context |  | ||||||
| 
 | 
 | ||||||
|  | #def AktualniZadaniView(request): | ||||||
|  | #	nastaveni = get_object_or_404(Nastaveni) | ||||||
|  | #	verejne = nastaveni.aktualni_cislo.verejne() | ||||||
|  | #	problemy = Problem.objects.filter(cislo_zadani=nastaveni.aktualni_cislo).filter(stav = 'zadany') | ||||||
|  | #	ulohy = problemy.filter(typ = 'uloha').order_by('kod') | ||||||
|  | #	serialy = problemy.filter(typ = 'serial').order_by('kod') | ||||||
|  | #	jednorazove_problemy = [ulohy, serialy] | ||||||
|  | #	return render(request, 'seminar/zadani/AktualniZadani.html', | ||||||
|  | #			{'nastaveni': nastaveni, | ||||||
|  | #			 'jednorazove_problemy': jednorazove_problemy, | ||||||
|  | #			 'temata': verejna_temata(nastaveni.aktualni_rocnik), | ||||||
|  | #			 'verejne': verejne, | ||||||
|  | #				}, | ||||||
|  | #			) | ||||||
|  | # | ||||||
| #def ZadaniTemataView(request): | #def ZadaniTemataView(request): | ||||||
| #	nastaveni = get_object_or_404(Nastaveni) | #	nastaveni = get_object_or_404(Nastaveni) | ||||||
| #	temata = verejna_temata(nastaveni.aktualni_rocnik) | #	temata = verejna_temata(nastaveni.aktualni_rocnik) | ||||||
|  | @ -285,6 +289,7 @@ class CojemamOrganizatoriStariView(generic.ListView): | ||||||
| 
 | 
 | ||||||
| ### Archiv | ### Archiv | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| class ArchivView(generic.ListView): | class ArchivView(generic.ListView): | ||||||
| 	model = Rocnik | 	model = Rocnik | ||||||
| 	template_name='seminar/archiv/cisla.html' | 	template_name='seminar/archiv/cisla.html' | ||||||
|  | @ -295,16 +300,13 @@ class ArchivView(generic.ListView): | ||||||
| 		vyska = 297  # px | 		vyska = 297  # px | ||||||
| 		sirka = 210  # px | 		sirka = 210  # px | ||||||
| 
 | 
 | ||||||
| 		# nejnovějších 10 zveřejněných čísel |  | ||||||
| 		cisla = Cislo.objects.filter(verejne_db=True)[:10] | 		cisla = Cislo.objects.filter(verejne_db=True)[:10] | ||||||
| 
 | 
 | ||||||
| 		# op = os.path, udělá z argumentů cestu |  | ||||||
| 		png_dir = op.join(settings.MEDIA_ROOT, "cislo", "png") | 		png_dir = op.join(settings.MEDIA_ROOT, "cislo", "png") | ||||||
| 
 | 
 | ||||||
| 		# seznam [(url obrázku, číslo)] | 		# seznam [(url obrázku, číslo)] | ||||||
| 		urls = [] | 		urls = [] | ||||||
| 
 | 
 | ||||||
| 		# c je číslo, i je pořadí čísla |  | ||||||
| 		for i, c in enumerate(cisla): | 		for i, c in enumerate(cisla): | ||||||
| 			if not c.pdf: | 			if not c.pdf: | ||||||
| 				continue | 				continue | ||||||
|  | @ -396,7 +398,7 @@ def sloupec_s_poradim(seznam_s_body): | ||||||
| 			sloupec_s_poradim.append("{}.".format(aktualni_poradi)) | 			sloupec_s_poradim.append("{}.".format(aktualni_poradi)) | ||||||
| 		# pokud je skupina větší, vypíšu rozsah | 		# pokud je skupina větší, vypíšu rozsah | ||||||
| 		else: | 		else: | ||||||
| 			sloupec_s_poradim.append("{}.–{}.".format(aktualni_poradi, | 			sloupec_s_poradim.append("{}.–{}.".format(aktualni_poradi,  | ||||||
| 						aktualni_poradi+velikost_skupiny-1)) | 						aktualni_poradi+velikost_skupiny-1)) | ||||||
| 		# zvětšíme aktuální pořadí o tolik, kolik pozic bylo přeskočeno | 		# zvětšíme aktuální pořadí o tolik, kolik pozic bylo přeskočeno | ||||||
| 		aktualni_poradi = aktualni_poradi + velikost_skupiny | 		aktualni_poradi = aktualni_poradi + velikost_skupiny | ||||||
|  | @ -404,10 +406,10 @@ def sloupec_s_poradim(seznam_s_body): | ||||||
| 
 | 
 | ||||||
| ## spočítá součet bodů získaných daným řešitelem za zadaný problém a všechny jeho podproblémy | ## spočítá součet bodů získaných daným řešitelem za zadaný problém a všechny jeho podproblémy | ||||||
| #def __soucet_resitele_problemu(problem, resitel, cislo, soucet): | #def __soucet_resitele_problemu(problem, resitel, cislo, soucet): | ||||||
| #	# sečteme body za daný problém přes všechna řešení daného problému | #	# sečteme body za daný problém přes všechna řešení daného problému  | ||||||
| #	# od daného řešitele | #	# od daného řešitele | ||||||
| #	reseni_resitele = s.Reseni_Resitele.objects.filter(resitele=resitel) | #	reseni_resitele = s.Reseni_Resitele.objects.filter(resitele=resitel) | ||||||
| #	hodnoceni_resitele = problem.hodnoceni.filter(reseni__in=reseni_resitele, | #	hodnoceni_resitele = problem.hodnoceni.filter(reseni__in=reseni_resitele,  | ||||||
| #				cislo_body=cislo) | #				cislo_body=cislo) | ||||||
| #	# XXX chyba na řádku výše - řešení může mít více řešitelů, asi chceme contains | #	# XXX chyba na řádku výše - řešení může mít více řešitelů, asi chceme contains | ||||||
| #	# nebo in | #	# nebo in | ||||||
|  | @ -415,7 +417,7 @@ def sloupec_s_poradim(seznam_s_body): | ||||||
| #		soucet += r.body | #		soucet += r.body | ||||||
| # | # | ||||||
| #	# a přičteme k tomu hodnocení všech podproblémů | #	# a přičteme k tomu hodnocení všech podproblémů | ||||||
| #	for p in problem.podproblem.all(): | #	for p in problem.podproblem.all():  | ||||||
| #	# i přes jméno by to měla být množina jeho podproblémů | #	# i přes jméno by to měla být množina jeho podproblémů | ||||||
| #		soucet += __soucet_resitele_problemu(p, resitel, soucet) | #		soucet += __soucet_resitele_problemu(p, resitel, soucet) | ||||||
| #	return soucet | #	return soucet | ||||||
|  | @ -433,14 +435,15 @@ def hlavni_problem(problem): | ||||||
| 
 | 
 | ||||||
| # vrátí list všech problémů s body v daném čísle, které již nemají nadproblém | # vrátí list všech problémů s body v daném čísle, které již nemají nadproblém | ||||||
| def hlavni_problemy_cisla(cislo): | def hlavni_problemy_cisla(cislo): | ||||||
| 	hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all()	# hodnocení, která se vážou k danému číslu | 	hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all()	 | ||||||
| 
 | 	# hodnocení, která se vážou k danému číslu | ||||||
|  | 	 | ||||||
| 	reseni = [h.reseni for h in hodnoceni] | 	reseni = [h.reseni for h in hodnoceni] | ||||||
| 	problemy = [h.problem for h in hodnoceni] | 	problemy = [h.problem for h in hodnoceni] | ||||||
| 	problemy_set = set(problemy)	# chceme každý problém unikátně, | 	problemy_set = set(problemy)	# chceme každý problém unikátně, | ||||||
| 	problemy = (list(problemy_set)) # převedení na množinu a zpět to zaručí | 	problemy = (list(problemy_set)) # převedení na množinu a zpět to zaručí | ||||||
| 
 | 
 | ||||||
| 	# hlavní problémy čísla | 	# hlavní problémy čísla  | ||||||
| 	# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) | 	# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) | ||||||
| 	hlavni_problemy = [] | 	hlavni_problemy = [] | ||||||
| 	for p in problemy: | 	for p in problemy: | ||||||
|  | @ -450,16 +453,16 @@ def hlavni_problemy_cisla(cislo): | ||||||
| 	hlavni_problemy_set = set(hlavni_problemy) | 	hlavni_problemy_set = set(hlavni_problemy) | ||||||
| 	hlavni_problemy = list(hlavni_problemy_set) | 	hlavni_problemy = list(hlavni_problemy_set) | ||||||
| 	hlavni_problemy.sort(key=lambda k: k.kod_v_rocniku()) # setřídit podle t1, t2, c3, ... | 	hlavni_problemy.sort(key=lambda k: k.kod_v_rocniku()) # setřídit podle t1, t2, c3, ... | ||||||
| 
 | 	 | ||||||
| 	return hlavni_problemy | 	return hlavni_problemy | ||||||
| 
 | 
 | ||||||
| # vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník | # vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník | ||||||
| # POZOR! Aktuálně počítá jen za posledních 10 let od zadaného ročníku |  | ||||||
| def body_resitelu_odjakziva(rocnik, resitele): | def body_resitelu_odjakziva(rocnik, resitele): | ||||||
| 	body_odjakziva = {} | 	body_odjakziva = {} | ||||||
| 
 | 
 | ||||||
| 	for r in resitele: | 	for r in resitele: | ||||||
| 		body_odjakziva[str(r.id)] = 0 | 		body_odjakziva[str(r.id)] = 0 | ||||||
|  | # POZOR! Aktuálně počítá jen za posledních 10 let od zadaného ročníku | ||||||
| #	# Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka | #	# Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka | ||||||
| #	# s aktivními řešiteli) | #	# s aktivními řešiteli) | ||||||
| # | # | ||||||
|  | @ -497,38 +500,6 @@ def body_resitelu_za_rocnik(rocnik, aktivni_resitele): | ||||||
| 				pricti_body(body_za_rocnik, resitel, hodn.body) | 				pricti_body(body_za_rocnik, resitel, hodn.body) | ||||||
| 	return body_za_rocnik | 	return body_za_rocnik | ||||||
| 
 | 
 | ||||||
| #def body_resitele_odjakziva(resitel): |  | ||||||
| #	body = 0 |  | ||||||
| #	resitelova_hodnoceni = Hodnoceni.objects.select_related('body').all().filter(reseni_resitele=resitel) |  | ||||||
| #	# TODO: v radku nahore chceme _in nebo _contains |  | ||||||
| #	for hodnoceni in resitelova_hodnoceni: |  | ||||||
| #		body = body + hodnoceni.body |  | ||||||
| #	return body |  | ||||||
| 
 |  | ||||||
| # spočítá součet všech bodů řešitele za dané číslo |  | ||||||
| #def body_resitele_v_cisle(resitel, cislo): |  | ||||||
| #	hlavni_problemy = hlavni_problemy_cisla(cislo) |  | ||||||
| #	body_resitele = 0 |  | ||||||
| #	for h in hlavni_problemy: |  | ||||||
| #		body_resitele = body_resitele + body_resitele_problemu_v_cisle(h, resitel, cislo) |  | ||||||
| #	# TODO: je rozdíl mezi odevzdanou úlohou za 0 a tím, když řešitel nic neodevzdal |  | ||||||
| #	# řešit přes kontrolu velikosti množiny řešení daného problému do daného čísla? |  | ||||||
| #	# Tady to ale nevadí, tady se počítá součet za číslo. |  | ||||||
| #	return body_resitele |  | ||||||
| 
 |  | ||||||
| # spočítá součet všech bodů řešitele za daný rok (nebo jen do daného čísla včetně) |  | ||||||
| #def body_resitele_v_rocniku(resitel, rocnik, do_cisla=None): |  | ||||||
| #	# pokud do_cisla=None, tak do posledního čísla v ročníku |  | ||||||
| #	# do_cisla je objekt Cislo |  | ||||||
| #	cisla = rocnik.cisla.all() # funkce vrátí pole objektů |  | ||||||
| #	# Cislo už lexikograficky setřízené, viz models |  | ||||||
| #	body = 0 |  | ||||||
| #	for cislo in cisla: |  | ||||||
| #		if cislo.poradi == do_cisla.poradi: break |  | ||||||
| #		# druhá část zaručuje, že máme výsledky do daného čísla včetně |  | ||||||
| #		body = body + body_resitele_v_cisle(resitel, cislo) |  | ||||||
| #	return body |  | ||||||
| 
 |  | ||||||
| # TODO: předělat na nový model | # TODO: předělat na nový model | ||||||
| #def vysledkovka_rocniku(rocnik, jen_verejne=True): | #def vysledkovka_rocniku(rocnik, jen_verejne=True): | ||||||
| #	"""Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve | #	"""Přebírá ročník (např. context["rocnik"]) a vrací výsledkovou listinu ve | ||||||
|  | @ -662,6 +633,120 @@ def pricti_body(slovnik, resitel, body): | ||||||
| 	 | 	 | ||||||
| 	slovnik[str(resitel.id)] += body | 	slovnik[str(resitel.id)] += body | ||||||
| 
 | 
 | ||||||
|  | def secti_body_za_rocnik(cislo, aktivni_resitele): | ||||||
|  | 	# spočítáme všem řešitelům jejich body za ročník | ||||||
|  | 	resitel_rocnikbody_slov = body_resitelu_za_rocnik(cislo.rocnik, aktivni_resitele) | ||||||
|  | 	# zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně | ||||||
|  | 	resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(), | ||||||
|  | 					key = lambda x: x[1], reverse = True) | ||||||
|  | 	return resitel_rocnikbody_sezn | ||||||
|  | 
 | ||||||
|  | # spočítá u řešitelů body za číslo a za jednotlivé hlavní problémy (témata) | ||||||
|  | def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy): | ||||||
|  | 	# TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé | ||||||
|  | 	# pro každý hlavní problém zavedeme slovník s body za daný hlavní problém  | ||||||
|  | 	# pro jednotlivé řešitele (slovník slovníků hlavních problémů) | ||||||
|  | 	hlavni_problemy_slovnik = {} | ||||||
|  | 	for hp in hlavni_problemy: | ||||||
|  | 		hlavni_problemy_slovnik[str(hp.id)] = {} | ||||||
|  | 
 | ||||||
|  | 	# zakládání prázdných záznamů pro řešitele | ||||||
|  | 	cislobody = {} | ||||||
|  | 	for ar in aktivni_resitele: | ||||||
|  | 		# řešitele převedeme na řetězec pomocí unikátního id | ||||||
|  | 		cislobody[str(ar.id)] = "" | ||||||
|  | 		for hp in hlavni_problemy: | ||||||
|  | 			slovnik = hlavni_problemy_slovnik[str(hp.id)] | ||||||
|  | 			slovnik[str(ar.id)] = "" | ||||||
|  | 	 | ||||||
|  | 	# vezmeme všechna řešení s body do daného čísla | ||||||
|  | 	reseni_do_cisla = Reseni.objects.prefetch_related('problem', 'resitele',  | ||||||
|  | 				'hodnoceni_set').filter(hodnoceni__cislo_body=cislo) | ||||||
|  | 	 | ||||||
|  | 	# projdeme všechna řešení do čísla a přičteme body každému řešiteli do celkových | ||||||
|  | 	# bodů i do bodů za problém | ||||||
|  | 	for reseni in reseni_do_cisla: | ||||||
|  | 		 | ||||||
|  | 		# řešení může řešit více problémů | ||||||
|  | 		for prob in list(reseni.problem.all()): | ||||||
|  | 			nadproblem = hlavni_problem(prob) | ||||||
|  | 			nadproblem_slovnik = hlavni_problemy_slovnik[str(nadproblem.id)] | ||||||
|  | 			 | ||||||
|  | 			# a mít více hodnocení | ||||||
|  | 			for hodn in list(reseni.hodnoceni_set.all()): | ||||||
|  | 				body = hodn.body	 | ||||||
|  | 			 | ||||||
|  | 				# a mít více řešitelů | ||||||
|  | 				for resitel in list(reseni.resitele.all()): | ||||||
|  | 					pricti_body(cislobody, resitel, body) | ||||||
|  | 					pricti_body(nadproblem_slovnik, resitel, body) | ||||||
|  | 	return hlavni_problemy_slovnik, cislobody | ||||||
|  | 		 | ||||||
|  | 
 | ||||||
|  | def spocti_vysledkovku_cisla(cislo, context=None): | ||||||
|  | 	if context is None: | ||||||
|  | 		context = {} | ||||||
|  | 	 | ||||||
|  | 	hlavni_problemy = hlavni_problemy_cisla(cislo) | ||||||
|  | 	## TODO dostat pro tyto problémy součet v daném čísle pro daného řešitele | ||||||
|  | 	## TODO možná chytřeji vybírat aktivní řešitele | ||||||
|  | 	# aktivní řešitelé - chceme letos něco poslal, TODO později vyfiltrujeme ty, kdo mají  | ||||||
|  | 	# u alespoň jedné hodnoty něco jiného než NULL | ||||||
|  | 	aktivni_resitele = list(Resitel.objects.filter( | ||||||
|  | 			rok_maturity__gte=cislo.rocnik.druhy_rok())) | ||||||
|  | 			# TODO: zkusit hodnoceni__rocnik... | ||||||
|  | 			#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik) | ||||||
|  | 
 | ||||||
|  | 	# získáme body za číslo | ||||||
|  | 	hlavni_problemy_slovnik, cislobody = secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy) | ||||||
|  | 
 | ||||||
|  | 	# získáme body za ročník, seznam obsahuje dvojice (řešitel_id, body) setřízené sestupně | ||||||
|  | 	resitel_rocnikbody_sezn = secti_body_za_rocnik(cislo, aktivni_resitele) | ||||||
|  | 
 | ||||||
|  | 	# získáme body odjakživa | ||||||
|  | 	resitel_odjakzivabody_slov = body_resitelu_odjakziva(cislo.rocnik.druhy_rok(),  | ||||||
|  | 								aktivni_resitele) | ||||||
|  | 
 | ||||||
|  | 	# řešitelé setřídění podle bodů za číslo sestupně | ||||||
|  | 	setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn] | ||||||
|  | 	setrizeni_resitele = [Resitel.objects.get(id=i) for i in setrizeni_resitele_id] | ||||||
|  | 			 | ||||||
|  | 	# spočítáme pořadí řešitelů | ||||||
|  | 	setrizeni_resitele_body = [dvojice[1] for dvojice in resitel_rocnikbody_sezn] | ||||||
|  | 	poradi = sloupec_s_poradim(setrizeni_resitele_body) | ||||||
|  | 
 | ||||||
|  | 	# vytvoříme jednotlivé sloupce výsledkovky | ||||||
|  | 	radky_vysledkovky = [] | ||||||
|  | 	i = 0 | ||||||
|  | 	for ar_id in setrizeni_resitele_id: | ||||||
|  | 		# získáme seznam bodů za problémy pro daného řešitele | ||||||
|  | 		problemy = [] 		 | ||||||
|  | 		for hp in hlavni_problemy: | ||||||
|  | 			problemy.append(hlavni_problemy_slovnik[str(hp.id)][ar_id]) | ||||||
|  | 		# vytáhneme informace pro daného řešitele | ||||||
|  | 		radek = RadekVysledkovky( | ||||||
|  | 			poradi[i], # pořadí | ||||||
|  | 			Resitel.objects.get(id=ar_id), # řešitel (z id) | ||||||
|  | 			problemy, # seznam bodů za hlavní problémy čísla | ||||||
|  | 			cislobody[ar_id], # body za číslo | ||||||
|  | 			setrizeni_resitele_body[i], # body za ročník (spočítané výše s pořadím) | ||||||
|  | 			resitel_odjakzivabody_slov[ar_id]) # body odjakživa | ||||||
|  | 		print("{}: body za problémy - {}, číslobody - {}, ročníkbody - {}, odjakživabody - {}".format(radek.resitel,  | ||||||
|  | 			radek.body_problemy_sezn, radek.body_cislo, radek.body_rocnik, radek.body_celkem_odjakziva)) | ||||||
|  | 		radky_vysledkovky.append(radek) | ||||||
|  | 		print("Přikládám {}-tý řádek.".format(i)) | ||||||
|  | 		i += 1 | ||||||
|  | 
 | ||||||
|  | 	print("Následuje předávání do kontextu.") | ||||||
|  | 	# vytahané informace předáváme do kontextu | ||||||
|  | 	context['cislo'] = cislo | ||||||
|  | 	context['radky_vysledkovky'] = radky_vysledkovky | ||||||
|  | 	context['problemy'] = hlavni_problemy | ||||||
|  | 	#context['v_cisle_zadane'] = TODO | ||||||
|  | 	#context['resene_problemy'] = resene_problemy | ||||||
|  | 	print("Předávám kontext.") | ||||||
|  | 	return context | ||||||
|  | 
 | ||||||
| class CisloView(generic.DetailView): | class CisloView(generic.DetailView): | ||||||
| 	model = Cislo | 	model = Cislo | ||||||
| 	template_name = 'seminar/archiv/cislo.html' | 	template_name = 'seminar/archiv/cislo.html' | ||||||
|  | @ -685,101 +770,8 @@ class CisloView(generic.DetailView): | ||||||
| 		context = super(CisloView, self).get_context_data(**kwargs) | 		context = super(CisloView, self).get_context_data(**kwargs) | ||||||
| 
 | 
 | ||||||
| 		cislo = context['cislo'] | 		cislo = context['cislo'] | ||||||
| 		hlavni_problemy = hlavni_problemy_cisla(cislo) | 		# vrátíme context (aktuálně obsahuje jen věci ohledně výsledkovky | ||||||
| 		# TODO setřídit hlavní problémy čísla podle id, ať jsou ve stejném pořadí pokaždé | 		return spocti_vysledkovku_cisla(cislo, context) | ||||||
| 		# pro každý hlavní problém zavedeme slovník s body za daný hlavní problém  |  | ||||||
| 		# pro jednotlivé řešitele (slovník slovníků hlavních problémů) |  | ||||||
| 		hlavni_problemy_slovnik = {} |  | ||||||
| 		for hp in hlavni_problemy: |  | ||||||
| 			hlavni_problemy_slovnik[str(hp.id)] = {} |  | ||||||
| 
 |  | ||||||
| 		## TODO dostat pro tyto problémy součet v daném čísle pro daného řešitele |  | ||||||
| 		## TODO možná chytřeji vybírat aktivní řešitele |  | ||||||
| 		# aktivní řešitelé - chceme letos něco poslal, TODO později vyfiltrujeme ty, kdo mají  |  | ||||||
| 		# u alespoň jedné hodnoty něco jiného než NULL |  | ||||||
| 		aktivni_resitele = list(Resitel.objects.filter( |  | ||||||
| 				rok_maturity__gte=cislo.rocnik.druhy_rok())) |  | ||||||
| 				# TODO: zkusit hodnoceni__rocnik... |  | ||||||
| 				#.filter(hodnoceni_set__rocnik__eq=cislo_rocnik) |  | ||||||
| 		# zakládání prázdných záznamů pro řešitele |  | ||||||
| 		cislobody = {} |  | ||||||
| 		for ar in aktivni_resitele: |  | ||||||
| 			# řešitele převedeme na řetězec pomocí unikátního id |  | ||||||
| 			cislobody[str(ar.id)] = "" |  | ||||||
| 			for hp in hlavni_problemy: |  | ||||||
| 				slovnik = hlavni_problemy_slovnik[str(hp.id)] |  | ||||||
| 				slovnik[str(ar.id)] = "" |  | ||||||
| 		 |  | ||||||
| 		# vezmeme všechna řešení s body do daného čísla |  | ||||||
| 		reseni_do_cisla = Reseni.objects.prefetch_related('problem', 'resitele', 'hodnoceni_set').filter(hodnoceni__cislo_body=cislo) |  | ||||||
| 		 |  | ||||||
| 		# projdeme všechna řešení do čísla a přičteme body každému řešiteli do celkových |  | ||||||
| 		# bodů i do bodů za problém |  | ||||||
| 		for reseni in reseni_do_cisla: |  | ||||||
| 			 |  | ||||||
| 			# řešení může řešit více problémů |  | ||||||
| 			for prob in list(reseni.problem.all()): |  | ||||||
| 				nadproblem = hlavni_problem(prob) |  | ||||||
| 				nadproblem_slovnik = hlavni_problemy_slovnik[str(nadproblem.id)] |  | ||||||
| 				 |  | ||||||
| 				# a více hodnocení |  | ||||||
| 				for hodn in list(reseni.hodnoceni_set.all()): |  | ||||||
| 					body = hodn.body	 |  | ||||||
| 					 |  | ||||||
| 					# a více řešitelů |  | ||||||
| 					for resitel in list(reseni.resitele.all()): |  | ||||||
| 						pricti_body(cislobody, resitel, body) |  | ||||||
| 						pricti_body(nadproblem_slovnik, resitel, body) |  | ||||||
| 
 |  | ||||||
| 		# zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně |  | ||||||
| 		resitel_rocnikbody_slov = body_resitelu_za_rocnik(cislo.rocnik, aktivni_resitele) |  | ||||||
| 		resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(), |  | ||||||
| 						key = lambda x: x[1], reverse = True) |  | ||||||
| 	 |  | ||||||
| 		# získáme body odjakživa |  | ||||||
| 		resitel_odjakzivabody_slov = body_resitelu_odjakziva(cislo.rocnik.druhy_rok(),  |  | ||||||
| 									aktivni_resitele) |  | ||||||
| 	 |  | ||||||
| 		# řešitelé setřídění podle bodů za číslo sestupně |  | ||||||
| 		setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn] |  | ||||||
| 		setrizeni_resitele = [Resitel.objects.get(id=i) for i in setrizeni_resitele_id] |  | ||||||
| 				 |  | ||||||
| 		# vytvoříme jednotlivé sloupce výsledkovky |  | ||||||
| 		radky_vysledkovky = [] |  | ||||||
| 		odjakziva_body = [] |  | ||||||
| 		rocnik_body = [] |  | ||||||
| 		cislo_body = [] |  | ||||||
| 		hlavni_problemy_body = [] |  | ||||||
| 		for ar_id in setrizeni_resitele_id: |  | ||||||
| 			# vytáhneme ze slovníků body pro daného řešitele |  | ||||||
| 			odjakziva_body.append(resitel_odjakzivabody_slov[ar_id]) |  | ||||||
| 			rocnik_body.append(resitel_rocnikbody_slov[ar_id]) |  | ||||||
| 			cislo_body.append(cislobody[ar_id]) |  | ||||||
| 			problemy = [] |  | ||||||
| 			for hp in hlavni_problemy: |  | ||||||
| 				problemy.append(hlavni_problemy_slovnik[str(hp.id)][ar_id]) |  | ||||||
| 			hlavni_problemy_body.append(problemy) |  | ||||||
| 			print("{}: body za problémy - {}, číslobody - {}, ročníkbody - {}, odjakživabody - ".format(ar_id, problemy, cislobody[ar_id], resitel_rocnikbody_slov[ar_id])) |  | ||||||
| 		# pořadí určíme pomocí funkce, které dáme celkové body za ročník vzestupně |  | ||||||
| 		poradi = sloupec_s_poradim(rocnik_body) |  | ||||||
| 
 |  | ||||||
| 		radky_vysledkovky = [] |  | ||||||
| 		for i in range(0, len(setrizeni_resitele_id)): |  | ||||||
| 			radek = RadekVysledkovky(poradi[i], setrizeni_resitele[i], |  | ||||||
| 				hlavni_problemy_body[i], cislo_body[i], rocnik_body[i], |  | ||||||
| 				odjakziva_body[i]) |  | ||||||
| 			radky_vysledkovky.append(radek) |  | ||||||
| 			print("Přikládám {}-tý řádek.".format(i)) |  | ||||||
| 
 |  | ||||||
| 		print("Následuje předávání do kontextu.") |  | ||||||
| 		# vytahané informace předáváme do kontextu |  | ||||||
| 		context['cislo'] = cislo |  | ||||||
| 		context['radky_vysledkovky'] = radky_vysledkovky |  | ||||||
| 		context['problemy'] = hlavni_problemy |  | ||||||
| #		context['v_cisle_zadane'] = TODO |  | ||||||
| #		context['resene_problemy'] = resene_problemy |  | ||||||
| 		print("Předávám kontext.") |  | ||||||
| 		return context |  | ||||||
| 
 | 
 | ||||||
| #		problemy = sorted(set(r.problem for r in reseni), key=lambda x:(poradi_typu[x.typ], x.kod_v_rocniku())) | #		problemy = sorted(set(r.problem for r in reseni), key=lambda x:(poradi_typu[x.typ], x.kod_v_rocniku())) | ||||||
| #		#setridi problemy podle typu a poradi zadani | #		#setridi problemy podle typu a poradi zadani | ||||||
|  | @ -1006,7 +998,7 @@ def soustredeniUcastniciExportView(request,soustredeni): | ||||||
| class ClankyResitelView(generic.ListView): | class ClankyResitelView(generic.ListView): | ||||||
| 	model = Problem | 	model = Problem | ||||||
| 	template_name = 'seminar/clanky/resitelske_clanky.html' | 	template_name = 'seminar/clanky/resitelske_clanky.html' | ||||||
| 	queryset = Clanek.objects.filter(stav=Problem.STAV_ZADANY, resitelsky=True).select_related('cislo__rocnik').order_by('-cislo__rocnik__rocnik', 'kod') | 	queryset = Clanek.objects.filter(stav=Problem.STAV_ZADANY).select_related('cislo_zadani__rocnik').order_by('-cislo_zadani__rocnik__rocnik', 'kod') | ||||||
| 
 | 
 | ||||||
| # FIXME: pokud chceme orgoclanky, tak nejak zavest do modelu a podle toho odkomentovat a upravit | # FIXME: pokud chceme orgoclanky, tak nejak zavest do modelu a podle toho odkomentovat a upravit | ||||||
| #class ClankyOrganizatorView(generic.ListView)<F12>: | #class ClankyOrganizatorView(generic.ListView)<F12>: | ||||||
|  | @ -1292,7 +1284,7 @@ def loginView(request): | ||||||
| 	if request.method == 'POST': | 	if request.method == 'POST': | ||||||
| 		form = LoginForm(request.POST) | 		form = LoginForm(request.POST) | ||||||
| 		if form.is_valid(): | 		if form.is_valid(): | ||||||
| 			user = authenticate(request, | 			user = authenticate(request,  | ||||||
| 				username=form.cleaned_data['username'], | 				username=form.cleaned_data['username'], | ||||||
| 				password=form.cleaned_data['password']) | 				password=form.cleaned_data['password']) | ||||||
| 			print(form.cleaned_data) | 			print(form.cleaned_data) | ||||||
|  | @ -1300,8 +1292,8 @@ def loginView(request): | ||||||
| 				login(request,user) | 				login(request,user) | ||||||
| 				return HttpResponseRedirect('/') | 				return HttpResponseRedirect('/') | ||||||
| 			else: | 			else: | ||||||
| 				return render(request, | 				return render(request,  | ||||||
| 					'seminar/login.html', | 					'seminar/login.html',  | ||||||
| 					{'form': form, 'login_error': 'Neplatné jméno nebo heslo'}) | 					{'form': form, 'login_error': 'Neplatné jméno nebo heslo'}) | ||||||
| 
 | 
 | ||||||
| 	else: | 	else: | ||||||
|  | @ -1319,7 +1311,7 @@ def logoutView(request): | ||||||
| def prihlaska_log_gdpr_safe(logger, gdpr_logger, msg, form_data): | def prihlaska_log_gdpr_safe(logger, gdpr_logger, msg, form_data): | ||||||
| 	msg = "{}, form_hash:{}".format(msg,hash(form_data)) | 	msg = "{}, form_hash:{}".format(msg,hash(form_data)) | ||||||
| 	logger.warn(msg) | 	logger.warn(msg) | ||||||
| 	gdpr_logger.warn(msg+", form:{}".format(form_data)) | 	gdpr_logger.warn(msg+", form:{}".format(form_data))		 | ||||||
| 
 | 
 | ||||||
| from django.forms.models import model_to_dict | from django.forms.models import model_to_dict | ||||||
| def resitelEditView(request): | def resitelEditView(request): | ||||||
|  | @ -1329,7 +1321,7 @@ def resitelEditView(request): | ||||||
|     osoba_edit = Osoba.objects.get(user=u) |     osoba_edit = Osoba.objects.get(user=u) | ||||||
|     resitel_edit = osoba_edit.resitel |     resitel_edit = osoba_edit.resitel | ||||||
|     user_edit = osoba_edit.user |     user_edit = osoba_edit.user | ||||||
|     ## Vytvoření slovníku, kterým předvyplním formulář |     ## Vytvoření slovníku, kterým předvyplním formulář  | ||||||
|     prefill_1=model_to_dict(user_edit) |     prefill_1=model_to_dict(user_edit) | ||||||
|     prefill_2=model_to_dict(resitel_edit) |     prefill_2=model_to_dict(resitel_edit) | ||||||
|     prefill_3=model_to_dict(osoba_edit) |     prefill_3=model_to_dict(osoba_edit) | ||||||
|  | @ -1387,7 +1379,7 @@ def prihlaskaView(request): | ||||||
| 			fcd = form.cleaned_data | 			fcd = form.cleaned_data | ||||||
| 			form_hash = hash(fcd) | 			form_hash = hash(fcd) | ||||||
| 			form_logger.info(fcd,form_hash=form_hash) | 			form_logger.info(fcd,form_hash=form_hash) | ||||||
| 
 | 			 | ||||||
| 			with transaction.atomic(): | 			with transaction.atomic(): | ||||||
| 				u = User.objects.create_user( | 				u = User.objects.create_user( | ||||||
| 					username=fcd['username'], | 					username=fcd['username'], | ||||||
|  | @ -1426,7 +1418,7 @@ def prihlaskaView(request): | ||||||
| 					rok_maturity = fcd['rok_maturity'], | 					rok_maturity = fcd['rok_maturity'], | ||||||
| 					zasilat = fcd['zasilat'] | 					zasilat = fcd['zasilat'] | ||||||
| 					) | 					) | ||||||
| 
 | 				 | ||||||
| 				r.save() | 				r.save() | ||||||
| 				r.osoba = o | 				r.osoba = o | ||||||
| 				if fcd.get('skola'): | 				if fcd.get('skola'): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Anet
						Anet