:date: 2017-01-10 ========================= Tuesday, January 10, 2017 ========================= As we start to use the :cmd:`py` memo command, we hit some more edge cases. I received an ImportError "No module named  lino". I fixed - the error handling when a non-existing Python object is specified. In that case it's not the system admin who should get notified, so this must not be considered a real error. - the HTML editor can insert non-breaking spaces at random positions. These were not well swallowed by the memo parser. I think that the handling of non-breaking spaces should rather happen at the parser level, not in every command. So I did this in :mod:`lino.modlib.memo.parser`. >>> from lino import startup >>> startup('lino_noi.projects.team.settings.demo') >>> from lino.api.doctest import * >>> ses = rt.login('robin') >>> print(ses.parse_memo(u"[py\u00A0lino].")) lino. >>> print(ses.parse_memo(u"[url\u00A0http://example.com].")) http://example.com. Side effect: non-breaking, leading and trailing spaces are now always removed from command text: >>> print(ses.parse_memo(u"[py lino My\u00A0favourite\u00A0framework].")) My favourite framework. >>> print(ses.parse_memo("[url http://example.com Trailing space ].")) Trailing space. >>> print(ses.parse_memo("[url http://example.com Leading space].")) Leading space. A quick update ============== I did a "quick" update to our ticket database. Actually it was not that quick, I had to migrate the remove of topics from faculties and the new end_user field and the removal of `reporter`. I also ran the following manual routine:: from lino.api.shell import * for t in tickets.Ticket.objects.filter(user__isnull=True): t.user = t.reporter t.full_clean() t.save() I start to realize that I should *always* announce production upgrades one day before and invite the core developers to watch.