20101021¶
Hackerzacker! Mit Sphinx macht das Dokumentieren so viel Spaß, dass ich heute morgen mal wieder anderthalb Stunden lang rumgespielt habe statt was zu programmieren. Der Bär ist noch nicht erlegt, aber ich versuche schon sein Fell zu verkaufen… Aber wir sind ja guter Hoffnung, dass der Bär bald erlegt wird, und wenn Lino geboren ist, wird die Webseite natürlich auch wichtig, um potentiellen Interessenten den Einstieg möglich zu machen.
JsonReader uses suboptimal data format¶
Das Problem des uneffizienten Datenformats ist in der To-do-Liste folgendermaßen formuliert:
Die interne Kolonnenliste eines Reports ist ja konstant. Also sollte ein Record im fmt=json nicht als
dict
sondern alslist
repräsentiert werden.
Das Füllen der Grid von
dauert momentan ziemlich lange. Die Antwort des Servers auf den AJAX-Call (GET /api/contacts/Persons?fmt=json) ist auch immerhin stolze 50 KB dick. Und das für 20 Records. Wie kommts? Ein Grund ist sicherlich, dass das Datenformat nicht optimal ist:{ count: 68,
rows: [
{ driving_licenseHidden: null,
last_name: "Altenberg",
street_box: "",
cityHidden: 1,
motivation_lack: false,
birth_country: null,
addr1: "",
...
},
... (für alle Records der ersten Grid-Seite so ein Objekt)
],
...
}
Jede Row wird als Dictionary übergeben, aber eine einfache Liste würde vollkommen reichen. Die Feldnamen sowie deren Metainfo ist dem Client ja von vorneherein bekannt, die sind pro Report konstant.
Dieses Datenformat wird durch den Store der Grid vorgegeben. Das ist ein
http://www.sencha.com/deploy/dev/docs/?class=Ext.data.JsonStore, der einen http://www.sencha.com/deploy/dev/docs/?class=Ext.data.JsonReader benutzt.
Stattdessen muss ich einen http://www.sencha.com/deploy/dev/docs/?class=Ext.data.ArrayStore benutzen.
Und eine Serie von neuen Methoden lino.ui.extjs.ext_store.StoreField.obj2list()
.
Und ein neues Attribut lino.ui.extjs.ext_store.Store.pk_index
,
der zum KonfigurationsParameter idIndex des ArrayStore wird.
Um die Position des PK im Array zu ermitteln, musste ich ein neues Klassenattribut
lino.ui.extjs.ext_store.StoreField.value_count
einführen (das für Comboboxen 2 ist,
ansonsten 1).
15.30 Uhr. Voilà, es funktioniert. Und die Antwort auf den AJAX-Call zum Füllen der Grid schrumpft wie vorausgeahnt auf die Hälfte (von 50 auf 25 KB). Schön.
Dynamic window title¶
16.40 Uhr. Den Titel auszuwerten, das war dann doch auch nochmal eine Stunde Arbeit. Aber okay.
Fixing another validation bug¶
Für die Bemerkungsfelder in Coaching und Exclusion hatte ich das blank=True vergessen. Deshalb weigerte er sich zu speichern, selbst wenn man user und type ausgefüllt hatte (aber eben nicht remark).
Der fiesere Fehler ist, dass er die entsprechende Fehlermeldung nicht anzeigte. Der ist jetzt erst halb behoben. Da kam stattdessen eine Exception auf dem Server. Die kommt jetzt nicht mehr, und die Fehlermeldung geht korrekt an den Client zurück. Aber trotzdem sieht der Benutzer sie noch nicht. Das liegt am on_afteredit des GridPanels. Da wird noch ein altes Lino.do_action benutzt.
Aber das schau ich mir morgen an, jetzt ist Check-in wegen Feierabend.