20101111 ======== Reminders --------- Ein weiterer Punkt kann aus der To-do-Liste raus: - Im Hauptmenü eine anklickbare Liste aller Verträge und eingescannten Dokumente dieses Benutzers anzeigen, die demnächst ablaufen. Auf Verträgen und eingescannten Dokumenten ein Ankreuzfeld "Erinnerung im Hauptmenü anzeigen", um Einträge manuell abschalten zu können. Die Implementierung ist ein bisschen anders als vorgesehen: - Notizen, Verweise und Verträge haben jetzt zwei neue Felder reminder_date und reminder_text. Wenn reminder_date ausgefüllt ist und nicht in der Zukunft liegt, wird dieser Eintrag im Hauptmenü angezeigt. Die Liste entspricht ästhetisch noch nicht ganz meinem Geschmack (``
  • `` wird nicht als Bullet angezeigt und ich fürchte, dass das am css von ExtJS liegt), aber sie funktioniert. Und ist anklickbar. Intern bertrachtet hat das einige Neuerungen gebracht: - Notizen, Verweise und Verträge sind jetzt Unterklassen von :class:`lino.utils.mixins.Reminder`, die das gemeinsame Interface enthält. - lino.reports.Report.as_string habe ich nach lino.reports.summary umbenannt. :func:`lino.lino_site.discover` installiert jetzt in jedes Modell eine Methode `summary_row`, wenn sie nicht schon existiert. - Lino benutzt jetzt Cheetah als Template Engine für die :xfile:`welcome.html`, und die :xfile:`welcome.html` wird jetzt in den config-Verzeichnissen gesucht (statt wie bisher in Djangos `templates`-Verzeichnissen). Sorry, aber die template engine von Django ist einfach zu beschränkt! Djangos *Such-System* für Templates könnte noch interessant sein, das kann man laut `Dokumentation `_ ja scheinbar sogar in Verbindung mit Cheetah benutzen. (Siehe auch http://code.google.com/p/django-cheetahtemplate.) Aber auf meine config-Verzeichnisse umzusteigen war weniger Arbeit als die Doku zu verstehen und zu implementieren. Wahrscheinlich ist mein Suchsystem langsamer als das von Django, aber Performance (beim einmaligen Finden der Datei) ist zumindest für die :xfile:`welcome.html` egal. 7.35 Uhr Check-in. Clickable URLField ------------------ 11.30 Uhr weiter mit dem folgenden Punkt aus der to-Do-Liste: - URLField muss im Detail anklickbar sein. Und vielleicht auch in der Grid. `Jorge Ramon `_ hat mich auf den Trick mit vtype='url' gebracht. Aber das ist nicht eigentlich das was ich will. Nach etwas Surferei komme ich zu dem Schluss, dass ich mir wohl am besten mein eigenes Feld Lino.URLField mache:: Lino.URLField = Ext.extend(Ext.form.TriggerField,{ triggerClass : 'x-form-search-trigger', vtype: 'url', onTriggerClick : function() { window.open(this.getValue(),'_blank'); } }); `Ext.form.TriggerField` ist die gemeinsame Basisklasse von ComboBox und DateField. Die jss-Klasse `x-form-search-trigger` sorgt dafür, dass das Bild im Trigger-Button eine Lupe ist. Das ist zufriedenstellend. Zumindest in einer Form. ComboBox for id part of GenericForeignKey ----------------------------------------- - Im Detail von Notizen und Links sieht man zwei Felder "Besitzerart" und "Besitzer". Letzteres müsste ebenfalls eine (kontext-sensitive) Combobox sein. Das war nicht einfach. Aber es funktioniert jetzt für Links schon fast. Besitzer wird jetzt angezeigt, und man kann eine Auswahlliste aufklappen. Aber Speichern geht noch nicht... `Chooser.get_text_for_value` ist jetzt implementiert: die schaut jetzt nach einer Methode `get_FOO_display `_. Ich breche dieses Ticket ab, denn mir ist aufgefallen, dass das Selbstbefriedigung war: im DSBE ist es gar nicht nötig, dass man Notizen "egal was" zuordnen kann. Lieber statt dessen zwei Foreign Keys `person` und `company` und basta. Dann ist das user interface intuitiver. Übrigens hat die mangelhafte Übersetzung von Owner ("Besitzer") mich darauf gebracht... Das ist eine gute Prüfungsarbeit für das Feature "wiederverwertbare Modelle": links.Link und notes.Note sind jetzt `abstract`. Dadurch kann (und muss) man sie in der Anwendung noch erweitern. dsbe erweitert sie mit `lino.utils.mixins.PartnerDocument` (also zwei Felder `person` und `company`). Man könnte auch einfach nur ein `pass` reinschreiben, wenn man Notizen und Links nur pro Benutzer und Art braucht. Oder (wenn die Comboboxen mal klappen) benutzt man `lino.utils.mixins.Owned`. Und noch später vielleicht auch mal ein Modul `tags`, mit dem man dann eine Notiz beliebig vielen anderen Objekten zuweisen kann... 17.50 Uhr: Die Prüfungsarbeit scheint erfolgreich abgeschlossen. Check-in. 20.45 Uhr : iGen funktioniert jetzt auch wieder (zumindest auf den ersten Blick). Check-in.