|
@ -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 |
|
|