20130301

contacts.QuickTest failed sometimes

Gestern abend hatte ich das hier bemerkt:

  • contacts.QuickTest fails when called for a Lino-Welfare site.

Das war subtil. Lag daran, dass lino_welfare.modlib.cv folgendes machte, um die Titel der drei Tabellen “Fähigkeiten”, “Sozialkompetenzen” und “Hindernisse” zu setzen:

@classmethod
def after_site_setup(self,site):
    super(ConfiguredPropsByPerson,self).after_site_setup(site)
    if self.propgroup_config_name:
        def adapt(sc):
            ...
        adapt(site.site_config)

        ...

Da wurde also während lino.Lino.startup() auf lino.Lino.site_config zugegriffen. Logisch, denn diese drei Tabellen hängen nun mal davon ab, was man in der SiteConfig angegeben hat.

Lino versucht da also die SiteConfig zu laden:

@property
def site_config(self):
    if self._site_config is None:
        from lino.core.modeltools import resolve_model
        SiteConfig = resolve_model('ui.SiteConfig')
        from django.db.utils import DatabaseError
        try:
            self._site_config = SiteConfig.objects.get(pk=1)
        except (SiteConfig.DoesNotExist,DatabaseError):
            kw = dict(pk=1)
            kw.update(self.site_config_defaults)
            self._site_config = SiteConfig(**kw)
    return self._site_config

Bei einem manage.py test gelang ihm das manchmal, und zwar dann, wenn zufällig momentan eine echte Datenbank existierte. Dann hatte er das Objekt im Cache drin, aber kurz danach wurde die echte Datenbank abgemeldet, um die Testdatenbank anzumelden und zu erstellen.

Besonders witzig war, dass es dann nicht sofort und überhaupt gar nicht immer knallte. Es knallte z.B., wenn ein Test dann auf settings.LINO.site_config.site_company zugriff. Dann versuchte Django, die site_company aus der Datenbank zu holen, deren primary key er sich zuvor selber notiert hatte. Und dann merkte er, dass eine Company mit diesem pk nicht existierte.

Eine erste Lösung bestand darin, nach jedem connection_created den cache zu löschen:

@dd.receiver(dd.connection_created)
def my_callback(sender,**kw):
    settings.LINO.clear_site_config()

Aber das war doch recht unelegant: zufällige Daten einlesen, nur das Ganze dann wieder rückgängig zu machen?

Nein, da ändern wir doch besser die obige after_site_setup, so dass diese Funktion adapt nicht sofort sondern nach jedem connection_created gerufen wird:

@classmethod
def after_site_setup(self,site):
    super(ConfiguredPropsByPerson,self).after_site_setup(site)
    if self.propgroup_config_name:
        def adapt(sc):
            ...
        @dd.receiver(dd.connection_created)
        def my_callback(sender,**kw):
            adapt(settings.LINO.site_config)

        ...

Jetzt brauchen wir auch nicht mehr den DatabaseError abzufangen in der property site_config. Cool! Lino ist mal wieder schöner geworden.

expected parenthesized list

I had the following line in my setup.py:

requires = [... 'python-dateutil'...],

That was wrong, it must be:

requires = [... 'python_dateutil'...],

Here is how Distribute told me this:

python setup.py sdist --formats=gztar,zip --dist-dir=docs/dl
Traceback (most recent call last):
  File "setup.py", line 47, in <module>
    Topic :: Software Development :: Libraries :: Application Frameworks""".splitlines())
  File "C:\Python27\lib\distutils\core.py", line 112, in setup
    _setup_distribution = dist = klass(attrs)
  File "C:\Python27\lib\site-packages\distribute-0.6.35-py2.7.egg\setuptools\dist.py", line 225, in __init__
    _Distribution.__init__(self,attrs)
  File "C:\Python27\lib\distutils\dist.py", line 259, in __init__
    getattr(self.metadata, "set_" + key)(val)
  File "C:\Python27\lib\distutils\dist.py", line 1220, in set_requires
    distutils.versionpredicate.VersionPredicate(v)
  File "C:\Python27\lib\distutils\versionpredicate.py", line 113, in __init__
    raise ValueError("expected parenthesized list: %r" % paren)
ValueError: expected parenthesized list: '-dateutil'
make: *** [sdist] Error 1

Release

Und jetzt kann ich die neuen Versionen für Lino-Welfare und Lino rauslassen und installieren. Genau rechtzeitig zum Amtsantritt des neuen Präsidenten. Willkommen im ÖSHZ, Lambert Jaegers! Wir kennen uns noch nicht persönlich, aber ich freue mich, dass jetzt ein Ecolo-Geist mitredet.

New naming ideas

Continued to think on docs/tickets/74.