seminar | TreeNode editor ++ | Pridano odveseni a sirotcinec
- doplneno nastavovani root u TreeNodu do testdat a treelib - pridana podpora odveseni do sirotcince - pridany funkce na smazani / nastaveni root u podstromu
This commit is contained in:
parent
74a95a8780
commit
c2483289fe
6 changed files with 90 additions and 37 deletions
23
seminar/templates/seminar/orphanage.html
Normal file
23
seminar/templates/seminar/orphanage.html
Normal file
|
@ -0,0 +1,23 @@
|
|||
{% extends "seminar/archiv/base.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load sekizai_tags %}
|
||||
|
||||
{# toto z nejakeho duvodu nefunguje #}
|
||||
{% addtoblock css %}
|
||||
dfsdfs
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/mamweb-dev.css' %}" />
|
||||
{% endaddtoblock "css" %}
|
||||
|
||||
{% block custom_css %}
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/mamweb-dev.css' %}" />
|
||||
{% endblock custom_css %}
|
||||
|
||||
{% load comments %}
|
||||
|
||||
{% block content %}
|
||||
<ul>
|
||||
{% for obj in object_list %}
|
||||
<li>{{obj}} (id {{obj.id}})</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock content %}
|
|
@ -8,7 +8,7 @@
|
|||
<button type="submit" formaction="{%url 'treenode_smazat' obj.node.id%}">Smazat</button>
|
||||
{% endif %}
|
||||
{% if obj.parent and obj.parent|editableSiblings %}
|
||||
<button type="submit" formaction="{%url 'treenode_odvesit' obj.node.id%}">Odvěsit na úroveň {{obj.parent.node}}</button>
|
||||
<button type="submit" formaction="{%url 'treenode_odvesitpryc' obj.node.id%}">Odvěsit pryč ze stromu {{obj.parent.node}}</button>
|
||||
{% endif %}
|
||||
{% if obj|canPodvesitPred %}
|
||||
<button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'pred'%}">Podvěsit pod předchozí</button> - nejsou testovací data
|
||||
|
|
|
@ -219,8 +219,8 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi
|
|||
na_web = text,
|
||||
do_cisla = text,
|
||||
)
|
||||
zad = TextNode.objects.create(text = text_zadani)
|
||||
uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad)
|
||||
zad = TextNode.objects.create(text = text_zadani, root = p.cislo_zadani.rocnik.rocniknode)
|
||||
uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad, root = p.cislo_zadani.rocnik.rocniknode)
|
||||
p.ulohazadaninode = uloha_zadani
|
||||
otec_syn(cisla[poradi_cisla-2-1].cislonode, uloha_zadani)
|
||||
|
||||
|
@ -241,8 +241,8 @@ def gen_vzoroveho_reseni_ulohy(rnd, organizatori, uloha, pocet_opravovatelu):
|
|||
na_web = obsah,
|
||||
do_cisla = obsah
|
||||
)
|
||||
vzorak = TextNode.objects.create(text = text_vzoraku)
|
||||
uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak)
|
||||
vzorak = TextNode.objects.create(text = text_vzoraku, root = uloha.cislo_zadani.rocnik.rocniknode)
|
||||
uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak, root = uloha.cislo_zadani.rocnik.rocniknode)
|
||||
uloha.ulohavzoraknode = uloha_vzorak
|
||||
|
||||
uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu))
|
||||
|
@ -409,7 +409,7 @@ def gen_cisla(rnd, rocniky):
|
|||
datum_deadline=deadline,
|
||||
verejne_db=True
|
||||
)
|
||||
node2 = CisloNode.objects.create(cislo = cislo, succ = node)
|
||||
node2 = CisloNode.objects.create(cislo = cislo, succ = node, root=rocnik.rocniknode)
|
||||
cislo.save()
|
||||
node = node2
|
||||
if otec:
|
||||
|
@ -448,54 +448,54 @@ def gen_dlouhe_tema(rnd, organizatori, rocnik, nazev, obor, kod):
|
|||
for cislo in cisla:
|
||||
# Přidáme TemaVCisleNode do daného čísla
|
||||
cislo_node = cislo.cislonode
|
||||
tema_cislo_node = TemaVCisleNode.objects.create(tema = tema)
|
||||
tema_cislo_node = TemaVCisleNode.objects.create(tema = tema, root = cislo_node.root)
|
||||
insert_last_child(cislo_node, tema_cislo_node)
|
||||
|
||||
# Přidávání obsahu do čísla
|
||||
cast_node = m.CastNode.objects.create(nadpis = "Příspěvek k číslu {}".format(cislo.kod))
|
||||
cast_node = m.CastNode.objects.create(nadpis = "Příspěvek k číslu {}".format(cislo.kod), root=cislo_node.root)
|
||||
add_first_child(tema_cislo_node, cast_node)
|
||||
|
||||
text_node = TextNode.objects.create(text = get_text())
|
||||
text_node = TextNode.objects.create(text = get_text(), root=cislo_node.root)
|
||||
add_first_child(cast_node, text_node)
|
||||
|
||||
cast_node2 = m.CastNode.objects.create(nadpis = "První podproblém")
|
||||
cast_node2 = m.CastNode.objects.create(nadpis = "První podproblém", root=cislo_node.root)
|
||||
add_first_child(text_node, cast_node2)
|
||||
|
||||
text_node2 = TextNode.objects.create(text = get_text())
|
||||
text_node2 = TextNode.objects.create(text = get_text(), root=cislo_node.root)
|
||||
add_first_child(cast_node2, text_node2)
|
||||
|
||||
cast_node3 = m.CastNode.objects.create(nadpis = "Druhý podproblém")
|
||||
cast_node3 = m.CastNode.objects.create(nadpis = "Druhý podproblém", root=cislo_node.root)
|
||||
add_first_child(text_node2, cast_node3)
|
||||
|
||||
text_node3 = TextNode.objects.create(text = get_text())
|
||||
text_node3 = TextNode.objects.create(text = get_text(), root=cislo_node.root)
|
||||
add_first_child(cast_node3, text_node3)
|
||||
|
||||
cast_node4 = m.CastNode.objects.create(nadpis = "Třetí podproblém")
|
||||
cast_node4 = m.CastNode.objects.create(nadpis = "Třetí podproblém", root=cislo_node.root)
|
||||
add_first_child(text_node3, cast_node4)
|
||||
|
||||
text_node4 = TextNode.objects.create(text = get_text())
|
||||
text_node4 = TextNode.objects.create(text = get_text(), root=cislo_node.root)
|
||||
add_first_child(cast_node3, text_node4)
|
||||
|
||||
cast_node3a = m.CastNode.objects.create(nadpis = "Podproblém paralelní s "
|
||||
"druhým podproblémem")
|
||||
"druhým podproblémem", root=cislo_node.root)
|
||||
cast_node3.succ = cast_node3a
|
||||
cast_node3.save()
|
||||
|
||||
text_node3a = TextNode.objects.create(text = get_text())
|
||||
text_node3a = TextNode.objects.create(text = get_text(), root=cislo_node.root)
|
||||
add_first_child(cast_node3a, text_node3a)
|
||||
|
||||
# Občas přidáme mezičíslo
|
||||
if rnd.randint(1, 3) == 1:
|
||||
create_node_after(cislo_node, m.MezicisloNode)
|
||||
create_node_after(cislo_node, m.MezicisloNode, root=cislo_node.root)
|
||||
mezicislo_node = cislo_node.succ
|
||||
|
||||
cast_node_mezicislo = m.CastNode.objects.create(
|
||||
nadpis = "Příspěvek k mezičíslu".format(cislo.kod))
|
||||
nadpis = "Příspěvek k mezičíslu".format(cislo.kod), root=cislo_node.root)
|
||||
add_first_child(mezicislo_node, cast_node_mezicislo)
|
||||
|
||||
odstavec = lorem.paragraph()
|
||||
text_mezicislo = Text.objects.create(na_web = odstavec, do_cisla = odstavec)
|
||||
text_node_mezicislo = TextNode.objects.create(text = text_mezicislo)
|
||||
text_mezicislo = Text.objects.create(na_web = odstavec, do_cisla = odstavec)
|
||||
text_node_mezicislo = TextNode.objects.create(text = text_mezicislo, root=cislo_node.root)
|
||||
add_first_child(cast_node_mezicislo, text_node_mezicislo)
|
||||
|
||||
return tema
|
||||
|
@ -539,7 +539,7 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori):
|
|||
|
||||
# Vyrobíme TemaVCisleNody pro obsah
|
||||
for i in range(zacatek_tematu, konec_tematu+1):
|
||||
node = TemaVCisleNode.objects.create(tema = t)
|
||||
node = TemaVCisleNode.objects.create(tema = t,root=rocnik.rocniknode)
|
||||
# FIXME: Není to off-by-one?
|
||||
otec = cisla[i-1].cislonode
|
||||
otec_syn(otec, node)
|
||||
|
@ -596,8 +596,8 @@ def gen_ulohy_tematu(rnd, organizatori, tema, kod, cislo, cislo_se_vzorakem):
|
|||
na_web = obsah,
|
||||
do_cisla = obsah,
|
||||
)
|
||||
zad = TextNode.objects.create(text = text_zadani)
|
||||
uloha_zadani = UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad)
|
||||
zad = TextNode.objects.create(text = text_zadani, root=tema.temavcislenode_set.first().root)
|
||||
uloha_zadani = UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad, root=tema.temavcislenode_set.first().root)
|
||||
uloha.ulohazadaninode = uloha_zadani
|
||||
|
||||
return uloha, uloha_zadani
|
||||
|
|
|
@ -181,6 +181,7 @@ def get_prev_node_of_type(node, type):
|
|||
# Editace stromu:
|
||||
def create_node_after(predecessor, type, **kwargs):
|
||||
new_node = type.objects.create(**kwargs)
|
||||
new_node.root = predecessor.root
|
||||
new_node.save()
|
||||
succ = predecessor.succ
|
||||
predecessor.succ = new_node
|
||||
|
@ -192,6 +193,7 @@ def create_node_after(predecessor, type, **kwargs):
|
|||
# Vyrábí prvního syna, ostatní nalepí za (existují-li)
|
||||
def create_child(parent, type, **kwargs):
|
||||
new_node = type.objects.create(**kwargs)
|
||||
new_node.root = parent.root
|
||||
new_node.save()
|
||||
orig_child = parent.first_child
|
||||
parent.first_child = new_node
|
||||
|
@ -231,6 +233,7 @@ def create_node_before(successor, type, **kwargs):
|
|||
create_child(successor.father_of_first, type, **kwargs)
|
||||
# Teď už easy: Jsme sirotci, takže se vyrobíme a našeho následníka si přidáme jako succ
|
||||
new = type.objects.create(**kwargs)
|
||||
new.root = successor.root
|
||||
new.succ = successor
|
||||
new.save()
|
||||
return new
|
||||
|
@ -247,7 +250,6 @@ class TreeLibError(RuntimeError):
|
|||
|
||||
|
||||
@transaction.atomic
|
||||
#FIXME Neřeší father-of-first!
|
||||
def swap_succ(node):
|
||||
if node is None:
|
||||
raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.")
|
||||
|
@ -339,22 +341,20 @@ def lower_node(node):
|
|||
|
||||
# To by mělo být všechno...
|
||||
|
||||
def delete_node(node):
|
||||
def disconnect_node(node):
|
||||
#FIXME: dodělat odstranění roota všem potomkům
|
||||
if node is None:
|
||||
raise TreeLibError("Nelze smazat None. Tohle by se nemělo stát.")
|
||||
if node.first_child:
|
||||
raise TreeLibError("Mazání TreeNode s potomky není podporováno.")
|
||||
raise TreeLibError("Nelze odpojit None. Tohle by se nemělo stát.")
|
||||
|
||||
print(f'My:{node}, predchudce:{safe_pred(node)}, naslednik:{safe_succ(node)}, otec:{safe_father_of_first(node)}')
|
||||
|
||||
# Jsme prvnim synem
|
||||
if safe_pred(node) is None:
|
||||
if safe_succ(node) is None: # Jsme jedinym synem - upravime otce (pokud mame) a smazeme se
|
||||
if safe_succ(node) is None: # Jsme jedinym synem - upravime otce (pokud mame) a odpojime se
|
||||
father = safe_father_of_first(node)
|
||||
if father is not None:
|
||||
father.first_child = None
|
||||
father.save()
|
||||
node.delete()
|
||||
return
|
||||
|
||||
else: # mame bratra
|
||||
|
@ -363,5 +363,24 @@ def delete_node(node):
|
|||
# Jsme neprvním synem
|
||||
prev = node.prev
|
||||
prev.succ = node.succ
|
||||
node.delete()
|
||||
node.prev = None
|
||||
node.succ = None
|
||||
node.save()
|
||||
clear_root(node)
|
||||
prev.save()
|
||||
|
||||
def clear_root(node):
|
||||
node.root = None
|
||||
node.save()
|
||||
if node.first_child:
|
||||
clear_root(node.first_child)
|
||||
if node.succ:
|
||||
clear_root(node.succ)
|
||||
|
||||
def set_root(node,root):
|
||||
node.root = root
|
||||
node.save()
|
||||
if node.first_child:
|
||||
clear_root(node.first_child)
|
||||
if node.succ:
|
||||
clear_root(node.succ)
|
||||
|
|
|
@ -28,9 +28,10 @@ urlpatterns = [
|
|||
path('treenode/<int:pk>/', views.TreeNodeView.as_view(), name='seminar_treenode'),
|
||||
path('treenode/editor/pridat/<int:pk>/<str:kam>/', views.TreeNodePridatView.as_view(), name='treenode_pridat'),
|
||||
path('treenode/editor/smazat/<int:pk>/', views.TreeNodeSmazatView.as_view(), name='treenode_smazat'),
|
||||
path('treenode/editor/odvesit/<int:pk>/', views.TreeNodeOdvesitView.as_view(), name='treenode_odvesit'),
|
||||
path('treenode/editor/odvesitpryc/<int:pk>/', views.TreeNodeOdvesitPrycView.as_view(), name='treenode_odvesitpryc'),
|
||||
path('treenode/editor/podvesit/<int:pk>/<str:kam>/', views.TreeNodePodvesitView.as_view(), name='treenode_podvesit'),
|
||||
path('treenode/editor/prohodit/<int:pk>/', views.TreeNodeProhoditView.as_view(), name='treenode_prohodit'),
|
||||
path('treenode/sirotcinec/', views.SirotcinecView.as_view(), name='seminar_treenode_sirotcinec'),
|
||||
#path('problem/(?P<pk>\d+)/(?P<prispevek>\d+)/', views.PrispevekView.as_view(), name='seminar_problem_prispevek'),
|
||||
|
||||
# Soustredeni
|
||||
|
|
|
@ -191,14 +191,18 @@ class TreeNodeSmazatView(generic.base.View):
|
|||
node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
|
||||
if node.first_child:
|
||||
raise NotImplementedError('Mazání TreeNode se syny není zatím podporováno!')
|
||||
treelib.delete_node(node)
|
||||
treelib.disconnect_node(node)
|
||||
node.delete()
|
||||
return redirect(request.headers.get('referer'))
|
||||
|
||||
class TreeNodeOdvesitView(generic.base.View):
|
||||
class TreeNodeOdvesitPrycView(generic.base.View):
|
||||
def post(self, request, *args, **kwargs):
|
||||
node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
|
||||
pass
|
||||
pass
|
||||
treelib.disconnect_node(node)
|
||||
node.root = None
|
||||
node.save()
|
||||
return redirect(request.headers.get('referer'))
|
||||
|
||||
|
||||
class TreeNodePodvesitView(generic.base.View):
|
||||
def post(self, request, *args, **kwargs):
|
||||
|
@ -217,6 +221,12 @@ class TreeNodeProhoditView(generic.base.View):
|
|||
return redirect(request.headers.get('referer'))
|
||||
#FIXME ve formulari predat puvodni url a vratit redirect na ni
|
||||
|
||||
class SirotcinecView(generic.ListView):
|
||||
model = s.TreeNode
|
||||
template_name = 'seminar/orphanage.html'
|
||||
|
||||
def get_queryset(self):
|
||||
return s.TreeNode.objects.not_instance_of(s.RocnikNode).filter(root=None)
|
||||
|
||||
class ProblemView(generic.DetailView):
|
||||
model = s.Problem
|
||||
|
|
Loading…
Reference in a new issue