From 2632b90e5d80b28a19e7febf47933c0467ed16ab Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Wed, 4 Mar 2020 02:41:02 +0100 Subject: [PATCH] =?UTF-8?q?TreeLib:=20n=C3=A1st=C5=99el=20rozhran=C3=AD,?= =?UTF-8?q?=20a=C5=BE=20na=20print=5Ftree=20neimplementov=C3=A1no?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/models.py | 11 ++------- seminar/treelib.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 seminar/treelib.py diff --git a/seminar/models.py b/seminar/models.py index 6f1c89f5..d1040739 100644 --- a/seminar/models.py +++ b/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 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 diff --git a/seminar/treelib.py b/seminar/treelib.py new file mode 100644 index 00000000..a0ef1e08 --- /dev/null +++ b/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)