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 solo.admin import SingletonModelAdmin | ||||||
| from django.utils.safestring import mark_safe | from django.utils.safestring import mark_safe | ||||||
| 
 | 
 | ||||||
| from seminar.utils import hlavni_problem |  | ||||||
| 
 |  | ||||||
| # Todo: reversion | # Todo: reversion | ||||||
| 
 | 
 | ||||||
| import seminar.models as m | import seminar.models as m | ||||||
|  | @ -99,7 +97,7 @@ class CisloAdmin(admin.ModelAdmin): | ||||||
| 					ch.stav = m.Problem.STAV_ZADANY | 					ch.stav = m.Problem.STAV_ZADANY | ||||||
| 					ch.save() | 					ch.save() | ||||||
| 
 | 
 | ||||||
| 					hp = hlavni_problem(ch) | 					hp = ch.hlavni_problem | ||||||
| 					if hp.stav not in (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): | 					if hp.stav not in (m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): | ||||||
| 						hp.stav = m.Problem.STAV_ZADANY | 						hp.stav = m.Problem.STAV_ZADANY | ||||||
| 						hp.save() | 						hp.save() | ||||||
|  |  | ||||||
|  | @ -24,7 +24,6 @@ from taggit.managers import TaggableManager | ||||||
| from reversion import revisions as reversion | from reversion import revisions as reversion | ||||||
| 
 | 
 | ||||||
| from seminar.utils import roman | from seminar.utils import roman | ||||||
| from seminar.utils import hlavni_problem |  | ||||||
| from treenode import treelib | 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é) | 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 | 		return vc[-1] if vc else None | ||||||
| 
 | 
 | ||||||
| 	def verejne_vysledkovky_cisla(self): | 	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) | 		vc.sort(key=lambda c: c.poradi) | ||||||
| 		return vc | 		return vc | ||||||
| 
 | 
 | ||||||
|  | @ -483,7 +482,10 @@ class Problem(SeminarModelBase,PolymorphicModel): | ||||||
| 	@cached_property | 	@cached_property | ||||||
| 	def hlavni_problem(self): | 	def hlavni_problem(self): | ||||||
| 		""" Pro daný problém vrátí jeho nejvyšší nadproblém.""" | 		""" 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 | # FIXME - k úloze | ||||||
| 	def body_v_zavorce(self): | 	def body_v_zavorce(self): | ||||||
|  |  | ||||||
|  | @ -248,77 +248,6 @@ def viewMethodSwitch(get, post): | ||||||
| 	 | 	 | ||||||
| 	return NewView.as_view() | 	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): | class TypDeadline(Enum): | ||||||
| 	PredDeadline = auto() | 	PredDeadline = auto() | ||||||
|  |  | ||||||
|  | @ -3,8 +3,7 @@ from functools import cached_property | ||||||
| 
 | 
 | ||||||
| import seminar.models as m | import seminar.models as m | ||||||
| from django.db.models import Q, Sum | from django.db.models import Q, Sum | ||||||
| from seminar.utils import resi_v_rocniku, cisla_rocniku,\ | from seminar.utils import resi_v_rocniku | ||||||
| 	hlavni_problemy_f, problemy_cisla, podproblemy_v_cislu |  | ||||||
| 
 | 
 | ||||||
| ROCNIK_ZRUSENI_TEMAT = 25 | ROCNIK_ZRUSENI_TEMAT = 25 | ||||||
| 
 | 
 | ||||||
|  | @ -154,7 +153,11 @@ class VysledkovkaRocniku(Vysledkovka): | ||||||
| 
 | 
 | ||||||
| 	@cached_property | 	@cached_property | ||||||
| 	def cisla_rocniku(self) -> list[m.Cislo]: | 	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 | 	@cached_property | ||||||
| 	def body_za_cisla_slovnik(self) -> dict[int, dict[int, int]]: | 	def body_za_cisla_slovnik(self) -> dict[int, dict[int, int]]: | ||||||
|  | @ -239,11 +242,26 @@ class VysledkovkaCisla(Vysledkovka): | ||||||
| 
 | 
 | ||||||
| 	@cached_property | 	@cached_property | ||||||
| 	def problemy(self) -> list[m.Problem]: | 	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 | 	@cached_property | ||||||
| 	def hlavni_problemy(self) -> list[m.Problem]: | 	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. | 	# Není cached, protože si myslím, že queryset lze použít ve for jen jednou. | ||||||
| 	@property | 	@property | ||||||
|  | @ -337,7 +355,26 @@ class VysledkovkaCisla(Vysledkovka): | ||||||
| 
 | 
 | ||||||
| 	@cached_property | 	@cached_property | ||||||
| 	def podproblemy(self) -> list[list[m.Problem]]: | 	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 | 	@cached_property | ||||||
| 	def podproblemy_seznam(self) -> list[list[m.Problem]]: | 	def podproblemy_seznam(self) -> list[list[m.Problem]]: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue