20101028

Started to reanimate iGen

Ich habe mich mal drangesetzt und lino.modlib.igen repariert. Zumindest lino.management.commands.initdb funktioniert jetzt wieder.

Todo:

  • eigentlich müssten ich Journaled, Bookable & Co als abstract models implementieren, aber das funktionierte irgendwie nicht. Laut Django Patterns: Model Inheritance sollte es das aber eindeutig.

  • Übergabe der master instance aus dem Hauptmenü in die DocumentsByJournal-Reports funktioniert noch nicht

Ich habe auch schon erwägt, django_polymorphic auszuprobieren (Polymorphic Models for Django, Code). Da lass ich aber momentan die Finger von, hauptsächlich wegen einiger restrictions & caveats. Lieber probiere ich weiter mit Mixins und auf die reine (wenn auch nicht unbedingt feine) Django-Art.

layoutOnTabChange isn’t always enough

Das Layout-Problem in den tabbed details ist gelöst! Hier zum Abschied nochmal der Eintrag aus der To-do-Liste:

  • Im Detail der Personen sind manche Tabs anfangs nicht korrekt gelayoutet. Dann muss man jeweils auf den Pin-Button oben rechts klicken (der die Seite mit Permalink neu öffnet) um das korrekte Layout sehen zu können. Condors Antwort in docs/tickets/1 war leider nur die Lösung für den dort beschriebenen spezifischen Fall. Aber er hat mich auf eine Idee gebracht: die vbox-Layouts sind schuld am Problem. Deshalb hatte ich ja auch VBorderPanel geschrieben, aber das wird zumindest in “Profil 1” nicht benutzt.

Für die Lösung waren drei Stunden Nachtschicht und am Ende eine Portion Glück nötig…

Gedanken während der Suche:

Das Problem kommt für vertikale Container ohne vflex-Element (die also layout ‘form’ haben), deren items hboxen sind (also keine einfachen Felder) und die sich selber wiederum in einer hbox befinden. Wenn diese hbox sich in einer vbox zusammen mit einem vflex-element befindet (was ja praktisch immer der Fall ist), fragt die vbox nach ihrer höhe und kriegt darauf nicht die richtige Antwort. Konkret kommt das vor in allen Tabs außer 4 (Profil 2) des Personen-Details. Jetzt wo ich das schon mal verstanden habe, könnte ich mal einen neuen showcase schreiben.

Wobei der erste Tab das Problem auf den ersten Blick nicht hat, weil der par défaut aktiv ist. Aber wenn man das Detail per Permalink mit einen anderen Tab aufruft (z.B. http://127.0.0.1:8000/api/contacts/Persons/16?fmt=detail&tab=1), dann ist der erste Tab ebenfalls falsch.

Ein kleiner Erfolg: nachdem ich jetzt TabPanel.layoutOnTabChange auf true setze, sind die fehlerhaften Tabs ab dem zweiten Aktivieren korrekt. Also man braucht jetzt nicht mehr den Permalink, sondern es reicht wenn man ein bisschen in den Tabs rumblättert…

Für das 5. Tab (Notizen) funktioniert dieser Trick allerdings noch nicht, da hilft weiterhin nur der Permalink. Dieses Tab ist ja auch anders, dort ist es die HtmlBox von LinksByOwner, die nicht richtig gelayoutet wird.

Nachdem ich das alles notiert hatte und das Problem eigentlich bis morgen ruhen lassen wollte, probierte ich noch schnell eine andere Idee: statt layoutOnTabChange zu setzen, rufe ich doLayout() ein bisschen später selber auf, indem ich eine Funktion Lino.on_tab_activate ans activate-Event aller Tabs des TabPanels hänge. Und siehe da: es funktioniert!

Für die HtmlBox musste ich außerdem do_when_visible nicht auf cmp sondern auf cmp.items.get(0) ansetzen.

2.30 Uhr. Puh, jetzt geh ich aber schlafen! Wenn wir 6 Monate früher wären, ginge jetzt die Sonne schon auf…