Merge branch 'data_migrations' into test
This commit is contained in:
		
						commit
						c63ca09e68
					
				
					 7 changed files with 76 additions and 32 deletions
				
			
		|  | @ -1 +0,0 @@ | ||||||
| ,anet,erebus,25.03.2020 22:21,file:///home/anet/.config/libreoffice/4; |  | ||||||
|  | @ -1,7 +1,8 @@ | ||||||
| from django.contrib import admin | from django.contrib import admin | ||||||
| from django.contrib.auth.models import Group | from django.contrib.auth.models import Group | ||||||
| from django.db import models | from django.db import models | ||||||
| from django.forms import widgets | from django.forms import widgets, ModelForm | ||||||
|  | from django.core.exceptions import ValidationError | ||||||
| 
 | 
 | ||||||
| from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter | from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter | ||||||
| from reversion.admin import VersionAdmin | from reversion.admin import VersionAdmin | ||||||
|  | @ -12,11 +13,43 @@ from solo.admin import SingletonModelAdmin | ||||||
| # Todo: reversion | # Todo: reversion | ||||||
| 
 | 
 | ||||||
| import seminar.models as m | import seminar.models as m | ||||||
|  | import seminar.treelib as tl | ||||||
| 
 | 
 | ||||||
| admin.site.register(m.Skola) | admin.site.register(m.Skola) | ||||||
| admin.site.register(m.Prijemce) | admin.site.register(m.Prijemce) | ||||||
| admin.site.register(m.Rocnik) | admin.site.register(m.Rocnik) | ||||||
| admin.site.register(m.Cislo) | 
 | ||||||
|  | class CisloForm(ModelForm): | ||||||
|  | 	class Meta: | ||||||
|  | 		model = m.Cislo | ||||||
|  | 		fields = '__all__' | ||||||
|  | 		 | ||||||
|  | 	def clean(self): | ||||||
|  | 		print("Cleaning...") | ||||||
|  | 		print(self.cleaned_data) | ||||||
|  | 		if self.cleaned_data.get('verejne_db') == False: | ||||||
|  | 			return self.cleaned_data | ||||||
|  | 		cn = m.CisloNode.objects.get(cislo=self.instance) | ||||||
|  | 		for ch in tl.all_children(cn): | ||||||
|  | 			if isinstance(ch, m.TemaVCisleNode): | ||||||
|  | 				if ch.tema.stav not in \ | ||||||
|  | 					(m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): | ||||||
|  | 						raise ValidationError('Téma %(tema)s není zadané ani vyřešené', params={'tema':ch.tema}) | ||||||
|  | 				 | ||||||
|  | 			if isinstance(ch, m.UlohaZadaniNode) or isinstance(ch, m.UlohaVzorakNode): | ||||||
|  | 				if ch.uloha.stav not in \ | ||||||
|  | 					(m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): | ||||||
|  | 					raise ValidationError('Úloha %(uloha)s není zadaná ani vyřešená', params={'uloha':ch.uloha}) | ||||||
|  | 			if isinstance(ch, m.ReseniNode): | ||||||
|  | 				for problem in ch.reseni.problem_set: | ||||||
|  | 					if problem not in \ | ||||||
|  | 						(m.Problem.STAV_ZADANY, m.Problem.STAV_VYRESENY): | ||||||
|  | 						raise ValidationError('Problém %s není zadaný ani vyřešený', code=problem) | ||||||
|  | 		return self.cleaned_data | ||||||
|  | 
 | ||||||
|  | @admin.register(m.Cislo) | ||||||
|  | class CisloAdmin(admin.ModelAdmin): | ||||||
|  | 	form = CisloForm | ||||||
| 
 | 
 | ||||||
| @admin.register(m.Osoba) | @admin.register(m.Osoba) | ||||||
| class OsobaAdmin(admin.ModelAdmin): | class OsobaAdmin(admin.ModelAdmin): | ||||||
|  |  | ||||||
|  | @ -350,9 +350,17 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): | ||||||
| 	def gen_terminy(): | 	def gen_terminy(): | ||||||
| 		import datetime | 		import datetime | ||||||
| 		from time import strftime | 		from time import strftime | ||||||
| 
 | 		 | ||||||
| 		aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik | 		from django.db.utils import OperationalError | ||||||
| 		aktualni_cislo = m.Nastaveni.get_solo().aktualni_cislo | 		try: | ||||||
|  | 			aktualni_rocnik = m.Nastaveni.get_solo().aktualni_rocnik | ||||||
|  | 			aktualni_cislo = m.Nastaveni.get_solo().aktualni_cislo | ||||||
|  | 		except OperationalError: | ||||||
|  | 			# django.db.utils.OperationalError: no such table: seminar_nastaveni | ||||||
|  | 			# Nemáme databázi, takže to selhalo. Pro jistotu vrátíme aspoň dvě možnosti, ať to nepadá dál | ||||||
|  | 			logger = logging.getLogger(__name__) | ||||||
|  | 			logger.error("Rozbitá databáze (před počátečními migracemi?)") | ||||||
|  | 			return [('broken', 'Je to rozbitý'), ('fubar', 'Nefunguje to')] | ||||||
| 
 | 
 | ||||||
| 		result = [] | 		result = [] | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -864,31 +864,31 @@ class Problem(SeminarModelBase,PolymorphicModel): | ||||||
| 			return str(self.kod) | 			return str(self.kod) | ||||||
| 		return '<Není zadaný>' | 		return '<Není zadaný>' | ||||||
| 
 | 
 | ||||||
| 	def verejne(self): | #	def verejne(self): | ||||||
| 		# aktuálně podle stavu problému | #		# aktuálně podle stavu problému | ||||||
| 		# FIXME pro některé problémy možná chceme override | #		# FIXME pro některé problémy možná chceme override | ||||||
| 		# FIXME vrací veřejnost čistě problému, nezávisle na čísle, ve kterém je.  | #		# FIXME vrací veřejnost čistě problému, nezávisle na čísle, ve kterém je.  | ||||||
| 		# Je to tak správně? Podle aktuální představy ano. | #		# Je to tak správně? Podle aktuální představy ano. | ||||||
| 		stav_verejny = False | #		stav_verejny = False | ||||||
| 		if self.stav == 'zadany' or self.stav == 'vyreseny': | #		if self.stav == 'zadany' or self.stav == 'vyreseny': | ||||||
| 			stav_verejny = True | #			stav_verejny = True | ||||||
| 			print("stav_verejny: {}".format(stav_verejny))		 | #			print("stav_verejny: {}".format(stav_verejny))		 | ||||||
| 
 | # | ||||||
| 		cislo_verejne = False | #		cislo_verejne = False | ||||||
| 		cislonode = self.cislo_node() | #		cislonode = self.cislo_node() | ||||||
| 		if cislonode is None: | #		if cislonode is None: | ||||||
| 			# problém nemá vlastní node, veřejnost posuzujeme jen podle stavu | #			# problém nemá vlastní node, veřejnost posuzujeme jen podle stavu | ||||||
| 			print("empty node")		 | #			print("empty node")		 | ||||||
| 			return stav_verejny | #			return stav_verejny | ||||||
| 		else:	 | #		else:	 | ||||||
| 			cislo_zadani = cislonode.cislo | #			cislo_zadani = cislonode.cislo | ||||||
| 			if (cislo_zadani and cislo_zadani.verejne()): | #			if (cislo_zadani and cislo_zadani.verejne()): | ||||||
| 				print("cislo: {}".format(cislo_zadani)) | #				print("cislo: {}".format(cislo_zadani)) | ||||||
| 				cislo_verejne = True | #				cislo_verejne = True | ||||||
| 			print("stav_verejny: {}".format(stav_verejny))		 | #			print("stav_verejny: {}".format(stav_verejny))		 | ||||||
| 			print("cislo_verejne: {}".format(cislo_verejne))		 | #			print("cislo_verejne: {}".format(cislo_verejne))		 | ||||||
| 			return (stav_verejny and cislo_verejne) | #			return (stav_verejny and cislo_verejne) | ||||||
| 	verejne.boolean = True | #	verejne.boolean = True | ||||||
| 
 | 
 | ||||||
| 	def verejne_url(self): | 	def verejne_url(self): | ||||||
| 		return reverse('seminar_problem', kwargs={'pk': self.id}) | 		return reverse('seminar_problem', kwargs={'pk': self.id}) | ||||||
|  |  | ||||||
|  | @ -24,7 +24,9 @@ | ||||||
|     <div class='mam-org-only'> |     <div class='mam-org-only'> | ||||||
|     <h1>Výsledky včetně neveřejných</h1> |     <h1>Výsledky včetně neveřejných</h1> | ||||||
|     {% with vysledkovka_s_neverejnymi as radky_vysledkovky %} |     {% with vysledkovka_s_neverejnymi as radky_vysledkovky %} | ||||||
|  |         {% with cisla_s_neverejnymi as cisla %} | ||||||
|       {% include "seminar/vysledkovka_rocnik.html" %} |       {% include "seminar/vysledkovka_rocnik.html" %} | ||||||
|  |         {% endwith %} | ||||||
|     {% endwith %} |     {% endwith %} | ||||||
|     </div> |     </div> | ||||||
|   {% endif %} |   {% endif %} | ||||||
|  |  | ||||||
|  | @ -232,7 +232,7 @@ def cisla_rocniku(rocnik, jen_verejne=True): | ||||||
| 	if jen_verejne: | 	if jen_verejne: | ||||||
| 		return rocnik.verejna_cisla() | 		return rocnik.verejna_cisla() | ||||||
| 	else: | 	else: | ||||||
| 		return rocnik.cisla.all() | 		return rocnik.cisla.all().order_by('poradi') | ||||||
| 
 | 
 | ||||||
| def hlavni_problem(problem): | def hlavni_problem(problem): | ||||||
| 	""" Pro daný problém vrátí jeho nejvyšší nadproblém.""" | 	""" Pro daný problém vrátí jeho nejvyšší nadproblém.""" | ||||||
|  |  | ||||||
|  | @ -503,6 +503,7 @@ def ZadaniAktualniVysledkovkaView(request): | ||||||
| 			pass | 			pass | ||||||
| 	# vysledkovka s neverejnyma vysledkama | 	# vysledkovka s neverejnyma vysledkama | ||||||
| 	vysledkovka_s_neverejnymi = vysledkovka_rocniku(nastaveni.aktualni_rocnik, jen_verejne=False) | 	vysledkovka_s_neverejnymi = vysledkovka_rocniku(nastaveni.aktualni_rocnik, jen_verejne=False) | ||||||
|  | 	cisla_s_neverejnymi = cisla_rocniku(nastaveni.aktualni_rocnik, jen_verejne=False) | ||||||
| 	return render( | 	return render( | ||||||
| 		request, | 		request, | ||||||
| 		'seminar/zadani/AktualniVysledkovka.html', | 		'seminar/zadani/AktualniVysledkovka.html', | ||||||
|  | @ -511,6 +512,7 @@ def ZadaniAktualniVysledkovkaView(request): | ||||||
| 			'radky_vysledkovky': vysledkovka, | 			'radky_vysledkovky': vysledkovka, | ||||||
| 			'cisla': cisla, | 			'cisla': cisla, | ||||||
| 			'vysledkovka_s_neverejnymi': vysledkovka_s_neverejnymi, | 			'vysledkovka_s_neverejnymi': vysledkovka_s_neverejnymi, | ||||||
|  | 			'cisla_s_neverejnymi': cisla_s_neverejnymi, | ||||||
| 		} | 		} | ||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Pavel "LEdoian" Turinsky
						Pavel "LEdoian" Turinsky