Browse Source

treelib: přidané funkce insert_last_child, get_last_child a is_orphan

export_seznamu_prednasek
Anet 4 years ago
parent
commit
322718f436
  1. 41
      seminar/treelib.py

41
seminar/treelib.py

@ -12,6 +12,13 @@ def print_tree(node,indent=0):
if node.succ: if node.succ:
print_tree(node.succ, indent=indent) print_tree(node.succ, indent=indent)
def is_orphan(node):
""" Zjišťuje, jestli už je daný Node někde pověšený či nikoli. """
if safe_father_of_first(node) is None and safe_pred(node) is None:
return True
else:
return False
# Django je trošku hloupé, takže node.prev nevrací None, ale hází django.core.exceptions.ObjectDoesNotExist # Django je trošku hloupé, takže node.prev nevrací None, ale hází django.core.exceptions.ObjectDoesNotExist
def safe_pred(node): def safe_pred(node):
try: try:
@ -43,6 +50,13 @@ def get_parent(node):
# ... a z prvního potomka umíme najít rodiče # ... a z prvního potomka umíme najít rodiče
return safe_father_of_first(node) return safe_father_of_first(node)
def get_last_child(node):
first = node.first_child
if first is None:
return None
else:
return last_brother(first)
# Obecný next: další Node v "the-right-order" pořadí (já, pak potomci, pak sousedé) # Obecný next: další Node v "the-right-order" pořadí (já, pak potomci, pak sousedé)
def general_next(node): def general_next(node):
# Máme potomka? # Máme potomka?
@ -100,12 +114,19 @@ def all_proper_brothers(node):
continue continue
yield br yield br
# Generátor potomků
def all_children(node): def all_children(node):
""" Generátor všech potomků zadaného Node. """
brothers = all_brothers(node.first_child) brothers = all_brothers(node.first_child)
for br in brothers: for br in brothers:
yield br yield br
def all_children_of_type(node, type):
""" Generuje všechny potomky daného Node a daného typu. """
brothers = all_brothers(node.first_child)
for br in brothers:
if isinstance(br, type):
yield br
# Generátor následníků v "the-right-order" # Generátor následníků v "the-right-order"
# Bez tohoto vrcholu # Bez tohoto vrcholu
def all_following(node): def all_following(node):
@ -173,6 +194,24 @@ def create_child(parent, type, **kwargs):
new_node.succ = orig_child new_node.succ = orig_child
new_node.save() new_node.save()
def insert_last_child(parent, node):
""" Zadaný Node přidá jako posledního potomka otce. """
last = get_last_child(parent)
if not is_orphan(node):
print(safe_pred(node))
print(safe_father_of_first(node))
if len(safe_father_of_first(node).get_real_instances()) == 0:
print("Related Manager je prázdný.")
print(type(safe_father_of_first(node).queryset_class))
raise TreeLibError("Snažíš se přidat do stromu Node, který už je zavěšený.")
if last is None:
parent.first_child = node
parent.save()
else:
last.succ = node
last.save()
def create_node_before(successor, type, **kwargs): def create_node_before(successor, type, **kwargs):
if safe_pred(successor) is not None: if safe_pred(successor) is not None:
# Easy: přidáme za předchůdce # Easy: přidáme za předchůdce

Loading…
Cancel
Save