Merge branch 'data_migrations' of ledoian@gimli.ms.mff.cuni.cz:/akce/mam/git/mamweb.git
This commit is contained in:
		
						commit
						81d868eb06
					
				
					 9 changed files with 233 additions and 35 deletions
				
			
		|  | @ -123,23 +123,10 @@ class PrihlaskaForm(forms.Form): | ||||||
| 				self.add_error('skola_adresa',forms.ValidationError('Je nutné vyplnit adresu školy')) | 				self.add_error('skola_adresa',forms.ValidationError('Je nutné vyplnit adresu školy')) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class EditForm(forms.Form): | class EditForm(forms.Form): | ||||||
| 	username = forms.CharField(label='Přihlašovací jméno',  | 	username = forms.CharField(label='Přihlašovací jméno',  | ||||||
| 			max_length=256,  | 			max_length=256,  | ||||||
| 			required=True, | 			required=True) | ||||||
| 			help_text='Tímto jménem se následně budeš přihlašovat pro odevzdání řešení a další činnosti v semináři') |  | ||||||
| 	password = forms.CharField( |  | ||||||
| 			label='Heslo', |  | ||||||
| 			max_length=256, |  | ||||||
| 			required=False, |  | ||||||
| 			widget=forms.PasswordInput()) |  | ||||||
| 	password_check = forms.CharField( |  | ||||||
| 			label='Ověření hesla', |  | ||||||
| 			max_length=256, |  | ||||||
| 			required=False, |  | ||||||
| 			widget=forms.PasswordInput()) |  | ||||||
| 
 | 
 | ||||||
| 	jmeno = forms.CharField(label='Jméno', max_length=256, required=True) | 	jmeno = forms.CharField(label='Jméno', max_length=256, required=True) | ||||||
| 	prijmeni = forms.CharField(label='Příjmení', max_length=256, required=True) | 	prijmeni = forms.CharField(label='Příjmení', max_length=256, required=True) | ||||||
|  | @ -178,7 +165,6 @@ class EditForm(forms.Form): | ||||||
| 		max_value=date.today().year+8, | 		max_value=date.today().year+8, | ||||||
| 		required=True) | 		required=True) | ||||||
| 	zasilat = forms.ChoiceField(label='Kam zasílat čísla a řešení',choices = Resitel.ZASILAT_CHOICES, required=True) | 	zasilat = forms.ChoiceField(label='Kam zasílat čísla a řešení',choices = Resitel.ZASILAT_CHOICES, required=True) | ||||||
| 	gdpr = forms.BooleanField(label='Souhlasím se zpracováním osobních údajů', required=True) |  | ||||||
| 	spam = forms.BooleanField(label='Souhlasím se zasíláním materiálů od MFF UK', required=False) | 	spam = forms.BooleanField(label='Souhlasím se zasíláním materiálů od MFF UK', required=False) | ||||||
| #	def clean_username(self): | #	def clean_username(self): | ||||||
| #		err_logger = logging.getLogger('seminar.prihlaska.problem') | #		err_logger = logging.getLogger('seminar.prihlaska.problem') | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								seminar/migrations/0072_auto_20191204_2257.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								seminar/migrations/0072_auto_20191204_2257.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | # Generated by Django 2.2.7 on 2019-12-04 21:57 | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('seminar', '0071_remove_nastaveni_aktualni_rocnik'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='treenode', | ||||||
|  |             name='srolovatelne', | ||||||
|  |             field=models.BooleanField(blank=True, help_text='Bude na stránce témátka možnost tuto položku skrýt', null=True, verbose_name='Srolovatelné'), | ||||||
|  |         ), | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='treenode', | ||||||
|  |             name='zajimave', | ||||||
|  |             field=models.BooleanField(default=False, help_text='Zobrazí se daná věc na rozcestníku témátek', verbose_name='Zajímavé'), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -21,9 +21,9 @@ 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, FirstTagParser # Pro získání úryvku z TextNode | ||||||
| 
 | 
 | ||||||
| from unidecode import unidecode | from unidecode import unidecode # Používám pro získání ID odkazu (ještě je to někde po někom zakomentované) | ||||||
| 
 | 
 | ||||||
| from polymorphic.models import PolymorphicModel | from polymorphic.models import PolymorphicModel | ||||||
| 
 | 
 | ||||||
|  | @ -620,7 +620,7 @@ class Problem(SeminarModelBase,PolymorphicModel): | ||||||
| 	id = models.AutoField(primary_key = True) | 	id = models.AutoField(primary_key = True) | ||||||
| 
 | 
 | ||||||
| 	# Název | 	# Název | ||||||
| 	nazev = models.CharField('název', max_length=256) | 	nazev = models.CharField('název', max_length=256) # Zveřejnitelný na stránky | ||||||
| 
 | 
 | ||||||
| 	# Problém má podproblémy | 	# Problém má podproblémy | ||||||
| 	nadproblem = models.ForeignKey('self', verbose_name='nadřazený problém', | 	nadproblem = models.ForeignKey('self', verbose_name='nadřazený problém', | ||||||
|  | @ -785,8 +785,11 @@ class Text(SeminarModelBase): | ||||||
| 		for tn in self.textnode_set.all(): | 		for tn in self.textnode_set.all(): | ||||||
| 			tn.save() | 			tn.save() | ||||||
| 
 | 
 | ||||||
| 
 | 	def __str__(self): | ||||||
| 	 | 		parser = FirstTagParser()		 | ||||||
|  | 		parser.feed(str(self.na_web)) | ||||||
|  | 		return parser.firstTag | ||||||
|  | 		 | ||||||
| class Uloha(Problem): | class Uloha(Problem): | ||||||
| 	class Meta: | 	class Meta: | ||||||
| 		db_table = 'seminar_ulohy' | 		db_table = 'seminar_ulohy' | ||||||
|  | @ -1238,8 +1241,15 @@ class TreeNode(PolymorphicModel): | ||||||
| 		on_delete=models.SET_NULL, | 		on_delete=models.SET_NULL, | ||||||
| 		verbose_name="další element na stejné úrovni") | 		verbose_name="další element na stejné úrovni") | ||||||
| 	nazev = models.TextField("název tohoto node", | 	nazev = models.TextField("název tohoto node", | ||||||
| 			help_text = "Tento název se zobrazuje v nabídkách pro výběr vhodného TreeNode", | 		help_text = "Tento název se zobrazuje v nabídkách pro výběr vhodného TreeNode", | ||||||
| 			blank=False, null=True) | 		blank=False,  | ||||||
|  | 		null=True) # Nezveřejnitelný název na stránky - pouze do adminu | ||||||
|  | 	zajimave = models.BooleanField(default = False, | ||||||
|  | 		verbose_name = "Zajímavé", | ||||||
|  | 		help_text = "Zobrazí se daná věc na rozcestníku témátek") | ||||||
|  | 	srolovatelne = models.BooleanField(null = True, blank = True, | ||||||
|  | 		verbose_name = "Srolovatelné", | ||||||
|  | 		help_text = "Bude na stránce témátka možnost tuto položku skrýt") | ||||||
| 	 | 	 | ||||||
| 	def print_tree(self,indent=0): | 	def print_tree(self,indent=0): | ||||||
| 		print("{}TreeNode({})".format(" "*indent,self.id)) | 		print("{}TreeNode({})".format(" "*indent,self.id)) | ||||||
|  | @ -1247,7 +1257,27 @@ class TreeNode(PolymorphicModel): | ||||||
| 			self.first_child.print_tree(indent=indent+2) | 			self.first_child.print_tree(indent=indent+2) | ||||||
| 		if self.succ: | 		if self.succ: | ||||||
| 			self.succ.print_tree(indent=indent) | 			self.succ.print_tree(indent=indent) | ||||||
| 		 | 
 | ||||||
|  | 	def getOdkazStr(self): # String na rozcestník | ||||||
|  | 		return self.first_child.getOdkazStr() | ||||||
|  | 
 | ||||||
|  | 	def getOdkaz(self): # ID HTML tagu, na který se bude scrollovat #{{self.getOdkaz}} | ||||||
|  | 	# Jsem si vědom, že tu potenciálně vznikají kolize. | ||||||
|  | 	# Přijdou mi natolik nepravděpodobné, že je neřeším | ||||||
|  | 	# Chtěl jsem ale hezké odkazy | ||||||
|  | 		string = unidecode(self.getOdkazStr()) | ||||||
|  | 		returnVal = "" | ||||||
|  | 		i = 0	 | ||||||
|  | 		while len(returnVal) < 16: # Max 15 znaků | ||||||
|  | 			if i == len(string): | ||||||
|  | 				break | ||||||
|  | 			if string[i] == " ": | ||||||
|  | 				returnVal += "-" | ||||||
|  | 			if string[i].isalnum(): | ||||||
|  | 				returnVal += string[i].lower() | ||||||
|  | 			i += 1 | ||||||
|  | 		return returnVal | ||||||
|  | 
 | ||||||
| 	def __str__(self): | 	def __str__(self): | ||||||
| 		if self.nazev: | 		if self.nazev: | ||||||
| 			return self.nazev | 			return self.nazev | ||||||
|  | @ -1283,6 +1313,9 @@ class CisloNode(TreeNode): | ||||||
| 	def aktualizuj_nazev(self): | 	def aktualizuj_nazev(self): | ||||||
| 		self.nazev = "CisloNode: "+str(self.cislo) | 		self.nazev = "CisloNode: "+str(self.cislo) | ||||||
| 
 | 
 | ||||||
|  | 	def getOdkazStr(self): | ||||||
|  | 		return "Číslo " + str(self.cislo) | ||||||
|  | 
 | ||||||
| class MezicisloNode(TreeNode): | class MezicisloNode(TreeNode): | ||||||
| 	class Meta: | 	class Meta: | ||||||
| 		db_table = 'seminar_nodes_mezicislo' | 		db_table = 'seminar_nodes_mezicislo' | ||||||
|  | @ -1304,6 +1337,8 @@ class MezicisloNode(TreeNode): | ||||||
| 		else: | 		else: | ||||||
| 			print("!!!!! Nějaké neidentifikované mezičíslo !!!!!") | 			print("!!!!! Nějaké neidentifikované mezičíslo !!!!!") | ||||||
| 			self.nazev = "MezicisloNode: Neidentifikovatelné mezičíslo!" | 			self.nazev = "MezicisloNode: Neidentifikovatelné mezičíslo!" | ||||||
|  | 	def getOdkazStr(self): | ||||||
|  | 		return "Obsah dostupný pouze na webu" | ||||||
| 
 | 
 | ||||||
| class TemaVCisleNode(TreeNode): | class TemaVCisleNode(TreeNode): | ||||||
| 	""" Obsahuje příspěvky k tématu v daném čísle """ | 	""" Obsahuje příspěvky k tématu v daném čísle """ | ||||||
|  | @ -1318,6 +1353,9 @@ class TemaVCisleNode(TreeNode): | ||||||
| 	def aktualizuj_nazev(self): | 	def aktualizuj_nazev(self): | ||||||
| 		self.nazev = "TemaVCisleNode: "+str(self.tema) | 		self.nazev = "TemaVCisleNode: "+str(self.tema) | ||||||
| 
 | 
 | ||||||
|  | 	def getOdkazStr(self): | ||||||
|  | 		return str(self.tema) | ||||||
|  | 
 | ||||||
| class KonferaNode(TreeNode): | class KonferaNode(TreeNode): | ||||||
| 	class Meta: | 	class Meta: | ||||||
| 		db_table = 'seminar_nodes_konfera' | 		db_table = 'seminar_nodes_konfera' | ||||||
|  | @ -1346,6 +1384,10 @@ class ClanekNode(TreeNode): | ||||||
| 	def aktualizuj_nazev(self): | 	def aktualizuj_nazev(self): | ||||||
| 		self.nazev = "ClanekNode: "+str(self.clanek) | 		self.nazev = "ClanekNode: "+str(self.clanek) | ||||||
| 
 | 
 | ||||||
|  | 	def getOdkazStr(self): | ||||||
|  | 		return str(self.clanek) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class UlohaZadaniNode(TreeNode): | class UlohaZadaniNode(TreeNode): | ||||||
| 	class Meta: | 	class Meta: | ||||||
| 		db_table = 'seminar_nodes_uloha_zadani' | 		db_table = 'seminar_nodes_uloha_zadani' | ||||||
|  | @ -1360,6 +1402,10 @@ class UlohaZadaniNode(TreeNode): | ||||||
| 	def aktualizuj_nazev(self): | 	def aktualizuj_nazev(self): | ||||||
| 		self.nazev = "UlohaZadaniNode: "+str(self.uloha) | 		self.nazev = "UlohaZadaniNode: "+str(self.uloha) | ||||||
| 
 | 
 | ||||||
|  | 	def getOdkazStr(self): | ||||||
|  | 		return str(self.uloha) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class PohadkaNode(TreeNode): | class PohadkaNode(TreeNode): | ||||||
| 	class Meta: | 	class Meta: | ||||||
| 		db_table = 'seminar_nodes_pohadka' | 		db_table = 'seminar_nodes_pohadka' | ||||||
|  | @ -1387,6 +1433,10 @@ class UlohaVzorakNode(TreeNode): | ||||||
| 	def aktualizuj_nazev(self): | 	def aktualizuj_nazev(self): | ||||||
| 		self.nazev = "UlohaVzorakNode: "+str(self.uloha) | 		self.nazev = "UlohaVzorakNode: "+str(self.uloha) | ||||||
| 
 | 
 | ||||||
|  | 	def getOdkazStr(self): | ||||||
|  | 		return str(self.uloha) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class TextNode(TreeNode): | class TextNode(TreeNode): | ||||||
| 	class Meta: | 	class Meta: | ||||||
| 		db_table = 'seminar_nodes_obsah' | 		db_table = 'seminar_nodes_obsah' | ||||||
|  | @ -1399,6 +1449,10 @@ class TextNode(TreeNode): | ||||||
| 	def aktualizuj_nazev(self): | 	def aktualizuj_nazev(self): | ||||||
| 		self.nazev = "TextNode: "+str(self.text) | 		self.nazev = "TextNode: "+str(self.text) | ||||||
| 
 | 
 | ||||||
|  | 	def getOdkazStr(self): | ||||||
|  | 		return str(self.text) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| ## FIXME: Logiku přesunout do views. | ## FIXME: Logiku přesunout do views. | ||||||
| #class VysledkyBase(SeminarModelBase): | #class VysledkyBase(SeminarModelBase): | ||||||
| # | # | ||||||
|  |  | ||||||
|  | @ -20,10 +20,6 @@ | ||||||
|      Přihlašovací údaje |      Přihlašovací údaje | ||||||
|      </li><li> |      </li><li> | ||||||
|        {% include "seminar/prihlaska_field.html" with field=form.username %} |        {% include "seminar/prihlaska_field.html" with field=form.username %} | ||||||
|      </li><li> |  | ||||||
|        {% include "seminar/prihlaska_field.html" with field=form.password %} |  | ||||||
|      </li><li> |  | ||||||
|        {% include "seminar/prihlaska_field.html" with field=form.password_check %} |  | ||||||
|      </li><li> |      </li><li> | ||||||
|      Osobní údaje |      Osobní údaje | ||||||
|      </li><li> |      </li><li> | ||||||
|  | @ -68,9 +64,6 @@ | ||||||
|        {% include "seminar/prihlaska_field.html" with field=form.rok_maturity %} |        {% include "seminar/prihlaska_field.html" with field=form.rok_maturity %} | ||||||
|      </li><li> |      </li><li> | ||||||
|        {% include "seminar/prihlaska_field.html" with field=form.zasilat %} |        {% include "seminar/prihlaska_field.html" with field=form.zasilat %} | ||||||
|      </li><li> |  | ||||||
|        {% include "seminar/gdpr.html" %} |  | ||||||
|        {% include "seminar/prihlaska_field.html" with field=form.gdpr %} |  | ||||||
|      </li><li> |      </li><li> | ||||||
|        {% include "seminar/prihlaska_field.html" with field=form.spam %} |        {% include "seminar/prihlaska_field.html" with field=form.spam %} | ||||||
|      </li> |      </li> | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								seminar/templates/seminar/tematka/rozcestnik.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								seminar/templates/seminar/tematka/rozcestnik.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | ||||||
|  | {% for tematko in tematka %} | ||||||
|  | <h1>{{tematko.nazev}}</h1> | ||||||
|  | <p>{{tematko.abstrakt}}</p> | ||||||
|  | 	<ul> | ||||||
|  | 	{% for cislo in tematko.cisla %} | ||||||
|  | 		<li>{{cislo.0.0}} -> /{{tematko.kod}}/#{{cislo.0.1}}</li> | ||||||
|  | 		<ul> | ||||||
|  | 		{% for odkaz in cislo.1 %} | ||||||
|  | 			<li>{{odkaz.0}} -> /{{tematko.kod}}/#{{odkaz.1}}</li>	 | ||||||
|  | 		{% endfor %} | ||||||
|  | 		</ul> | ||||||
|  | 	{% endfor %} | ||||||
|  | 	</ul> | ||||||
|  | {% endfor %} | ||||||
|  | @ -380,7 +380,8 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori): | ||||||
| 				kod=str(n), | 				kod=str(n), | ||||||
| 				# atributy třídy Téma | 				# atributy třídy Téma | ||||||
| 				tema_typ=rnd.choice(Tema.TEMA_CHOICES)[0], | 				tema_typ=rnd.choice(Tema.TEMA_CHOICES)[0], | ||||||
| 				rocnik=rocnik | 				rocnik=rocnik, | ||||||
|  | 				abstrakt = "Abstrakt tematka {}".format(n) | ||||||
| 			) | 			) | ||||||
| 			konec_tematu = min(rnd.randint(ci, 7), len(cisla)) | 			konec_tematu = min(rnd.randint(ci, 7), len(cisla)) | ||||||
| 			for i in range(ci, konec_tematu+1): | 			for i in range(ci, konec_tematu+1): | ||||||
|  |  | ||||||
|  | @ -8,6 +8,9 @@ from django.contrib.auth import views as auth_views | ||||||
| staff_member_required = user_passes_test(lambda u: u.is_staff) | staff_member_required = user_passes_test(lambda u: u.is_staff) | ||||||
| 
 | 
 | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
|  |   path('tematka/', views.TemataRozcestnikView), | ||||||
|  |   path('tematko/<int:tematko>/', views.TematkoView), | ||||||
|  | 
 | ||||||
| 	# REDIRECTy | 	# REDIRECTy | ||||||
| 	path('jak-resit/', RedirectView.as_view(url='/co-je-MaM/jak-resit/')), | 	path('jak-resit/', RedirectView.as_view(url='/co-je-MaM/jak-resit/')), | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,9 +2,18 @@ | ||||||
| 
 | 
 | ||||||
| import datetime | import datetime | ||||||
| from django.contrib.auth.decorators import user_passes_test | from django.contrib.auth.decorators import user_passes_test | ||||||
|  | from html.parser import HTMLParser  | ||||||
| 
 | 
 | ||||||
| staff_member_required = user_passes_test(lambda u: u.is_staff) | staff_member_required = user_passes_test(lambda u: u.is_staff) | ||||||
| 
 | 
 | ||||||
|  | class FirstTagParser(HTMLParser): | ||||||
|  | 	def __init__(self, *args, **kwargs): | ||||||
|  | 		self.firstTag = None | ||||||
|  | 		super().__init__(*args, **kwargs) | ||||||
|  | 	def handle_data(self, data): | ||||||
|  | 		if self.firstTag == None: | ||||||
|  | 			self.firstTag = data | ||||||
|  | 	 | ||||||
| def histogram(seznam): | def histogram(seznam): | ||||||
| 	d = {} | 	d = {} | ||||||
| 	for i in seznam: | 	for i in seznam: | ||||||
|  |  | ||||||
							
								
								
									
										123
									
								
								seminar/views.py
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								seminar/views.py
									
									
									
									
									
								
							|  | @ -16,7 +16,8 @@ from django.contrib.auth.mixins import LoginRequiredMixin | ||||||
| from django.db import transaction | from django.db import transaction | ||||||
| from dal import autocomplete | from dal import autocomplete | ||||||
| 
 | 
 | ||||||
| from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Tema, Clanek, Osoba, Skola | import seminar.models as s | ||||||
|  | from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Tema, Clanek, Osoba, Skola # Tohle je stare a chceme se toho zbavit. Pouzivejte s.ToCoChci | ||||||
| #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | ||||||
| from . import utils | from . import utils | ||||||
| from .unicodecsv import UnicodeWriter | from .unicodecsv import UnicodeWriter | ||||||
|  | @ -74,6 +75,91 @@ def ZadaniTemataView(request): | ||||||
| 		} | 		} | ||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
|  | #TODO na příště - implementovat DFS, které vrátí seznam objektů, jejich hloubku a objekt, který chci zobrazit, | ||||||
|  | #TODO na příště - rozmyslet, jak zobrazovat objekty - u každého Nodu se objekt, na který ukazuje jmenuje jinak, zavést metodu, která se u každé subclassy bude jmenovat stejně? __str__ | ||||||
|  | #TODO na příště - v jaké formě předávat templatu? Jak řešit rozbalovací tagy? | ||||||
|  | #TODO na příště - implementace vpisování rozbalovacích tagů, vytvořit si nový objekt, který bude mít stejnou metodu jako objekty, které mají node, která bude vracet vhodný tag a prostě ji přidat do seznamu? | ||||||
|  | def vytahniZLesaSeznam(tematko, koren, pouze_zajimave=False): | ||||||
|  | 	returnVal = [] | ||||||
|  | 
 | ||||||
|  | 	stack = [] | ||||||
|  | 	stack.append((koren.first_child, 0, False)) #Tuple of node, depth and relevance | ||||||
|  | 
 | ||||||
|  | 	while len(stack) > 0: | ||||||
|  | 		wn, wd, wr = stack.pop() | ||||||
|  | 
 | ||||||
|  | 		if wn.succ != None: | ||||||
|  | 			stack.append((wn.succ, wd, wr)) | ||||||
|  | 		if isinstance(wn, s.TemaVCisleNode): | ||||||
|  | 			print("TEMA") | ||||||
|  | 			print(wn.tema.id)	 | ||||||
|  | 			print(tematko.id)	 | ||||||
|  | 			if wn.tema.id == tematko.id: | ||||||
|  | 				returnVal.append((posledni_cislo, 0)) | ||||||
|  | 				print("PRIDANO") | ||||||
|  | 				wr = True | ||||||
|  | 				wd = 1 | ||||||
|  | 
 | ||||||
|  | 		if wn.srolovatelne: | ||||||
|  | 			tagOpen = s.Text(na_web = "Otevírací srolovací tag") | ||||||
|  | 			tagOpenNode = s.TextNode(text = tagOpen) | ||||||
|  | 			tagClose = s.Text(na_web = "Zavírací srolovací tag") | ||||||
|  | 			tagCloseNode = s.TextNode(text = tagClose) | ||||||
|  | 			stack.append((tagCloseNode, wd, True)) | ||||||
|  | 			 | ||||||
|  | 		if wn.first_child != None: | ||||||
|  | 			stack.append((wn.first_child, wd + 1, wr)) | ||||||
|  | 
 | ||||||
|  | 		if isinstance(wn, s.CisloNode): | ||||||
|  | 			posledni_cislo = wn | ||||||
|  | 		print(wn) | ||||||
|  | 
 | ||||||
|  | 		if wr:						 | ||||||
|  | 			print("ZAJIMAVE") | ||||||
|  | 			if pouze_zajimave: | ||||||
|  | 				if not wn.zajimave: | ||||||
|  | 					continue | ||||||
|  | 			returnVal.append((wn, wd)) | ||||||
|  | 	return returnVal | ||||||
|  |    | ||||||
|  | def TematkoView(request): | ||||||
|  | 	neco | ||||||
|  | 
 | ||||||
|  | def TemataRozcestnikView(request): | ||||||
|  | 	print("=============================================") | ||||||
|  | 	nastaveni = s.Nastaveni.objects.first() | ||||||
|  | 	tematka_objects = s.Tema.objects.filter(rocnik=nastaveni.aktualni_rocnik()) | ||||||
|  | 	tematka = [] #List tematka obsahuje pro kazde tematko object a list vsech TemaVCisleNodu - implementované pomocí slovníku | ||||||
|  | 	for tematko_object in tematka_objects: | ||||||
|  | 		print("AKTUALNI TEMATKO") | ||||||
|  | 		print(tematko_object.id) | ||||||
|  | 		odkazy = vytahniZLesaSeznam(tematko_object, nastaveni.aktualni_rocnik().rocniknode, pouze_zajimave = True) #Odkazy jsou tuply (node, depth) v listu | ||||||
|  | 		print(odkazy) | ||||||
|  | 		cisla = [] # List tuplů (nazev cisla, list odkazů) | ||||||
|  | 		vcisle = [] | ||||||
|  | 		cislo = None | ||||||
|  | 		for odkaz	in odkazy: | ||||||
|  | 			if odkaz[1] == 0: | ||||||
|  | 				if cislo != None: | ||||||
|  | 					cisla.append((cislo, vcisle)) | ||||||
|  | 				cislo = (odkaz[0].getOdkazStr(), odkaz[0].getOdkaz()) | ||||||
|  | 				vcisle = [] | ||||||
|  | 			else: | ||||||
|  | 				print(odkaz[0].getOdkaz()) | ||||||
|  | 				vcisle.append((odkaz[0].getOdkazStr(), odkaz[0].getOdkaz())) | ||||||
|  | 		if cislo != None: | ||||||
|  | 			cisla.append((cislo, vcisle)) | ||||||
|  | 				 | ||||||
|  | 		print(cisla) | ||||||
|  | 		tematka.append({ | ||||||
|  | 			"kod" : tematko_object.kod, | ||||||
|  | 			"nazev" : tematko_object.nazev, | ||||||
|  | 			"abstrakt" : tematko_object.abstrakt,  | ||||||
|  | 			"obrazek": tematko_object.obrazek, | ||||||
|  | 			"cisla" : cisla | ||||||
|  | 		}) | ||||||
|  | 	return render(request, 'seminar/tematka/rozcestnik.html', {"tematka": tematka}) | ||||||
|  |      | ||||||
| 
 | 
 | ||||||
| #def ZadaniAktualniVysledkovkaView(request): | #def ZadaniAktualniVysledkovkaView(request): | ||||||
| #	nastaveni = get_object_or_404(Nastaveni) | #	nastaveni = get_object_or_404(Nastaveni) | ||||||
|  | @ -1028,15 +1114,16 @@ def prihlaska_log_gdpr_safe(logger, gdpr_logger, msg, form_data): | ||||||
| 
 | 
 | ||||||
| from django.forms.models import model_to_dict | from django.forms.models import model_to_dict | ||||||
| def resitelEditView(request): | def resitelEditView(request): | ||||||
|  |     err_logger = logging.getLogger('seminar.prihlaska.problem') | ||||||
|     ## Načtení objektu Osoba a Resitel, patrici k aktuálně přihlášenému uživately |     ## Načtení objektu Osoba a Resitel, patrici k aktuálně přihlášenému uživately | ||||||
|     u = request.user |     u = request.user | ||||||
|     osoba_edit = Osoba.objects.get(user=u) |     osoba_edit = Osoba.objects.get(user=u) | ||||||
|     resitel_edit = osoba_edit.resitel |     resitel_edit = osoba_edit.resitel | ||||||
|     user_edit = osoba_edit.user |     user_edit = osoba_edit.user | ||||||
|     ## Vytvoření slovníku, kterým předvyplním formulář  |     ## Vytvoření slovníku, kterým předvyplním formulář  | ||||||
|     prefill_1=model_to_dict(osoba_edit) |     prefill_1=model_to_dict(user_edit) | ||||||
|     prefill_2=model_to_dict(resitel_edit) |     prefill_2=model_to_dict(resitel_edit) | ||||||
|     prefill_3=model_to_dict(user_edit) |     prefill_3=model_to_dict(osoba_edit) | ||||||
|     prefill_1.update(prefill_2) |     prefill_1.update(prefill_2) | ||||||
|     prefill_1.update(prefill_3) |     prefill_1.update(prefill_3) | ||||||
|     form = EditForm(initial=prefill_1) |     form = EditForm(initial=prefill_1) | ||||||
|  | @ -1044,7 +1131,35 @@ def resitelEditView(request): | ||||||
|     if request.method == 'POST': |     if request.method == 'POST': | ||||||
|         form = EditForm(request.POST) |         form = EditForm(request.POST) | ||||||
|         if form.is_valid(): |         if form.is_valid(): | ||||||
|             osoba_edit.prijmeni = 'NOVOTA' |             ## Změny v osobě | ||||||
|  |             fcd = form.cleaned_data | ||||||
|  |             osoba_edit.jmeno = fcd['jmeno'] | ||||||
|  |             osoba_edit.prijmeni = fcd['prijmeni'] | ||||||
|  |             osoba_edit.pohlavi_muz = fcd['pohlavi_muz'] | ||||||
|  |             osoba_edit.email = fcd['email'] | ||||||
|  |             osoba_edit.telefon = fcd['telefon'] | ||||||
|  |             osoba_edit.ulice = fcd['ulice'] | ||||||
|  |             osoba_edit.mesto = fcd['mesto'] | ||||||
|  |             osoba_edit.psc = fcd['psc'] | ||||||
|  |             ## Změny v osobě s podmínkami | ||||||
|  |             if fcd.get('spam',False): | ||||||
|  |                 osoba_edit.datum_souhlasu_zasilani = date.today() | ||||||
|  |             if fcd.get('stat','') in ('CZ','SK'): | ||||||
|  |                 osoba_edit.stat = fcd['stat'] | ||||||
|  |             else: | ||||||
|  |                 ## Neznámá země | ||||||
|  |                 msg = "Unknown country {}".format(fcd['stat_text']) | ||||||
|  | 
 | ||||||
|  |             ## Změny v řešiteli | ||||||
|  |             resitel_edit.skola = fcd['skola'] | ||||||
|  |             resitel_edit.rok_maturity = fcd['rok_maturity'] | ||||||
|  |             resitel_edit.zasilat = fcd['zasilat'] | ||||||
|  |             if fcd.get('skola'): | ||||||
|  |                 resitel_edit.skola = fcd['skola'] | ||||||
|  |             else: | ||||||
|  |                 # Unknown school - log it | ||||||
|  |                 msg = "Unknown school {}, {}".format(fcd['skola_nazev'],fcd['skola_adresa']) | ||||||
|  |             resitel_edit.save() | ||||||
|             osoba_edit.save() |             osoba_edit.save() | ||||||
|             return HttpResponseRedirect('/thanks/') |             return HttpResponseRedirect('/thanks/') | ||||||
|     else: |     else: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Pavel 'LEdoian' Turinsky
						Pavel 'LEdoian' Turinsky