20120209

Probleme mit komplexer JSON-Response

Weiter mit dem Problem von gestern. Das Ganze hängt in der Tat damit zusammen, dass es sich um die Antwort auf einen file upload handelt.

Im Fall eines Dateiuploads funktioniert eine ExtJS-Form anders als normal: “File uploads are not performed using Ajax submission, that is they are not performed using XMLHttpRequests. (…) If the server is using JSON to send the return object, then the Content-Type header must be set to “text/html” in order to tell the browser to insert the text unchanged into the document body.” (http://docs.sencha.com/ext-js/3-4/#!/api/Ext.form.BasicForm)

Aber den Awesome Uploader zu benutzen, der mit richtigen XMLHttpRequests arbeitet, scheint mir weiterhin viel Aufwand für wenig Nutzen. (Wie viel Aufwand es wäre, kann ich momentan nicht genau abschätzen, aber es könnten einige Teufel im Detail stecken.) Und zumindest in unserer momentanen Sicht der Dinge brauchen wir keinen multiple file upload, weil die Benutzer sowieso pro Datei diverse Metadaten angeben sollen (Upload-Art, Gültig bis, Person). Der einzige Vorteil wäre, dass man während des Dateitransfers weiter im Formular eingeben kann.

Nach einigem Surfen (1 2 3) und Probieren scheint mir momentan folgende Knubbelslösung die Sinnvollste: der Lino-Server antwortet auf ein “normales” mit einem vollen data_record in der JSON-Antwort (die jetzt auch den offiziellen content type ‘application/json’ hat), und nur in der Antwort auf ein POST mit file upload benutzt er record_id und den content type ‘text/html’.

N.B.: Noch was Schönes (aber nur von intern): lino.ui.extjs3.ext_store.Store speichert die erstellten Atomizer jetzt nicht mehr temporär für sich selber, sondern im Feld unter einem Attribut _lino_atomizer. Also mehrere Stores auf dem gleichen Modell benutzen die gleichen Atomizer.

Speichern eines Uploads

Beim Speichern eines Uploads mit ausgefülltem :guilabel`Gültig bis` kam ein Server-Traceback “‘alarm_value’ is an invalid keyword argument for this function”.

Außerdem waren die Erinnerungsmeldungen “eID-Karte läuft ab” ein bisschen unkomplett: sie gaben nicht an, wann das passiert. Jetzt lautet der automatische Text “eID-Karte läuft ab in 2 Monaten”.

Neue Funktion lino.modlib.cal.utils.update_reminder()

Neue Funktion lino.apps.pcsw.models.update_all_reminders()

Neuer Button “Update reminders” pro User.

Der Lino-Kernel führt jetzt gegen Ende des startups eine eventuelle Funktion site_setup aus. Dadurch kann das cal-Modul in der Users-Tabelle seinen Button “Update reminders” hinzufügen.

Cool! Aber das alles ist erst fast fertig. Checkin wegen Feierabend um 22.50 Uhr.