20110613

Disable slave elements in Insert Window

Hier die Problemmeldung eines Benutzers:

Es ist es für den Benutzer nicht logisch, dass er keinen Drittpartner hinzufügen kann, solange er eine neue Notiz nicht mindestens einmal gespeichert hat.

Ja klar. Das hatte ich schon immer geahnt und bisher lediglich noch nicht implementiert: im InsertWindow müssen natürlich alle Slave-Elemente disabled werden. Nicht nur der “Insert”-Button des HtmlPanels, sondern auch die HtmlPanels selber und alle SlaveGridPanels.

Anders als bei disabled fields brauchen diese Felder natürlich nicht eigens in der AJAX-Response genannt zu werden, sondern die sind ja automatisch bekann und immer die gleichen. Deshalb haben Lino.GridPanel und Lino.HtmlBoxPanel in der linolib.js einfach ein Attribut disabled_in_insert_window.

En passant zwei Bugs weniger: Wenn man ein Insert-Fenster per Permalink aufrief, z.B. http://127.0.0.1:8000/api/notes/MyNotes?fmt=insert&mt=1&mk=1, dann kam ein UnboundLocalError: local variable ‘params’ referenced before assignment”. Und nachdem dieser Bug behoben kam, kam außerdem nicht der richtige Titel “Einfügen nach…”.

Intuitiveres Bearbeiten der Drittpartner

Und noch eine Problemmeldung eines Benutzers:

Beim Erstellen eines Drittpartners einer Notiz kann man eine Person UND eine Firma gleichzeitig auswählen. Eigentlich geht das aber nicht und führt zu Reaktionen, die für den Benutzer nicht nachvollziehbar sind.

Es ist richtig und nötig, dass man beide Felder (Person und Firma) eines Drittpartners ausfüllen kann, und das bedeutet dann “Person X als Vertreter für Firma Y”. Das wurde dann bisher im Panel allerdings als “Person / Firma” angezeigt. In der Tat nicht gerade selbsterklärend. Für die nächste Version ändere ich diese Anzeige mal nach “<Firma> z.Hd. <Person>”, dann ist der Verwendungszweck wahrscheinlich intuitiv klarer.

Eine andere störende Sache beim Erstellen von Drittpartnern war, dass das Insert-Fenster als solches verwirrte. Deshalb habe ich es jetzt probeweise mal rausgeschmissen. Was allerdings dazu führt, dass auch der “Einfügen”-Button verschwindet. Um Drittpartner einzufügen, muss man momentan also das Drittpartner-Panel “im eigenen Fenster öffnen”. Später kommt dann das Erstellen per Drag & Drop hinzu.

Check-in Revision 4bf5a5344714

Lino location other than “/”

Um auf unserem internen Webserver (jana) mehrere Lino-Anwendungen parallel laufen lassen zu können, habe ich erstmals den Fall, dass Lino nicht auf “/” sitzt. Um das zu ermöglichen, habe ich einige Stunden gewurstelt und eine ganze Serie von Check-ins gemacht.

Die momentane Lösung ist möglicherweise auch nicht definitiv, aber sie geht so: wenn Lino nicht unter / läuft, dann muss man das ebenfalls in der settings.py im neuen Klassenattribut lino.Lino.root_url angeben.

In der Apache-Konfig:

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  DocumentRoot /usr/share/apache2/default-site
  <Directory />
          Options FollowSymLinks
          AllowOverride None
  </Directory>

  WSGIDaemonProcess example.com processes=2 threads=15
  WSGIProcessGroup example.com

  WSGIScriptAlias /prj1 /usr/local/django/prj1/apache/django.wsgi
  Alias /prj1/media/ /usr/local/django/prj1/media/
  <Location /prj1/media/>
     SetHandler none
  </Location>

  WSGIScriptAlias /prj2 /usr/local/django/prj2/apache/django.wsgi
  Alias /prj2/media/ /usr/local/django/prj2/media/

  ErrorLog ${APACHE_LOG_DIR}/error.log
  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Nebenbei sind bei diesen Arbeiten auch noch einige kleine Änderungen gekommen:

  • lino.modlib.countries.fixtures.ee funktioniert noch nicht
  • lino.modlib.countries.fixtures.few_cities ist jetzt intelligenter und funktioniert auch mit be zusammen.

Der folgende Traceback kommt noch mit Django 1.3, aber mindestens ab Revision 16392 nicht mehr:

luc@mops:/usr/local/django/igen_demo$ python manage.py  test
Creating test database for alias 'default'...
.E....
======================================================================
ERROR: test_shortcut_view (django.contrib.contenttypes.tests.ContentTypesTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/var/snapshots/django/django/contrib/contenttypes/tests.py", line 64, in test_shortcut_view
    obj = User.objects.create(username="john")
  File "/var/snapshots/django/django/db/models/manager.py", line 138, in create
    return self.get_query_set().create(**kwargs)
  File "/var/snapshots/django/django/db/models/query.py", line 360, in create
    obj.save(force_insert=True, using=self.db)
  File "/var/snapshots/django/django/db/models/base.py", line 460, in save
    self.save_base(using=using, force_insert=force_insert, force_update=force_update)
  File "/var/snapshots/django/django/db/models/base.py", line 553, in save_base
    result = manager._insert(values, return_id=update_pk, using=using)
  File "/var/snapshots/django/django/db/models/manager.py", line 195, in _insert
    return insert_query(self.model, values, **kwargs)
  File "/var/snapshots/django/django/db/models/query.py", line 1436, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/var/snapshots/django/django/db/models/sql/compiler.py", line 791, in execute_sql
    cursor = super(SQLInsertCompiler, self).execute_sql(None)
  File "/var/snapshots/django/django/db/models/sql/compiler.py", line 735, in execute_sql
    cursor.execute(sql, params)
  File "/var/snapshots/django/django/db/backends/util.py", line 34, in execute
    return self.cursor.execute(sql, params)
  File "/var/snapshots/django/django/db/backends/sqlite3/base.py", line 234, in execute
    return Database.Cursor.execute(self, query, params)
DatabaseError: no such table: auth_user

----------------------------------------------------------------------
Ran 6 tests in 13.871s

FAILED (errors=1)
Destroying test database for alias 'default'...

Lino 1.1.16

Und die heutigen Änderungen releasen wir als /releases/2011/0613.