TreeLib: nástřel rozhraní, až na print_tree neimplementováno
This commit is contained in:
parent
de24a5029a
commit
2632b90e5d
2 changed files with 63 additions and 9 deletions
|
@ -1244,6 +1244,7 @@ class TreeNode(PolymorphicModel):
|
|||
on_delete = models.SET_NULL, # Vrcholy s null kořenem jsou sirotci bez ročníku
|
||||
verbose_name="kořen stromu")
|
||||
first_child = models.ForeignKey('TreeNode',
|
||||
related_name='father_of_first',
|
||||
null = True,
|
||||
blank = True,
|
||||
on_delete=models.SET_NULL,
|
||||
|
@ -1264,15 +1265,6 @@ class TreeNode(PolymorphicModel):
|
|||
srolovatelne = models.BooleanField(null = True, blank = True,
|
||||
verbose_name = "Srolovatelné",
|
||||
help_text = "Bude na stránce témátka možnost tuto položku skrýt")
|
||||
|
||||
# Slouží k debugování pro rychlé získání představy o podobě podstromu pod tímto TreeNode.
|
||||
def print_tree(self,indent=0):
|
||||
# FIXME: Tady se spoléháme na to, že nedeklarovaný primární klíč se jmenuje by default 'id', což není úplně správně
|
||||
print("{}{} (id: {})".format(" "*indent,self, self.id))
|
||||
if self.first_child:
|
||||
self.first_child.print_tree(indent=indent+2)
|
||||
if self.succ:
|
||||
self.succ.print_tree(indent=indent)
|
||||
|
||||
def getOdkazStr(self): # String na rozcestník
|
||||
return self.first_child.getOdkazStr()
|
||||
|
@ -1341,6 +1333,7 @@ class MezicisloNode(TreeNode):
|
|||
verbose_name = 'Mezičíslo (Node)'
|
||||
verbose_name_plural = 'Mezičísla (Node)'
|
||||
|
||||
# TODO: Využít TreeLib
|
||||
def aktualizuj_nazev(self):
|
||||
if self.prev:
|
||||
if (self.prev.get_real_instance_class() != CisloNode and
|
||||
|
|
61
seminar/treelib.py
Normal file
61
seminar/treelib.py
Normal file
|
@ -0,0 +1,61 @@
|
|||
# NOTE: node.prev a node.succ jsou implementovány přímo v models.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):
|
||||
# FIXME: Tady se spoléháme na to, že nedeklarovaný primární klíč se jmenuje by default 'id', což není úplně správně
|
||||
print("{}{} (id: {})".format(" "*indent,node, node.id))
|
||||
if node.first_child:
|
||||
node.first_child.print_tree(indent=indent+2)
|
||||
if node.succ:
|
||||
node.succ.print_tree(indent=indent)
|
||||
|
||||
## Rodinné vztahy
|
||||
def get_parent(node):
|
||||
# Nejdřív získáme prvního potomka...
|
||||
|
||||
# ... a z prvního potomka umíme najít rodiče
|
||||
|
||||
# Obecný next: další Node v "the-right-order" pořadí (já, pak potomci, pak sousedé)
|
||||
def general_next(node)
|
||||
def general_prev(node)
|
||||
|
||||
# Generátor potomků
|
||||
# TODO: copy-pasta
|
||||
|
||||
# Generátor bratrů
|
||||
|
||||
# Generátor následníků v "the-right-order"
|
||||
|
||||
## Filtrační hledání
|
||||
# Najdi dalšího bratra nějakého typu, nebo None.
|
||||
# hledá i podtřídy, i.e. get_next_brother_of_type(neco, TreeNode) je prostě succ.
|
||||
def get_next_brother_of_type(current, type):
|
||||
def get_prev_brother_of_type(current, type):
|
||||
|
||||
# Totéž pro "the-right-order" pořadí
|
||||
def get_next_node_of_type(current, type):
|
||||
def get_next_node_of_type(current, type):
|
||||
|
||||
|
||||
|
||||
|
||||
# Editace stromu:
|
||||
def create_node_after(predecessor, type, **kwargs):
|
||||
|
||||
# Vyrábí prvního syna, ostatní nalepí za (existují-li)
|
||||
def create_child(parent, type, **kwargs):
|
||||
|
||||
def create_node_before(...):
|
||||
# Tohle bude hell.
|
||||
|
||||
# ValueError, pokud je (aspoň) jeden parametr None
|
||||
def swap(node, other):
|
||||
|
||||
def swap_pred
|
||||
def swap_succ
|
||||
|
||||
# Rotace stromu
|
||||
# Dokumentace viz wiki:
|
||||
# (lower bude jednoduchá rotace, ne mega, existence jednoduché rotace mi došla až po nakreslení obrázku)
|
||||
def raise(node)
|
||||
def lower(node)
|
Loading…
Reference in a new issue