Detailní výsledkovka (start)
This commit is contained in:
		
							parent
							
								
									749d16ee89
								
							
						
					
					
						commit
						4d348ad9c7
					
				
					 2 changed files with 170 additions and 16 deletions
				
			
		|  | @ -74,9 +74,24 @@ | ||||||
|         <th class='border-r'># |         <th class='border-r'># | ||||||
|         <th class='border-r'>Jméno |         <th class='border-r'>Jméno | ||||||
|         {% for p in problemy %} |         {% for p in problemy %} | ||||||
|         <th class='border-r'><a href="{{ p.verejne_url }}">{{ p.kod_v_rocniku }}</a> |         <th class='border-r' id="problem{{ p.kod_v_rocniku }}"><a href="{{ p.verejne_url }}">{{ p.kod_v_rocniku }}</a> | ||||||
|  | 
 | ||||||
|  |             {# TODELETE #} | ||||||
|  |                 {% for podproblemy in podproblemy_iter.next %} | ||||||
|  |                     <th class='border-r podproblem{{ forloop.parentloop.counter }}'><a href="{{ podproblemy.verejne_url }}">{{ podproblemy.kod_v_rocniku }}</a> | ||||||
|  |                 {% endfor %} | ||||||
|  |             {# TODELETE #} | ||||||
|  | 
 | ||||||
|         {% endfor %} |         {% endfor %} | ||||||
|         {% if ostatni %}<th class='border-r'>Ostatní {% endif %} |         {% if ostatni %}<th class='border-r'>Ostatní {% endif %} | ||||||
|  | 
 | ||||||
|  |             {# TODELETE #} | ||||||
|  |                 {% for podproblemy in podproblemy_iter.next %} | ||||||
|  |                     <th class='border-r podproblem{{ problemy.len }}'><a href="{{ podproblemy.verejne_url }}">{{ podproblemy.kod_v_rocniku }}</a> | ||||||
|  |                 {% endfor %} | ||||||
|  |             {# TODELETE #} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         <th class='border-r'>Za číslo |         <th class='border-r'>Za číslo | ||||||
|         <th class='border-r'>Za ročník |         <th class='border-r'>Za ročník | ||||||
|         <th class='border-r'>Odjakživa |         <th class='border-r'>Odjakživa | ||||||
|  | @ -90,6 +105,13 @@ | ||||||
|             {{ rv.resitel.osoba.plne_jmeno }} |             {{ rv.resitel.osoba.plne_jmeno }} | ||||||
|         {% for b in rv.body_problemy_sezn %} |         {% for b in rv.body_problemy_sezn %} | ||||||
|         <td class='border-r'>{{ b }} |         <td class='border-r'>{{ b }} | ||||||
|  | 
 | ||||||
|  |             {# TODELETE #} | ||||||
|  |                 {% for body_podproblemu in rv.body_podproblemy_iter.next %} | ||||||
|  |                     <td class='border-r podproblem{{ forloop.parentloop.counter }}'>{{ body_podproblemu }} | ||||||
|  |                 {% endfor %} | ||||||
|  |             {# TODELETE #} | ||||||
|  | 
 | ||||||
|         {% endfor %} |         {% endfor %} | ||||||
|         <td class='border-r'>{{ rv.body_cislo }} |         <td class='border-r'>{{ rv.body_cislo }} | ||||||
|         <td class='border-r'><b>{{ rv.body_rocnik }}</b> |         <td class='border-r'><b>{{ rv.body_rocnik }}</b> | ||||||
|  | @ -97,6 +119,23 @@ | ||||||
|       </tr> |       </tr> | ||||||
|     {% endfor %} |     {% endfor %} | ||||||
|     </table> |     </table> | ||||||
|  | 
 | ||||||
|  |       {# TODELETE #} | ||||||
|  |         <script> | ||||||
|  |           {% for p in problemy %} | ||||||
|  |             $(".podproblem{{ forloop.counter }}").css("display", "none") | ||||||
|  |             $("#problem{{ forloop.counter }}")[0].addEventListener('mouseover', podproblem{{ forloop.counter }}) | ||||||
|  |             $("#problem{{ forloop.counter }}")[0].addEventListener('mouseout', podproblem{{ forloop.counter }}end) | ||||||
|  |             function podproblem{{ forloop.counter }}(event) { | ||||||
|  |                 $(".podproblem{{ forloop.counter }}").css("display", "") | ||||||
|  |             } | ||||||
|  |             function podproblem{{ forloop.counter }}end(event) { | ||||||
|  |                 $(".podproblem{{ forloop.counter }}").css("display", "none") | ||||||
|  |             } | ||||||
|  |           {% endfor %} | ||||||
|  |         </script> | ||||||
|  |       {# TODELETE #} | ||||||
|  | 
 | ||||||
|   {% endif %} |   {% endif %} | ||||||
| 
 | 
 | ||||||
|   {% if not cislo.verejna_vysledkovka and user.je_org %} |   {% if not cislo.verejna_vysledkovka and user.je_org %} | ||||||
|  |  | ||||||
|  | @ -721,15 +721,24 @@ def hlavni_problemy_rocniku(rocnik, jen_verejne=True): | ||||||
| 	 | 	 | ||||||
| 	return hlavni_problemy | 	return hlavni_problemy | ||||||
| 
 | 
 | ||||||
| def hlavni_problemy_cisla(cislo): | 
 | ||||||
| 	""" Vrátí seznam všech problémů s body v daném čísle, které již nemají nadproblém. """ | def problemy_cisla(cislo): | ||||||
| 	hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all()	 | 	""" Vrátí seznam všech problémů s body v daném čísle. """ | ||||||
|  | 	hodnoceni = cislo.hodnoceni.select_related('problem', 'reseni').all() | ||||||
| 	# hodnocení, která se vážou k danému číslu | 	# 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čí | ||||||
|  | 
 | ||||||
|  | 	return problemy | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def hlavni_problemy_cisla(cislo, problemy=None): | ||||||
|  | 	""" Vrátí seznam všech problémů s body v daném čísle, které již nemají nadproblém. """ | ||||||
|  | 	if problemy is None: | ||||||
|  | 		problemy = problemy_cisla(cislo) | ||||||
| 
 | 
 | ||||||
| 	# 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) | ||||||
|  | @ -744,6 +753,27 @@ def hlavni_problemy_cisla(cislo): | ||||||
| 	 | 	 | ||||||
| 	return hlavni_problemy | 	return hlavni_problemy | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | def podproblemy_v_cislu(cislo, problemy=None, hlavni_problemy=None): | ||||||
|  | 	""" Vrátí seznam všech problémů s body v daném čísle v poli 'indexovaném' tématy. """ | ||||||
|  | 	if problemy is None: | ||||||
|  | 		problemy = problemy_cisla(cislo) | ||||||
|  | 	if hlavni_problemy is None: | ||||||
|  | 		hlavni_problemy = hlavni_problemy_cisla(cislo, problemy) | ||||||
|  | 
 | ||||||
|  | 	podproblemy = dict((hp.id, []) for hp in hlavni_problemy) | ||||||
|  | 	hlavni_problemy = set(hlavni_problemy) | ||||||
|  | 	podproblemy[-1] = [] | ||||||
|  | 
 | ||||||
|  | 	for problem in problemy: | ||||||
|  | 		h_problem = hlavni_problem(problem) | ||||||
|  | 		if h_problem in hlavni_problemy: | ||||||
|  | 			podproblemy[h_problem.id].append(problem) | ||||||
|  | 		else: | ||||||
|  | 			podproblemy[-1].append(problem) | ||||||
|  | 
 | ||||||
|  | 	return podproblemy | ||||||
|  | 
 | ||||||
| def body_resitelu(resitele, za, odjakziva=True): | def body_resitelu(resitele, za, odjakziva=True): | ||||||
| 	""" Funkce počítající počty bodů pro zadané řešitele,  | 	""" Funkce počítající počty bodů pro zadané řešitele,  | ||||||
| 	buď odjakživa do daného ročníku/čísla anebo za daný ročník/číslo. | 	buď odjakživa do daného ročníku/čísla anebo za daný ročník/číslo. | ||||||
|  | @ -940,8 +970,8 @@ class RadekVysledkovkyCisla(object): | ||||||
| 	"""Obsahuje věci, které se hodí vědět při konstruování výsledkovky. | 	"""Obsahuje věci, které se hodí vědět při konstruování výsledkovky. | ||||||
| 	Umožňuje snazší práci v templatu (lepší, než seznam).""" | 	Umožňuje snazší práci v templatu (lepší, než seznam).""" | ||||||
| 
 | 
 | ||||||
| 	def __init__(self, poradi, resitel, body_problemy_sezn,  | 	def __init__(self, poradi, resitel, body_problemy_sezn, | ||||||
| 				body_cislo, body_rocnik, body_odjakziva, rok): | 				body_cislo, body_rocnik, body_odjakziva, rok, body_podproblemy, body_podproblemy_iter): | ||||||
| 		self.resitel = resitel | 		self.resitel = resitel | ||||||
| 		self.rocnik_resitele = resitel.rocnik(rok) | 		self.rocnik_resitele = resitel.rocnik(rok) | ||||||
| 		self.body_cislo = body_cislo | 		self.body_cislo = body_cislo | ||||||
|  | @ -950,7 +980,9 @@ class RadekVysledkovkyCisla(object): | ||||||
| 		self.poradi = poradi | 		self.poradi = poradi | ||||||
| 		self.body_problemy_sezn = body_problemy_sezn | 		self.body_problemy_sezn = body_problemy_sezn | ||||||
| 		self.titul = resitel.get_titul(body_odjakziva) | 		self.titul = resitel.get_titul(body_odjakziva) | ||||||
| 	 | 		self.body_podproblemy = body_podproblemy | ||||||
|  | 		self.body_podproblemy_iter = body_podproblemy_iter  # TODELETE | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def pricti_body(slovnik, resitel, body): | def pricti_body(slovnik, resitel, body): | ||||||
| 	""" Přiřazuje danému řešiteli body do slovníku. """ | 	""" Přiřazuje danému řešiteli body do slovníku. """ | ||||||
|  | @ -1039,11 +1071,81 @@ def secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy=None): | ||||||
| 					pricti_body(nadproblem_slovnik, resitel, body) | 					pricti_body(nadproblem_slovnik, resitel, body) | ||||||
| 	return hlavni_problemy_slovnik, cislobody | 	return hlavni_problemy_slovnik, cislobody | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | def secti_body_za_cislo_podle_temat(cislo, aktivni_resitele, podproblemy=None, temata=None): | ||||||
|  | 	""" Spočítá u řešitelů body za číslo za úlohy v jednotlivých hlavních problémech (témata).""" | ||||||
|  | 	if temata is None: | ||||||
|  | 		temata = hlavni_problemy_cisla(cislo) | ||||||
|  | 
 | ||||||
|  | 	if podproblemy is None: | ||||||
|  | 		podproblemy_v_cislu(cislo, hlavni_problemy=temata) | ||||||
|  | 
 | ||||||
|  | 	body_slovnik = {} | ||||||
|  | 	for tema in temata: | ||||||
|  | 		body_slovnik[tema.id] = {} | ||||||
|  | 		for problem in podproblemy[tema.id]: | ||||||
|  | 			body_slovnik[tema.id][problem.id] = {} | ||||||
|  | 	body_slovnik[-1] = {} | ||||||
|  | 	for problem in podproblemy[-1]: | ||||||
|  | 		body_slovnik[-1][problem.id] = {} | ||||||
|  | 
 | ||||||
|  | 	# zakládání prázdných záznamů pro řešitele | ||||||
|  | 	for ar in aktivni_resitele: | ||||||
|  | 		for tema in temata: | ||||||
|  | 			for problem in podproblemy[tema.id]: | ||||||
|  | 				body_slovnik[tema.id][problem.id][ar.id] = "" | ||||||
|  | 
 | ||||||
|  | 		for problem in podproblemy[-1]: | ||||||
|  | 			body_slovnik[-1][problem.id][ar.id] = "" | ||||||
|  | 
 | ||||||
|  | 	temata = set(t.id for t in temata) | ||||||
|  | 
 | ||||||
|  | 	# 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) | ||||||
|  | 			if nadproblem.id in temata: | ||||||
|  | 				nadproblem_slovnik = body_slovnik[nadproblem.id] | ||||||
|  | 			else: | ||||||
|  | 				nadproblem_slovnik = body_slovnik[-1] | ||||||
|  | 
 | ||||||
|  | 			problem_slovnik = nadproblem_slovnik[prob.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()): | ||||||
|  | 					if resitel not in aktivni_resitele: | ||||||
|  | 						print("Skipping {}".format(resitel.id)) | ||||||
|  | 						continue | ||||||
|  | 					pricti_body(problem_slovnik, resitel, body) | ||||||
|  | 	return body_slovnik | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # TODELETE | ||||||
|  | class FixedIterator: | ||||||
|  | 	def next(self): | ||||||
|  | 		return self.niter.__next__() | ||||||
|  | 
 | ||||||
|  | 	def __init__(self, niter): | ||||||
|  | 		self.niter = niter | ||||||
|  | # TODELETE | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def vysledkovka_cisla(cislo, context=None): | def vysledkovka_cisla(cislo, context=None): | ||||||
| 	if context is None: | 	if context is None: | ||||||
| 		context = {} | 		context = {} | ||||||
| 	 | 	problemy = problemy_cisla(cislo) | ||||||
| 	hlavni_problemy = hlavni_problemy_cisla(cislo) | 	hlavni_problemy = hlavni_problemy_cisla(cislo, problemy) | ||||||
| 	## TODO možná chytřeji vybírat aktivní ř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í  | 	# 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 | 	# u alespoň jedné hodnoty něco jiného než NULL | ||||||
|  | @ -1075,6 +1177,10 @@ def vysledkovka_cisla(cislo, context=None): | ||||||
| 
 | 
 | ||||||
| 	temata_a_spol = list(filter(ne_clanek_ne_konfera, hlavni_problemy)) | 	temata_a_spol = list(filter(ne_clanek_ne_konfera, hlavni_problemy)) | ||||||
| 
 | 
 | ||||||
|  | 	# získáme body u jednotlivých témat | ||||||
|  | 	podproblemy = podproblemy_v_cislu(cislo, problemy, temata_a_spol) | ||||||
|  | 	problemy_slovnik = secti_body_za_cislo_podle_temat(cislo, aktivni_resitele, podproblemy, temata_a_spol) | ||||||
|  | 
 | ||||||
| 	# def not_empty(value): | 	# def not_empty(value): | ||||||
| 	# 	return value != '' | 	# 	return value != '' | ||||||
| 	# | 	# | ||||||
|  | @ -1084,20 +1190,26 @@ def vysledkovka_cisla(cislo, context=None): | ||||||
| 
 | 
 | ||||||
| 	for ar_id in setrizeni_resitele_id: | 	for ar_id in setrizeni_resitele_id: | ||||||
| 		# získáme seznam bodů za problémy pro daného řešitele | 		# získáme seznam bodů za problémy pro daného řešitele | ||||||
| 		problemy = [] 		 | 		body_problemy = [] | ||||||
|  | 		body_podproblemy = [] | ||||||
| 		for hp in temata_a_spol: | 		for hp in temata_a_spol: | ||||||
| 			problemy.append(hlavni_problemy_slovnik[hp.id][ar_id]) | 			body_problemy.append(hlavni_problemy_slovnik[hp.id][ar_id]) | ||||||
|  | 			body_podproblemy.append([problemy_slovnik[hp.id][it.id][ar_id] for it in podproblemy[hp.id]]) | ||||||
| 		if je_nejake_ostatni: | 		if je_nejake_ostatni: | ||||||
| 			problemy.append(hlavni_problemy_slovnik[-1][ar_id]) | 			body_problemy.append(hlavni_problemy_slovnik[-1][ar_id]) | ||||||
|  | 			body_podproblemy.append([problemy_slovnik[-1][it.id][ar_id] for it in podproblemy[-1]]) | ||||||
| 		# vytáhneme informace pro daného řešitele | 		# vytáhneme informace pro daného řešitele | ||||||
| 		radek = RadekVysledkovkyCisla( | 		radek = RadekVysledkovkyCisla( | ||||||
| 			poradi[i], # pořadí | 			poradi[i], # pořadí | ||||||
| 			Resitel.objects.get(id=ar_id), # řešitel (z id) | 			Resitel.objects.get(id=ar_id), # řešitel (z id) | ||||||
| 			problemy, # seznam bodů za hlavní problémy čísla | 			body_problemy, # seznam bodů za hlavní problémy čísla | ||||||
| 			cislobody[ar_id], # body za číslo | 			cislobody[ar_id], # body za číslo | ||||||
| 			setrizeni_resitele_body[i], # body za ročník (spočítané výše s pořadím) | 			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 | 			resitel_odjakzivabody_slov[ar_id], # body odjakživa | ||||||
| 			cislo.rocnik) # ročník semináře pro zjištění ročníku řešitele | 			cislo.rocnik, | ||||||
|  | 			body_podproblemy,  # body všech podproblémů | ||||||
|  | 			FixedIterator(body_podproblemy.__iter__())  # TODELETE | ||||||
|  | 		)  # ročník semináře pro zjištění ročníku řešitele | ||||||
| 		radky_vysledkovky.append(radek) | 		radky_vysledkovky.append(radek) | ||||||
| 		i += 1 | 		i += 1 | ||||||
| 
 | 
 | ||||||
|  | @ -1106,6 +1218,9 @@ def vysledkovka_cisla(cislo, context=None): | ||||||
| 	context['radky_vysledkovky'] = radky_vysledkovky | 	context['radky_vysledkovky'] = radky_vysledkovky | ||||||
| 	context['problemy'] = temata_a_spol | 	context['problemy'] = temata_a_spol | ||||||
| 	context['ostatni'] = je_nejake_ostatni | 	context['ostatni'] = je_nejake_ostatni | ||||||
|  | 	pt = [podproblemy[it.id] for it in temata_a_spol]+[podproblemy[-1]] | ||||||
|  | 	context['podproblemy'] = pt | ||||||
|  | 	context['podproblemy_iter'] = FixedIterator(pt.__iter__())  # TODELETE | ||||||
| 	#context['v_cisle_zadane'] = TODO | 	#context['v_cisle_zadane'] = TODO | ||||||
| 	#context['resene_problemy'] = resene_problemy | 	#context['resene_problemy'] = resene_problemy | ||||||
| 	return context | 	return context | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jonas Havelka
						Jonas Havelka