Tuesday, January 13, 2015¶
Moved the content of https://www.lino-framework.org/dev/mixins.html to the docstrings in
lino.core.model
and lino.mixins
.
Fixed #7. When a new user had been created through the web interface, it was not possible to change their password.
ValueError: Attempted relative import in non-package¶
Then I converted the content of /dev/ml/users to the
lino.modlib.users
API.
Since this is a tested document, I changed two lines in /tests/__init__.py. Basically I replaced:
self.run_simple_doctests("docs/dev/ml/users.rst")
with:
self.run_simple_doctests("lino/modlib/users/models.py")
This change caused a ValueError: Attempted relative import
in non-package
at the line:
from .mixins import UserProfiles
I’ve had this problem before, and this time I explored the reason for it.
It comes from atelier.doctest_utf8
where some code which I did
not write (I copied it from Python 2.7’s doctest
module) does a
special handling if a file ends with .py
. And a comment for
this treatment says:
# It is a module -- insert its dir into sys.path and try to
# import it. If it is part of a package, that possibly
# won't work because of package imports.
And this comment is still there in the doctest module of Python 3.
And of course I am not the first to stumble over this problem. See Doctest and relative imports where Jason Scheirer advises:
I would get rid of the relative imports, many Python style guides strongly discourage them, most forbid them.
But even when I do this, the import fails because Django is special:
you cannot import a models.py
module if your
DJANGO_SETTINGS_MODULE is not set. So I moved these tests to a
separate new document https://www.lino-framework.org/dev/users.html. A topic which anyway has
serious lacks of documentation.