Browse Source

seminar | treenode editor | pridany dalsi funkce

export_seznamu_prednasek
parent
commit
336ef69054
  1. 4
      seminar/models.py
  2. 4
      seminar/templates/seminar/treenode_recursive.html
  3. 2
      seminar/templatetags/treenodes.py
  4. 14
      seminar/treelib.py
  5. 41
      seminar/views/views_all.py

4
seminar/models.py

@ -826,9 +826,7 @@ class Text(SeminarModelBase):
tn.save() tn.save()
def __str__(self): def __str__(self):
parser = FirstTagParser() return str(self.na_web)[:20]
parser.feed(str(self.na_web))
return parser.firstTag
class Uloha(Problem): class Uloha(Problem):
class Meta: class Meta:

4
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' obj.node.id 'predchozi'%}">Podvěsit pod předchozí</button> - nejsou testovací data <button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'pred'%}">Podvěsit pod předchozí</button> - nejsou testovací data
{% endif %} {% endif %}
{% if obj|canPodvesitZa %} {% if obj|canPodvesitZa %}
<button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'nasledujíci'%}">Podvěsit pod následující</button> - nejsou testovací data <button type="submit" formaction="{%url 'treenode_podvesit' obj.node.id 'za'%}">Podvěsit pod následující</button> - nejsou testovací data
{% endif %} {% endif %}

2
seminar/templatetags/treenodes.py

@ -181,7 +181,7 @@ def appendableChildren(value):
return (NodeTypes.CAST.value, return (NodeTypes.CAST.value,
NodeTypes.TEXT.value, NodeTypes.TEXT.value,
) )
if isCast(value): if isCast(value.node):
return appendableChildren(value.parent) return appendableChildren(value.parent)
return None return None

14
seminar/treelib.py

@ -1,4 +1,5 @@
from django.core.exceptions import ObjectDoesNotExist 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 # 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: 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. # TODO: Chceme, aby všechno nějak zvládlo None jako parametr.
@ -239,6 +240,7 @@ def swap(node, other):
class TreeLibError(RuntimeError): class TreeLibError(RuntimeError):
pass pass
@transaction.atomic
def swap_pred(node): def swap_pred(node):
if node is None: if node is None:
raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.") 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) pre_pred = safe_pred(pred)
succ = node.succ succ = node.succ
#TODO zkontrolovaz, ze toto poradi nerozbiji db a neskonci s unique constraint violation
if pre_pred is not None: if pre_pred is not None:
pre_pred.succ = node pre_pred.succ = None
pre_pred.save() pre_pred.save()
node.succ = pred node.succ = pred
node.save() node.save()
pred.succ = succ pred.succ = succ
pred.save() pred.save()
if pre_pred is not None:
pre_pred.succ = node
pre_pred.save()
@transaction.atomic
def swap_succ(node): def swap_succ(node):
if node is None: if node is None:
raise TreeLibError("Nelze přesunout None. Tohle by se nemělo stát.") 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 post_succ = succ.succ
if pred is not None: if pred is not None:
pred.succ = succ pred.succ = None
pred.save() pred.save()
succ.succ = node succ.succ = node
succ.save() succ.save()
node.succ = post_succ node.succ = post_succ
node.save() node.save()
if pred is not None:
pred.succ = succ
pred.save()
# Rotace stromu # Rotace stromu
# Dokumentace viz wiki: # Dokumentace viz wiki:

41
seminar/views/views_all.py

@ -159,51 +159,60 @@ class TreeNodePridatView(generic.View):
} }
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
kam = self.kwargs['kam']
node = s.TreeNode.objects.get(pk=self.kwargs['pk']) node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
kam = self.kwargs['kam']
if kam not in ('syn','za'): if kam not in ('syn','za'):
raise ValidationError('Přidat lze pouze před nebo za node') raise ValidationError('Přidat lze pouze před nebo za node')
if kam == 'syn': if kam == 'syn':
strtyp = request.POST.get('pridat-typ-{}-syn'.format(node.id)) strtyp = request.POST.get('pridat-typ-{}-syn'.format(node.id))
typ = self.type_from_str[strtyp] typ = self.type_from_str[strtyp]
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) node = treelib.create_child(node,typ)
if kam == 'za': if kam == 'za':
strtyp = request.POST.get('pridat-typ-{}-za'.format(node.id)) strtyp = request.POST.get('pridat-typ-{}-za'.format(node.id))
typ = self.type_from_str[strtyp] typ = self.type_from_str[strtyp]
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) node = treelib.create_node_after(node,typ)
return redirect(node.get_admin_url()) return redirect(node.get_admin_url())
class TreeNodeSmazatView(generic.base.View): class TreeNodeSmazatView(generic.base.View):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
pass node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
pass if node.first_child:
raise NotImplemented('Mazání TreeNode se syny není zatím podporováno!')
node.delete()
class TreeNodeOdvesitView(generic.base.View): class TreeNodeOdvesitView(generic.base.View):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
pass pass
pass pass
class TreeNodePodvesitView(generic.base.View): class TreeNodePodvesitView(generic.base.View):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
pass node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
pass 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): class TreeNodeProhoditView(generic.base.View):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
pass node = s.TreeNode.objects.get(pk=self.kwargs['pk'])
pass treelib.swap_succ(node)
#FIXME ve formulari predat puvodni url a vratit redirect na ni
class ProblemView(generic.DetailView): class ProblemView(generic.DetailView):

Loading…
Cancel
Save