Plone 6.1.2 released

Release notes for Plone 6.1.2 (2025-06-20)

If you want to jump straight in, here are some important links:

Highlights

These are the main changes since 6.1.1:

  • plonetheme.barceloneta:
    • (Re)Introduce the ajax_load theme parameter and skip diazo theming, if set.
      Note: when you upgrade an existing Classic UI site to this version, the site will look broken at first.
      Just run the upgrades on the standard plone-upgrade page, and all should be fine.
      Alternatively, go to the Theming controlpanel, deactivate the Barceloneta theme, and then activate it again.
    • Add a dedicated barceloneta-toolbar stylesheet.
      Add a new stylesheet which only compiles the barceloneta toolbar styles.
      This stylesheet can be used in situations where only the toolbar is wanted but
      not the whole Barceloneta design system.
    • Support for required and invalid styles on form tabs.
  • All packages in the five and z3c namespaces have dropped support for pkg_resources namespace and replaced it with PEP 420 native namespace.
    Caution: if you are using any other packages in these namespaces for which we have no versoin pin, you should switch these to versions using a PEP 420 namespace as well.
  • Products.CMFPlone: Make resource registry more robust against broken resources.
    Don't break the resource registry when a resource error happens (missing dependency, circular dependency, file not found, etc).
    Admins will see a warning badge and can fix the problem in the resource registry user interface.
    Previously such errors broke the rendering of the whole site, making fixes very fiddly.
  • plone.app.discussion:
    • Implement auto_approve_admin_comments based on specified roles.
    • Add Volto control panel.
  • plone.volto:
    • Enable automatic versioning for content types with blocks.
    • Enable preview image link behavior by default for most content types.
    • Put preview image fields in their own fieldset, and the navigation title field in the Settings fieldset.
    • Enable navigation title by default for most content types.
    • Create a separate initial profile which is used to set up the Volto distribution.
      The existing default profile defines the Volto add-on, and makes minimal changes to existing content types.
      The initial profile includes the plone.app.contenttypes:default profile and fully controls the behaviors for the included content types.
  • plone.staticresources: Update to mockup 5.4.0.
    NOTE: This updates the selection button and popover.
    The selection button shows now the number of selected and maximum number of items within the current folder.
    The corresponding popover offers the option to select all items, all visible items on the page and to cancel the selection.
    The previous popover to manage the selected items is gone.
  • plone.base:
    • Refactoring Interface ITinyMCEPluginSchema, field menubar is not longer a List, it's now a TextLine Field.
    • Add a "is_truthy" utility to test for true-ish and false-ish string values.
  • plone.app.dexterity: Include obj in the results from the INextPreviousProvider adapter.
  • plone.app.iterate: Add is_working_copy column to catalog metadata.
  • plone.app.multilingual: Run the SetupMultilingualSite actions with an event subscriber.
  • plone.distribution:
    • Add attribute package to plone.distribution.core.Distribution to store which package registered a specific distribution.
    • Support specifying a base GenericSetup profile during distribution registration.
  • plone.namedfile:
    • Add a srcset method to the @@images view.
    • "Scale" SVGs by setting the correct height and width for the given scale in its metadata.
  • plone.restapi:
    • @site service: Add a way for add-ons to add additional data using an ISiteEndpointExpander adapter.
    • Include all summary fields when serializing next_item and previous_item.
  • plone.scale: Add method to 'scale' SVGs by modifying display size and viewbox.
  • plone.recipe.zope2instance: Check for presence of Products.CMFPlone with multiple keys. This is needed, depending on the used zc.buildout and setuptools versions.
  • twine: Add compatibility with setuptools 77+.
    This fixes errors when making releases to PyPI: "twine.exceptions.InvalidDistribution: Metadata is missing required fields: Name, Version." .

Volto frontend

The default frontend for new Plone 6 sites is Volto.
Note that this is a JavaScript frontend that you need to run in a separate process with NodeJS.

Plone 6.1 is meant to be used with Volto 18.
Latest release is 18.23.0. See the changelog.
You can already test with the latest Volto 19 alpha version.

Classic UI

The HTML based and server side rendered UI that was present in Plone 5.2 and earlier major Plone releases is still available and has also been updated and improved upon in Plone 6.0 and 6.1. Our documentation now refers to this frontend as 'Classic UI'.

Python compatibility

This release supports Python 3.10, 3.11, 3.12, and 3.13.

pip, buildout, setuptools

In Plone core we use these versions to install Plone:

packaging==25.0
pip==25.1.1
setuptools==80.9.0
wheel==0.46.1
zc.buildout==4.1.12

In general you are free to use whatever versions work for you, but these worked for us.

Note that if you use Buildout and are on setuptools 80+, you need the latest zc.buildout 4.1.12.

Installation

For installation instructions, see the documentation.

Issues

If you find any issues, please report them in the main issue tracker.

4 Likes

Possibly a brown-bag release.

1):

plone@plone-staging:~/zchl_buildout$ uv pip install -r requirements.txt.612
Resolved 6 packages in 34ms
Uninstalled 5 packages in 66ms
Installed 5 packages in 70ms
 - packaging==24.2
 + packaging==25.0
 - pip==25.0.1
 + pip==25.1.1
 - setuptools==75.8.2
 + setuptools==80.9.0
 - wheel==0.45.1
 + wheel==0.46.1
 - zc-buildout==4.1.4
 + zc-buildout==4.1.12
warning: `wheel==0.46.1` is yanked (reason: "Causes CI failures where setuptools is pinned to an old version
  1. this error after upgrading from 6.1.1 to 6.1.2:
 File "/home/plone/zchl_buildout/eggs/PasteDeploy-3.1.0-py3.12.egg/paste/deploy/util.py", line 61, in fix_call
    val = callable(*args, **kw)
          ^^^^^^^^^^^^^^^^^^^^^
  File "/home/plone/zchl_buildout/eggs/Zope-5.13-py3.12.egg/Zope2/Startup/run.py", line 61, in make_wsgi_app
    starter.prepare()
  File "/home/plone/zchl_buildout/eggs/Zope-5.13-py3.12.egg/Zope2/Startup/starter.py", line 38, in prepare
    self.startZope()
  File "/home/plone/zchl_buildout/eggs/Zope-5.13-py3.12.egg/Zope2/Startup/starter.py", line 94, in startZope
    Zope2.startup_wsgi()
  File "/home/plone/zchl_buildout/eggs/Zope-5.13-py3.12.egg/Zope2/__init__.py", line 36, in startup_wsgi
    _startup()
  File "/home/plone/zchl_buildout/eggs/Zope-5.13-py3.12.egg/Zope2/App/startup.py", line 70, in startup
    OFS.Application.import_products()
  File "/home/plone/zchl_buildout/eggs/Zope-5.13-py3.12.egg/OFS/Application.py", line 423, in import_products
    import_product(finder, product_name)
  File "/home/plone/zchl_buildout/eggs/Zope-5.13-py3.12.egg/OFS/Application.py", line 429, in import_product
    product = __import__("Products.%s" % product_name,
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/plone/zchl_buildout/eggs/Products.CMFDiffTool-4.0.4-py3.12.egg/Products/CMFDiffTool/__init__.py", line 10, in <module>
    from Products.CMFDiffTool import BinaryDiff  # NOQA
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/plone/zchl_buildout/eggs/Products.CMFDiffTool-4.0.4-py3.12.egg/Products/CMFDiffTool/BinaryDiff.py", line 3, in <module>
    from Products.CMFDiffTool.BaseDiff import _getValue
  File "/home/plone/zchl_buildout/eggs/Products.CMFDiffTool-4.0.4-py3.12.egg/Products/CMFDiffTool/BaseDiff.py", line 8, in <module>
    from plone.base.utils import safe_hasattr
  File "/home/plone/zchl_buildout/eggs/plone.base-3.1.0-py3.12.egg/plone/base/utils.py", line 2, in <module>
    from .interfaces import ISearchSchema
  File "/home/plone/zchl_buildout/eggs/plone.base-3.1.0-py3.12.egg/plone/base/interfaces/__init__.py", line 40, in <module>
    from .login import IForcePasswordChange
  File "/home/plone/zchl_buildout/eggs/plone.base-3.1.0-py3.12.egg/plone/base/interfaces/login.py", line 3, in <module>
    from plone.z3cform.interfaces import IWrappedForm
  File "/home/plone/zchl_buildout/eggs/plone.z3cform-2.0.5-py3.12.egg/plone/z3cform/__init__.py", line 1, in <module>
    from plone.z3cform.patch import apply_patch
  File "/home/plone/zchl_buildout/eggs/plone.z3cform-2.0.5-py3.12.egg/plone/z3cform/patch.py", line 5, in <module>
    from plone.z3cform.z2 import processInputs
  File "/home/plone/zchl_buildout/eggs/plone.z3cform-2.0.5-py3.12.egg/plone/z3cform/z2.py", line 7, in <module>
    import z3c.form.interfaces
ModuleNotFoundError: No module named 'z3c.form'

We have upgraded our clients sites from 6.1.1 to 6.1.2 without any issues. Our installations are done with buildout.

1 Like

I thought I had reverted that pin to 0.45.1, but apparently not. This is only a problem for uv though: plain pip and buildout have no problems installing a yanked release.

PyPI says: "Reason this release was yanked: Causes CI failures where setuptools is pinned to an old version". So the reason is pretty much irrelevant for us.

You may want to check if uv has an option for ignoring this error. Or update the constraint to wheel==0.45.1 yourself.

You probably have a z3c.something that still uses pkg_resources style namespaces. Switch to a version that uses native namespaces.

Possibly collective.z3cform.datagridfield (which works with 6.1.1). Sounds like a breaking change.

use you z3c.rml in your installation? i use it and downpinned to 4.5

If you find your code failing to import packages in the z3c namespace, you might want to update some z3c package to a PEP 420 compatible release (e.g. z3c.jbot = 3.0).

It might be that for some packages there is not such a release.
You are welcome to submit PRs to fix that, see:

The same holds true for packages in the five namespace.

We have these z3c packages in 6.1.1:

  '/home/plone/zchl_buildout/eggs/z3c.jbot-2.2-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/collective.z3cform.datagridfield-3.0.4-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/z3c.pt-4.4-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/z3c.relationfield-2.0.0-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/plone.app.z3cform-4.7.4-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/z3c.zcmlhook-2.0-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/plone.z3cform-2.0.4-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/z3c.form-5.1-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/z3c.caching-3.0-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/z3c.objpath-2.0-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/z3c.formwidget.query-2.0.0-py3.12.egg',
  '/home/plone/zchl_buildout/eggs/z3c.unconfigure-2.1-py3.12.egg',

This change in 6.1.2 is unexpected and a breaking change from what I see.

The breakage is because setuptools is showing more and more deprecation warnings with every release. The old pkg_resources style namespaces will be unsupported at the end of this year. You can still use them if you stick to older setuptools versions. We need to start moving to native namespaces. In Plone 6.2 we will do this for the plone namespace.

An easy workaround that you can try: add the horse-with-no-namespace package. In your case: uv pip install horse-with-no-namespace.

1 Like

Discussion Support cannot install

2025-06-23 16:02:49,998 ERROR [Zope.SiteErrorLog:35][waitress-1] PicklingError: http://192.168.141.130:3000/@addons/plone.app.discussion/install
Traceback (innermost last):
Module ZPublisher.WSGIPublisher, line 187, in transaction_pubevents
Module transaction._manager, line 255, in commit
Module transaction._manager, line 132, in commit
Module transaction._transaction, line 282, in commit
Module transaction._transaction, line 273, in commit
Module transaction._transaction, line 456, in _commitResources
Module transaction._transaction, line 430, in _commitResources
Module ZODB.Connection, line 494, in commit
Module ZODB.Connection, line 541, in _commit
Module ZODB.Connection, line 572, in _store_objects
Module ZODB.serialize, line 433, in serialize
Module ZODB.serialize, line 442, in _dump
_pickle.PicklingError: Can't pickle <class 'testsite.interfaces.IBrowserLayer'>: import of module 'testsite.interfaces' failed

I haven't used it yet, but after the headache involved in switching my projects with a shared namespace, I am really glad to see horse-with-no-namespace·PyPI !

@mactrash That looks like it is probably not an error with plone.app.discussion, but a problem with your testsite package (no longer installed in the venv, or a pkg_namespace issue, maybe).

This is not work. I created my venv, installed requirements.txt using pip/uv and then horse-with-no-namespace. The buildout command fails badly:

Traceback (most recent call last):
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/zc/buildout/buildout.py", line 2330, in main
    getattr(buildout, command)(args)
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/zc/buildout/buildout.py", line 753, in install
    [self[part]['recipe'] for part in install_parts]
     ~~~~^^^^^^
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/zc/buildout/buildout.py", line 1406, in __getitem__
    options._initialize()
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/zc/buildout/buildout.py", line 1518, in _initialize
    self.initialize()
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/zc/buildout/buildout.py", line 1524, in initialize
    recipe_class = _install_and_load(reqs, 'zc.buildout', entry, buildout)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/zc/buildout/buildout.py", line 1466, in _install_and_load
    zc.buildout.easy_install.install(
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/zc/buildout/easy_install.py", line 1094, in install
    return installer.install(specs, working_set)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/zc/buildout/easy_install.py", line 819, in install
    for dist in self._get_dist(requirement, ws):
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/zc/buildout/easy_install.py", line 721, in _get_dist
    ws.add(dist)
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/pkg_resources/__init__.py", line 806, in add
    self._added_new(dist)
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/pkg_resources/__init__.py", line 1090, in _added_new
    callback(dist)
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/pkg_resources/__init__.py", line 3687, in <lambda>
    lambda dist: dist.activate(replace=True),
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/pkg_resources/__init__.py", line 3146, in activate
    declare_namespace(pkg)
  File "/home/ajung/src/zchl_buildout/.venv/lib/python3.12/site-packages/horse_with_no_namespace/__init__.py", line 46, in declare_namespace
    parent_locals["__path__"], packageName
    ~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: '__path__'

Okay, so horse-with-no-namespace does not currently work with Buildout.

I do have a PR in zc.buildout that should help, but it is highly experimental and I did not work in it since April, as I was busy fixing Buildout for setuptools 80+. I do want to pick it up again in summer.

All or most z3c.* packages should already have a compatible release though. See z3c, z3c.recipe, z3c.formwidget – 21 repos · Issue #321 · zopefoundation/meta · GitHub.

Don't get me wrong, but 6.1.2 should be a bugfix release only. Instead, 6.1.2 contains breaking changes that do not belong in a bugfix release. This would belong in 6.2, not in the 6.1 release cycle.

I agree with you in theory, but surely the underlying issue is changes forced on Plone by pep namespace policy and enforcement? I mean I've been having problems with it just upgrading my own namespace packages. Especially with upgrading to uv, although they rightly point to approved peps as the authority. The Plone team being aggressive on this is a good thing I think, since the pressure is external.

Sorry guys, we all know how release management is supposed to work and how we should handle bugfix releases and feature releases. These changes are clearly breaking feature changes which do not belong into 6.1.2. This is a violation of release basics and it breaks installation if you are trying to upgrade the usual, known way. The proposed way does not work for me - neither with pip nor with uv - and I am blocked from upgrading and don't see a solution at the horizon.

Unluckily, the change to native namespace is not an easy thing to handle.

BTW, are you still stuck importing z3c packages?

Can you list the z3c packages you have in your deployment?
Something like grep z3c bin/instance or buildout annotate | grep z3c?

1 Like

This just means close the 6.1.X line and switch to 6.2. The namespace changes are not maintainable by Plone itself. It had to be done in 6.1.0, it has been done in 6.1.2. The big problem is that Zope/Plone still not have its own API wrapper on namespaces/versions so the rely on Python tools, so it will happen again.

Python has been terrible on this, and we're just speaking of . vs - in a string and parsing failures :smiling_face_with_tear:

If you mean me: see above

@zopyx All z3c packages that you mention above are also mentioned in this zopefoundation meta ticket. According to that list, they have all been migrated to native namespaces, and a release has been made. So adjust your version pins, and it should work.

The ones that are actually in use by core Plone, have the new versions in versions.cfg. z3c.jbot is not used in core, but its pin is in versions-ecosystem.cfg which you can add to your extends. (And z3c.dependencychecker is in versions-extra.cfg, but that package is not in your list.)

Note that is is only about package names starting with z3c., so plone.z3cform, plone.app.z3cform, and collective.z3cform.datagridfield are not affected.

Same is true for the five. namespace, but this apparently contains only four packages, and they have all been migrated.

Here is the zopefoundation meta issue for all zopefoundation namespaces. Next up is the zope and zope.app namespace with 117 repos. Michael Howitz has been handling all or most other packages. The work is not difficult if you use the script, but there are a lot of repos, so he can certainly use help!

1 Like