Unter http://www.python-forum.de/topic-9698.html habe ich schon einmal nachgefragt, wie man aus den DB Daten einen tree erzeugen kann.
Die Daten aus der DB sehen z.B. so aus:
Code: Alles auswählen
data = [
{'id': 1, 'parent': None, 'name': '1. AAA'},
{'id': 2, 'parent': 1, 'name': '1.1. BBB'},
{'id': 3, 'parent': 1, 'name': '1.2. BBB'},
{'id': 4, 'parent': 2, 'name': '1.2.1. CCC'},
{'id': 5, 'parent': 2, 'name': '1.2.2. CCC'},
{'id': 6, 'parent': None, 'name': '2. AAA'},
{'id': 7, 'parent': 6, 'name': '2.1. BBB'},
]
Dabei unterscheiden sich die beiden Varianten so: Im Hauptmenü werden nur die relevanten Zweige dargestellt , während im SiteMap alle CMS Seiten als Baum aufgelistet werden. Allerdings werden bei beiden Varianten erstmal alle CMS Seiten aus der DB geholt. Das muß man ja leider beim Parent-Modell tun.
Das Hauptmenü soll so funktionieren, wie es z.B. auf http://www.pylucid.org funktioniert. (Dort läuft ja noch die alte PyLucid Version)
Bisher hatte ich nur einen tree-Generator geschrieben, der die SiteMap Daten aufbaut. Gestern habe ich den Teil fertig bekommen, der für das Hauptmenü zuständig ist.
Irgendwie erscheint mir meine Lösung nicht so super effektiv. Vielleicht hat der ein oder andere ja ein paar optimierungs Vorschläge.
Im Grunde wäre es vielleicht nicht schlecht das Parent-Modell mit einer "Nested Sets" Implementierung zu tauschen. Aber das möchte ich z.Z. nicht.
Der Sourcecode ist seperat und kann somit losgelöst getestet werden. Ich hab auf extra unten testdaten eingefügt. z.Z. macht es genau das was es soll.
Sourcecode via Subversion:
http://pylucid.net/trac/browser/branche ... nerator.py
Soucecode im paste:
http://paste.pocoo.org/show/1546/
Wenn ich Verbesserungen im Code machen solltet, wäre es das beste, ihr postet das im paste Dienst, hier der "Replay" Link: http://paste.pocoo.org/reply/1546/ (Dann kann man die DIFF Darstellung benutzten)
Ansonsten: Allgemeine Kommentare sehr erwünscht.
Kleine Erklärung zum Code:
Der erste Aufruf mit .get_complete_tree() erzeugt die SiteMap Daten.
Der zweite und dritte Aufruf mit .get_tree_menu() erzeugt eine "Hauptmenü-Ansicht".
Ich nutzte unten beim Test deepcopy, weil ich im Code später mit .pop() Datensätze aus dem Dict herauslöse. Ich erhoffe mir davon etwas Zeiteinsparung, denn in einem späteren Schritt werden diese Teile eh nicht mehr verwendet. Somit werden die Grunddaten nach und nach weniger.
Ob das wirklich eine gute Idee ist, weiß ich noch nicht so genau...