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 (<li> 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 lino.utils.mixins.Reminder, die das gemeinsame Interface enthält.
  • lino.reports.Report.as_string habe ich nach lino.reports.summary umbenannt. 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 welcome.html, und die 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 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.