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 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 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:
lino.Lino.user_model
,
lino.Lino.person_model
,
lino.Lino.company_model
and
lino.Lino.project_model
.
The same problem was with 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:
lino.apps.dsbe.models.Persons
is accessible as dsbe.Persons,
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
lino.utils.AttrDict
contains models, actors (tables, frames) and also the setup_ methods.