20120124

05.00 Uhr.

Wie gut, dass ich das Release verschoben habe:

Lino hatte in der Tat ein gewaltiges Performance-Problem: ich hatte gedacht, dass wenn man len() von einem QuerySet macht, Django dies automatisch in einen entsprechenden “SELECT COUNT” konvertiert. Aber Pustekuchen, der machte dann jedesmal ein “SELECT * FROM Persons”, und zwar ohne LIMIT. Und ich rief das ungeniert mehrere Male pro Request auf.

Interessant, dass mir das bei den Tests mit der Demo-Datenbank gar nicht aufgefallen war. Erst bei 5000 Records machte es sich bemerkbar.

Um das rauszufinden, habe ich übrigens zunächst mal einen TestCase geschrieben: new module lino.apps.pcsw.tests.pcsw_sql_tests.

Das war nicht ganz leicht, eigentlich musste ich zunächst mal ein Test-Framework zum Testen der SQL-Queries aufbauen: Added new class attribute lino.utils.test.TestCase.defining_module and method lino.utils.test.TestCase.check_sql_queries(). Also fixed a little bug in lino.utils.auth.

Noch Kleinkram:

  • Der Button mit den Benutzereinstellungen benutzte noch eine url mit permalink statt javascript.

  • ClientsTest prüft jetzt par défaut nur die aktiven Klienten. Wer alle prüfen will, muss das Datumsfeld auf leer setzen.

  • Person.get_image_url() verlangt jetzt ein weiterens Argument request und gibt dafür jetzt auch dann den richtigen URL, wenn Lino nicht im Root des Webservers installiert ist.

  • Bug in der Anbindung von Lino.show_fk_detail: Wenn man vom Detail einer Person aus auf die Lupe beim Feld “Stadt” klickte um deren Detail zu öffnen, und dieses Fenster dann wieder schloss, dann kam in der Console:

    Uncaught TypeError: Object [object Object] has no method 'refresh'
    (anonymous function)                               lino_de.js:3257
    Lino.FormPanel.Ext.extend.do_when_clean            lino_de.js:1858
    Lino.Window.Ext.extend.hide                        lino_de.js:3246
    (anonymous function)                        ext-all-debug.js:17401
    h
    
  • Wenn man versuchte, einen Termin auszudrucken, bekam man eine Fehlermeldung “‘Event’ object has no attribute ‘language’. Ein Fehlerbericht wurde an den Systemverwalter geschickt.”:

    Traceback (most recent call last):
      File "t:\hgwork\lino\lino\ui\extjs3\ext_ui.py", line 1466, in api_element_view
        return a.run(ar,elem)
      File "t:\hgwork\lino\lino\mixins\printable.py", line 541, in run
        kw = self.run_(rr.request,rr.ui,elem,**kw)
      File "t:\hgwork\lino\lino\mixins\printable.py", line 519, in run_
        t = bm.build(self,elem)
      File "t:\hgwork\lino\lino\mixins\printable.py", line 253, in build
        tpl_leaf = self.get_template_leaf(action,elem)
      File "t:\hgwork\lino\lino\mixins\printable.py", line 230, in get_template_leaf
        lang = elem.get_print_language(self)
      File "t:\hgwork\lino\lino\mixins\printable.py", line 786, in get_print_language
        return self.language
    AttributeError: 'Event' object has no attribute 'language'
    

    Jetzt wird der Termin in der Sprache des Klienten ausgedruckt. Falls der Termin mit keinem Klient verknüpft ist in der Sprache des Benutzers.

  • Ha, noch ein kleiner Bug: beim Ausdrucken einer Kandidatenliste:

    Error while evaluating expression "self.candidates()".
    File "<string>", line 1, in <module>
    File "t:\hgwork\lino\lino\apps\pcsw\models.py", line 1754, in candidates
    return CandidatesByCourse().request(master_instance=self)
    File "t:\hgwork\lino\lino\utils\tables.py", line 439, in __init__
    raise NotImplementedError("20120104")
    <type 'exceptions.NotImplementedError'>: 20120104
    

    Erklärung: lino.apps.pcsw.models.Course.participants() und lino.apps.pcsw.models.Course.candidates() versuchten, die Tabelle zu instanziieren. Was jetzt ja nicht mehr nötig ist.

    Außerdem ist ein TableRequest per se jetzt nicht mehr iterable. Man muss sich entscheiden für entweder data_iterator oder sliced_data_iterator. Ob das so toll ist? Sollte ich nicht doch den __iter__ wieder reintun, und die loopt dann über den sliced iterator. Nur wenn man explizit das offset und limit ignorieren will (was außer von get_total_count auch von den druckbaren Versionen (csv, html, pdf) benutzt wird, fragt man sich den data_iterator.

23.56 Uhr. Voilà, die Version /releases/1.3.4 hat die interne QC bestanden und wurde released und in Eupen installiert.