20120108 ======== A yet undiscovered bug in context-sensitive ComboBoxes ------------------------------------------------------ Ein anderer Bug, der möglicherweise schon länger existiert: Wenn ich im Detail einer Person bin: - ein anderes Land auswählen - die Liste im Feld "Stadt" aufklappen und wieder schließe, ohne eine Stadt auszuwählen - das Land wieder auf das vorige zurücksetzen - Speichern Dann kommt eine Fehlermeldung im Stil "{'city': ValidationError([u'Refused to auto-create city Aachen in Deutschland because same name exists.'])}" Schon beim PUT hat er fälschlicherweise im Feld `cityHidden` den Namen statt die ID der Stadt stehen:: cityHidden:Aachen city:Aachen Bisher noch keine Lösung gefunden. Models, Tables and their app_label ---------------------------------- Discovered another bug caused by the removal of actors.actors_dict: `ext_elems.RemoteComboFieldElement` finds a wrong URL to query. For the Person.city field, it should be "/choices/dsbe/Person/city" but currently it is "/choices/contacts/Person/city". This was because the `dsbe.Person` model has `app_label = contacts`. With the new actor lookup system after the removal of actors.actors_dict, this points to the abstract Person model in :mod:`lino.modlib.contacts.models`, which is not what we want here. I cannot easily remove that app_label on dsbe.Person because this name (and the freedom from needing to know where Person is really defined) is used in a lot of places. A first attempt failed: But are there really so many of them? Shouldn't I better use global settings `person_model` and `company_model`, as I did for :attr:`lino.Lino.user_model`? Yes, that seems a good solution. Overriding app_label of a model is simply no longer supported. This feature was a little insane anyway. Flexibility is good, but it should remain under control. If there are "variable" or "overridable" models, then this should be a configuration option. Currently we have four of them: :attr:`lino.Lino.user_model`, :attr:`lino.Lino.person_model`, :attr:`lino.Lino.company_model` and :attr:`lino.Lino.project_model`. The same problem was with :class:`lino.modlib.notes.models.Note` which was also abstract to make application-specific overrides possible. Here I decided to make the whole modlib module specific to `lino.apps.dsbe` because also the modlib version was already quite dsbe-specific. I abandoned this attempt after realizing that "the freedom to not need to know where Person is really defined" *is* important. One example of why this is such a complex topic: :class:`lino.apps.dsbe.models.Persons` is accessible as `dsbe.Persons`, :class:`lino.modlib.contacts.models.Persons` as `contacts.Persons`. `dsbe.Persons` inherits the modlib version, but adds application-specific rules of not showing newcomers and inactive Persons. I'll have to write more about that topic one day. The solution was to not store the ``models`` modules themselves in `settings.LINO.modules`, but to rather build an equivalent of the `actors_dict`, with some differences: - accessible using dotted notation using :class:`lino.utils.AttrDict` - contains models, actors (tables, frames) *and also* the `setup_` methods.