Browse Source

TreeLib: nástřel rozhraní, až na print_tree neimplementováno

export_seznamu_prednasek
Pavel 'LEdoian' Turinsky 5 years ago
parent
commit
2632b90e5d
  1. 11
      seminar/models.py
  2. 61
      seminar/treelib.py

11
seminar/models.py

@ -1244,6 +1244,7 @@ class TreeNode(PolymorphicModel):
on_delete = models.SET_NULL, # Vrcholy s null kořenem jsou sirotci bez ročníku on_delete = models.SET_NULL, # Vrcholy s null kořenem jsou sirotci bez ročníku
verbose_name="kořen stromu") verbose_name="kořen stromu")
first_child = models.ForeignKey('TreeNode', first_child = models.ForeignKey('TreeNode',
related_name='father_of_first',
null = True, null = True,
blank = True, blank = True,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
@ -1264,15 +1265,6 @@ class TreeNode(PolymorphicModel):
srolovatelne = models.BooleanField(null = True, blank = True, srolovatelne = models.BooleanField(null = True, blank = True,
verbose_name = "Srolovatelné", verbose_name = "Srolovatelné",
help_text = "Bude na stránce témátka možnost tuto položku skrýt") 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 def getOdkazStr(self): # String na rozcestník
return self.first_child.getOdkazStr() return self.first_child.getOdkazStr()
@ -1341,6 +1333,7 @@ class MezicisloNode(TreeNode):
verbose_name = 'Mezičíslo (Node)' verbose_name = 'Mezičíslo (Node)'
verbose_name_plural = 'Mezičísla (Node)' verbose_name_plural = 'Mezičísla (Node)'
# TODO: Využít TreeLib
def aktualizuj_nazev(self): def aktualizuj_nazev(self):
if self.prev: if self.prev:
if (self.prev.get_real_instance_class() != CisloNode and if (self.prev.get_real_instance_class() != CisloNode and

61
seminar/treelib.py

@ -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…
Cancel
Save