From 336ef6905492c363f4e3f9fbd416b21feb658a70 Mon Sep 17 00:00:00 2001 From: "Tomas \"Jethro\" Pokorny" Date: Thu, 21 May 2020 12:42:15 +0200 Subject: [PATCH] seminar | treenode editor | pridany dalsi funkce --- seminar/models.py | 4 +- .../templates/seminar/treenode_recursive.html | 4 +- seminar/templatetags/treenodes.py | 2 +- seminar/treelib.py | 14 +++++- seminar/views/views_all.py | 45 +++++++++++-------- 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/seminar/models.py b/seminar/models.py index c53c7048..c045b658 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -826,9 +826,7 @@ class Text(SeminarModelBase): tn.save() def __str__(self): - parser = FirstTagParser() - parser.feed(str(self.na_web)) - return parser.firstTag + return str(self.na_web)[:20] class Uloha(Problem): class Meta: diff --git a/seminar/templates/seminar/treenode_recursive.html b/seminar/templates/seminar/treenode_recursive.html index 62beed10..a95568df 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 %} diff --git a/seminar/templatetags/treenodes.py b/seminar/templatetags/treenodes.py index d9bb668e..2aa914e4 100644 --- a/seminar/templatetags/treenodes.py +++ b/seminar/templatetags/treenodes.py @@ -181,7 +181,7 @@ def appendableChildren(value): return (NodeTypes.CAST.value, NodeTypes.TEXT.value, ) - if isCast(value): + if isCast(value.node): return appendableChildren(value.parent) return None diff --git a/seminar/treelib.py b/seminar/treelib.py index ba08e07a..8653e599 100644 --- a/seminar/treelib.py +++ b/seminar/treelib.py @@ -1,4 +1,5 @@ from django.core.exceptions import ObjectDoesNotExist +from django.db import transaction # NOTE: node.prev a node.succ jsou implementovány přímo v models.TreeNode # TODO: Všechny tyto funkce se naivně spoléhají na to, že jako parametr dostanou nějaký TreeNode (některé možná zvládnou i None) # TODO: Chceme, aby všechno nějak zvládlo None jako parametr. @@ -239,6 +240,7 @@ def swap(node, other): class TreeLibError(RuntimeError): pass +@transaction.atomic def swap_pred(node): if node is None: raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.") @@ -248,14 +250,19 @@ def swap_pred(node): pre_pred = safe_pred(pred) succ = node.succ + #TODO zkontrolovaz, ze toto poradi nerozbiji db a neskonci s unique constraint violation if pre_pred is not None: - pre_pred.succ = node + pre_pred.succ = None pre_pred.save() node.succ = pred node.save() pred.succ = succ pred.save() + if pre_pred is not None: + pre_pred.succ = node + pre_pred.save() +@transaction.atomic def swap_succ(node): if node is None: raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.") @@ -266,12 +273,15 @@ def swap_succ(node): post_succ = succ.succ if pred is not None: - pred.succ = succ + pred.succ = None pred.save() succ.succ = node succ.save() node.succ = post_succ node.save() + if pred is not None: + pred.succ = succ + pred.save() # Rotace stromu # Dokumentace viz wiki: diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 8bad8c03..46297dba 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -159,51 +159,60 @@ class TreeNodePridatView(generic.View): } def post(self, request, *args, **kwargs): - kam = self.kwargs['kam'] node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + kam = self.kwargs['kam'] 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 typ == m.TextNode: + text_obj = m.Text() + text_obj.save() + node = treelib.create_child(node,typ,text=text_obj) + else: + 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) + if typ == m.TextNode: + text_obj = m.Text() + text_obj.save() + node = treelib.create_node_after(node,typ,text=text_obj) + else: + 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 + node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + if node.first_child: + raise NotImplemented('Mazání TreeNode se syny není zatím podporováno!') + node.delete() class TreeNodeOdvesitView(generic.base.View): def post(self, request, *args, **kwargs): + node = s.TreeNode.objects.get(pk=self.kwargs['pk']) pass pass class TreeNodePodvesitView(generic.base.View): def post(self, request, *args, **kwargs): - pass - pass + node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + kam = self.kwargs['kam'] + if kam == 'pred': + lower_node(node) + elif kam == 'za': + raise NotImplemented('Podvěsit za není zatím podporováno') class TreeNodeProhoditView(generic.base.View): def post(self, request, *args, **kwargs): - pass - pass + node = s.TreeNode.objects.get(pk=self.kwargs['pk']) + treelib.swap_succ(node) + #FIXME ve formulari predat puvodni url a vratit redirect na ni class ProblemView(generic.DetailView):