Plone 6.0.7 soft released

Plone 6.0.7 has been soft-released. Please give it a try and let me know if there are any critical issues.
For those who haven't run across soft-releases before, this is the last step before the final release. Because things haven't been finalized yet, some packages may change between now and the release. It is not recommended to use soft-releases in production.

Release notes for Plone 6.0.7rc1

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

Highlights

Major changes since 6.0.6:

  • Zope: Security fixes in AccessControl and RestrictedPython. See community announcement.
  • plone.namedfile:
    • Add internal modification timestamp with fallback to _p_mtime.
    • Use new internal modification timestamp as part of the hash key for scales.
  • plone.dexterity: Fix a memory leak. For details see issue 3829.
  • plone.app.widgets: Make this package deprecated. It still works, and is included in Plone 6.0, but Plone 6.1 will not ship with it.
    Widget base classes have been moved to plone.app.z3cform.widgets.patterns.
    Also see plone.app.widgets.utils for information about moving utility methods to their new location.
  • plone.app.robotframework: Add support for playwright-based tests via robotframework-browser.
  • plone.app.z3cform: Introduce new Email-Widget which is used for plone.schema.email.IEmail fields. It uses the input type email.
  • plone.volto: Add block_types index to zcatalog. By default it is only added for new Plone sites.
    To add it to an existing site, run plone.volto.upgrades.add_block_types_index manually.
  • plone.app.multilingual: Fixes for Indonesian in a multilingual site. Fix set_recursive_language to actually find child objects.
  • plone.app.querystring: Fix the `currentUser`` operation when the current user's username is different from their user id.
  • plone.namedfile: Fixed issue with SVG images that contain extensive metadata.
  • plone.staticresources: update to Mockup 5.1.4:
    • pat structure: Fix popover-structure-columns, use 2-column layout. (9fb499e)
    • pat structure: Fix sticky position when toolbar is on top.
    • pat tinymce: Fix image modal with selected image.
  • plonetheme.barceloneta: Update Bootstrap to 5.3.1
  • Products.CMFCore:
    • Improve handling of PortalFolder filter input.
    • Provide a way to not publish items that are acquired.
  • plone.restapi:
    • Allow passing additional parameters to the delete users endpoint to request not to delete local roles and memberareas.
    • When serializing blocks, image_scales is now added to blocks that contain a resolveuid-based url.
    • When deserializing blocks, image_scales is removed.
    • Add visit_blocks util for finding all nested blocks.
  • plone.app.locales: Updates to nl translations.

Volto frontend

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

Also, existing Plone sites need some or more extensive changes to be upgraded before they can use the Volto Frontend. Please read the guide on migrating from Plone Classic UI to Volto.

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. Our documentation now refers to this frontend as 'Classic UI'. Support for Classic UI is especially relevant for existing Plone sites which for whatever reason or requirements are not yet ready to be upgraded to the Volto frontend.

Python compatibility

This release supports Python 3.8, 3.9, 3.10, and 3.11.

pip, buildout, setuptools

In Plone core we use these versions to install Plone:

pip==23.2
setuptools==68.0.0
wheel==0.40.0
zc.buildout==3.0.1

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

Note that setuptools 66 or higher is more strict with what versions it can recognize. If you run pip or buildout and it suddenly cannot find a package with a non-standard version, then this may be the cause.
And setuptools 68.1.0 until at least 68.1.2 may give problems with namespace packages, especially when they have multiple levels, like plone.app.*, and are installed in editable mode. And pinning a specific version of setuptools in your virtual environment may not even be enough for this case. See ModuleNotFoundError when running tests on Python 3.11 · Issue #172 · plone/meta · GitHub

Installation

For installation instructions, see the documentation.

Issues

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

Upgrade from 6.0.6 to 6.0.7 raise an error. Looks like a problem between yafowil.plone and plone.app.widgets. I will investigate the Problem.

Traceback (most recent call last):
  File "/opt/csnet/parts/client1/bin/interpreter", line 333, in <module>
    exec(compile(__file__f.read(), __file__, "exec"))
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/Startup/serve.py", line 255, in <module>
    sys.exit(main() or 0)
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/Startup/serve.py", line 251, in main
    return command.run()
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/Startup/serve.py", line 189, in run
    app = self.loadapp(app_spec, name=app_name, relative_to=base,
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/Startup/serve.py", line 220, in loadapp
    return loadapp(app_spec, name=name, relative_to=relative_to, **kw)
  File "/opt/csnet/eggs/cp39/PasteDeploy-3.0.1-py3.9.egg/paste/deploy/loadwsgi.py", line 248, in loadapp
    return loadobj(APP, uri, name=name, **kw)
  File "/opt/csnet/eggs/cp39/PasteDeploy-3.0.1-py3.9.egg/paste/deploy/loadwsgi.py", line 273, in loadobj
    return context.create()
  File "/opt/csnet/eggs/cp39/PasteDeploy-3.0.1-py3.9.egg/paste/deploy/loadwsgi.py", line 741, in create
    return self.object_type.invoke(self)
  File "/opt/csnet/eggs/cp39/PasteDeploy-3.0.1-py3.9.egg/paste/deploy/loadwsgi.py", line 200, in invoke
    app = context.app_context.create()
  File "/opt/csnet/eggs/cp39/PasteDeploy-3.0.1-py3.9.egg/paste/deploy/loadwsgi.py", line 741, in create
    return self.object_type.invoke(self)
  File "/opt/csnet/eggs/cp39/PasteDeploy-3.0.1-py3.9.egg/paste/deploy/loadwsgi.py", line 138, in invoke
    return fix_call(context.object, context.global_conf, **context.local_conf)
  File "/opt/csnet/eggs/cp39/PasteDeploy-3.0.1-py3.9.egg/paste/deploy/util.py", line 61, in fix_call
    val = callable(*args, **kw)
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/Startup/run.py", line 61, in make_wsgi_app
    starter.prepare()
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/Startup/starter.py", line 38, in prepare
    self.startZope()
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/Startup/starter.py", line 94, in startZope
    Zope2.startup_wsgi()
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/__init__.py", line 36, in startup_wsgi
    _startup()
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/App/startup.py", line 126, in startup
    load_zcml()
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/App/startup.py", line 41, in load_zcml
    load_site()
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/Zope2/App/zcml.py", line 45, in load_site
    _context = xmlconfig.file(site_zcml)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 662, in file
    include(context, name, package)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 559, in include
    processxmlfile(f, context)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 409, in processxmlfile
    parser.parse(src)
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/usr/lib/python3.9/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "../Modules/pyexpat.c", line 459, in EndElement
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 395, in endElementNS
    self._handle_exception(ex, info)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 393, in endElementNS
    self.context.end()
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/config.py", line 701, in end
    self.stack.pop().finish()
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/config.py", line 869, in finish
    actions = self.handler(context, **args)
  File "/opt/csnet/eggs/cp39/Zope-5.8.4-py3.9.egg/OFS/metaconfigure.py", line 47, in loadProducts
    xmlconfig.include(_context, zcml, package=product)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 559, in include
    processxmlfile(f, context)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 409, in processxmlfile
    parser.parse(src)
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/usr/lib/python3.9/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "../Modules/pyexpat.c", line 459, in EndElement
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 395, in endElementNS
    self._handle_exception(ex, info)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 393, in endElementNS
    self.context.end()
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/config.py", line 701, in end
    self.stack.pop().finish()
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/config.py", line 869, in finish
    actions = self.handler(context, **args)
  File "/opt/csnet/eggs/cp39/plone.autoinclude-1.0.1-py3.9.egg/plone/autoinclude/zcml.py", line 39, in includePluginsDirective
    loader.load_configure(context, filename, dists)
  File "/opt/csnet/eggs/cp39/plone.autoinclude-1.0.1-py3.9.egg/plone/autoinclude/loader.py", line 180, in load_configure
    load_zcml_file(context, module_name, package, filename)
  File "/opt/csnet/eggs/cp39/plone.autoinclude-1.0.1-py3.9.egg/plone/autoinclude/loader.py", line 173, in load_zcml_file
    include(context, filename, package)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 559, in include
    processxmlfile(f, context)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 409, in processxmlfile
    parser.parse(src)
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/usr/lib/python3.9/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "../Modules/pyexpat.c", line 459, in EndElement
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 395, in endElementNS
    self._handle_exception(ex, info)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 393, in endElementNS
    self.context.end()
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/config.py", line 701, in end
    self.stack.pop().finish()
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/config.py", line 869, in finish
    actions = self.handler(context, **args)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 559, in include
    processxmlfile(f, context)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 409, in processxmlfile
    parser.parse(src)
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 111, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/usr/lib/python3.9/xml/sax/xmlreader.py", line 125, in parse
    self.feed(buffer)
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 217, in feed
    self._parser.Parse(data, isFinal)
  File "../Modules/pyexpat.c", line 459, in EndElement
  File "/usr/lib/python3.9/xml/sax/expatreader.py", line 381, in end_element_ns
    self._cont_handler.endElementNS(pair, None)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 395, in endElementNS
    self._handle_exception(ex, info)
  File "/opt/csnet/eggs/cp39/zope.configuration-5.0-py3.9.egg/zope/configuration/xmlconfig.py", line 237, in _handle_exception
    raise ZopeXMLConfigurationError(info, ex)
zope.configuration.xmlconfig.ZopeXMLConfigurationError: File "/opt/csnet/eggs/cp39/yafowil.plone-4.0.0a5-py3.9.egg/yafowil/plone/autoform/configure.zcml", line 26.2-31.37
    File "/opt/csnet/parts/client1/etc/site.zcml", line 16.2-16.23
    File "/opt/csnet/eggs/cp39/Products.CMFPlone-6.0.7rc1-py3.9.egg/Products/CMFPlone/configure.zcml", line 128.2-132.8
    File "/opt/csnet/eggs/cp39/yafowil.plone-4.0.0a5-py3.9.egg/yafowil/plone/configure.zcml", line 16.2-16.33
    ImportError: cannot import name 'get_ajaxselect_options' from 'plone.app.widgets.utils' (unknown location)

Yes, same here with yafowil.plone. It's because plone.app.widgets==5.0 removed plone.app.widgets.utils.get_ajaxselect_options as stated in the deprecation warning in branch 4.x ... I'm upgrading the imports in yafowil.plone now, but one could argue, that it should not break for this minor version update... downgrading plone.app.widgets==4.0.1 works also. I think it would be most convenient if we reimplement the deprecation warning in plone.app.widgets==5.0.1 and simply remove the whole package in Plone==6.1 ...

Update: plone.app.widgets.utils.get_ajaxselect_options got deprecated since version 3.0.0 (see get_ajaxselect_options is no longer used in plone.app.z3cform by jensens · Pull Request #194 · plone/plone.app.widgets · GitHub) so yafowil.plone should really get rid of that.

As this method is stale code in plone.app.widgets since 3.0.0 I'm now against reimplementing it in 5.0.1 :wink:

No news on the dexterity Provides fix?

Yes, this fix is included in the release, with plone.dexterity 3.0.3.
I see the automated changelog generation missed this, and so I missed this when writing release notes. I will update the release notes on dist.plone.org and in my original comment here. Thanks for mentioning it!

For reference, it is this change.

1 Like

yafowil.plone is fixed here WIP: Bootstrap plone6 by rnixx · Pull Request #29 · bluedynamics/yafowil.plone · GitHub ... hopefully released as 5.0.0a1 soon.

Thanks, the error is gone!

I tried to upgrade a Plone 5.2.x to 6.0.7rc1 and got the following traceback: problem with plone.base.interfaces.syndication.ISiteSyndicationSettings when upgrading from 5.x to 6 · Issue #315 · plone/plone.app.upgrade · GitHub

I think the upgrade step fix_syndication_settings needs to check if the keys plone.base.interfaces.syndication.ISiteSyndicationSettings do exist.

/cc @1letter any thoughts?

Confirmed, and looks like a blocker. I have fixes here now:

1 Like

I have released plone.app.upgrade 3.0.8 with the fix, and added it to the versions on dist.plone.org.

Some last-minute changes are being considered, so I am holding off on making the release final for the moment.

2 Likes

Plone 6.0.7 final is out.

1 Like