From f1336ed67b5efa256606da6f3031e48aaf37d0c2 Mon Sep 17 00:00:00 2001 From: jensens Date: Mon, 28 Oct 2024 10:44:32 +0100 Subject: [PATCH] [fc] Repository: plone.protect Branch: refs/heads/master Date: 2024-09-25T09:35:08+02:00 Author: Peter Mathis (petschki) Commit: https://github.com/plone/plone.protect/commit/aca1e8b621c89480dde0c8c337dc771ec49723f9 Check for removed tinymce.util.XHR Files changed: M plone/protect/protect.js Repository: plone.protect Branch: refs/heads/master Date: 2024-09-25T09:35:08+02:00 Author: Peter Mathis (petschki) Commit: https://github.com/plone/plone.protect/commit/7aac622b021556f6cdc5f98cf626ef9b730e2448 changenote Files changed: A news/106.bugfix Repository: plone.protect Branch: refs/heads/master Date: 2024-10-23T16:15:56+02:00 Author: Peter Mathis (petschki) Commit: https://github.com/plone/plone.protect/commit/9f3cf436f6ced883b03c73a7416bd63441cc3e21 Update plone/protect/protect.js Co-authored-by: Johannes Raggam <thetetet@gmail.com> Files changed: M plone/protect/protect.js Repository: plone.protect Branch: refs/heads/master Date: 2024-10-28T10:43:03+01:00 Author: Jens W. Klein (jensens) Commit: https://github.com/plone/plone.protect/commit/80a9b99932a428c459e8db9cad129b01f1e982a5 Merge branch 'master' into tinymce-fix Files changed: M .pre-commit-config.yaml Repository: plone.protect Branch: refs/heads/master Date: 2024-10-28T10:44:32+01:00 Author: Jens W. Klein (jensens) Commit: https://github.com/plone/plone.protect/commit/dab69f6cca215051cba84e3c6e638bcb36820fb3 Merge pull request #118 from plone/tinymce-fix TinyMCE 6+ support Files changed: A news/106.bugfix M plone/protect/protect.js --- last_commit.txt | 181 +++++++++++++----------------------------------- 1 file changed, 49 insertions(+), 132 deletions(-) diff --git a/last_commit.txt b/last_commit.txt index e7c49f581e..6278f692d6 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,163 +1,80 @@ -Repository: Products.CMFPlone +Repository: plone.protect Branch: refs/heads/master -Date: 2024-08-05T19:48:10+05:30 -Author: Sarthak Pandey (SarthakPaandey) -Commit: https://github.com/plone/Products.CMFPlone/commit/3505f1d3dda138400820e315113e8e84fd41da03 +Date: 2024-09-25T09:35:08+02:00 +Author: Peter Mathis (petschki) +Commit: https://github.com/plone/plone.protect/commit/aca1e8b621c89480dde0c8c337dc771ec49723f9 -Changed twitter link to x +Check for removed tinymce.util.XHR Files changed: -M setup.py +M plone/protect/protect.js -b'diff --git a/setup.py b/setup.py\nindex 35f8fbeec3..97dd946f8a 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -41,7 +41,7 @@\n "Forum": "https://community.plone.org/",\n "Chat": "https://discord.gg/zFY3EBbjaj",\n "Mastodon": "https://plone.social/@plone",\n- "Twitter": "https://twitter.com/plone",\n+ "Twitter": "https://x.com/plone",\n "Videos": "https://youtube.com/@plonecms",\n "Sponsor": "https://github.com/sponsors/plone",\n },\n' +b'diff --git a/plone/protect/protect.js b/plone/protect/protect.js\nindex acd3aed..817b246 100644\n--- a/plone/protect/protect.js\n+++ b/plone/protect/protect.js\n@@ -29,7 +29,7 @@ if(script){\n }\n });\n }\n- if(window.tinymce && window.tinymce.util.XHR._send === undefined){\n+ if(window.tinymce && window.tinymce.util.XHR && window.tinymce.util.XHR._send === undefined){\n window.tinymce.util.XHR._send = window.tinymce.util.XHR.send;\n var xhr = window.tinymce.util.XHR;\n var _send = xhr.send;\n' -Repository: Products.CMFPlone +Repository: plone.protect Branch: refs/heads/master -Date: 2024-10-23T16:52:06-07:00 -Author: Steve Piercy (stevepiercy) -Commit: https://github.com/plone/Products.CMFPlone/commit/3688a89217779a6e87ced5e97e8dd41987d16157 +Date: 2024-09-25T09:35:08+02:00 +Author: Peter Mathis (petschki) +Commit: https://github.com/plone/plone.protect/commit/7aac622b021556f6cdc5f98cf626ef9b730e2448 -Update setup.py +changenote Files changed: -M setup.py +A news/106.bugfix -b'diff --git a/setup.py b/setup.py\nindex 97dd946f8a..b31fd765ac 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -41,7 +41,7 @@\n "Forum": "https://community.plone.org/",\n "Chat": "https://discord.gg/zFY3EBbjaj",\n "Mastodon": "https://plone.social/@plone",\n- "Twitter": "https://x.com/plone",\n+ "X (formerly Twitter)": "https://x.com/plone",\n "Videos": "https://youtube.com/@plonecms",\n "Sponsor": "https://github.com/sponsors/plone",\n },\n' +b'diff --git a/news/106.bugfix b/news/106.bugfix\nnew file mode 100644\nindex 0000000..d7fa367\n--- /dev/null\n+++ b/news/106.bugfix\n@@ -0,0 +1,2 @@\n+Remove tinymce patch. `tinymce.utils.XHR` has been removed in TinyMCE 6.\n+[petschki]\n' -Repository: Products.CMFPlone +Repository: plone.protect Branch: refs/heads/master -Date: 2024-10-24T07:35:31+05:30 -Author: Rohan Shaw (rohnsha0) <86848116+rohnsha0@users.noreply.github.com> -Commit: https://github.com/plone/Products.CMFPlone/commit/eadf2dd8fcb8363ca54afe6bbe1a276dac1e02c1 +Date: 2024-10-23T16:15:56+02:00 +Author: Peter Mathis (petschki) +Commit: https://github.com/plone/plone.protect/commit/9f3cf436f6ced883b03c73a7416bd63441cc3e21 -Merge branch 'master' into branch +Update plone/protect/protect.js + +Co-authored-by: Johannes Raggam <thetetet@gmail.com> Files changed: -A Products/CMFPlone/tests/configure-distributions.zcml -A Products/CMFPlone/tests/robot/test_contentbrowser.robot -A Products/CMFPlone/tests/robot/test_select_widget.robot -A news/139.bugfix -A news/3813.feature -A news/3813.feature.1 -A news/3961.breaking.1 -A news/3961.breaking.2 -A news/3961.breaking.3 -A news/3961.feature.1 -A news/3980.bugfix -A news/4009.feature -A news/4011.bugfix -A news/4015.bugfix -A news/4020.bugfix -A news/4022.bugfix -A news/4026.bugfix -A news/4028.bugfix -A news/4031.feature -A news/6105.internal -M CHANGES.md -M Products/CMFPlone/CatalogTool.py -M Products/CMFPlone/PloneTool.py -M Products/CMFPlone/Portal.py -M Products/CMFPlone/URLTool.py -M Products/CMFPlone/browser/admin.py -M Products/CMFPlone/browser/admin.zcml -M Products/CMFPlone/browser/search.py -M Products/CMFPlone/browser/templates/plone-addsite.pt -M Products/CMFPlone/browser/templates/plone-overview.pt -M Products/CMFPlone/browser/templates/search.pt -M Products/CMFPlone/configure.zcml -M Products/CMFPlone/controlpanel/browser/configure.zcml -M Products/CMFPlone/controlpanel/browser/redirects-controlpanel.pt -M Products/CMFPlone/controlpanel/browser/redirects.py -M Products/CMFPlone/controlpanel/browser/types.py -M Products/CMFPlone/controlpanel/permissions.zcml -M Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_navigation.py -M Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_redirection.py -M Products/CMFPlone/controlpanel/tests/test_controlpanel_browser_search.py -M Products/CMFPlone/factory.py -M Products/CMFPlone/patches/__init__.py -M Products/CMFPlone/patterns/settings.py -M Products/CMFPlone/profiles/default/metadata.xml -M Products/CMFPlone/profiles/default/types.xml -M Products/CMFPlone/profiles/default/types/Plone_Site.xml -M Products/CMFPlone/profiles/default/types/TempFolder.xml -M Products/CMFPlone/profiles/default/workflows.xml -M Products/CMFPlone/profiles/dependencies/metadata.xml -M Products/CMFPlone/resources/utils.py -M Products/CMFPlone/testing.py -M Products/CMFPlone/tests/configure.zcml -M Products/CMFPlone/tests/robot/keywords.robot -M Products/CMFPlone/tests/robot/test_actionmenu.robot -M Products/CMFPlone/tests/robot/test_controlpanel_actions.robot -M Products/CMFPlone/tests/robot/test_controlpanel_editing.robot -M Products/CMFPlone/tests/robot/test_controlpanel_filter.robot -M Products/CMFPlone/tests/robot/test_controlpanel_language.robot -M Products/CMFPlone/tests/robot/test_controlpanel_markup.robot -M Products/CMFPlone/tests/robot/test_controlpanel_navigation.robot -M Products/CMFPlone/tests/robot/test_controlpanel_redirection.robot -M Products/CMFPlone/tests/robot/test_controlpanel_search.robot -M Products/CMFPlone/tests/robot/test_controlpanel_security.robot -M Products/CMFPlone/tests/robot/test_controlpanel_site.robot -M Products/CMFPlone/tests/robot/test_controlpanel_social.robot -M Products/CMFPlone/tests/robot/test_controlpanel_types.robot -M Products/CMFPlone/tests/robot/test_controlpanel_usergroups.robot -M Products/CMFPlone/tests/robot/test_edit.robot -M Products/CMFPlone/tests/robot/test_edit_user_schema.robot -M Products/CMFPlone/tests/robot/test_folder_contents.robot -M Products/CMFPlone/tests/robot/test_linkintegrity.robot -M Products/CMFPlone/tests/robot/test_livesearch.robot -M Products/CMFPlone/tests/robot/test_overlays.robot -M Products/CMFPlone/tests/robot/test_portlets.robot -M Products/CMFPlone/tests/robot/test_querystring.robot -M Products/CMFPlone/tests/robot/test_tinymce.robot -M Products/CMFPlone/tests/testMigrationTool.py -M Products/CMFPlone/tests/testPloneTool.py -M Products/CMFPlone/tests/testPortalCreation.py -M Products/CMFPlone/tests/testResourceRegistries.py -M Products/CMFPlone/tests/testSearch.py -M Products/CMFPlone/tests/testSecurity.py -M Products/CMFPlone/tests/testSiteAdminRole.py -M Products/CMFPlone/tests/test_factory.py -M Products/CMFPlone/utils.py -M setup.py -D Products/CMFPlone/patches/addzmiplonesite.py -D Products/CMFPlone/profiles/default/types/Discussion_Item.xml -D Products/CMFPlone/tests/robot/common.robot -D Products/CMFPlone/tests/robot/robodoc/README.rst -D Products/CMFPlone/tests/robot/robodoc/TODO.rst -D Products/CMFPlone/tests/robot/robodoc/anonymous.robot -D Products/CMFPlone/tests/robot/robodoc/collaboration-advanced_control.robot -D Products/CMFPlone/tests/robot/robodoc/collaboration.robot -D Products/CMFPlone/tests/robot/robodoc/common.robot -D Products/CMFPlone/tests/robot/robodoc/config-screens.robot -D Products/CMFPlone/tests/robot/robodoc/content.robot -D Products/CMFPlone/tests/robot/robodoc/managing-working_copy.robot -D Products/CMFPlone/tests/robot/robodoc/managing_content.robot -D Products/CMFPlone/tests/robot/robodoc/personalsettings.robot -D Products/CMFPlone/tests/robot/robodoc/working_with_tinymce.robot -D news/6104.internal - -b'diff --git a/CHANGES.md b/CHANGES.md\nindex 89b8127809..f16e3beadc 100644\n--- a/CHANGES.md\n+++ b/CHANGES.md\n@@ -15,6 +15,33 @@\n \n \n \n+## 6.1.0a5 (2024-09-05)\n+\n+\n+### Breaking changes:\n+\n+- Use `Products.isurlinportal` directly, instead of relying on it patching our `URLTool`.\n+ This solves a cyclic dependency.\n+ [maurits] #12\n+- Turn plone.app.discussion in a core-addon.\n+ [@jensens] #3782\n+\n+\n+### Bug fixes:\n+\n+- Sort portal types in search filter according to `ReallyUserFriendlyTypes` using `unidecode` in `plone.app.vocabularies`. @rohnsha0 #3860\n+- Do not use deprecated `base_hasattr` in `utils.py`.\n+ [maurits] #3998\n+- Use `five.registerPackage` so an editable install with `pip` works.\n+ [maurits] #4002\n+- Fix help text for redirect target path. @davisagli #4007\n+\n+\n+### Internal:\n+\n+- Updated metadata version to 6104.\n+ [maurits] #6104\n+\n ## 6.1.0a4 (2024-08-01)\n \n \ndiff --git a/Products/CMFPlone/CatalogTool.py b/Products/CMFPlone/CatalogTool.py\nindex 1b45f330a1..723d71e8b9 100644\n--- a/Products/CMFPlone/CatalogTool.py\n+++ b/Products/CMFPlone/CatalogTool.py\n@@ -10,7 +10,6 @@\n from BTrees.Length import Length\n from DateTime import DateTime\n from OFS.interfaces import IOrderedContainer\n-from plone.app.discussion.interfaces import DISCUSSION_ANNOTATION_KEY\n from plone.base.interfaces import INonStructuralFolder\n from plone.base.interfaces import IPloneCatalogTool\n from plone.base.utils import base_hasattr\n@@ -46,6 +45,13 @@\n \n \n logger = logging.getLogger("Plone")\n+try:\n+ from plone.app.discussion.interfaces import DISCUSSION_ANNOTATION_KEY\n+except ImportError: # pragma: no cover\n+ DISCUSSION_ANNOTATION_KEY = None\n+\n+\n+logger = logging.getLogger(\'Plone\')\n \n _marker = object()\n \n@@ -455,9 +461,13 @@ def indexObject(obj, path):\n ):\n try:\n self.reindexObject(obj, idxs=idxs)\n- # index conversions from plone.app.discussion\n+ # index conversations from plone.app.discussion\n annotions = IAnnotations(obj)\n- if DISCUSSION_ANNOTATION_KEY in annotions:\n+ if (\n+ DISCUSSION_ANNOTATION_KEY is not None\n+ and DISCUSSION_ANNOTATION_KEY in annotions\n+\n+ ):\n conversation = annotions[DISCUSSION_ANNOTATION_KEY]\n conversation = conversation.__of__(obj)\n for comment in conversation.getComments():\ndiff --git a/Products/CMFPlone/PloneTool.py b/Products/CMFPlone/PloneTool.py\nindex e5ec5bd1be..85f28e820e 100644\n--- a/Products/CMFPlone/PloneTool.py\n+++ b/Products/CMFPlone/PloneTool.py\n@@ -137,6 +137,12 @@ def validateSingleNormalizedEmailAddress(self, address):\n if not isinstance(address, str):\n return False\n \n+ address = address.strip()\n+\n+ # address can be empty if getaddresses has parsing errors (returns [("", "")])\n+ if address == "":\n+ return False\n+\n sub = EMAIL_CUTOFF_RE.match(address)\n if sub is not None:\n # Address contains two newlines (possible spammer relay attack)\n@@ -757,7 +763,7 @@ def acquireLocalRoles(self, obj, status=1, REQUEST=None):\n # If status is 1, allow acquisition of local roles (regular\n # behaviour).\n # If it\'s 0, prohibit it (it will allow some kind of local role\n- # blacklisting).\n+ # denylisting).\n mt = getToolByName(self, "portal_membership")\n if not mt.checkPermission(ModifyPortalContent, obj):\n raise Unauthorized\n@@ -936,7 +942,7 @@ def getUserFriendlyTypes(self, typesList=None):\n typesList = []\n registry = getUtility(IRegistry)\n search_settings = registry.forInterface(ISearchSchema, prefix="plone")\n- blacklistedTypes = search_settings.types_not_searched\n+ denylistedTypes = search_settings.types_not_searched\n \n ttool = getToolByName(self, "portal_types")\n tool_types = ttool.keys()\n@@ -945,7 +951,7 @@ def getUserFriendlyTypes(self, typesList=None):\n else:\n types = tool_types\n \n- friendlyTypes = set(types) - set(blacklistedTypes)\n+ friendlyTypes = set(types) - set(denylistedTypes)\n return list(friendlyTypes)\n \n @security.public\ndiff --git a/Products/CMFPlone/Portal.py b/Products/CMFPlone/Portal.py\nindex cbf4c91149..878872e666 100644\n--- a/Products/CMFPlone/Portal.py\n+++ b/Products/CMFPlone/Portal.py\n@@ -61,7 +61,7 @@ def __getattr__(self, name):\n \n def __setattr__(self, name, obj):\n # handle re setting an item as an attribute\n- if self._tree is not None and name in self:\n+ if not name.startswith("_") and self._tree is not None and name in self:\n del self[name]\n self[name] = obj\n else:\ndiff --git a/Products/CMFPlone/URLTool.py b/Products/CMFPlone/URLTool.py\nindex 76ccbb2f39..71aecab897 100644\n--- a/Products/CMFPlone/URLTool.py\n+++ b/Products/CMFPlone/URLTool.py\n@@ -6,6 +6,7 @@\n from Products.CMFCore.URLTool import URLTool as BaseTool\n from Products.CMFPlone.patches.gtbn import rewrap_in_request_container\n from Products.CMFPlone.PloneBaseTool import PloneBaseTool\n+from Products.isurlinportal import isURLInPortal\n from zope.component import getUtility\n \n \n@@ -14,26 +15,10 @@ class URLTool(PloneBaseTool, BaseTool):\n security = ClassSecurityInfo()\n toolicon = "skins/plone_images/link_icon.png"\n \n- @security.public\n- def isURLInPortal(self, url, context=None):\n- # Note: no docstring, because the method is publicly available\n- # but does not need to be callable on site-url/portal_url/isURLInPortal.\n- #\n- # This method is overridden by Products.isurlinportal,\n- # but the public declaration still seems needed.\n- #\n- # Also, in tests/testURLTool.py we do not use layers,\n- # which means the Products code is not loaded,\n- # so we need to import it explicitly.\n- # This is done once.\n- try:\n- from Products.isurlinportal import isURLInPortal\n- except ImportError:\n- # If this somehow fails, it seems better to have a safe fallback,\n- # instead of a hard failure.\n- return False\n-\n- return isURLInPortal(self, url, context=context)\n+ # The implementation of this method was moved to Products.isurlinportal\n+ # to be able to more quickly do a security release in case there is a\n+ # problem in this part.\n+ isURLInPortal = isURLInPortal\n \n def getPortalObject(self):\n portal = aq_parent(aq_inner(self))\ndiff --git a/Products/CMFPlone/browser/admin.py b/Products/CMFPlone/browser/admin.py\nindex e6273a812a..1c91c8e97d 100644\n--- a/Products/CMFPlone/browser/admin.py\n+++ b/Products/CMFPlone/browser/admin.py\n@@ -2,10 +2,10 @@\n from AccessControl.Permissions import view as View\n from collections import OrderedDict\n from functools import cached_property\n+from importlib import import_module\n from importlib.metadata import distribution\n from importlib.metadata import PackageNotFoundError\n from OFS.interfaces import IApplication\n-from plone.base.interfaces import INonInstallable\n from plone.base.interfaces import IPloneSiteRoot\n from plone.base.utils import get_installer\n from plone.i18n.locales.interfaces import IContentLanguageAvailability\n@@ -14,16 +14,13 @@\n from plone.protect.interfaces import IDisableCSRFProtection\n from Products.CMFCore.permissions import ManagePortal\n from Products.CMFPlone.factory import _DEFAULT_PROFILE\n+from Products.CMFPlone.factory import _TYPES_PROFILE\n from Products.CMFPlone.factory import addPloneSite\n from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile\n-from Products.GenericSetup import BASE\n-from Products.GenericSetup import EXTENSION\n-from Products.GenericSetup import profile_registry\n from Products.GenericSetup.upgrade import normalize_version\n from urllib import parse\n from ZODB.broken import Broken\n from zope.component import adapter\n-from zope.component import getAllUtilitiesRegisteredFor\n from zope.component import getUtility\n from zope.component import queryMultiAdapter\n from zope.component import queryUtility\n@@ -45,6 +42,11 @@\n HAS_VOLTO = True\n except PackageNotFoundError:\n HAS_VOLTO = False\n+try:\n+ distribution("plone.app.caching")\n+ HAS_CACHING = True\n+except PackageNotFoundError:\n+ HAS_CACHING = False\n try:\n distribution("plone.app.upgrade")\n HAS_UPGRADE = True\n@@ -66,8 +68,6 @@ def publishTraverse(self, request, name):\n \n \n class Overview(BrowserView):\n- has_volto = HAS_VOLTO\n-\n def sites(self, root=None):\n if root is None:\n root = self.context\n@@ -154,67 +154,15 @@ class FrontPage(BrowserView):\n \n \n class AddPloneSite(BrowserView):\n- # Profiles that are installed by default,\n- # but can be removed later.\n- default_extension_profiles = (\n- "plone.app.caching:default",\n- "plonetheme.barceloneta:default",\n- )\n- # Let\'s have a separate list for Volto.\n- volto_default_extension_profiles = (\n- "plone.app.caching:default",\n- "plonetheme.barceloneta:default",\n- "plone.volto:default",\n- )\n-\n- def profiles(self):\n- base_profiles = []\n- extension_profiles = []\n- if HAS_VOLTO and not self.request.get("classic"):\n- selected_extension_profiles = self.volto_default_extension_profiles\n- else:\n- selected_extension_profiles = self.default_extension_profiles\n-\n- # profiles available for install/uninstall, but hidden at the time\n- # the Plone site is created\n- not_installable = [\n- "Products.CMFPlacefulWorkflow:CMFPlacefulWorkflow",\n- ]\n- utils = getAllUtilitiesRegisteredFor(INonInstallable)\n- for util in utils:\n- not_installable.extend(\n- util.getNonInstallableProfiles()\n- if hasattr(util, "getNonInstallableProfiles")\n- else []\n- )\n-\n- for info in profile_registry.listProfileInfo():\n- if info.get("type") == EXTENSION and info.get("for") in (\n- IPloneSiteRoot,\n- None,\n- ):\n- profile_id = info.get("id")\n- if profile_id not in not_installable:\n- if profile_id in selected_extension_profiles:\n- info["selected"] = "selected"\n- extension_profiles.append(info)\n-\n- def _key(v):\n- # Make sure implicitly selected items come first\n- selected = v.get("selected") and "automatic" or "manual"\n- return "{}-{}".format(selected, v.get("title", ""))\n-\n- extension_profiles.sort(key=_key)\n-\n- for info in profile_registry.listProfileInfo():\n- if info.get("type") == BASE and info.get("for") in (IPloneSiteRoot, None):\n- base_profiles.append(info)\n-\n- return dict(\n- base=tuple(base_profiles),\n- default=_DEFAULT_PROFILE,\n- extensions=tuple(extension_profiles),\n- )\n+ @property\n+ def default_extension_profiles(self):\n+ # Profiles that are installed by default,\n+ # but can be removed later.\n+ profiles = [_TYPES_PROFILE]\n+ if HAS_CACHING:\n+ profiles.append("plone.app.caching:default")\n+ profiles.append("plonetheme.barceloneta:default")\n+ return profiles\n \n def browser_language(self):\n language = "en"\n@@ -307,9 +255,8 @@ def __call__(self):\n context,\n site_id,\n title=form.get("title", ""),\n- profile_id=form.get("profile_id", _DEFAULT_PROFILE),\n- extension_ids=form.get("extension_ids", ()),\n- setup_content=form.get("setup_content", False),\n+ profile_id=_DEFAULT_PROFILE,\n+ extension_ids=self.default_extension_profiles,\n default_language=form.get("default_language", "en"),\n portal_timezone=form.get("portal_timezone", "UTC"),\n )\n@@ -354,7 +301,12 @@ def missing_packages(self):\n try:\n distribution(package)\n except PackageNotFoundError:\n- missing.append(package)\n+ try:\n+ # profiles can live in submodules of packages.\n+ # check if we can import the module namespace\n+ import_module(package)\n+ except ModuleNotFoundError:\n+ missing.append(package)\n return missing\n \n def versions(self):\ndiff --git a/Products/CMFPlone/browser/admin.zcml b/Products/CMFPlone/browser/admin.zcml\nindex 8d6696c408..04af682344 100644\n--- a/Products/CMFPlone/browser/admin.zcml\n+++ b/Products/CMFPlone/browser/admin.zcml\n@@ -1,6 +1,7 @@\n \n \n \n \n- \n+ \n+ \n \n- \n+ \n+\n+ \n+\n+ \n+\n+ \n \n \n \n- \n-\n \n \n- \n-\n \n
\n+ tal:attributes="action string:${context/absolute_url}/@@plone-addsite">\n
\n
\n

Create a Plone site

\n@@ -120,92 +115,6 @@\n
\n \n \n-
\n-
\n- \n- \n-
\n- Should the default example content be added to the site?\n-
\n-
\n-
\n-\n- \n-\n-
\n-
\n-

Base configuration

\n-\n-
\n- \n- \n-
${info/description}
\n-
\n-\n-
\n- You normally don\'t need to change anything here unless you have specific reasons and know what you are doing.\n-
\n-\n-
\n-
\n-\n-\n-
\n- \n-

Add-ons

\n-\n-
\n- Select any add-ons you want to activate immediately.\n- You can also activate add-ons after the site has been created using the Add-ons control panel.\n-
\n-
\n-\n- \n- \n- \n-
\n- \n- \n-
\n- ${info/description}\n-
\n-
\n-
\n- \n- \n- \n-
\n-
\n-
\n
\n \n \ndiff --git a/Products/CMFPlone/browser/templates/plone-overview.pt b/Products/CMFPlone/browser/templates/plone-overview.pt\nindex 035f0b4856..42217e8180 100644\n--- a/Products/CMFPlone/browser/templates/plone-overview.pt\n+++ b/Products/CMFPlone/browser/templates/plone-overview.pt\n@@ -87,24 +87,9 @@\n \n \n- Create Classic UI Plone site\n- Advanced\n+ i18n:translate="">Create Classic UI Plone site\n \n
\n-

\n- Starting with Plone 6, \'Create a new Plone site\' applies a\n- profile and creates default content for the new React based\n- default frontend Volto. You are however required to set up and run\n- an additional frontend service to use this setup.\n-

\n

\n The \'Create Classic UI Plone site\' button creates a Plone site configured\n for HTML based output, as was already supported by previous Plone versions.\n@@ -117,6 +102,11 @@\n these frontends and possible upgrade paths from older Plone versions\n to Plone 6.\n

\n+

\n+ Starting with Plone 6.1, default content is not loaded into the site.\n+ If you want to load the default content, you should install the plone.classicui package.\n+ If you see this text, that means you have not installed that package yet.\n+

\n
\n
\n \ndiff --git a/Products/CMFPlone/browser/templates/search.pt b/Products/CMFPlone/browser/templates/search.pt\nindex 3e0d611acf..5e89454238 100644\n--- a/Products/CMFPlone/browser/templates/search.pt\n+++ b/Products/CMFPlone/browser/templates/search.pt\n@@ -87,7 +87,7 @@\n \n \n \n-