Saturday, January 7, 2023

En passant

Yesterday and today, while trying to understand what’s happening, I did a series of en passant changes.

A fake dump2py

When upgrading a production site

I wrote a new option --simulate for the pm dump2py command and optimized the code that causes the models contenttypes.ContentType, sessions.Session and lino.modlib.checkdata.Message to never be dumped.

There were still references to and in the docs. I replaced them by

I started a new section Django-admin commands in the “Reference” section of the Developer Guide. The first commands to benefit from this reorganization are pm dump2py, pm run and pm prep.

Inactive plugins

I recently wrote a solution for ticket #4780, but now I optimized my own approach. The lino.core.plugin.Plugin class has two new methods deactivate() and is_active(). When a plugin is inactive, its database models exist but otherwise almost everything, including its actors, becomes non-existent. The tinymce and extensible plugins now deactivate themselves in their on_init() method when the default_ui is not extjs. As a side effect, the main menu is now built using

Event loop is closed

When I run pm prep in noi1r, there is a long series of –non-fatal– tracebacks that have been there for some time:

Task exception was never retrieved
future: <Task finished name='Task-1548' coro=<Connection.disconnect() done, defined at /home/luc/virtualenvs/dev/lib/python3.10/site-packages/redis/asyncio/> exception=RuntimeError('Event loop is closed')>
Traceback (most recent call last):
  File "/home/luc/virtualenvs/dev/lib/python3.10/site-packages/redis/asyncio/", line 696, in disconnect
    self._writer.close()  # type: ignore[union-attr]
  File "/usr/lib/python3.10/asyncio/", line 338, in close
    return self._transport.close()
  File "/usr/lib/python3.10/asyncio/", line 698, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "/usr/lib/python3.10/asyncio/", line 750, in call_soon
  File "/usr/lib/python3.10/asyncio/", line 515, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

Question to async experts: what’s happening?