Browse Source

Rozcestnik tematek view

export_seznamu_prednasek
Martin Z. (Zimamazim) 5 years ago
parent
commit
1ff1d05028
  1. 23
      seminar/migrations/0072_auto_20191204_2257.py
  2. 43
      seminar/models.py
  3. 14
      seminar/templates/seminar/tematka/rozcestnik.html
  4. 3
      seminar/testutils.py
  5. 3
      seminar/urls.py
  6. 9
      seminar/utils.py
  7. 84
      seminar/views.py

23
seminar/migrations/0072_auto_20191204_2257.py

@ -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é'),
),
]

43
seminar/models.py

@ -21,7 +21,7 @@ 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
@ -785,7 +785,10 @@ 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:
@ -1239,7 +1242,14 @@ class TreeNode(PolymorphicModel):
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)
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))
@ -1248,6 +1258,9 @@ class TreeNode(PolymorphicModel):
if self.succ: if self.succ:
self.succ.print_tree(indent=indent) self.succ.print_tree(indent=indent)
def getOdkaz(self):
return self.first_child.getOdkaz()
def __str__(self): def __str__(self):
if self.nazev: if self.nazev:
return self.nazev return self.nazev
@ -1283,6 +1296,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 getOdkaz(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 +1320,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 getOdkaz(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 +1336,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 getOdkaz(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 +1367,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 getOdkaz(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 +1385,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 getOdkaz(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 +1416,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 getOdkaz(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 +1432,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 getOdkaz(self):
return str(self.text)
## FIXME: Logiku přesunout do views. ## FIXME: Logiku přesunout do views.
#class VysledkyBase(SeminarModelBase): #class VysledkyBase(SeminarModelBase):
# #

14
seminar/templates/seminar/tematka/rozcestnik.html

@ -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 %}

3
seminar/testutils.py

@ -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):

3
seminar/urls.py

@ -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 = [
# TEMP DEV
path('dev_tematka/', views.TemataRozcestnikView),
# 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/')),

9
seminar/utils.py

@ -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:

84
seminar/views.py

@ -15,7 +15,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
@ -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): #def ZadaniAktualniVysledkovkaView(request):
# nastaveni = get_object_or_404(Nastaveni) # nastaveni = get_object_or_404(Nastaveni)

Loading…
Cancel
Save