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 https://docs.djangoproject.com/en/5.0 and https://docs.djangoproject.com/en/5.0 in the docs. I replaced them by https://docs.djangoproject.com/en/5.0

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 lino.core.site.Site.sorted_plugins.

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/connection.py:687> exception=RuntimeError('Event loop is closed')>
Traceback (most recent call last):
  File "/home/luc/virtualenvs/dev/lib/python3.10/site-packages/redis/asyncio/connection.py", line 696, in disconnect
    self._writer.close()  # type: ignore[union-attr]
  File "/usr/lib/python3.10/asyncio/streams.py", line 338, in close
    return self._transport.close()
  File "/usr/lib/python3.10/asyncio/selector_events.py", line 698, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "/usr/lib/python3.10/asyncio/base_events.py", line 750, in call_soon
    self._check_closed()
  File "/usr/lib/python3.10/asyncio/base_events.py", line 515, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

Question to async experts: what’s happening?