20110226 ======== Die Anpssungen in :lino:`/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 :mod:`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 :meth:`before_save` (sh. :blogref:`20100804`) scheint nun geregelt zu sein: alle Fälle habe ich durch entsprechende :meth:`full_clean` auf diesen Modellen ersetzt. Die war auch zum Setzen der Dokumentnummer nötig. :func:`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: :class:`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: #. `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 :func:`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 :setting:`LANGUAGES` reduzieren (unter Verwendung von :func:`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.