diff --git a/seminar/templates/seminar/treenode.html b/seminar/templates/seminar/treenode.html index eddb6243..a6dc39f9 100644 --- a/seminar/templates/seminar/treenode.html +++ b/seminar/templates/seminar/treenode.html @@ -16,7 +16,8 @@ dfsdfs {% block content %} -
+ +{% csrf_token %} {%with obj=tnldata depth=1 template_name="seminar/treenode_recursive.html" %} {%include template_name%} {%endwith%} diff --git a/seminar/templates/seminar/treenode_add_stub.html b/seminar/templates/seminar/treenode_add_stub.html index b4318d07..09f2d2fa 100644 --- a/seminar/templates/seminar/treenode_add_stub.html +++ b/seminar/templates/seminar/treenode_add_stub.html @@ -1,11 +1,17 @@ {% load treenodes %} -{% if obj.node|appendableChildren %} +{% if kam_slug == "syn" %} + {% appendableChildren obj as dostupne_typy %} +{% else %} + {% appendableChildren obj.parent as dostupne_typy %} +{% endif %} + +{% if dostupne_typy %}
Přidat {{kam}} - + {% for typ in dostupne_typy %} + {% endfor %} - +
{% endif %}{# appendablebleChildren #} diff --git a/seminar/templates/seminar/treenode_name.html b/seminar/templates/seminar/treenode_name.html index ef15de1e..501effe4 100644 --- a/seminar/templates/seminar/treenode_name.html +++ b/seminar/templates/seminar/treenode_name.html @@ -9,6 +9,8 @@ Úloha {{obj.node.uloha.kod_v_rocniku}} ({{obj.node.uloha.max_body}} b) {% elif obj.node|isUlohaVzorak %} Řešení: {{obj.node.uloha.kod_v_rocniku}} +{% elif obj.node|isCast %} + {{obj.node.nadpis}} {% elif obj.node|isText %} {{obj.node.text.na_web}} {% else %} diff --git a/seminar/templates/seminar/treenode_recursive.html b/seminar/templates/seminar/treenode_recursive.html index 1fad8d80..62beed10 100644 --- a/seminar/templates/seminar/treenode_recursive.html +++ b/seminar/templates/seminar/treenode_recursive.html @@ -10,10 +10,10 @@ {% endif %} {% if obj|canPodvesitPred %} - - nejsou testovací data + - nejsou testovací data {% endif %} {% if obj|canPodvesitZa %} - - nejsou testovací data + - nejsou testovací data {% endif %} @@ -28,16 +28,16 @@ {%if obj.children %}
- {% with kam="před" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} + {% with kam="před" kam_slug="syn" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} {%for ch in obj.children %} {# ----------- Vypisujeme podstrom ----------#} {%with obj=ch depth=depth|add:"1" %} {%include "seminar/treenode_recursive.html" %} {%endwith%} {# ----------- Přidáváme mezi syny / za posledního -------- #} {% if forloop.last %} - {% with kam="za" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} + {% with kam="za" kam_slug="za" obj=ch %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} {% else %} - {% with kam="mezi" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} + {% with kam="mezi" obj=ch kam_slug="za" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} {% endif %} {# ----------- Prohazujeme sousedy ----------#}
@@ -49,6 +49,6 @@
{% else %} {# ----------- Přidáváme prvního syna ----------#} - {% with kam="jako syna" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} + {% with kam="jako syna" kam_slug="syn" %} {% include "seminar/treenode_add_stub.html" %} {% endwith %} {%endif%}
diff --git a/seminar/templatetags/treenodes.py b/seminar/templatetags/treenodes.py index b1e7b65d..d9bb668e 100644 --- a/seminar/templatetags/treenodes.py +++ b/seminar/templatetags/treenodes.py @@ -155,6 +155,7 @@ def canPodvesitPred(value): class NodeTypes(Enum): ROCNIK = ('rocnikNode','Ročník') CISLO = ('cisloNode', 'Číslo') + MEZICISLO = ('mezicisloNode', 'Mezičíslo') CAST = ('castNode', 'Část') TEXT = ('textNode', 'Text') TEMAVCISLE = ('temaVCisleNode', 'Téma v čísle') @@ -167,16 +168,16 @@ class NodeTypes(Enum): -@register.filter +@register.simple_tag def appendableChildren(value): - if isTemaVCisle(value): + if isTemaVCisle(value.node): return (NodeTypes.RESENI.value, NodeTypes.ULOHAZADANI.value, NodeTypes.ULOHAVZORAK.value, NodeTypes.CAST.value, NodeTypes.TEXT.value, ) - if isOrgText(value) or isReseni(value) or isUlohaZadani(value) or isUlohaVzorak(value): + if isOrgText(value.node) or isReseni(value.node) or isUlohaZadani(value.node) or isUlohaVzorak(value.node): return (NodeTypes.CAST.value, NodeTypes.TEXT.value, ) diff --git a/seminar/treelib.py b/seminar/treelib.py index 854bf62c..ba08e07a 100644 --- a/seminar/treelib.py +++ b/seminar/treelib.py @@ -181,6 +181,7 @@ def create_node_after(predecessor, type, **kwargs): predecessor.save() new_node.succ = succ new_node.save() + return new_node # Vyrábí prvního syna, ostatní nalepí za (existují-li) def create_child(parent, type, **kwargs): @@ -193,6 +194,7 @@ def create_child(parent, type, **kwargs): # Přidáme původního prvního syna jako potomka nového vrcholu new_node.succ = orig_child new_node.save() + return new_node def insert_last_child(parent, node): """ Zadaný Node přidá jako posledního potomka otce. """ @@ -225,6 +227,7 @@ def create_node_before(successor, type, **kwargs): new = type.objects.create(**kwargs) new.succ = successor new.save() + return new # ValueError, pokud je (aspoň) jeden parametr None diff --git a/seminar/urls.py b/seminar/urls.py index e462979c..f13fd442 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -26,12 +26,11 @@ urlpatterns = [ path('cislo/./', views.CisloView.as_view(), name='seminar_cislo'), # odkomentované jenom kvůli testování archivu path('problem//', views.ProblemView.as_view(), name='seminar_problem'), path('treenode//', views.TreeNodeView.as_view(), name='seminar_treenode'), - path('treenode/editor/pridat/', views.TreeNodeView.as_view(), name='treenode_pridat'), - path('treenode/editor/smazat/', views.TreeNodeView.as_view(), name='treenode_smazat'), - path('treenode/editor/odvesit/', views.TreeNodeView.as_view(), name='treenode_odvesit'), - path('treenode/editor/podvesit/predchozi/', views.TreeNodeView.as_view(), name='treenode_podvesit_predchozi'), - path('treenode/editor/podvesit/nasledujici/', views.TreeNodeView.as_view(), name='treenode_podvesit_nasledujici'), - path('treenode/editor/prohodit/', views.TreeNodeView.as_view(), name='treenode_prohodit'), + path('treenode/editor/pridat///', views.TreeNodePridatView.as_view(), name='treenode_pridat'), + path('treenode/editor/smazat//', views.TreeNodeSmazatView.as_view(), name='treenode_smazat'), + path('treenode/editor/odvesit//', views.TreeNodeOdvesitView.as_view(), name='treenode_odvesit'), + path('treenode/editor/podvesit///', views.TreeNodePodvesitView.as_view(), name='treenode_podvesit'), + path('treenode/editor/prohodit//', views.TreeNodeProhoditView.as_view(), name='treenode_prohodit'), #path('problem/(?P\d+)/(?P\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'), # Soustredeni diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 7146ca8b..aa34837f 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -1,6 +1,6 @@ # coding:utf-8 -from django.shortcuts import get_object_or_404, render +from django.shortcuts import get_object_or_404, render, redirect from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, JsonResponse from django.urls import reverse,reverse_lazy from django.core.exceptions import PermissionDenied, ObjectDoesNotExist @@ -133,6 +133,8 @@ class TNLData(object): for tnl in result: found.append(tnl) return found + def __repr__(self): + return("TNL({})".format(self.node)) class TreeNodeView(generic.DetailView): model = s.TreeNode @@ -143,6 +145,68 @@ class TreeNodeView(generic.DetailView): context['tnldata'] = TNLData.from_treenode(self.object) return context +class TreeNodePridatView(generic.View): + type_from_str = { + 'rocnikNode': m.RocnikNode, + 'cisloNode': m.CisloNode, + 'castNode': m.CastNode, + 'textNode': m.TextNode, + 'temaVCisleNode': m.TemaVCisleNode, + 'reseniNode': m.ReseniNode, + 'ulohaZadaniNode': m.UlohaZadaniNode, + 'ulohaVzorakNode': m.UlohaVzorakNode, + 'pohadkaNode': m.PohadkaNode, + 'orgText': m.OrgTextNode, + } + + def post(self, request, *args, **kwargs): + kam = self.kwargs['kam'] + node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + + if kam not in ('syn','za'): + raise ValidationError('Přidat lze pouze před nebo za node') + if kam == 'syn': + strtyp = request.POST.get('pridat-typ-{}-syn'.format(node.id)) + typ = self.type_from_str[strtyp] + node = treelib.create_child(node,typ) + if kam == 'za': + strtyp = request.POST.get('pridat-typ-{}-za'.format(node.id)) + typ = self.type_from_str[strtyp] + node = treelib.create_node_after(node,typ) + + return redirect(node.get_admin_url()) + + + + + + + + + + + +class TreeNodeSmazatView(generic.base.View): + def post(self, request, *args, **kwargs): + pass + pass + +class TreeNodeOdvesitView(generic.base.View): + def post(self, request, *args, **kwargs): + pass + pass + +class TreeNodePodvesitView(generic.base.View): + def post(self, request, *args, **kwargs): + pass + pass + +class TreeNodeProhoditView(generic.base.View): + def post(self, request, *args, **kwargs): + pass + pass + + class ProblemView(generic.DetailView): model = s.Problem # Zkopírujeme template_name od TreeNodeView, protože jsme prakticky jen trošku upravený TreeNodeView