Merge branch 'nove_tituly' into data_migrations
This commit is contained in:
		
						commit
						f45586fdfa
					
				
					 1 changed files with 98 additions and 17 deletions
				
			
		|  | @ -311,25 +311,106 @@ class Resitel(SeminarModelBase): | |||
| 		return sum(h.body for h in list(vsechna_hodnoceni)) | ||||
| 
 | ||||
| 
 | ||||
| 	def get_titul(self, celkove_body=None): | ||||
| 		"Vrati titul" | ||||
| 		if celkove_body is None: | ||||
| 			celkove_body = self.vsechny_body() | ||||
| 	def get_titul(self, body=None): | ||||
| 		"Vrati titul jako řetězec." | ||||
| 		 | ||||
| 		if celkove_body < 10: | ||||
| 			return '' | ||||
| 		elif celkove_body < 20: | ||||
| 			return 'Bc.' | ||||
| 		elif celkove_body < 50: | ||||
| 			return 'Mgr.' | ||||
| 		elif celkove_body < 100: | ||||
| 			return 'Dr.' | ||||
| 		elif celkove_body < 200: | ||||
| 			return 'Doc.' | ||||
| 		elif celkove_body < 500: | ||||
| 			return 'Prof.' | ||||
| 		# Nejprve si zadefinujeme titul | ||||
| 		from enum import Enum | ||||
| 		from functools import total_ordering | ||||
| 		@total_ordering | ||||
| 		class Titul(Enum): | ||||
| 			""" Třída reprezentující možné tituly. Hodnoty jsou dvojice (dolní hranice, stringifikace). """ | ||||
| 			nic =  (0, '') | ||||
| 			bc =   (20, 'Bc.') | ||||
| 			mgr =  (50, 'Mgr.') | ||||
| 			dr =   (100, 'Dr.') | ||||
| 			doc =  (200, 'Doc.') | ||||
| 			prof = (500, 'Prof.') | ||||
| 			akad = (1000, 'Akad.') | ||||
| 
 | ||||
| 			def __lt__(self, other): | ||||
| 				return True if self.value[0] < other.value[0] else False | ||||
| 			def __eq__(self, other): # Měla by být implicitní, ale klidně explicitně. | ||||
| 				return True if self.value[0] == other.value[0] else False | ||||
| 
 | ||||
| 			def __str__(self): | ||||
| 				return self.value[1] | ||||
| 
 | ||||
| 			@classmethod | ||||
| 			def z_bodu(cls, body): | ||||
| 				aktualni = cls.nic | ||||
| 				# TODO: ověřit, že to funguje | ||||
| 				for titul in cls: # Kdyžtak použít __members__.items() | ||||
| 					if titul.value[0] <= body: | ||||
| 						aktualni = titul | ||||
| 					else: | ||||
| 						break | ||||
| 				return aktualni | ||||
| 
 | ||||
| 		# Hledáme body v databázi | ||||
| 		# V listopadu 2020 jsme se na filosofické schůzce shodli o změně hranic titulů: | ||||
| 		#  - body z 25. ročníku a dříve byly shledány dvakrát hodnotnějšími | ||||
| 		#  - proto se započítávají dvojnásobně a byly posunuté hranice titulů | ||||
| 		#  - staré tituly se ale nemají odebrat, pokud řešitel v t.č. minulém (26.) ročníku měl titul, má ho mít pořád. | ||||
| 		hodnoceni_do_25_rocniku = Hodnoceni.objects.filter(cislo_body__rocnik__rocnik__lte=25,reseni__in=self.reseni_set.all()) | ||||
| 		novejsi_hodnoceni = Hodnoceni.objects.filter(reseni__in=self.reseni_set.all()).difference(hodnoceni_do_25_rocniku) | ||||
| 
 | ||||
| 		def body_z_hodnoceni(hh : list): | ||||
| 			return sum(h.body for h in hh) | ||||
| 
 | ||||
| 		stare_body = body_z_hodnoceni(hodnoceni_do_25_rocniku) | ||||
| 		if body is None: | ||||
| 			nove_body = body_z_hodnoceni(novejsi_hodnoceni) | ||||
| 		else: | ||||
| 			return 'Akad.' | ||||
| 			# Zjistíme, kolik bodů jsou staré, tedy hodnotnější | ||||
| 			nove_body = max(0, body - stare_body) # Všechny body nad počet původních hodnotnějších | ||||
| 			stare_body = min(stare_body, body) # Skutečný počet hodnotnějších bodů | ||||
| 		logicke_body = 2*stare_body + nove_body | ||||
| 
 | ||||
| 	 | ||||
| 		# Titul se určí následovně: | ||||
| 		#  - Pokud se řeší body, které jsou starší, než do 26 ročníku (včetně), dáváme tituly postaru. | ||||
| 		#  - Jinak dáváme tituly po novu... | ||||
| 		#  - ... ale titul se nesmí odebrat, pokud se zmenšil. | ||||
| 		def titul_do_26_rocniku(body): | ||||
| 			""" Původní hranice bodů za tituly """ | ||||
| 			if body < 10: | ||||
| 				return Titul.nic | ||||
| 			elif body < 20: | ||||
| 				return Titul.bc | ||||
| 			elif body < 50: | ||||
| 				return Titul.mgr | ||||
| 			elif body < 100: | ||||
| 				return Titul.dr | ||||
| 			elif body < 200: | ||||
| 				return Titul.doc | ||||
| 			elif body < 500: | ||||
| 				return Titul.prof | ||||
| 			else: | ||||
| 				return Titul.akad | ||||
| 
 | ||||
| 		hodnoceni_do_26_rocniku = Hodnoceni.objects.filter(cislo_body__rocnik__rocnik__lte=26,reseni__in=self.reseni_set.all()) | ||||
| 		novejsi_body = body_z_hodnoceni( | ||||
| 			Hodnoceni.objects.filter(reseni__in=self.reseni_set.all()) | ||||
| 			.difference(hodnoceni_do_26_rocniku) | ||||
| 			) | ||||
| 		starsi_body = body_z_hodnoceni(hodnoceni_do_26_rocniku) | ||||
| 		if body is not None: | ||||
| 			# Ještě z toho vybereme ty správně staré body | ||||
| 			novejsi_body = max(0, body - starsi_body) | ||||
| 			starsi_body = min(starsi_body, body) | ||||
| 
 | ||||
| 		# Titul pro 26. ročník | ||||
| 		stary_titul = titul_do_26_rocniku(starsi_body) | ||||
| 		# Titul podle aktuálních pravidel | ||||
| 		novy_titul = Titul.z_bodu(logicke_body) | ||||
| 
 | ||||
| 		if novejsi_body == 0: | ||||
| 			# Žádné nové body -- titul podle starých pravidel | ||||
| 			return str(stary_titul) | ||||
| 		return str(max(novy_titul, stary_titul)) | ||||
| 
 | ||||
| 
 | ||||
| 	def __str__(self): | ||||
| 		return self.osoba.plne_jmeno() | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky