Weeknotes (2025 week 49)
I seem to be publishing weeknotes monthly, so I’m now thinking about renaming the category :-)
Mosparo
I have started using a self-hosted mosparo instance for my captcha needs. It’s nicer than Google reCAPTCHA. Also, not sending data to Google and not training AI models on traffic signs feels better.
Fixes for the YouTube 153 error
Simon Willison published a nice writeup about YouTube embeds failing with a 153 error. We have also encountered this problem in the wild and fixed the feincms3 embedding code to also set the required referrerpolicy attribute.
Updated packages since 2025-11-04
- django-sitemaps 2.0.2: Uploaded a new release which includes a wheel build. Rebuilding the wheel all the time when creating new container images was getting annoying. The code itself is unchanged.
- django-prune-uploads 0.3.1: The package now supports pruning a storage backed by django-s3-storage efficiently. I have also looked at django-prune-media but since the package uses the storage API instead of enumerating files using boto3 directly it’s unusably slow for my use case.
- feincms3-forms 0.6: Much better docs and a new way to reference individual form fields in custom templates.
- django-json-schema-editor 0.11: Switched from JSON paths to
jmespathinstances. Made the JSON model instance reference support easier and more fun to use. Added new ways of customizing the generated proxy model for individual JSON plugin instances. - form-designer 0.27.1: Added support for the mosparo captcha to the default list of field types.
- asgi-plausible 0.1.1: No code change really, just added required dependencies to the package metadata.
- django-tree-queries 0.23: The package now ships a
OrderableTreeNodebase model which you can use when you want to order siblings manually. feincms3 already uses this base model for its pages model. - feincms3-data 0.10: This is quite a big one. I discovered issues with the way
save_as_new(to copy data) anddelete_missinginteracted. First the code was cleaned up to delete less data, and then to delete enough data. I’m now somewhat confident that the code does what it should again. - django-prose-editor 0.22.3: Started returning an empty string for an empty document instead of
<p></p>also when using the frontend integration; previously, this transformation was only implemented when using at least the form if not the model field. Also,<ol>tags now have adata-typeattribute since Chrome cannot case-sensitively match e.g.type="a"vstype="A"for lowercase or uppercase letters. I previously only tested the code in Firefox and there it worked nicely.