20110226

Die Anpssungen in /igen/index gingen erstaunlich schnell. Es gab natürlich noch einige Verbesserungen:

Beim manuellen Eingeben einer neuen Verkaufsrechnung (sales.Invoice) kamen noch eine Serie von Problemen in lino.ui.extjs.ext_store:

  • IntegerField (Invoice.number) : muss er leer erlauben, und dann selber ausfüllen
  • OneToOneField.form2obj machte Dummheiten mit dem salesdocument_ptr

Das mit dem before_save() (sh. 2010-08-04) scheint nun geregelt zu sein: alle Fälle habe ich durch entsprechende full_clean() auf diesen Modellen ersetzt. Die war auch zum Setzen der Dokumentnummer nötig. lino.core.kernel.analyze_models() macht jetzt bis auf weiteres noch eine Exception für den Fall dass noch irgendwo eine before_save rumhängt.

Und cool: nebenbei habe ich doch noch eine elegantere Lösung für mehrsprachige Datenbankfelder gefunden: lino.utils.babel.BabelCharField.

Statt wie bisher

class Foo(models.Model):
    name = models.CharField(_("Designation"),max_length=200)
    def __unicode__(self):
        return babelattr(self,'name')
add_babel_field(Foo,'name')

macht man jetzt einfach

class Foo(models.Model):
    name = babel.BabelCharField(_("Designation"),max_length=200)
    def __unicode__(self):
        return babel.babelattr(self,'name')

01.40 Uhr. Ich habe Einschlafstörungen, weil der folgende Punkt noch behoben werden wollte:

  1. dtosl funktioniert momentan nicht. Die funktionierte nur, als babel.setlang() auch locale.setlocale setzte. Damit gab es aber Probleme (entweder weil setlocale nicht threadsafe ist, oder weil meine babel.lc2locale() in vielen Konfigurationen nicht funktioniert). Auch benutzerspezifizierte Datumsformatierungen wie “row.started.strftime(‘%B %Y’)” kommen in Englisch statt in der Sprache des Dokuments. Stattdessen sollte ich wahrscheinlich django.template.defaultfilters.date() nutzen und mich auf Djangos Formatsyntax verlassen.

Hat nur anderthalb Stunden gedauert.

Statt BABEL_LANGS zu setzen, muss man jetzt die echte LANGUAGES reduzieren (unter Verwendung von lino.sites.std.settings.language_choices()).

Wenn man das nicht täte, hätte man eine Datenbank, in der alle Babelfelder in hundertfacher Ausführung existierten (eine für jede von Djangos sprachen).

Also nicht den Django-Defaultwert nehmen, sondern immer lokal setzen.