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