Merge pull request 'Úpravy výsledkovky' (!36) from pregenerovavani-deadlinu into master
Reviewed-on: #36
This commit is contained in:
		
						commit
						14b3caaa04
					
				
					 4 changed files with 41 additions and 23 deletions
				
			
		|  | @ -12,15 +12,25 @@ from django.utils.safestring import mark_safe | ||||||
| import seminar.models as m | import seminar.models as m | ||||||
| 
 | 
 | ||||||
| admin.site.register(m.Rocnik) | admin.site.register(m.Rocnik) | ||||||
| 
 |  | ||||||
| admin.site.register(m.Deadline) |  | ||||||
| admin.site.register(m.ZmrazenaVysledkovka) | admin.site.register(m.ZmrazenaVysledkovka) | ||||||
| 
 | 
 | ||||||
|  | @admin.register(m.Deadline) | ||||||
|  | class DeadlineAdmin(admin.ModelAdmin): | ||||||
|  | 	actions = ['pregeneruj_vysledkovku'] | ||||||
|  | 
 | ||||||
|  | 	# Nikomu nezobrazovat, ale superuživatelům se může hodit :-) | ||||||
|  | 	@admin.action(permissions=['bazmek'], description= 'Přegeneruj výsledkovky vybraných deadlinů') | ||||||
|  | 	def pregeneruj_vysledkovku(self, req, qs): | ||||||
|  | 		for deadline in qs: | ||||||
|  | 			deadline.vygeneruj_vysledkovku() | ||||||
|  | 	 | ||||||
|  | 	def has_bazmek_permission(self, request): | ||||||
|  | 		# Boilerplate: potřebujeme nějakou permission, protože nějaká haluz v Djangu… | ||||||
|  | 		return request.user.is_superuser | ||||||
| 	 | 	 | ||||||
| class DeadlineAdminInline(admin.TabularInline): | class DeadlineAdminInline(admin.TabularInline): | ||||||
|     model = m.Deadline | 	model = m.Deadline | ||||||
|     extra = 0 | 	extra = 0 | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| class CisloForm(ModelForm): | class CisloForm(ModelForm): | ||||||
| 	class Meta: | 	class Meta: | ||||||
|  | @ -71,7 +81,7 @@ class CisloForm(ModelForm): | ||||||
| @admin.register(m.Cislo) | @admin.register(m.Cislo) | ||||||
| class CisloAdmin(admin.ModelAdmin): | class CisloAdmin(admin.ModelAdmin): | ||||||
| 	form = CisloForm | 	form = CisloForm | ||||||
| 	actions = ['force_publish'] | 	actions = ['force_publish', 'pregeneruj_vysledkovky'] | ||||||
| 	inlines = (DeadlineAdminInline,) | 	inlines = (DeadlineAdminInline,) | ||||||
| 
 | 
 | ||||||
| 	def force_publish(self,request,queryset): | 	def force_publish(self,request,queryset): | ||||||
|  | @ -111,6 +121,17 @@ class CisloAdmin(admin.ModelAdmin): | ||||||
| 
 | 
 | ||||||
| 	force_publish.short_description = 'Zveřejnit vybraná čísla a všechny návrhy úloh v nich učinit zadanými' | 	force_publish.short_description = 'Zveřejnit vybraná čísla a všechny návrhy úloh v nich učinit zadanými' | ||||||
| 
 | 
 | ||||||
|  | 	# Jen pro superuživatele | ||||||
|  | 	@admin.action(permissions=['bazmek'], description='Přegenerovat výsledkovky všech deadlinů vybraných čísel') | ||||||
|  | 	def pregeneruj_vysledkovky(self, req, qs): | ||||||
|  | 		for cislo in qs: | ||||||
|  | 			for deadline in cislo.deadline_v_cisle.all(): | ||||||
|  | 				deadline.vygeneruj_vysledkovku() | ||||||
|  | 	 | ||||||
|  | 	def has_bazmek_permission(self, request): | ||||||
|  | 		# Boilerplate: potřebujeme nějakou permission, protože nějaká haluz v Djangu… | ||||||
|  | 		return request.user.is_superuser | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| @admin.register(m.Problem) | @admin.register(m.Problem) | ||||||
| class ProblemAdmin(PolymorphicParentModelAdmin): | class ProblemAdmin(PolymorphicParentModelAdmin): | ||||||
|  |  | ||||||
|  | @ -491,7 +491,7 @@ class Problem(SeminarModelBase,PolymorphicModel): | ||||||
| 				return self.nadproblem.kod_v_rocniku+".{}".format(self.kod) | 				return self.nadproblem.kod_v_rocniku+".{}".format(self.kod) | ||||||
| 			return str(self.kod) | 			return str(self.kod) | ||||||
| 		logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") | 		logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") | ||||||
| 		return '<Není zadaný>' | 		return f'<Není zadaný: {self.kod}>' | ||||||
| 
 | 
 | ||||||
| #	def verejne(self): | #	def verejne(self): | ||||||
| #		# aktuálně podle stavu problému | #		# aktuálně podle stavu problému | ||||||
|  | @ -571,9 +571,9 @@ class Tema(Problem): | ||||||
| 		if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY: | 		if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY: | ||||||
| 			if self.nadproblem: | 			if self.nadproblem: | ||||||
| 				return self.nadproblem.kod_v_rocniku+".t{}".format(self.kod) | 				return self.nadproblem.kod_v_rocniku+".t{}".format(self.kod) | ||||||
| 			return "t{}".format(self.kod) | 			return 't'+self.kod | ||||||
| 		logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") | 		logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") | ||||||
| 		return '<Není zadaný>' | 		return f'<Není zadaný: {self.kod}>' | ||||||
| 
 | 
 | ||||||
| 	def save(self, *args, **kwargs): | 	def save(self, *args, **kwargs): | ||||||
| 		super().save(*args, **kwargs) | 		super().save(*args, **kwargs) | ||||||
|  | @ -607,9 +607,9 @@ class Clanek(Problem): | ||||||
| # Nemělo by být potřeba | # Nemělo by být potřeba | ||||||
| #			if self.nadproblem: | #			if self.nadproblem: | ||||||
| #				return self.nadproblem.kod_v_rocniku+".c{}".format(self.kod) | #				return self.nadproblem.kod_v_rocniku+".c{}".format(self.kod) | ||||||
| 			return "c{}".format(self.kod) | 			return "c" + self.kod | ||||||
| 		logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") | 		logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") | ||||||
| 		return '<Není zadaný>' | 		return f'<Není zadaný: {self.kod}>' | ||||||
| 	 | 	 | ||||||
| 	def node(self): | 	def node(self): | ||||||
| 		return None | 		return None | ||||||
|  | @ -642,12 +642,9 @@ class Uloha(Problem): | ||||||
| 	@cached_property | 	@cached_property | ||||||
| 	def kod_v_rocniku(self): | 	def kod_v_rocniku(self): | ||||||
| 		if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY: | 		if self.stav == Problem.STAV_ZADANY or self.stav == Problem.STAV_VYRESENY: | ||||||
| 			name="{}.u{}".format(self.cislo_zadani.poradi,self.kod) | 			return f"{self.cislo_zadani.poradi}.{self.kod}" | ||||||
| 			if self.nadproblem: |  | ||||||
| 				return self.nadproblem.kod_v_rocniku+name |  | ||||||
| 			return name |  | ||||||
| 		logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") | 		logger.warning(f"K problému {self} byl vyžadován kód v ročníku, i když není zadaný ani vyřešený.") | ||||||
| 		return '<Není zadaný>' | 		return f'<Není zadaný: {self.kod}>' | ||||||
| 
 | 
 | ||||||
| 	def save(self, *args, **kwargs): | 	def save(self, *args, **kwargs): | ||||||
| 		super().save(*args, **kwargs) | 		super().save(*args, **kwargs) | ||||||
|  |  | ||||||
|  | @ -4,11 +4,11 @@ | ||||||
|         <th class='border-r'>#</th> |         <th class='border-r'>#</th> | ||||||
|         <th class='border-r'>Jméno</th> |         <th class='border-r'>Jméno</th> | ||||||
|             {% for p in vysledkovka.temata_a_spol%} |             {% for p in vysledkovka.temata_a_spol%} | ||||||
|                 <th class='border-r' id="problem{{ oznaceni_vysledkovky }}_{{ forloop.counter0 }}">{# <a href="{{ p.verejne_url }}"> #}{{ p.kod_v_rocniku }}{# </a> #}</th> |                 <th class='border-r' id="problem{{ oznaceni_vysledkovky }}_{{ forloop.counter0 }}">{# <a href="{{ p.verejne_url }}"> #}<span title="{{ p }}">{{ p.kod_v_rocniku }}</span>{# </a> #}</th> | ||||||
| 
 | 
 | ||||||
|                     {# TODELETE #} |                     {# TODELETE #} | ||||||
|                     {% for podproblemy in vysledkovka.podproblemy_iter.next %} |                     {% for podproblemy in vysledkovka.podproblemy_iter.next %} | ||||||
|                         <th class='border-r podproblem{{ oznaceni_vysledkovky }}_{{ forloop.parentloop.counter0 }} podproblem'>{# <a href="{{ podproblemy.verejne_url }}"> #}{{ podproblemy.kod_v_rocniku }}{# </a> #}</th> |                         <th class='border-r podproblem{{ oznaceni_vysledkovky }}_{{ forloop.parentloop.counter0 }} podproblem'>{# <a href="{{ podproblemy.verejne_url }}"> #}<span title="{{ podproblemy }}">{{ podproblemy.kod_v_rocniku }}</span>{# </a> #}</th> | ||||||
|                     {% endfor %} |                     {% endfor %} | ||||||
|                 {# TODELETE #} |                 {# TODELETE #} | ||||||
| 
 | 
 | ||||||
|  | @ -17,7 +17,7 @@ | ||||||
| 
 | 
 | ||||||
|         {# TODELETE #} |         {# TODELETE #} | ||||||
|         {% for podproblemy in vysledkovka.podproblemy_iter.next %} |         {% for podproblemy in vysledkovka.podproblemy_iter.next %} | ||||||
|             <th class='border-r podproblem{{ oznaceni_vysledkovky }}_{{ vysledkovka.temata_a_spol| length }} podproblem'>{# <a href="{{ podproblemy.verejne_url }}"> #}{{ podproblemy.kod_v_rocniku }}{# </a> #}</th> |             <th class='border-r podproblem{{ oznaceni_vysledkovky }}_{{ vysledkovka.temata_a_spol| length }} podproblem'>{# <a href="{{ podproblemy.verejne_url }}"> #}<span title="{{ podproblemy }}">{{ podproblemy.kod_v_rocniku }}</span>{# </a> #}</th> | ||||||
|         {% endfor %} |         {% endfor %} | ||||||
|         {# TODELETE #} |         {# TODELETE #} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -257,7 +257,7 @@ class VysledkovkaCisla(Vysledkovka): | ||||||
| 		# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) | 		# (mají vlastní sloupeček ve výsledkovce, nemají nadproblém) | ||||||
| 		hlavni_problemy = set() | 		hlavni_problemy = set() | ||||||
| 		for p in self.problemy: | 		for p in self.problemy: | ||||||
| 			hlavni_problemy.add(p.hlavni_problem) | 			hlavni_problemy.add(p.hlavni_problem) # FIXME: proč tohle nemůže obsahovat reálné instance? Ve výsledkovce by se pak zobrazovaly správné kódy… | ||||||
| 
 | 
 | ||||||
| 		# zunikátnění | 		# zunikátnění | ||||||
| 		hlavni_problemy = list(hlavni_problemy) | 		hlavni_problemy = list(hlavni_problemy) | ||||||
|  | @ -313,7 +313,7 @@ class VysledkovkaCisla(Vysledkovka): | ||||||
| 
 | 
 | ||||||
| 		# Sečteme hodnocení | 		# Sečteme hodnocení | ||||||
| 		for hodnoceni in self.hodnoceni_do_cisla: | 		for hodnoceni in self.hodnoceni_do_cisla: | ||||||
| 			prob = hodnoceni.problem | 			prob = hodnoceni.problem.get_real_instance() | ||||||
| 			nadproblem = prob.hlavni_problem.id | 			nadproblem = prob.hlavni_problem.id | ||||||
| 
 | 
 | ||||||
| 			# Když nadproblém není "téma", pak je "Ostatní" | 			# Když nadproblém není "téma", pak je "Ostatní" | ||||||
|  | @ -366,9 +366,9 @@ class VysledkovkaCisla(Vysledkovka): | ||||||
| 		for problem in self.problemy: | 		for problem in self.problemy: | ||||||
| 			h_problem = problem.hlavni_problem | 			h_problem = problem.hlavni_problem | ||||||
| 			if h_problem in temata_a_spol: | 			if h_problem in temata_a_spol: | ||||||
| 				podproblemy[h_problem.id].append(problem) | 				podproblemy[h_problem.id].append(problem.get_real_instance()) | ||||||
| 			else: | 			else: | ||||||
| 				podproblemy[-1].append(problem) | 				podproblemy[-1].append(problem.get_real_instance()) | ||||||
| 
 | 
 | ||||||
| 		for podproblem in podproblemy.keys(): | 		for podproblem in podproblemy.keys(): | ||||||
| 			podproblemy[podproblem] = sorted(podproblemy[podproblem], key=lambda p: p.kod_v_rocniku) | 			podproblemy[podproblem] = sorted(podproblemy[podproblem], key=lambda p: p.kod_v_rocniku) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue