20101025

A Grid Store is not a Detail Store

Da brauch ich gar nicht nach weiteren Ideen zu suchen, unnütze Summaries von Slave Reports gehören natürlich nicht in die Grid, das ist ein klarer Fall von falschem Design aus historischen Gründen.

Ich brauche nicht einen einzigen Store pro Report, sondern zwei: einen für Listenansichten und einen anderen für Detail-Ansichten (Detail und Insert). Der eine benutzt obj2list, der andere obj2dict. N.B. im Listen-Store können trotzdem auch Report-Summaries auftreten, wenn die als Kolonne einer Grid angefragt wurden.

Zu bemerken ist auch, dass der ext_store.Store gar kein jsgen.Component mehr zu sein braucht. In der lino.js instanziere ich ja inzwischen selber einen http://www.sencha.com/deploy/dev/docs/?class=Ext.data.ArrayStore. Und die DetailWrapper brauchen gar keinen http://www.sencha.com/deploy/dev/docs/?class=Ext.data.Store, sondern nur dessen Felddefinitionen. Ein Store ist eine Sammlung von Feldern, der deren manchmal komplexen Werte in Atome verteilt.

Anstatt den Store zu verdoppeln, mach ich ihm zwei Listen von StoreFields detail_fields und list_fields. Denn die meisten Datenfelder sind ja in beiden Stores vertreten, und es ist ein bisschen schade, dafür jedesmal zwei Store-Felder zu instanzieren. Das ist mir auch ein bisschen Mengenarithmetik beim Initialisieren des Stores wert, die ja nur einmal beim Hochfahren des Serverprozesses läuft.

12 Uhr. Na bitte: eine Grid erzeugt jetzt nur noch 46 statt vorher 159 SQL-Queries.

Für jede Zeile macht er jetzt doch noch zwei überflüssige SELECTS: einen für die Bezeichnung des Landes und einen für die Bezeichnung der Stadt. Das sind eigentlich die Kolonnen, für die select_related nützlich wäre. Aber für die bewirkt select_related nichts, weil das nullable Foreign Keys sind. Idee: ich muss pro Report individuell konfigurierbar machen, wie er select_related() aufruft.

12.20 Uhr. Und nochmal na bitte: Anzahl der Queries nochmal von 46 auf 4 runtergeschraubt, indem ich in lino.modlib.contacts.models.Contacts die Methode get_queryset überschreibe:

class Contacts(reports.Report):
    def get_queryset(self):
        return self.model.objects.select_related('country','city')

Kleine Probleme en passant

  • Quicksearch im Detail funktionierte wieder nicht.

  • Grid eines Slave-Reports im eigenen Fenster (z.B. http://127.0.0.1:8000/api/links/LinksByOwner?fmt=grid&mt=12&mk=16)

    • Hier funktionierte das Speichern noch nicht, da wurden mt und mk zwar übergeben, aber in ExtUI.api_elem_view nicht richtig ausgewertet. Beim PUT eines Elements brauchen die base_params (also z.B. mt und mk) eigentlich nicht übergeben zu werden.

    • Bei Insert in so einem Report waren die Master-Felder nicht ausgefüllt.

  • Wenn man einen Record in der Detail-Ansicht hatte und dann löschte, dann blient das Fenster stehen. Stattdessen schließt sich jetzt das Detail-Fenster, und die eventuell darunterliegende Grid wird aktualisiert.

First steps with Drag & Drop