Browse Source

seminar | treenode editor | Prototyp pridavani, funguje jen neco

export_seznamu_prednasek
parent
commit
98eed4bab4
  1. 3
      seminar/templates/seminar/treenode.html
  2. 16
      seminar/templates/seminar/treenode_add_stub.html
  3. 2
      seminar/templates/seminar/treenode_name.html
  4. 12
      seminar/templates/seminar/treenode_recursive.html
  5. 7
      seminar/templatetags/treenodes.py
  6. 3
      seminar/treelib.py
  7. 11
      seminar/urls.py
  8. 66
      seminar/views/views_all.py

3
seminar/templates/seminar/treenode.html

@ -16,7 +16,8 @@ dfsdfs
{% block content %} {% block content %}
<form> <form method="POST">
{% csrf_token %}
{%with obj=tnldata depth=1 template_name="seminar/treenode_recursive.html" %} {%with obj=tnldata depth=1 template_name="seminar/treenode_recursive.html" %}
{%include template_name%} {%include template_name%}
{%endwith%} {%endwith%}

16
seminar/templates/seminar/treenode_add_stub.html

@ -1,11 +1,17 @@
{% load treenodes %} {% 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 %}
<div class="pink">Přidat {{kam}} <div class="pink">Přidat {{kam}}
<select> <select name="pridat-typ-{{obj.node.id}}-{{kam_slug}}">
{% for chld in obj.node|appendableChildren %} {% for typ in dostupne_typy %}
<option value="{{chld.0}}">{{chld.1}}</option> <option value="{{typ.0}}">{{typ.1}}</option>
{% endfor %} {% endfor %}
</select> </select>
<button action="submit" formaction="{%url 'treenode_pridat' obj.node.id%}">Přidat</button> <button action="submit" formaction="{%url 'treenode_pridat' obj.node.id kam_slug%}">Přidat</button>
</div> </div>
{% endif %}{# appendablebleChildren #} {% endif %}{# appendablebleChildren #}

2
seminar/templates/seminar/treenode_name.html

@ -9,6 +9,8 @@
<h{{depth}}>Úloha {{obj.node.uloha.kod_v_rocniku}} ({{obj.node.uloha.max_body}} b)</h{{depth}}> <h{{depth}}>Úloha {{obj.node.uloha.kod_v_rocniku}} ({{obj.node.uloha.max_body}} b)</h{{depth}}>
{% elif obj.node|isUlohaVzorak %} {% elif obj.node|isUlohaVzorak %}
<h{{depth}}>Řešení: {{obj.node.uloha.kod_v_rocniku}}</h{{depth}}> <h{{depth}}>Řešení: {{obj.node.uloha.kod_v_rocniku}}</h{{depth}}>
{% elif obj.node|isCast %}
<h{{depth}}> {{obj.node.nadpis}} </h{{depth}}>
{% elif obj.node|isText %} {% elif obj.node|isText %}
{{obj.node.text.na_web}} {{obj.node.text.na_web}}
{% else %} {% else %}

12
seminar/templates/seminar/treenode_recursive.html

@ -10,10 +10,10 @@
<button type="submit" formaction="{%url 'treenode_odvesit' obj.node.id%}">Odvěsit na úroveň {{obj.parent.node}}</button> <button type="submit" formaction="{%url 'treenode_odvesit' obj.node.id%}">Odvěsit na úroveň {{obj.parent.node}}</button>
{% endif %} {% endif %}
{% if obj|canPodvesitPred %} {% if obj|canPodvesitPred %}
<button type="submit" formaction="{%url 'treenode_podvesit_predchozi' obj.node.id%}">Podvěsit pod předchozí</button> - nejsou testovací data <button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'predchozi'%}">Podvěsit pod předchozí</button> - nejsou testovací data
{% endif %} {% endif %}
{% if obj|canPodvesitZa %} {% if obj|canPodvesitZa %}
<button type="submit" formaction="{%url 'treenode_podvesit_nasledujici' obj.node.id%}">Podvěsit pod následující</button> - nejsou testovací data <button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'nasledujíci'%}">Podvěsit pod následující</button> - nejsou testovací data
{% endif %} {% endif %}
@ -28,16 +28,16 @@
{%if obj.children %} {%if obj.children %}
<div class="borderized children"> <div class="borderized 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 %} {%for ch in obj.children %}
{# ----------- Vypisujeme podstrom ----------#} {# ----------- Vypisujeme podstrom ----------#}
{%with obj=ch depth=depth|add:"1" %} {%include "seminar/treenode_recursive.html" %} {%endwith%} {%with obj=ch depth=depth|add:"1" %} {%include "seminar/treenode_recursive.html" %} {%endwith%}
{# ----------- Přidáváme mezi syny / za posledního -------- #} {# ----------- Přidáváme mezi syny / za posledního -------- #}
{% if forloop.last %} {% 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 %} {% 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 %} {% endif %}
{# ----------- Prohazujeme sousedy ----------#} {# ----------- Prohazujeme sousedy ----------#}
<div class="pink"> <div class="pink">
@ -49,6 +49,6 @@
</div> </div>
{% else %} {% else %}
{# ----------- Přidáváme prvního syna ----------#} {# ----------- 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%} {%endif%}
</div> </div>

7
seminar/templatetags/treenodes.py

@ -155,6 +155,7 @@ def canPodvesitPred(value):
class NodeTypes(Enum): class NodeTypes(Enum):
ROCNIK = ('rocnikNode','Ročník') ROCNIK = ('rocnikNode','Ročník')
CISLO = ('cisloNode', 'Číslo') CISLO = ('cisloNode', 'Číslo')
MEZICISLO = ('mezicisloNode', 'Mezičíslo')
CAST = ('castNode', 'Část') CAST = ('castNode', 'Část')
TEXT = ('textNode', 'Text') TEXT = ('textNode', 'Text')
TEMAVCISLE = ('temaVCisleNode', 'Téma v čísle') TEMAVCISLE = ('temaVCisleNode', 'Téma v čísle')
@ -167,16 +168,16 @@ class NodeTypes(Enum):
@register.filter @register.simple_tag
def appendableChildren(value): def appendableChildren(value):
if isTemaVCisle(value): if isTemaVCisle(value.node):
return (NodeTypes.RESENI.value, return (NodeTypes.RESENI.value,
NodeTypes.ULOHAZADANI.value, NodeTypes.ULOHAZADANI.value,
NodeTypes.ULOHAVZORAK.value, NodeTypes.ULOHAVZORAK.value,
NodeTypes.CAST.value, NodeTypes.CAST.value,
NodeTypes.TEXT.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, return (NodeTypes.CAST.value,
NodeTypes.TEXT.value, NodeTypes.TEXT.value,
) )

3
seminar/treelib.py

@ -181,6 +181,7 @@ def create_node_after(predecessor, type, **kwargs):
predecessor.save() predecessor.save()
new_node.succ = succ new_node.succ = succ
new_node.save() new_node.save()
return new_node
# Vyrábí prvního syna, ostatní nalepí za (existují-li) # Vyrábí prvního syna, ostatní nalepí za (existují-li)
def create_child(parent, type, **kwargs): 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 # Přidáme původního prvního syna jako potomka nového vrcholu
new_node.succ = orig_child new_node.succ = orig_child
new_node.save() new_node.save()
return new_node
def insert_last_child(parent, node): def insert_last_child(parent, node):
""" Zadaný Node přidá jako posledního potomka otce. """ """ 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 = type.objects.create(**kwargs)
new.succ = successor new.succ = successor
new.save() new.save()
return new
# ValueError, pokud je (aspoň) jeden parametr None # ValueError, pokud je (aspoň) jeden parametr None

11
seminar/urls.py

@ -26,12 +26,11 @@ urlpatterns = [
path('cislo/<int:rocnik>.<int:cislo>/', views.CisloView.as_view(), name='seminar_cislo'), # odkomentované jenom kvůli testování archivu path('cislo/<int:rocnik>.<int:cislo>/', views.CisloView.as_view(), name='seminar_cislo'), # odkomentované jenom kvůli testování archivu
path('problem/<int:pk>/', views.ProblemView.as_view(), name='seminar_problem'), path('problem/<int:pk>/', views.ProblemView.as_view(), name='seminar_problem'),
path('treenode/<int:pk>/', views.TreeNodeView.as_view(), name='seminar_treenode'), path('treenode/<int:pk>/', views.TreeNodeView.as_view(), name='seminar_treenode'),
path('treenode/editor/pridat/<int:pk>', views.TreeNodeView.as_view(), name='treenode_pridat'), path('treenode/editor/pridat/<int:pk>/<str:kam>/', views.TreeNodePridatView.as_view(), name='treenode_pridat'),
path('treenode/editor/smazat/<int:pk>', views.TreeNodeView.as_view(), name='treenode_smazat'), path('treenode/editor/smazat/<int:pk>/', views.TreeNodeSmazatView.as_view(), name='treenode_smazat'),
path('treenode/editor/odvesit/<int:pk>', views.TreeNodeView.as_view(), name='treenode_odvesit'), path('treenode/editor/odvesit/<int:pk>/', views.TreeNodeOdvesitView.as_view(), name='treenode_odvesit'),
path('treenode/editor/podvesit/predchozi/<int:pk>', views.TreeNodeView.as_view(), name='treenode_podvesit_predchozi'), path('treenode/editor/podvesit/<int:pk>/<str:kam>/', views.TreeNodePodvesitView.as_view(), name='treenode_podvesit'),
path('treenode/editor/podvesit/nasledujici/<int:pk>', views.TreeNodeView.as_view(), name='treenode_podvesit_nasledujici'), path('treenode/editor/prohodit/<int:pk>/', views.TreeNodeProhoditView.as_view(), name='treenode_prohodit'),
path('treenode/editor/prohodit/<int:pk>', views.TreeNodeView.as_view(), name='treenode_prohodit'),
#path('problem/(?P<pk>\d+)/(?P<prispevek>\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'), #path('problem/(?P<pk>\d+)/(?P<prispevek>\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'),
# Soustredeni # Soustredeni

66
seminar/views/views_all.py

@ -1,6 +1,6 @@
# coding:utf-8 # 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.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, JsonResponse
from django.urls import reverse,reverse_lazy from django.urls import reverse,reverse_lazy
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
@ -133,6 +133,8 @@ class TNLData(object):
for tnl in result: for tnl in result:
found.append(tnl) found.append(tnl)
return found return found
def __repr__(self):
return("TNL({})".format(self.node))
class TreeNodeView(generic.DetailView): class TreeNodeView(generic.DetailView):
model = s.TreeNode model = s.TreeNode
@ -143,6 +145,68 @@ class TreeNodeView(generic.DetailView):
context['tnldata'] = TNLData.from_treenode(self.object) context['tnldata'] = TNLData.from_treenode(self.object)
return context 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): class ProblemView(generic.DetailView):
model = s.Problem model = s.Problem
# Zkopírujeme template_name od TreeNodeView, protože jsme prakticky jen trošku upravený TreeNodeView # Zkopírujeme template_name od TreeNodeView, protože jsme prakticky jen trošku upravený TreeNodeView

Loading…
Cancel
Save