Rozcestnik tematek view
This commit is contained in:
		
							parent
							
								
									61c1ebfc9b
								
							
						
					
					
						commit
						1ff1d05028
					
				
					 7 changed files with 177 additions and 8 deletions
				
			
		
							
								
								
									
										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,7 +21,7 @@ from taggit.managers import TaggableManager | |||
| 
 | ||||
| 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 | ||||
| 
 | ||||
|  | @ -785,8 +785,11 @@ class Text(SeminarModelBase): | |||
| 		for tn in self.textnode_set.all(): | ||||
| 			tn.save() | ||||
| 
 | ||||
| 
 | ||||
| 	 | ||||
| 	def __str__(self): | ||||
| 		parser = FirstTagParser()		 | ||||
| 		parser.feed(str(self.na_web)) | ||||
| 		return parser.firstTag | ||||
| 		 | ||||
| class Uloha(Problem): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_ulohy' | ||||
|  | @ -1238,8 +1241,15 @@ class TreeNode(PolymorphicModel): | |||
| 		on_delete=models.SET_NULL, | ||||
| 		verbose_name="další element na stejné úrovni") | ||||
| 	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", | ||||
| 			blank=False, null=True) | ||||
| 		help_text = "Tento název se zobrazuje v nabídkách pro výběr vhodného TreeNode", | ||||
| 		blank=False,  | ||||
| 		null=True) | ||||
| 	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): | ||||
| 		print("{}TreeNode({})".format(" "*indent,self.id)) | ||||
|  | @ -1247,7 +1257,10 @@ class TreeNode(PolymorphicModel): | |||
| 			self.first_child.print_tree(indent=indent+2) | ||||
| 		if self.succ: | ||||
| 			self.succ.print_tree(indent=indent) | ||||
| 		 | ||||
| 
 | ||||
| 	def getOdkaz(self): | ||||
| 		return self.first_child.getOdkaz() | ||||
| 	 | ||||
| 	def __str__(self): | ||||
| 		if self.nazev: | ||||
| 			return self.nazev | ||||
|  | @ -1283,6 +1296,9 @@ class CisloNode(TreeNode): | |||
| 	def aktualizuj_nazev(self): | ||||
| 		self.nazev = "CisloNode: "+str(self.cislo) | ||||
| 
 | ||||
| 	def getOdkaz(self): | ||||
| 		return "Číslo " + str(self.cislo) | ||||
| 
 | ||||
| class MezicisloNode(TreeNode): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_nodes_mezicislo' | ||||
|  | @ -1304,6 +1320,8 @@ class MezicisloNode(TreeNode): | |||
| 		else: | ||||
| 			print("!!!!! Nějaké neidentifikované mezičíslo !!!!!") | ||||
| 			self.nazev = "MezicisloNode: Neidentifikovatelné mezičíslo!" | ||||
| 	def getOdkaz(self): | ||||
| 		return "Obsah dostupný pouze na webu" | ||||
| 
 | ||||
| class TemaVCisleNode(TreeNode): | ||||
| 	""" Obsahuje příspěvky k tématu v daném čísle """ | ||||
|  | @ -1318,6 +1336,9 @@ class TemaVCisleNode(TreeNode): | |||
| 	def aktualizuj_nazev(self): | ||||
| 		self.nazev = "TemaVCisleNode: "+str(self.tema) | ||||
| 
 | ||||
| 	def getOdkaz(self): | ||||
| 		return str(self.tema) | ||||
| 
 | ||||
| class KonferaNode(TreeNode): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_nodes_konfera' | ||||
|  | @ -1346,6 +1367,10 @@ class ClanekNode(TreeNode): | |||
| 	def aktualizuj_nazev(self): | ||||
| 		self.nazev = "ClanekNode: "+str(self.clanek) | ||||
| 
 | ||||
| 	def getOdkaz(self): | ||||
| 		return str(self.clanek) | ||||
| 
 | ||||
| 
 | ||||
| class UlohaZadaniNode(TreeNode): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_nodes_uloha_zadani' | ||||
|  | @ -1360,6 +1385,10 @@ class UlohaZadaniNode(TreeNode): | |||
| 	def aktualizuj_nazev(self): | ||||
| 		self.nazev = "UlohaZadaniNode: "+str(self.uloha) | ||||
| 
 | ||||
| 	def getOdkaz(self): | ||||
| 		return str(self.uloha) | ||||
| 
 | ||||
| 
 | ||||
| class PohadkaNode(TreeNode): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_nodes_pohadka' | ||||
|  | @ -1387,6 +1416,10 @@ class UlohaVzorakNode(TreeNode): | |||
| 	def aktualizuj_nazev(self): | ||||
| 		self.nazev = "UlohaVzorakNode: "+str(self.uloha) | ||||
| 
 | ||||
| 	def getOdkaz(self): | ||||
| 		return str(self.uloha) | ||||
| 
 | ||||
| 
 | ||||
| class TextNode(TreeNode): | ||||
| 	class Meta: | ||||
| 		db_table = 'seminar_nodes_obsah' | ||||
|  | @ -1399,6 +1432,10 @@ class TextNode(TreeNode): | |||
| 	def aktualizuj_nazev(self): | ||||
| 		self.nazev = "TextNode: "+str(self.text) | ||||
| 
 | ||||
| 	def getOdkaz(self): | ||||
| 		return str(self.text) | ||||
| 
 | ||||
| 
 | ||||
| ## FIXME: Logiku přesunout do views. | ||||
| #class VysledkyBase(SeminarModelBase): | ||||
| # | ||||
|  |  | |||
							
								
								
									
										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>TEMA</h1> | ||||
| <p>{{tematko.abstrakt}}</p> | ||||
| 	<ul> | ||||
| 	{% for cislo in tematko.cisla %} | ||||
| 		<li>{{cislo.0}}</li> | ||||
| 		<ul> | ||||
| 		{% for odkaz in cislo.1 %} | ||||
| 			<li>{{odkaz}}</li>	 | ||||
| 		{% endfor %} | ||||
| 		</ul> | ||||
| 	{% endfor %} | ||||
| 	</ul> | ||||
| {% endfor %} | ||||
|  | @ -380,7 +380,8 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori): | |||
| 				kod=str(n), | ||||
| 				# atributy třídy Téma | ||||
| 				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)) | ||||
| 			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) | ||||
| 
 | ||||
| urlpatterns = [ | ||||
|   # TEMP DEV | ||||
|   path('dev_tematka/', views.TemataRozcestnikView), | ||||
| 
 | ||||
| 	# REDIRECTy | ||||
| 	path('jak-resit/', RedirectView.as_view(url='/co-je-MaM/jak-resit/')), | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,9 +2,18 @@ | |||
| 
 | ||||
| import datetime | ||||
| 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) | ||||
| 
 | ||||
| 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): | ||||
| 	d = {} | ||||
| 	for i in seznam: | ||||
|  |  | |||
|  | @ -15,7 +15,8 @@ from django.contrib.auth.mixins import LoginRequiredMixin | |||
| from django.db import transaction | ||||
| 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 . import utils | ||||
| from .unicodecsv import UnicodeWriter | ||||
|  | @ -73,6 +74,87 @@ 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 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) | ||||
| 		print(odkazy) | ||||
| 		cisla = [] | ||||
| 		vcisle = [] | ||||
| 		cislo = None | ||||
| 		for odkaz	in odkazy: | ||||
| 			if odkaz[1] == 0: | ||||
| 				if cislo != None: | ||||
| 					cisla.append((cislo, vcisle)) | ||||
| 				cislo = odkaz[0].getOdkaz() | ||||
| 				vcisle = [] | ||||
| 			else: | ||||
| 				print(odkaz[0].getOdkaz()) | ||||
| 				vcisle.append(odkaz[0].getOdkaz()) | ||||
| 		if cislo != None: | ||||
| 			cisla.append((cislo, vcisle)) | ||||
| 				 | ||||
| 		print(cisla) | ||||
| 		tematka.append({ | ||||
| 			"abstrakt" : tematko_object.abstrakt,  | ||||
| 			"obrazek": tematko_object.obrazek, | ||||
| 			"cisla" : cisla | ||||
| 		}) | ||||
| 	return render(request, 'seminar/tematka/rozcestnik.html', {"tematka": tematka}) | ||||
|      | ||||
| 
 | ||||
| #def ZadaniAktualniVysledkovkaView(request): | ||||
| #	nastaveni = get_object_or_404(Nastaveni) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Martin Z. (Zimamazim)
						Martin Z. (Zimamazim)