Browse Source

Merge branch 'data_migrations' of gimli.ms.mff.cuni.cz:/akce/mam/git/mamweb into data_migrations

export_seznamu_prednasek
parent
commit
1cec286697
  1. 54
      seminar/treelib.py

54
seminar/treelib.py

@ -1,6 +1,7 @@
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
# 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.
# Slouží k debugování pro rychlé získání představy o podobě podstromu pod tímto TreeNode. # Slouží k debugování pro rychlé získání představy o podobě podstromu pod tímto TreeNode.
def print_tree(node,indent=0): def print_tree(node,indent=0):
@ -106,6 +107,12 @@ def all_children(node):
yield br yield br
# Generátor následníků v "the-right-order" # Generátor následníků v "the-right-order"
# Bez tohoto vrcholu
def all_following(node):
current = general_next(node)
while current is not None:
yield current
current = general_next(current)
## Filtrační hledání ## Filtrační hledání
# Najdi dalšího bratra nějakého typu, nebo None. # Najdi dalšího bratra nějakého typu, nebo None.
@ -114,26 +121,57 @@ def get_next_brother_of_type(node, type):
for current in right_brothers(node): for current in right_brothers(node):
if isinstance(current, type): if isinstance(current, type):
return current return current
return None
def get_prev_brother_of_type(node, type): def get_prev_brother_of_type(node, type):
pass # Na tohle není rozumný generátor, ani ho asi nechceme, prostě to implementujeme cyklem.
current = node
while safe_pred(current) is not None:
current = safe_pred(current)
if isinstance(current, type):
return current
return None
# Totéž pro "the-right-order" pořadí # Totéž pro "the-right-order" pořadí
def get_next_node_of_type(current, type): def get_next_node_of_type(node, type):
pass for cur in all_folowing(node):
def get_next_node_of_type(current, type): if isinstance(cur, type):
pass return cur
return None
def get_prev_node_of_type(node, type):
# Na tohle není rozumný generátor, ani ho asi nechceme, prostě to implementujeme cyklem.
current = node
while general_prev(current) is not None:
current = general_prev(current)
if isinstance(current, type):
return current
return None
# Editace stromu: # Editace stromu:
def create_node_after(predecessor, type, **kwargs): def create_node_after(predecessor, type, **kwargs):
pass new_node = type.objects.create(**kwargs)
new_node.save()
succ = predecessor.succ
predecessor.succ = new_node
predecessor.save()
new_node.succ = succ
new_node.save()
# Vyrábí prvního syna, ostatní nalepí za (existují-li) # Vyrábí prvního syna, ostatní nalepí za (existují-li)
def create_child(parent, type, **kwargs): def create_child(parent, type, **kwargs):
pass new_node = type.objects.create(**kwargs)
new_node.save()
orig_child = parent.first_child
parent.first_child = new_node
parent.save()
if orig_child is not None:
# Přidáme původního prvního syna jako potomka nového vrcholu
new_node.succ = orig_child
new_node.save()
def create_node_before(some, arguments, but, i, dont, know, which, yet): def create_node_before(some, arguments, but, i, dont, know, which, yet):
pass pass
@ -141,7 +179,7 @@ def create_node_before(some, arguments, but, i, dont, know, which, yet):
# ValueError, pokud je (aspoň) jeden parametr None # ValueError, pokud je (aspoň) jeden parametr None
def swap(node, other): def swap(node, other):
pass raise NotImplementedError("YAGNI (You aren't gonna need it).")
def swap_pred(node): def swap_pred(node):
pass pass

Loading…
Cancel
Save