:xdate: 2017-10-18 =========================== Wednesday, October 18, 2017 =========================== Models for newbies documentation ================================ After stumbling over Tim Kholod's nice blogpost `The simple way to understand Django models `__, I started to write :ref:`dev.models` (which mentions it). Common accounts =============== I added two virtual fields to :class:`lino_xl.lib.accounts.CommonAcccounts`, and added the table to the Explorer menu. Connect using a Belgian eID card ================================ I asked Google for "belgian eid python" and found `this page `__ which made me discover `Python Social Auth `__. It seems that for Belgium it's only `a few lines of code `__. There is also a backend for `Google OpenId, OAuth2, OAuth1, Google+ `__. That might be interesting for Hamza who is working on :ticket:`2013`. FieldDoesNotExist: Event has no field named '_event_type_cache' =============================================================== Yesterday with Johanna we had an error which happens from time to time:: File "/xl/lino_xl/lib/cal/models.py", line 560, in after_ui_save super(Event, self).after_ui_save(ar, cw) File "/lino/lino/modlib/notify/mixins.py", line 144, in after_ui_save ar, self, mt, msg, self.get_change_observers()) File "/lino/lino/modlib/notify/models.py", line 213, in emit_message subject_body = msg_func(user, mm) File "/lino/lino/modlib/notify/mixins.py", line 135, in msg return (subject, self.get_change_body(ar, cw)) File "/lino/lino/modlib/notify/mixins.py", line 67, in get_change_body items = list(cw.get_updates_html(["_user_cache"])) File "/lino/lino/core/diff.py", line 68, in get_updates_html f = self.watched._meta.get_field(k) File "/site-packages/django/db/models/options.py", line 619, in get_field raise FieldDoesNotExist("%s has no field named '%s'" % (self.object_name, field_name)) FieldDoesNotExist: Event has no field named '_event_type_cache' It seems that the :attr:`__dict__` of a Django database object can now contain additional names used internally by Django. I didn't write an automatic way to reproduce it, but I now fixed it at least theoretically, and at least the test suite passes. Side effect: The :meth:`lino.core.diff.ChangeWatcher.get_updates` method now sorts its result in order to make it predictable for test cases. En passant I fixed another bug :message:`AjaxExceptionResponse KeyError: u'obj' in request POST /api/tickets/Tickets` which occured when sending an update notification to a user in German. Because the text "{user} created {what}" had been translated to "{user} hat {obj} erstellt" (`{obj}` instead `{what}`). New notification mode "silent" ============================== For :ticket:`2119` I added a new notification mode :attr:`silent `. This mode differs from :attr:`never `: "never" means that you want to get notified, but only in the web interface, not via E-Mail. The new option "silent" means that notifications are completely disabled and not even being created. To be observed. I am not sure whether they really want this. Cannot query "1Euro-Shop": Must be "Person" instance ==================================================== Lydia had an error message "ValueError: Cannot query "1Euro-Shop": Must be "Person" instance". In the virtual fields :attr:`suppliers` and :attr:`needed_skills` we had to add:: if not isinstance(self, dd.plugins.faculties.demander_model): return ''