Funkce použité pouze ve výsledkovce přesunuty do výsledkovky
This commit is contained in:
		
							parent
							
								
									0e92526a8a
								
							
						
					
					
						commit
						623124e833
					
				
					 4 changed files with 49 additions and 83 deletions
				
			
		|  | @ -7,8 +7,6 @@ from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModel | |||
| from solo.admin import SingletonModelAdmin | ||||
| from django.utils.safestring import mark_safe | ||||
| 
 | ||||
| from seminar.utils import hlavni_problem | ||||
| 
 | ||||
| # Todo: reversion | ||||
| 
 | ||||
| import seminar.models as m | ||||
|  | @ -99,7 +97,7 @@ class CisloAdmin(admin.ModelAdmin): | |||
| 					ch.stav = m.Problem.STAV_ZADANY | ||||
| 					ch.save() | ||||
| 
 | ||||
| 					hp = hlavni_problem(ch) | ||||
| 					hp = ch.hlavni_problem | ||||
| 					if hp.stav not in (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): | ||||
| 						hp.stav = m.Problem.STAV_ZADANY | ||||
| 						hp.save() | ||||
|  |  | |||
|  | @ -24,7 +24,6 @@ from taggit.managers import TaggableManager | |||
| from reversion import revisions as reversion | ||||
| 
 | ||||
| from seminar.utils import roman | ||||
| from seminar.utils import hlavni_problem | ||||
| from treenode import treelib | ||||
| 
 | ||||
| from unidecode import unidecode # Používám pro získání ID odkazu (ještě je to někde po někom zakomentované) | ||||
|  | @ -98,7 +97,7 @@ class Rocnik(SeminarModelBase): | |||
| 		return vc[-1] if vc else None | ||||
| 
 | ||||
| 	def verejne_vysledkovky_cisla(self): | ||||
| 		vc = list(self.cisla.filter(verejna_vysledkovka=True)) | ||||
| 		vc = list(self.cisla.filter(deadline_v_cisle__verejna_vysledkovka=True)) | ||||
| 		vc.sort(key=lambda c: c.poradi) | ||||
| 		return vc | ||||
| 
 | ||||
|  | @ -483,7 +482,10 @@ class Problem(SeminarModelBase,PolymorphicModel): | |||
| 	@cached_property | ||||
| 	def hlavni_problem(self): | ||||
| 		""" Pro daný problém vrátí jeho nejvyšší nadproblém.""" | ||||
| 		return hlavni_problem(self) | ||||
| 		problem = self | ||||
| 		while not (problem.nadproblem is None): | ||||
| 			problem = problem.nadproblem | ||||
| 		return problem | ||||
| 
 | ||||
| # FIXME - k úloze | ||||
| 	def body_v_zavorce(self): | ||||
|  |  | |||
|  | @ -248,77 +248,6 @@ def viewMethodSwitch(get, post): | |||
| 	 | ||||
| 	return NewView.as_view() | ||||
| 
 | ||||
| def cisla_rocniku(rocnik, jen_verejne=True): | ||||
| 	""" | ||||
| 	Vrátí všechna čísla daného ročníku. | ||||
| 	Parametry: | ||||
| 		rocnik (Rocnik): ročník semináře | ||||
| 		jen_verejne (bool): zda se mají vrátit jen veřejná, nebo všechna čísla | ||||
| 	Vrátí: | ||||
| 		seznam objektů typu Cislo | ||||
| 	"""	 | ||||
| 	if jen_verejne: | ||||
| 		return rocnik.verejne_vysledkovky_cisla() | ||||
| 	else: | ||||
| 		return rocnik.cisla.all().order_by('poradi') | ||||
| 
 | ||||
| def hlavni_problem(problem): | ||||
| 	""" Pro daný problém vrátí jeho nejvyšší nadproblém.""" | ||||
| 	while not(problem.nadproblem == None): | ||||
| 		problem = problem.nadproblem | ||||
| 	return problem | ||||
| 
 | ||||
| def problemy_rocniku(rocnik, jen_verejne=True): | ||||
| 	return  m.Problem.objects.filter(hodnoceni__in = m.Hodnoceni.objects.filter(deadline_body__cislo__in = cisla_rocniku(rocnik, jen_verejne))).distinct().select_related('nadproblem').select_related('nadproblem__nadproblem') | ||||
| 
 | ||||
| def problemy_cisla(cislo): | ||||
| 	""" Vrátí seznam všech problémů s body v daném čísle. """ | ||||
| 	return m.Problem.objects.filter(hodnoceni__in = m.Hodnoceni.objects.filter(deadline_body__cislo = cislo)).distinct().non_polymorphic().select_related('nadproblem').select_related('nadproblem__nadproblem') | ||||
| 
 | ||||
| 
 | ||||
| def hlavni_problemy_f(problemy=None): | ||||
| 	""" Vrátí seznam všech problémů, které již nemají nadproblém. """ | ||||
| 	# hlavní problémy čísla  | ||||
| 	# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) | ||||
| 	hlavni_problemy = set() | ||||
| 	for p in problemy: | ||||
| 		hlavni_problemy.add(hlavni_problem(p)) | ||||
| 		 | ||||
| 	# zunikátnění | ||||
| 	hlavni_problemy = list(hlavni_problemy) | ||||
| 	hlavni_problemy.sort(key=lambda k: k.kod_v_rocniku) # setřídit podle t1, t2, c3, ... | ||||
| 	 | ||||
| 	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_f(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) | ||||
| 
 | ||||
| 	for podproblem in podproblemy.keys(): | ||||
| 		def int_or_zero(p): | ||||
| 			try: | ||||
| 				return int(p.kod) | ||||
| 			except ValueError: | ||||
| 				return 0 | ||||
| 
 | ||||
| 		podproblemy[podproblem] = sorted(podproblemy[podproblem], key=int_or_zero) | ||||
| 
 | ||||
| 	return podproblemy | ||||
| 
 | ||||
| class TypDeadline(Enum): | ||||
| 	PredDeadline = auto() | ||||
|  |  | |||
|  | @ -3,8 +3,7 @@ from functools import cached_property | |||
| 
 | ||||
| import seminar.models as m | ||||
| from django.db.models import Q, Sum | ||||
| from seminar.utils import resi_v_rocniku, cisla_rocniku,\ | ||||
| 	hlavni_problemy_f, problemy_cisla, podproblemy_v_cislu | ||||
| from seminar.utils import resi_v_rocniku | ||||
| 
 | ||||
| ROCNIK_ZRUSENI_TEMAT = 25 | ||||
| 
 | ||||
|  | @ -154,7 +153,11 @@ class VysledkovkaRocniku(Vysledkovka): | |||
| 
 | ||||
| 	@cached_property | ||||
| 	def cisla_rocniku(self) -> list[m.Cislo]: | ||||
| 		return cisla_rocniku(self.rocnik, self.jen_verejne) | ||||
| 		""" Vrátí všechna čísla daného ročníku. """ | ||||
| 		if self.jen_verejne: | ||||
| 			return self.rocnik.verejne_vysledkovky_cisla() | ||||
| 		else: | ||||
| 			return self.rocnik.cisla.all().order_by('poradi') | ||||
| 
 | ||||
| 	@cached_property | ||||
| 	def body_za_cisla_slovnik(self) -> dict[int, dict[int, int]]: | ||||
|  | @ -239,11 +242,26 @@ class VysledkovkaCisla(Vysledkovka): | |||
| 
 | ||||
| 	@cached_property | ||||
| 	def problemy(self) -> list[m.Problem]: | ||||
| 		return problemy_cisla(self.cislo) | ||||
| 		""" Vrátí seznam všech problémů s body v daném čísle. """ | ||||
| 		return m.Problem.objects.filter( | ||||
| 			hodnoceni__in=m.Hodnoceni.objects.filter(deadline_body__cislo=self.cislo) | ||||
| 		).distinct().non_polymorphic().select_related('nadproblem').select_related('nadproblem__nadproblem') | ||||
| 
 | ||||
| 	@cached_property | ||||
| 	def hlavni_problemy(self) -> list[m.Problem]: | ||||
| 		return hlavni_problemy_f(self.problemy) | ||||
| 		""" Vrátí seznam všech problémů, které již nemají nadproblém. """ | ||||
| 		# hlavní problémy čísla | ||||
| 		# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) | ||||
| 		hlavni_problemy = set() | ||||
| 		for p in self.problemy: | ||||
| 			hlavni_problemy.add(p.hlavni_problem) | ||||
| 
 | ||||
| 		# zunikátnění | ||||
| 		hlavni_problemy = list(hlavni_problemy) | ||||
| 		hlavni_problemy.sort( | ||||
| 			key=lambda k: k.kod_v_rocniku)  # setřídit podle t1, t2, c3, ... | ||||
| 
 | ||||
| 		return hlavni_problemy | ||||
| 
 | ||||
| 	# Není cached, protože si myslím, že queryset lze použít ve for jen jednou. | ||||
| 	@property | ||||
|  | @ -337,7 +355,26 @@ class VysledkovkaCisla(Vysledkovka): | |||
| 
 | ||||
| 	@cached_property | ||||
| 	def podproblemy(self) -> list[list[m.Problem]]: | ||||
| 		return podproblemy_v_cislu(self.cislo, self.problemy, self.temata_a_spol) | ||||
| 		podproblemy = {hp.id: [] for hp in self.hlavni_problemy} | ||||
| 		hlavni_problemy = set(self.hlavni_problemy) | ||||
| 		podproblemy[-1] = [] | ||||
| 
 | ||||
| 		for problem in self.problemy: | ||||
| 			h_problem = problem.hlavni_problem | ||||
| 			if h_problem in hlavni_problemy: | ||||
| 				podproblemy[h_problem.id].append(problem) | ||||
| 			else: | ||||
| 				podproblemy[-1].append(problem) | ||||
| 
 | ||||
| 		for podproblem in podproblemy.keys(): | ||||
| 			def int_or_zero(p): | ||||
| 				try: | ||||
| 					return int(p.kod) | ||||
| 				except ValueError: | ||||
| 					return 0 | ||||
| 
 | ||||
| 			podproblemy[podproblem] = sorted(podproblemy[podproblem], key=int_or_zero) | ||||
| 		return podproblemy | ||||
| 
 | ||||
| 	@cached_property | ||||
| 	def podproblemy_seznam(self) -> list[list[m.Problem]]: | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue