diff --git a/last_commit.txt b/last_commit.txt index daa021304e..a169322eeb 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,20 +1,267 @@ -Repository: plone.restapi +Repository: plone.volto Branch: refs/heads/main -Date: 2024-12-11T16:06:59-08:00 +Date: 2023-06-30T15:46:50+02:00 +Author: Peter Mathis (petschki) +Commit: https://github.com/plone/plone.volto/commit/dc79ce91cd7c61bfe3a1667c8a010cac6721686b + +Fix deprecated imports + +Files changed: +M src/plone/volto/browser/breadcrumbs.py +M src/plone/volto/browser/migrate_to_volto.py +M src/plone/volto/browser/navigation.py +M src/plone/volto/setuphandlers.py +M src/plone/volto/vocabularies/subject.py + +b'diff --git a/src/plone/volto/browser/breadcrumbs.py b/src/plone/volto/browser/breadcrumbs.py\nindex b9c3b759..c66bb1dc 100644\n--- a/src/plone/volto/browser/breadcrumbs.py\n+++ b/src/plone/volto/browser/breadcrumbs.py\n@@ -1,13 +1,14 @@\n # -*- coding: utf-8 -*-\n from Acquisition import aq_base\n from Acquisition import aq_inner\n+from Acquisition import aq_parent\n from plone.app.layout.navigation.interfaces import INavigationRoot\n from plone.app.layout.navigation.root import getNavigationRoot\n-from Products.CMFPlone import utils\n+from plone.base.defaultpage import check_default_page_via_view\n+from plone.base.interfaces import IHideFromBreadcrumbs\n+from plone.base.utils import pretty_title_or_id\n from Products.CMFPlone.browser.interfaces import INavigationBreadcrumbs\n from Products.CMFPlone.browser.navigation import get_view_url\n-from Products.CMFPlone.defaultpage import check_default_page_via_view\n-from Products.CMFPlone.interfaces import IHideFromBreadcrumbs\n from Products.Five import BrowserView\n from zope.component import getMultiAdapter\n from zope.interface import implementer\n@@ -18,12 +19,12 @@ class PhysicalNavigationBreadcrumbs(BrowserView):\n def breadcrumbs(self):\n context = aq_inner(self.context)\n request = self.request\n- container = utils.parent(context)\n+ container = aq_parent(context)\n \n name, item_url = get_view_url(context)\n last_crumb = {\n "absolute_url": item_url,\n- "Title": utils.pretty_title_or_id(context, context),\n+ "Title": pretty_title_or_id(context, context),\n "nav_title": getattr(aq_base(context), "nav_title", ""),\n }\n \ndiff --git a/src/plone/volto/browser/migrate_to_volto.py b/src/plone/volto/browser/migrate_to_volto.py\nindex 8eba43b2..d10fa7a6 100644\n--- a/src/plone/volto/browser/migrate_to_volto.py\n+++ b/src/plone/volto/browser/migrate_to_volto.py\n@@ -7,13 +7,13 @@\n from plone.app.linkintegrity.utils import referencedRelationship\n from plone.app.redirector.interfaces import IRedirectionStorage\n from plone.app.textfield.value import RichTextValue\n+from plone.base.utils import get_installer\n from plone.dexterity.interfaces import IDexterityFTI\n from plone.volto.browser.migrate_richtext import get_blocks_from_richtext\n from plone.volto.browser.migrate_richtext import migrate_richtext_to_blocks\n from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2Base\n from Products.CMFCore.utils import getToolByName\n from Products.CMFPlone.relationhelper import restore_relations\n-from Products.CMFPlone.utils import get_installer\n from Products.Five import BrowserView\n from uuid import uuid4\n from zope.component import getUtility\ndiff --git a/src/plone/volto/browser/navigation.py b/src/plone/volto/browser/navigation.py\nindex f2b01d6e..20a5050d 100644\n--- a/src/plone/volto/browser/navigation.py\n+++ b/src/plone/volto/browser/navigation.py\n@@ -2,13 +2,13 @@\n from Acquisition import aq_inner\n from Missing import Missing\n from plone.app.layout.navigation.root import getNavigationRoot\n+from plone.base import utils\n+from plone.base.interfaces import INavigationSchema\n from plone.registry.interfaces import IRegistry\n from Products.CMFCore.utils import getToolByName\n-from Products.CMFPlone import utils\n from Products.CMFPlone.browser.interfaces import INavigationTabs\n from Products.CMFPlone.browser.navigation import get_id\n from Products.CMFPlone.browser.navigation import get_view_url\n-from Products.CMFPlone.interfaces import INavigationSchema\n from Products.Five import BrowserView\n from zope.component import getMultiAdapter\n from zope.component import getUtility\ndiff --git a/src/plone/volto/setuphandlers.py b/src/plone/volto/setuphandlers.py\nindex 314d9d46..4b14cbba 100644\n--- a/src/plone/volto/setuphandlers.py\n+++ b/src/plone/volto/setuphandlers.py\n@@ -3,13 +3,13 @@\n from plone import api\n from plone.app.multilingual.browser.setup import SetupMultilingualSite\n from plone.app.multilingual.setuphandlers import enable_translatable_behavior\n+from plone.base.utils import get_installer\n from plone.dexterity.interfaces import IDexterityFTI\n from plone.volto.default_homepage.default import default_home\n from plone.volto.default_homepage.demo import demo_home_page\n from plone.volto.default_homepage.lrf import default_lrf_home\n from Products.CMFCore.utils import getToolByName\n from Products.CMFPlone.interfaces import INonInstallable\n-from Products.CMFPlone.utils import get_installer\n from zope.component import queryUtility\n from zope.interface import implementer\n \ndiff --git a/src/plone/volto/vocabularies/subject.py b/src/plone/volto/vocabularies/subject.py\nindex 543b6afa..84bde6b3 100644\n--- a/src/plone/volto/vocabularies/subject.py\n+++ b/src/plone/volto/vocabularies/subject.py\n@@ -1,6 +1,6 @@\n from BTrees.IIBTree import intersection\n from plone.app.layout.navigation.root import getNavigationRootObject\n-from plone.app.vocabularies.terms import safe_encode\n+from plone.base.utils import safe_bytes\n from plone.registry.interfaces import IRegistry\n from Products.CMFCore.utils import getToolByName\n from zope.component import queryUtility\n@@ -41,7 +41,7 @@ def unsafe_simplevocabulary_from_values(values, query=None):\n [\n UnsafeSimpleSubjectTerm(value, value, value)\n for value in values\n- if query is None or safe_encode(query) in safe_encode(value)\n+ if query is None or safe_bytes(query) in safe_bytes(value)\n ]\n )\n \n@@ -87,11 +87,11 @@ def keywords_of_section(self, section, kwfilter):\n pquery = {\n self.path_index: {"query": "/".join(section.getPhysicalPath()), "depth": -1}\n }\n- kwfilter = safe_encode(kwfilter)\n+ kwfilter = safe_bytes(kwfilter)\n # uses internal zcatalog specific details to quickly get the values.\n path_result, info = path_idx._apply_index(pquery)\n for tag in tags_idx.uniqueValues():\n- if kwfilter and kwfilter not in safe_encode(tag):\n+ if kwfilter and kwfilter not in safe_bytes(tag):\n continue\n tquery = {self.keyword_index: tag}\n tags_result, info = tags_idx._apply_index(tquery)\n' + +Repository: plone.volto + + +Branch: refs/heads/main +Date: 2023-06-30T15:48:26+02:00 +Author: Peter Mathis (petschki) +Commit: https://github.com/plone/plone.volto/commit/9dae2121b0bc80d48a6ae49a165af1b38d3887fa + +changenote + +Files changed: +A news/128.bugfix + +b'diff --git a/news/128.bugfix b/news/128.bugfix\nnew file mode 100644\nindex 00000000..5375b8e2\n--- /dev/null\n+++ b/news/128.bugfix\n@@ -0,0 +1,2 @@\n+Fix deprecated imports.\n+[petschki]\n' + +Repository: plone.volto + + +Branch: refs/heads/main +Date: 2024-12-11T14:27:14-08:00 +Author: David Glick (davisagli) +Commit: https://github.com/plone/plone.volto/commit/cb852d80844b9b259e5084d2f0163e63108f2a07 + +Merge remote-tracking branch 'origin/main' into petschki-cleanup-deprecations + +Files changed: +A .editorconfig +A .github/workflows/meta.yml +A .meta.toml +A .pre-commit-config.yaml +A CHANGES.md +A CONTRIBUTORS.md +A README.md +A constraints.txt +A dependabot.yml +A instance.yaml +A mx.ini +A news/.changelog_template.jinja +A news/164.breaking +A news/164.bugfix +A news/167.internal +A news/168.bugfix +A src/plone/volto/bbb.py +A src/plone/volto/behaviors/kicker.py +A src/plone/volto/distributions.zcml +A src/plone/volto/distributions/volto/content/content/__metadata__.json +A src/plone/volto/distributions/volto/content/content/plone_site_root/data.json +A src/plone/volto/distributions/volto/content/discussions.json +A src/plone/volto/distributions/volto/content/principals.json +A src/plone/volto/distributions/volto/content/redirects.json +A src/plone/volto/distributions/volto/content/relations.json +A src/plone/volto/distributions/volto/content/translations.json +A src/plone/volto/distributions/volto/image.png +A src/plone/volto/distributions/volto/profiles.json +A src/plone/volto/distributions/volto/schema.json +A src/plone/volto/indexers/__init__.py +A src/plone/volto/indexers/configure.zcml +A src/plone/volto/indexers/indexers.py +A src/plone/volto/locales/__init__.py +A src/plone/volto/locales/pt_BR/LC_MESSAGES/plone.volto.po +A src/plone/volto/locales/update.py +A src/plone/volto/profiles/default/types/Plone_Site.xml +A tests/conftest.py +A tests/coresandbox/conftest.py +A tests/coresandbox/test_coresandbox.py +A tests/distribution/test_creation.py +A tests/distribution/test_distribution.py +A tests/distribution/test_registration.py +A tests/features/test_indexers.py +A tests/features/test_linkintegrity.py +A tests/features/test_preview_link_behavior.py +A tests/features/test_scripts.py +A tests/features/test_summary_serialization.py +A tests/features/test_transforms.py +A tests/migration/conftest.py +A tests/migration/test_migrate_to_volto.py +A tests/setup/test_setup_install.py +A tests/setup/test_setup_uninstall.py +A tests/setup/test_upgrades.py +A tox.ini +M .flake8 +M .gitignore +M MANIFEST.in +M Makefile +M pyproject.toml +M requirements.txt +M setup.py +M src/plone/__init__.py +M src/plone/volto/__init__.py +M src/plone/volto/behaviors/configure.zcml +M src/plone/volto/behaviors/navtitle.py +M src/plone/volto/behaviors/preview.py +M src/plone/volto/behaviors/preview_link.py +M src/plone/volto/blocksuuidfixer.py +M src/plone/volto/browser/breadcrumbs.py +M src/plone/volto/browser/configure.zcml +M src/plone/volto/browser/migrate_richtext.pt +M src/plone/volto/browser/migrate_richtext.py +M src/plone/volto/browser/migrate_to_volto.pt +M src/plone/volto/browser/migrate_to_volto.py +M src/plone/volto/browser/navigation.py +M src/plone/volto/browser/voltobackendwarning.pt +M src/plone/volto/configure.zcml +M src/plone/volto/content.py +M src/plone/volto/controlpanel.py +M src/plone/volto/coresandbox/example.py +M src/plone/volto/dependencies.zcml +M src/plone/volto/interfaces.py +M src/plone/volto/locales/de/LC_MESSAGES/plone.volto.po +M src/plone/volto/locales/en/LC_MESSAGES/plone.volto.po +M src/plone/volto/locales/es/LC_MESSAGES/plone.volto.po +M src/plone/volto/locales/eu/LC_MESSAGES/plone.volto.po +M src/plone/volto/locales/it/LC_MESSAGES/plone.volto.po +M src/plone/volto/locales/plone.volto.pot +M src/plone/volto/overrides.zcml +M src/plone/volto/patches.py +M src/plone/volto/patches.zcml +M src/plone/volto/profiles.zcml +M src/plone/volto/profiles/coresandbox/diff_tool.xml +M src/plone/volto/profiles/coresandbox/metadata.xml +M src/plone/volto/profiles/coresandbox/repositorytool.xml +M src/plone/volto/profiles/coresandbox/types.xml +M src/plone/volto/profiles/coresandbox/types/example.xml +M src/plone/volto/profiles/default/actions.xml +M src/plone/volto/profiles/default/browserlayer.xml +M src/plone/volto/profiles/default/catalog.xml +M src/plone/volto/profiles/default/controlpanel.xml +M src/plone/volto/profiles/default/metadata.xml +M src/plone/volto/profiles/default/registry.xml +M src/plone/volto/profiles/default/types/Collection.xml +M src/plone/volto/profiles/default/types/Document.xml +M src/plone/volto/profiles/default/types/Event.xml +M src/plone/volto/profiles/default/types/Folder.xml +M src/plone/volto/profiles/default/types/LRF.xml +M src/plone/volto/profiles/default/types/News_Item.xml +M src/plone/volto/profiles/multilingual/metadata.xml +M src/plone/volto/profiles/multilingual/registry.xml +M src/plone/volto/profiles/uninstall/browserlayer.xml +M src/plone/volto/scripts/add_image_field_metadata.py +M src/plone/volto/scripts/auditblocks.py +M src/plone/volto/scripts/clear-rebuild-catalog.py +M src/plone/volto/scripts/migrate_richtext.py +M src/plone/volto/scripts/utils.py +M src/plone/volto/setuphandlers.py +M src/plone/volto/testing.py +M src/plone/volto/transforms.py +M src/plone/volto/upgrades.py +M src/plone/volto/upgrades.zcml +M src/plone/volto/vocabularies/subject.py +D .github/workflows/code-analysis.yml +D .github/workflows/tests.yml +D CHANGES.rst +D CONTRIBUTORS.rst +D README.rst +D base.cfg +D buildout.cfg +D plone-5.2.x.cfg +D plone-6.0.x.cfg +D requirements/dev.txt +D requirements/plone-5.2.txt +D requirements/plone-6.0.txt +D requirements/prod.txt +D scripts/update_translations.sh +D setup.cfg +D src/plone/volto/behaviors/headtitle.py +D src/plone/volto/default_homepage/__init__.py +D src/plone/volto/default_homepage/default.py +D src/plone/volto/default_homepage/demo.py +D src/plone/volto/default_homepage/lrf.py +D src/plone/volto/indexers.py +D src/plone/volto/locales/update.sh +D src/plone/volto/profiles/demo/metadata.xml +D src/plone/volto/profiles/demo/rolemap.xml +D src/plone/volto/profiles/homepage/metadata.xml +D src/plone/volto/profiles/richtext/metadata.xml +D src/plone/volto/profiles/richtext/types.xml +D src/plone/volto/profiles/richtext/types/Document.xml +D src/plone/volto/scaling.py +D src/plone/volto/tests/__init__.py +D src/plone/volto/tests/test_coresandbox.py +D src/plone/volto/tests/test_linkintegrity.py +D src/plone/volto/tests/test_migrate_to_volto.py +D src/plone/volto/tests/test_preview_link_behavior.py +D src/plone/volto/tests/test_scripts.py +D src/plone/volto/tests/test_setup.py +D src/plone/volto/tests/test_summary_serialization.py +D src/plone/volto/tests/test_transforms.py +D src/plone/volto/tests/test_upgrades.py +D versions.cfg + +b'diff --git a/.editorconfig b/.editorconfig\nnew file mode 100644\nindex 00000000..5b3c112c\n--- /dev/null\n+++ b/.editorconfig\n@@ -0,0 +1,56 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/main/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+#\n+# EditorConfig Configuration file, for more details see:\n+# http://EditorConfig.org\n+# EditorConfig is a convention description, that could be interpreted\n+# by multiple editors to enforce common coding conventions for specific\n+# file types\n+\n+# top-most EditorConfig file:\n+# Will ignore other EditorConfig files in Home directory or upper tree level.\n+root = true\n+\n+\n+[*]\n+# Default settings for all files.\n+# Unix-style newlines with a newline ending every file\n+end_of_line = lf\n+insert_final_newline = true\n+trim_trailing_whitespace = true\n+# Set default charset\n+charset = utf-8\n+# Indent style default\n+indent_style = space\n+# Max Line Length - a hard line wrap, should be disabled\n+max_line_length = off\n+\n+[*.{py,cfg,ini}]\n+# 4 space indentation\n+indent_size = 4\n+\n+[*.{yml,zpt,pt,dtml,zcml,html,xml}]\n+# 2 space indentation\n+indent_size = 2\n+\n+[*.{json,jsonl,js,jsx,ts,tsx,css,less,scss}]\n+# Frontend development\n+# 2 space indentation\n+indent_size = 2\n+max_line_length = 80\n+\n+[{Makefile,.gitmodules}]\n+# Tab indentation (no size specified, but view as 4 spaces)\n+indent_style = tab\n+indent_size = unset\n+tab_width = unset\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [editorconfig]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.flake8 b/.flake8\nindex 9ec27e56..38918f42 100644\n--- a/.flake8\n+++ b/.flake8\n@@ -1,7 +1,22 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/main/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n [flake8]\n-# Recommend matching the black line length (default 88),\n-# rather than using the flake8 default of 79:\n-max-line-length = 100000\n-extend-ignore =\n- # See https://github.com/PyCQA/pycodestyle/issues/373\n+doctests = 1\n+ignore =\n+ # black takes care of line length\n+ E501,\n+ # black takes care of where to break lines\n+ W503,\n+ # black takes care of spaces within slicing (list[:])\n E203,\n+ # black takes care of spaces after commas\n+ E231,\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [flake8]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.github/workflows/code-analysis.yml b/.github/workflows/code-analysis.yml\ndeleted file mode 100644\nindex f121eaa5..00000000\n--- a/.github/workflows/code-analysis.yml\n+++ /dev/null\n@@ -1,80 +0,0 @@\n-name: Code Analysis\n-on:\n- push:\n-\n-jobs:\n- black:\n- name: Black\n- runs-on: ubuntu-latest\n-\n- steps:\n- - name: Checkout codebase\n- uses: actions/checkout@v2\n-\n- - name: Run check\n- uses: plone/code-analysis-action@v1\n- with:\n- check: \'black\'\n- path: |\n- src\n- setup.py\n-\n- flake8:\n- name: flake8\n- runs-on: ubuntu-latest\n-\n- steps:\n- - name: Checkout codebase\n- uses: actions/checkout@v2\n-\n- - name: Run check\n- uses: plone/code-analysis-action@v1\n- with:\n- check: \'flake8\'\n- path: |\n- src\n- setup.py\n-\n- isort:\n- runs-on: ubuntu-latest\n- steps:\n- - name: Checkout codebase\n- uses: actions/checkout@v2\n-\n- - name: Run check\n- uses: plone/code-analysis-action@v1\n- with:\n- check: \'isort\'\n- path: |\n- src\n- setup.py\n-\n- pyroma:\n- name: pyroma\n- runs-on: ubuntu-latest\n-\n- steps:\n- - name: Checkout codebase\n- uses: actions/checkout@v2\n-\n- - name: Run check\n- uses: plone/code-analysis-action@v1\n- with:\n- check: \'pyroma\'\n- path: |\n- ./\n-\n- zpretty:\n- name: zpretty\n- runs-on: ubuntu-latest\n-\n- steps:\n- - name: Checkout codebase\n- uses: actions/checkout@v2\n-\n- - name: Run check\n- uses: plone/code-analysis-action@v1\n- with:\n- check: \'zpretty\'\n- path: |\n- src\ndiff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml\nnew file mode 100644\nindex 00000000..c9848bcb\n--- /dev/null\n+++ b/.github/workflows/meta.yml\n@@ -0,0 +1,75 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/main/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+name: Meta\n+on:\n+ push:\n+ branches:\n+ - master\n+ - main\n+ pull_request:\n+ branches:\n+ - master\n+ - main\n+ workflow_dispatch:\n+\n+##\n+# To set environment variables for all jobs, add in .meta.toml:\n+# [github]\n+# env = """\n+# debug: 1\n+# image-name: \'org/image\'\n+# image-tag: \'latest\'\n+# """\n+##\n+\n+jobs:\n+ qa:\n+ uses: plone/meta/.github/workflows/qa.yml@main\n+ test:\n+ uses: plone/meta/.github/workflows/test.yml@main\n+ coverage:\n+ uses: plone/meta/.github/workflows/coverage.yml@main\n+ dependencies:\n+ uses: plone/meta/.github/workflows/dependencies.yml@main\n+ release_ready:\n+ uses: plone/meta/.github/workflows/release_ready.yml@main\n+ circular:\n+ uses: plone/meta/.github/workflows/circular.yml@main\n+\n+##\n+# To modify the list of default jobs being created add in .meta.toml:\n+# [github]\n+# jobs = [\n+# "qa",\n+# "test",\n+# "coverage",\n+# "dependencies",\n+# "release_ready",\n+# "circular",\n+# ]\n+##\n+\n+##\n+# To request that some OS level dependencies get installed\n+# when running tests/coverage jobs, add in .meta.toml:\n+# [github]\n+# os_dependencies = "git libxml2 libxslt"\n+##\n+\n+##\n+# To test against a specific matrix of python versions\n+# when running tests jobs, add in .meta.toml:\n+# [github]\n+# py_versions = "[\'3.12\', \'3.11\']"\n+##\n+\n+\n+##\n+# Specify additional jobs in .meta.toml:\n+# [github]\n+# extra_lines = """\n+# another:\n+# uses: org/repo/.github/workflows/file.yml@main\n+# """\n+##\ndiff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml\ndeleted file mode 100644\nindex d8dc1094..00000000\n--- a/.github/workflows/tests.yml\n+++ /dev/null\n@@ -1,40 +0,0 @@\n-name: Tests\n-on: [push]\n-jobs:\n- build:\n- runs-on: ubuntu-latest\n- strategy:\n- fail-fast: false\n- matrix:\n- python: [3.7, 3.8, 3.9, "3.10", "3.11"]\n- plone: ["6.0.0", "5.2.10"]\n- exclude:\n- - plone: "6.0.0"\n- python: 3.7\n- - plone: "5.2.10"\n- python: 3.9\n- - plone: "5.2.10"\n- python: "3.10"\n- - plone: "5.2.10"\n- python: "3.11"\n-\n- steps:\n- # git checkout\n- - uses: actions/checkout@v2\n-\n- - name: Setup Plone ${{ matrix.plone }} with Python ${{ matrix.python }}\n- id: setup\n- uses: plone/setup-plone@v1.0.0\n- with:\n- python-version: ${{ matrix.python }}\n- plone-version: ${{ matrix.plone }}\n-\n- # Install plone.volto with test extras\n- - name: Install plone.volto\n- run: |\n- pip install ".[test]"\n-\n- # test\n- - name: test\n- run: |\n- zope-testrunner --auto-color --auto-progress --test-path src\ndiff --git a/.gitignore b/.gitignore\nindex 1292b600..791aeb0a 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -1,40 +1,57 @@\n-.coverage\n-.vscode\n+# Generated from:\n+# https://github.com/plone/meta/tree/main/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+# python related\n *.egg-info\n-*.log\n+*.pyc\n+*.pyo\n+\n+# translation related\n *.mo\n-*.py?\n-*.swp\n-.Python\n-# dirs\n+\n+# tools related\n+build/\n+.coverage\n+.*project\n+coverage.xml\n+dist/\n+docs/_build\n+__pycache__/\n+.tox\n+.vscode/\n+node_modules/\n+\n+# venv / buildout related\n bin/\n-buildout-cache/\n develop-eggs/\n eggs/\n+.eggs/\n etc/\n-htmlcov/\n+.installed.cfg\n include/\n lib/\n-local/\n-parts/\n-test.plone_addon/\n-var/\n-node_modules\n-# files\n-.installed.cfg\n-.mr.developer.cfg\n lib64\n-log.html\n-output.xml\n-pip-selfcheck.json\n-report.html\n-# excludes\n-!.coveragerc\n-!.editorconfig\n-!.gitattributes\n-!.gitignore\n-!.gitkeep\n-!.travis.yml\n+.mr.developer.cfg\n+parts/\n pyvenv.cfg\n-extras\n-inituser\n+var/\n+local.cfg\n+\n+# mxdev\n+/instance/\n+/.make-sentinels/\n+/*-mxdev.txt\n+/reports/\n+/sources/\n+/venv/\n+.installed.txt\n+\n+.venv\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [gitignore]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/.meta.toml b/.meta.toml\nnew file mode 100644\nindex 00000000..dce91ce8\n--- /dev/null\n+++ b/.meta.toml\n@@ -0,0 +1,26 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/main/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[meta]\n+template = "default"\n+commit-id = "721299ce"\n+\n+[gitignore]\n+extra_lines = """\n+.venv\n+"""\n+\n+[pyproject]\n+codespell_skip = "*.min.js,*lock.yaml"\n+codespell_ignores = "vew"\n+dependencies_ignores = "[\'collective.folderishtypes\', \'plone.app.caching\', \'plone.app.multilingual\', \'requests\', \'responses\', \'zest.releaser\', \'zestreleaser.towncrier\']"\n+dependencies_mappings = [\n+ "\'Products.CMFPlone\' = [\'Acquisition\', \'BTrees\', \'Missing\', \'OFS\', \'plone.app.contenttypes\', \'plone.app.layout\', \'plone.app.linkintegrity\', \'plone.app.redirector\', \'plone.app.registry\', \'plone.app.textfield\', \'plone.app.vocabularies\', \'plone.app.z3cform\', \'plone.autoform\', \'plone.base\', \'plone.behavior\', \'plone.dexterity\', \'plone.indexer\', \'plone.namedfile\', \'plone.protect\', \'plone.registry\', \'plone.rfc822\', \'plone.schema\', \'plone.supermodel\', \'Products.BTreeFolder2\', \'Products.CMFCore\', \'Products.Five\', \'Products.GenericSetup\', \'Products.SiteErrorLog\', \'transaction\', \'z3c.form\', \'z3c.relationfield\', \'zope.component\', \'zope.i18n\', \'zope.i18nmessageid\', \'zope.interface\', \'zope.lifecycleevent\', \'zope.publisher\', \'zope.schema\', \'Zope\']",\n+ "\'plone.restapi\' = [\'plone.rest\']",\n+]\n+\n+[tox]\n+test_runner = "pytest"\n+test_path = "/tests"\n+use_mxdev = true\n+test_deps_additional = ""\ndiff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml\nnew file mode 100644\nindex 00000000..d60054bd\n--- /dev/null\n+++ b/.pre-commit-config.yaml\n@@ -0,0 +1,94 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/main/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+ci:\n+ autofix_prs: false\n+ autoupdate_schedule: monthly\n+\n+repos:\n+- repo: https://github.com/asottile/pyupgrade\n+ rev: v3.15.2\n+ hooks:\n+ - id: pyupgrade\n+ args: [--py38-plus]\n+- repo: https://github.com/pycqa/isort\n+ rev: 5.13.2\n+ hooks:\n+ - id: isort\n+- repo: https://github.com/psf/black\n+ rev: 24.4.2\n+ hooks:\n+ - id: black\n+- repo: https://github.com/collective/zpretty\n+ rev: 3.1.0\n+ hooks:\n+ - id: zpretty\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# zpretty_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/PyCQA/flake8\n+ rev: 7.0.0\n+ hooks:\n+ - id: flake8\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# flake8_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/codespell-project/codespell\n+ rev: v2.2.6\n+ hooks:\n+ - id: codespell\n+ additional_dependencies:\n+ - tomli\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# codespell_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+- repo: https://github.com/mgedmin/check-manifest\n+ rev: "0.49"\n+ hooks:\n+ - id: check-manifest\n+- repo: https://github.com/regebro/pyroma\n+ rev: "4.2"\n+ hooks:\n+ - id: pyroma\n+- repo: https://github.com/mgedmin/check-python-versions\n+ rev: "0.22.0"\n+ hooks:\n+ - id: check-python-versions\n+ args: [\'--only\', \'setup.py,pyproject.toml\']\n+- repo: https://github.com/collective/i18ndude\n+ rev: "6.2.0"\n+ hooks:\n+ - id: i18ndude\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# i18ndude_extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pre_commit]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/CHANGES.rst b/CHANGES.md\nsimilarity index 52%\nrename from CHANGES.rst\nrename to CHANGES.md\nindex 5c0fb46d..852a19ee 100644\n--- a/CHANGES.rst\n+++ b/CHANGES.md\n@@ -1,75 +1,205 @@\n-Changelog\n-=========\n+# Changelog\n \n-.. You should *NOT* be adding new change log entries to this file.\n+\n \n-.. towncrier release notes start\n+\n \n-4.0.9 (2023-06-22)\n-------------------\n+## 5.0.0b2 (2024-11-25)\n+\n+\n+### Bug fixes:\n+\n+- Rename `default` distribution to `volto`. @davisagli #161\n+\n+## 5.0.0b1 (2024-10-30)\n+\n+\n+### Breaking changes:\n+\n+- Drop support for Plone 5.2 and Plone 6.0 [@ericof] #155\n+- The following GenericSetup profiles were removed: `default-homepage`,\n+ `default-homepage-drafjs`, `default-homepage-slate`, `demo` and `richtext`. @davisagli #155\n+\n+\n+### New features:\n+\n+- This package now contains a Plone distribution named "default". @ericof #155\n+\n+\n+### Internal:\n+\n+- setup.py: specify the encoding, otherwise it fails on Windows.\n+ [maurits] \n+\n+## 4.4.3 (2024-08-01)\n \n Bug fixes:\n \n \n+- Fix getting the the variation when migrating collections to listing blocks. @pbauer (#158)\n+\n+\n+## 4.4.2 (2024-06-26)\n+\n+### Bug fixes:\n+\n+\n+- Remove runtime dependency on plone.app.upgrade. [@davisagli] (#142)\n+- Do not fail on startup when the ``requests`` library is missing.\n+ Conditionally load the views to migrate to Volto: only when the ``requests`` library is available.\n+ We don\'t want to make this a hard dependency.\n+ If you need the migration views, you should include the ``requests`` package yourself.\n+ [@maurits] (#152)\n+\n+\n+## 4.4.1 (2024-05-16)\n+\n+### Bug fixes:\n+\n+\n+- Do not set the nonfolderish_tabs registry to False. @wesleybl (#145)\n+- Fix for preview_image_link image_scales adapter when the field is empty.\n+ Swap condition for `image_field` indexer, `preview_image_link` first, then the default `preview_image`\n+ [@sneridagh] (#148)\n+\n+\n+## 4.4.0 (2024-04-25)\n+\n+### New features:\n+\n+\n+- Import ILanguageSchema from plone.i18n.interfaces instead of Products.CMFPlone.interfaces.controlpanel. @ksuess\n+ profile "plone.volto:multilingual": Add language german. @ksuess (#144)\n+\n+\n+### Bug fixes:\n+\n+\n+- Avoid a deprecated import warnings in Plone 6. @davisagli (#147)\n+\n+\n+## 4.3.0 (2024-01-30)\n+\n+### New features:\n+\n+\n+- Add `VOLTO_FRONTEND_DOMAIN` as env var for `volto.frontend_domain` registry setting\n+ [@sneridagh] (#139)\n+\n+\n+## 4.2.1 (2024-01-26)\n+\n+### Bug fixes:\n+\n+\n+- Fix changed behavior and marker interfaces for plone.leadimage and plone.richtext.\n+ See: https://github.com/plone/plone.app.contenttypes/pull/480\n+ @thet (#133)\n+- Avoid accidental acquisition in ``block_types`` indexer. @davisagli (#137)\n+\n+\n+## 4.2.0 (2023-12-13)\n+\n+### New features:\n+\n+\n+- Add pt_BR translations. @wesleybl (#133)\n+- Add `preview_image_link` behavior to the Example content type for testing @sneridagh (#136)\n+\n+\n+### Bug fixes:\n+\n+\n+- Add guard for template used in the Volto installed status message that is Plone 6 only @sneridagh (#135)\n+\n+\n+## 4.1.0 (2023-08-07)\n+\n+### New features:\n+\n+\n+- Add `block_types` index to zcatalog. By default it is only added for new Plone sites.\n+ To add it to an existing site, run `plone.volto.upgrades.add_block_types_index` manually.\n+ [margaridasp, davisagli] (#4778)\n+\n+\n+### Bug fixes:\n+\n+\n+- Change the implementation for finding nested blocks to use an IBlockVisitor adapter. @davisagli (#127)\n+- Fix missing translations for head_title field. @davisagli (#130)\n+\n+\n+## 4.0.10 (2023-07-14)\n+\n+### Bug fixes:\n+\n+\n+- Use the plone.app.multilingual conditionally so as is not an explicit dependency\n+ [@foxtrot-01] (#119)\n+\n+\n+## 4.0.9 (2023-06-22)\n+\n+### Bug fixes:\n+\n+\n - Let the migration-form @@migrate_to_volto transform richtext to slate-blocks by default.\n- [pbauer] (#122)\n+ [@pbauer] (#122)\n - Fix value of unchecked checkboxes in migrate_to_volto.\n- [pbauer] (#124)\n+ [@pbauer] (#124)\n \n \n-4.0.8 (2023-03-23)\n-------------------\n+## 4.0.8 (2023-03-23)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Use correct service_url when calling make_document. Fix #95\n- [pbauer] (#95)\n+ [@pbauer] (#95)\n - Change home page more demo link. Fix #114 (#114)\n \n \n-4.0.7 (2023-03-02)\n-------------------\n+## 4.0.7 (2023-03-02)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Better migration of collections: Fix migrating sort_order. Adapt relative path of query when migrating default-page collection to listing block.\n- [pbauer] (#111)\n+ [@pbauer] (#111)\n \n \n-4.0.6 (2023-02-27)\n-------------------\n+## 4.0.6 (2023-02-27)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Prevent AttributeError when migrating to FolderishDocument.\n- [pbauer] (#109)\n+ [@pbauer] (#109)\n \n \n-4.0.5 (2023-01-19)\n-------------------\n+## 4.0.5 (2023-01-19)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n-- Include internal links from nested blocks in link integrity recordkeeping. [davisagli] (#108)\n+- Include internal links from nested blocks in link integrity recordkeeping. [@davisagli] (#108)\n \n \n-Internal:\n+### Internal:\n \n \n-- Update default Plone Classic UI message to inform developers to install, start, and visit the Volto frontend, if desired, with updated links to relevant docs. [stevepiercy] (#107)\n+- Update default Plone Classic UI message to inform developers to install, start, and visit the Volto frontend, if desired, with updated links to relevant docs. [@stevepiercy] (#107)\n \n \n-4.0.4 (2022-12-16)\n-------------------\n+## 4.0.4 (2022-12-16)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Clarifications in the @@migrate_to_volto wizard. Volto is a separate service that needs to be configured and hosted. It is not included in the Plone backend.\n@@ -78,490 +208,447 @@ Bug fixes:\n [fredvd, stevepiercy] (#106)\n \n \n-4.0.3 (2022-12-14)\n-------------------\n+## 4.0.3 (2022-12-14)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Fix a11y problems in both demo and default pages @sneridagh (#105)\n \n \n-4.0.2 (2022-12-12)\n-------------------\n+## 4.0.2 (2022-12-12)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Fix create default homepage script problem with non existent description field. Fix default and demo page texts\n- [sneridagh] (#103)\n+ [@sneridagh] (#103)\n \n \n-4.0.1 (2022-12-12)\n-------------------\n+## 4.0.1 (2022-12-12)\n \n-Internal:\n+### Internal:\n \n \n-- Prepare 6 final default text for demo and local installs. [stevepiercy] (#102)\n+- Prepare 6 final default text for demo and local installs. [@stevepiercy] (#102)\n \n \n-4.0.0 (2022-11-18)\n-------------------\n+## 4.0.0 (2022-11-18)\n \n-Internal:\n+### Internal:\n \n \n-- Re-release plone.volto 4.0.0a15 as 4.0.0 [tisto] (#99)\n+- Re-release plone.volto 4.0.0a15 as 4.0.0 [@tisto] (#99)\n \n \n-4.0.0a15 (2022-11-16)\n----------------------\n+## 4.0.0a15 (2022-11-16)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n-- Fix adding a leadimage block during migration to Volto when a leadimage exists. [pbauer] (#96)\n-- Make the `migrate_to_volto` process more robust when running multiple times or when plone.volto was installed first. [pbauer] (#97)\n-- Don\'t acquire nav_title from parent in breadcrumbs view. [davisagli] (#98)\n+- Fix adding a leadimage block during migration to Volto when a leadimage exists. [@pbauer] (#96)\n+- Make the `migrate_to_volto` process more robust when running multiple times or when plone.volto was installed first. [@pbauer] (#97)\n+- Don\'t acquire nav_title from parent in breadcrumbs view. [@davisagli] (#98)\n \n \n-4.0.0a14 (2022-11-02)\n----------------------\n+## 4.0.0a14 (2022-11-02)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n-- Improve help text for head_title field. [davisagli] (#92)\n+- Improve help text for head_title field. [@davisagli] (#92)\n - Adjust Plone site actions to work in Volto. [nileshgulia1, davisagli] (#93)\n-- Show a warning in the classic UI when plone.volto is installed. Fix https://github.com/plone/Products.CMFPlone/issues/3664 [pbauer] (#94)\n+- Show a warning in the classic UI when plone.volto is installed. Fix https://github.com/plone/Products.CMFPlone/issues/3664 [@pbauer] (#94)\n \n \n-4.0.0a13 (2022-09-29)\n----------------------\n+## 4.0.0a13 (2022-09-29)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n-- Keep folder order when migrating from folderishtypes [cekk] (#86)\n-- Fix hasPreviewImage and image_field indexers when the preview_image_link relation is broken. [davisagli] (#91)\n+- Keep folder order when migrating from folderishtypes [@cekk] (#86)\n+- Fix hasPreviewImage and image_field indexers when the preview_image_link relation is broken. [@davisagli] (#91)\n \n \n-4.0.0a12 (2022-09-27)\n----------------------\n+## 4.0.0a12 (2022-09-27)\n \n-New features:\n+### New features:\n \n \n - Add proper icon in classic control panel\n- [sneridagh] (#89)\n+ [@sneridagh] (#89)\n \n \n-4.0.0a11 (2022-09-04)\n----------------------\n+## 4.0.0a11 (2022-09-04)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Update demo homepage content for Slate, round 2. @stevepiercy (#85)\n \n \n-Internal:\n+### Internal:\n \n \n - Sign CONTRIBUTORS.rst. @stevepiercy (#88)\n \n \n-4.0.0a10 (2022-08-30)\n----------------------\n+## 4.0.0a10 (2022-08-30)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Update default homepage content for Slate. @stevepiercy (#84)\n \n \n-Internal:\n+### Internal:\n \n \n-- Added `make i18n` command [davisagli] (#81)\n+- Added `make i18n` command [@davisagli] (#81)\n \n \n-4.0.0a9 (2022-08-12)\n---------------------\n+## 4.0.0a9 (2022-08-12)\n \n-New features:\n+### New features:\n \n \n - Added preview image link behavior (Plone 6+ only)\n- [robgietema] (#49)\n+ [@robgietema] (#49)\n \n \n-4.0.0a8 (2022-08-04)\n---------------------\n+## 4.0.0a8 (2022-08-04)\n \n-New features:\n+### New features:\n \n \n - Add better implementation of the PLONE6 check (cosmetic)\n- [sneridagh] (#59)\n+ [@sneridagh] (#59)\n - Use slate as default text block in default contents for ``default-homepage`` and\n ``multilingual`` profile.\n- [sneridagh] (#77)\n- \n+ [@sneridagh] (#77)\n+\n \n-4.0.0a7 (2022-07-22)\n---------------------\n+## 4.0.0a7 (2022-07-22)\n \n-New features:\n+### New features:\n \n \n - Use new metadata utility for adding the ``image_scales`` to the default serialization.\n- [ericof] (#74)\n+ [@ericof] (#74)\n \n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Use plone/code-analysis-action on GitHub Actions and plone/code-quality Docker image and versions to format code.\n- [ericof] (#68)\n+ [@ericof] (#68)\n - Fix the handler for resolving UIDs in nested blocks to avoid trying to resolve them twice. This also makes it possible to use deserialization and serialization transforms that intentionally run before the resolveuid transform in the context of nested blocks.\n- [davisagli] (#76)\n+ [@davisagli] (#76)\n \n \n-4.0.0a6 (2022-06-25)\n---------------------\n+## 4.0.0a6 (2022-06-25)\n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Re-release 4.0.0a5/4.0.0a5.dev0\n- [tisto] (#72)\n+ [@tisto] (#72)\n \n \n-4.0.0a5 (2022-06-25)\n---------------------\n+## 4.0.0a5 (2022-06-25)\n \n-New features:\n+### New features:\n \n \n - Add form ``@@migrate_richtext`` to migrate ``html-richtext`` to slate blocks or draftjs blocks\n- [pbauer] (#47)\n+ [@pbauer] (#47)\n - Add ``@@migrate_to_volto`` to prepare existing sites for Volto.\n- [pbauer] (#55)\n+ [@pbauer] (#55)\n \n \n-Bug fixes:\n+### Bug fixes:\n \n \n - Update test to 6.0.0a4 and new pip practices.\n- [sneridagh] (#51)\n+ [@sneridagh] (#51)\n - Conditional custom ``IImageScaleFactory`` adapter for Plone < 6 (svg are now handled in `plone.namedfile `_).\n- [cekk] (#60)\n+ [@cekk] (#60)\n - Fixed code quality configuration.\n Removed unused imports and variables and sorted the imports.\n- [maurits] (#71)\n+ [@maurits] (#71)\n \n \n-4.0.0a4 (2022-04-08)\n---------------------\n+## 4.0.0a4 (2022-04-08)\n \n - Fix deprecated import of isDefaultPage\n- [pbauer]\n+ [@pbauer]\n \n \n-4.0.0a3 (2022-02-04)\n---------------------\n+## 4.0.0a3 (2022-02-04)\n \n - Fix Multilingual profile, revert to use draftJS (until slate is integrated into Volto)\n- [sneridagh]\n+ [@sneridagh]\n \n \n-4.0.0a2 (2022-01-25)\n---------------------\n+## 4.0.0a2 (2022-01-25)\n \n - Bring back the draftJS as default, until Slate is integrated in full in Volto\n- [sneridagh]\n+ [@sneridagh]\n \n \n-4.0.0a1 (2022-01-25)\n---------------------\n+## 4.0.0a1 (2022-01-25)\n \n-Breaking:\n+### Breaking\n \n - Use Slate blocks for the default pages\n- [sneridagh]\n+ [@sneridagh]\n \n - Add ``volto.blocks`` behavior to Plone Site GS types info.\n- [sneridagh]\n+ [@sneridagh]\n \n - Remove ``Collection`` from types in GS types info.\n- [sneridagh]\n+ [@sneridagh]\n \n - Remove ``plone.richtext`` behavior from Plone Site, Document, News Item, Events\n- [sneridagh]\n+ [@sneridagh]\n \n - Add blocks behavior on Event and NewsItem\n- [nzambello]\n+ [@nzambello]\n \n - Add preview_image to Event\n- [nzambello]\n+ [@nzambello]\n \n-Internal:\n+### Internal:\n \n - Code cleanup, remove some outdated and unused helpers in ``setuptools.py``\n- [sneridagh]\n+ [@sneridagh]\n \n - Workaround a test fixture isolation issue with the `IVoltoSettings.frontend_domain`\n setting.\n- [rpatterson]\n+ [@rpatterson]\n \n \n-3.1.0a9 (2022-01-15)\n---------------------\n+## 3.1.0a9 (2022-01-15)\n \n-Breaking:\n+### Breaking\n \n - Remove c.folderishtypes dependency\n \n-New Feature:\n+### New Feature\n \n - Add new field in the coresandbox: not constrained by vocabulary field but the vocabulary defined in the widget.\n- [sneridagh]\n+ [@sneridagh]\n \n \n-3.1.0a8 (2022-01-12)\n---------------------\n+## 3.1.0a8 (2022-01-12)\n \n - Computed copyright dates for content demo pages\n- [sneridagh]\n+ [@sneridagh]\n \n-3.1.0a7 (2021-12-11)\n---------------------\n+## 3.1.0a7 (2021-12-11)\n \n-New Feature:\n+### New Feature\n \n - Added coresandbox fixture for Volto\'s cypress tests\n- [sneridagh]\n+ [@sneridagh]\n \n-Internal:\n+### Internal:\n \n - Test with Plone 6.0.0a2\n- [ericof]\n+ [@ericof]\n \n \n-3.1.0a6 (2021-11-22)\n---------------------\n+## 3.1.0a6 (2021-11-22)\n \n-New Feature:\n+### New Feature\n \n - Add Basque and Spanish translations\n- [erral]\n+ [@erral]\n \n - Add Italian translations\n- [cekk]\n+ [@cekk]\n \n-Bug fix:\n+### Bugfix\n \n - Update German translations\n- [timo]\n+ [@timo]\n \n - Fix translation files\n [cekk, timo]\n \n \n-3.1.0a5 (2021-11-07)\n---------------------\n+## 3.1.0a5 (2021-11-07)\n \n-New Feature:\n+### New Feature\n \n - Use new metadata utility for adding the ``image_field`` to the default serialization. This feature requires the JSONSummarySerializerMetadata serializer that has been added with plone.restapi 8.13.0.\n- [ericof]\n+ [@ericof]\n \n-Internal:\n+### Internal:\n \n - Use plone/setup-plone github action.\n- [ericof]\n+ [@ericof]\n \n \n-3.1.0a4 (2021-10-29)\n---------------------\n+## 3.1.0a4 (2021-10-29)\n \n-Internal:\n+### Internal:\n \n - Initial support and tests using Github Actions for Plone with pip installations.\n- [ericof]\n+ [@ericof]\n \n-3.1.0a3 (2021-10-25)\n---------------------\n+## 3.1.0a3 (2021-10-25)\n \n-Breaking:\n+### Breaking\n \n - Explicitly require Python 3.7 or superior.\n- [ericof]\n+ [@ericof]\n \n-Internal:\n+### Internal:\n \n - Remove ``jq`` from dependencies and remove old ``blocksremoveserver.py`` script.\n- [ericof]\n+ [@ericof]\n \n - Remove ``z3c.jbot`` from dependencies\n- [ericof]\n+ [@ericof]\n \n - Remove ``requests`` from dependencies\n- [ericof]\n+ [@ericof]\n \n \n-3.1.0a2 (2021-10-14)\n---------------------\n+## 3.1.0a2 (2021-10-14)\n \n-Bug fix:\n+### Bug fix\n \n - Fixed install on Windows, `issue 14 `_.\n- [maurits]\n+ [@maurits]\n \n \n-3.1.0a1 (2021-10-11)\n---------------------\n+## 3.1.0a1 (2021-10-11)\n \n-Feature:\n+### Feature\n \n - Add new ``image_field`` metadata for image detection in catalog\n- [sneridagh]\n+ [@sneridagh]\n \n-Internal:\n+### Internal:\n \n - Add Plone 6.0.0-pre-alpha configuration.\n- [tisto]\n+ [@tisto]\n \n - Upgrade to Plone 5.2.5\n- [tisto]\n+ [@tisto]\n \n - Change GS setup profile label to "Plone 6 Frontend (plone.volto)".\n- [tisto]\n+ [@tisto]\n \n \n-3.0.0a1 (2021-09-25)\n---------------------\n+## 3.0.0a1 (2021-09-25)\n \n-Breaking Change:\n+### Breaking Change\n \n - Rename kitconcept.volto to plone.volto.\n- [tisto]\n+ [@tisto]\n \n \n-2.5.3 (2021-09-13)\n-------------------\n+## 2.5.3 (2021-09-13)\n \n - Fix condition of the guard for the multilingual fixture in the docker image.\n- [sneridagh]\n+ [@sneridagh]\n \n \n-2.5.2 (2021-09-13)\n-------------------\n+## 2.5.2 (2021-09-13)\n \n - Fix multilingual fixture for docker image, the guard seems not to work there, for some reason the blocks and blocks_layout are not set yet (?)\n- [sneridagh]\n+ [@sneridagh]\n \n-2.5.1 (2021-09-12)\n-------------------\n+## 2.5.1 (2021-09-12)\n \n - "More agnostic and simplify GS profile for Plone Site definition" (https://github.com/kitconcept/kitconcept.volto/pull/38)\n- [sneridagh]\n+ [@sneridagh]\n \n-2.5.0 (2021-09-12)\n-------------------\n+## 2.5.0 (2021-09-12)\n \n - Support pip-based Plone installation by explicitly including dependencies on configure.zcml\n- [ericof]\n+ [@ericof]\n \n - Add Lock-Token to default CORS allow_headers\n- [avoinea]\n+ [@avoinea]\n \n - Add guard for not overwrite blocks in default home pages (if PAM enabled) if they are already set\n- [sneridagh]\n+ [@sneridagh]\n \n-2.4.0 (2021-07-19)\n-------------------\n+## 2.4.0 (2021-07-19)\n \n-- Fix German translation for "Navigation title" ("Navigation titel" -> "Navigationstitel")\n- [timo]\n+- Fix German translation for "Navigation title" [@timo]\n \n - Fix and complete upgrade step from Volto 12 to Volto 13\n- [sneridagh]\n+ [@sneridagh]\n \n - Add helper scripts\n- [sneridagh]\n+ [@sneridagh]\n \n - Add preview_image to transforms\n- [sneridagh]\n+ [@sneridagh]\n \n - Add headtitle behavior\n- [sneridagh]\n+ [@sneridagh]\n \n - Guard for setuphandlers disablecontenttype\n- [sneridagh]\n+ [@sneridagh]\n \n - Fix audit script\n- [sneridagh]\n+ [@sneridagh]\n \n - Add support for subblocks in the custom transforms for ``volto-blocks-grid``\n- [sneridagh]\n+ [@sneridagh]\n \n-2.3.0 (2021-05-19)\n-------------------\n+## 2.3.0 (2021-05-19)\n \n - Add upgrade step facility\n - Add upgrade step from Volto 12 to Volto 13\n- [sneridagh]\n+ [@sneridagh]\n \n \n-2.2.1 (2021-04-21)\n-------------------\n+## 2.2.1 (2021-04-21)\n \n - Better multilingual profile\n- [sneridagh]\n+ [@sneridagh]\n \n \n-2.2.0 (2021-04-21)\n-------------------\n+## 2.2.0 (2021-04-21)\n \n - Add multilingual test fixture for Cypress tests\n- [sneridagh]\n+ [@sneridagh]\n \n \n-2.1.3 (2021-03-26)\n-------------------\n+## 2.1.3 (2021-03-26)\n \n - Add ``requests`` as dependency\n- [sneridagh]\n+ [@sneridagh]\n \n \n-2.1.2 (2021-03-07)\n-------------------\n+## 2.1.2 (2021-03-07)\n \n - Add a demo home page for demo site\n- [sneridagh]\n+ [@sneridagh]\n \n \n-2.1.1 (2021-03-06)\n-------------------\n+## 2.1.1 (2021-03-06)\n \n - Add demo site profile\n- [sneridagh]\n+ [@sneridagh]\n \n \n-2.1.0 (2021-02-23)\n-------------------\n+## 2.1.0 (2021-02-23)\n \n - Remove Images and Files from types_use_view_action_in_listings since in Volto it\'s no used at all.\n- [sneridagh]\n+ [@sneridagh]\n \n \n-2.0.0 (2021-02-20)\n-------------------\n+## 2.0.0 (2021-02-20)\n \n-- [Breaking] Define good known to work well with Volto image scales in ``registry.xml``\n+- [@Breaking] Define good known to work well with Volto image scales in ``registry.xml``\n GenericSetup profile. When this add-on is installed or the profile is applied, it will\n overwrite the existing scales in your Plone site. If you are using specific scales for\n your project, make sure they are installed after this addon\'s profile.\n@@ -571,149 +658,134 @@ Breaking Change:\n [timo, sneridagh]\n \n \n-1.7.2 (2021-01-26)\n-------------------\n+## 1.7.2 (2021-01-26)\n \n - Nothing changed yet.\n \n \n-1.7.1 (2021-01-25)\n-------------------\n+## 1.7.1 (2021-01-25)\n \n - Fix first level tabs and add nav_title to them\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.7.0 (2021-01-21)\n-------------------\n+## 1.7.0 (2021-01-21)\n \n - Add ``breadcrumbs_view`` override to include ``nav_title``\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.6.0 (2021-01-14)\n-------------------\n+## 1.6.0 (2021-01-14)\n \n - Added indexers for `preview_image`, it allows the Volto object browser widget to access it\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.5.2 (2020-12-14)\n-------------------\n+## 1.5.2 (2020-12-14)\n \n - Missing ZCML for translations\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.5.1 (2020-12-14)\n-------------------\n+## 1.5.1 (2020-12-14)\n \n - Add zest.pocompile\n- [sneridagh]\n+ [@sneridagh]\n \n - Add missing .mo\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.5.0 (2020-12-09)\n-------------------\n+## 1.5.0 (2020-12-09)\n \n - Fix locales default in German\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.4.0 (2020-07-29)\n-------------------\n+## 1.4.0 (2020-07-29)\n \n - Add volto.preview_image behavior to Page type.\n- [timo]\n+ [@timo]\n \n \n-1.3.2 (2020-05-17)\n-------------------\n+## 1.3.2 (2020-05-17)\n \n - Make sure that the enable_pam helper does its job.\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.3.1 (2020-05-12)\n-------------------\n+## 1.3.1 (2020-05-12)\n \n - Fix LRF global allow and ensure default behaviors\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.3.0 (2020-05-11)\n-------------------\n+## 1.3.0 (2020-05-11)\n \n - Add registry navigation setting for not show the current item in navigations\n- [sneridagh]\n+ [@sneridagh]\n \n - New enable_pam setuphandlers helper\n- [sneridagh]\n+ [@sneridagh]\n \n - New enable_pam_consistency setuphandlers helper\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.2.0 (2020-04-17)\n-------------------\n+## 1.2.0 (2020-04-17)\n \n - Bring back the event type, since it\'s fully working in Volto now\n- [sneridagh]\n+ [@sneridagh]\n \n - fix typo in behavior name ``navttitle`` -> ``navtitle``\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.1.0 (2020-03-10)\n-------------------\n+## 1.1.0 (2020-03-10)\n \n - Added a specific IImageScaleFactory for ``Image`` content type, to fix SVG handling\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.0.1 (2020-03-08)\n-------------------\n+## 1.0.1 (2020-03-08)\n \n - Update version numbers in default home page.\n- [sneridagh]\n+ [@sneridagh]\n \n \n-1.0.0 (2020-03-06)\n-------------------\n+## 1.0.0 (2020-03-06)\n \n - Add Zope log patch\n- [sneridagh]\n+ [@sneridagh]\n \n - Add nav_title and preview_image behaviors\n- [sneridagh]\n+ [@sneridagh]\n \n - override plone.app.vocabularies.Keywords with a version that\n uses the unencode subject value as the token.\n- [csenger]\n+ [@csenger]\n \n - Remove versioning behavior from Document type.\n- [timo]\n+ [@timo]\n \n - Backport all features that were in plone.voltodemo\n- [sneridagh]\n+ [@sneridagh]\n \n - Patch Password reset tool in Products.CMFPlone to use the optional volto_domain in the\n e-email which is sent to users, only if the request is made through REST.\n- [fredvd]\n+ [@fredvd]\n \n - Add Volto settings control panel with frontend_domain field.\n- [fredvd]\n+ [@fredvd]\n \n - Homepage profile for demo purposes\n- [sneridagh]\n+ [@sneridagh]\n \n - CORS profile\n- [sneridagh]\n+ [@sneridagh]\n \n - Enable Volto Blocks for Document and LRF\n- [sneridagh]\n+ [@sneridagh]\n \n - Initial release.\n- [kitconcept]\n+ [@kitconcept]\ndiff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.md\nsimilarity index 50%\nrename from CONTRIBUTORS.rst\nrename to CONTRIBUTORS.md\nindex 1da317ce..d7255a93 100644\n--- a/CONTRIBUTORS.rst\n+++ b/CONTRIBUTORS.md\n@@ -1,9 +1,4 @@\n-Contributors\n-============\n-\n-.. note::\n- place names and roles of the people who contribute to this package\n- in this file, one to a line, like so, please add your name at the end:\n+# Contributors\n \n - Timo Stollenwerk, Original Author\n - Victor Fernandez de Alba, Original Author\ndiff --git a/MANIFEST.in b/MANIFEST.in\nindex 9f94b068..929782f9 100644\n--- a/MANIFEST.in\n+++ b/MANIFEST.in\n@@ -1,25 +1,12 @@\n-graft src/plone/volto\n+graft src/plone\n graft docs\n+graft scripts\n+graft tests\n+prune news\n+include *.yaml\n+include Makefile\n+include *.md\n include *.rst\n-include *.txt\n-recursive-include requirements *.txt\n+exclude *.txt\n exclude *.cfg\n-exclude *.yml\n-exclude *.in\n-exclude *.jmx\n-exclude *.yaml\n-exclude .coveragerc\n-exclude .editorconfig\n-exclude .flake8\n-exclude Dockerfile\n-exclude Makefile\n-exclude CODEOWNERS\n-exclude docs/make.bat\n-recursive-exclude docs/doctrees *\n-recursive-exclude docs/html *\n-recursive-exclude performance *\n-exclude docs/Makefile\n-prune docs/Makefile\n-prune news\n global-exclude *.pyc\n-include pyproject.toml\n\\ No newline at end of file\ndiff --git a/Makefile b/Makefile\nindex f7a97d63..92652f0c 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -15,15 +15,28 @@ GREEN=`tput setaf 2`\n RESET=`tput sgr0`\n YELLOW=`tput setaf 3`\n \n-PLONE5=5.2.9\n-PLONE6=6.0.0b1\n+BASE_FOLDER=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))\n+VENV_FOLDER=$(BASE_FOLDER)/.venv\n+BIN_FOLDER=$(VENV_FOLDER)/bin\n \n-CODE_QUALITY_VERSION=1.0.1\n-LINT=docker run --rm -v "$(PWD)":/github/workspace plone/code-quality:${CODE_QUALITY_VERSION} check\n \n-PACKAGE_NAME=plone.volto\n-PACKAGE_PATH=src/\n-CHECK_PATH=setup.py $(PACKAGE_PATH)\n+# Python checks\n+PYTHON?=python3\n+\n+# installed?\n+ifeq (, $(shell which $(PYTHON) ))\n+ $(error "PYTHON=$(PYTHON) not found in $(PATH)")\n+endif\n+\n+# version ok?\n+PYTHON_VERSION_MIN=3.8\n+PYTHON_VERSION_OK=$(shell $(PYTHON) -c "import sys; print((int(sys.version_info[0]), int(sys.version_info[1])) >= tuple(map(int, \'$(PYTHON_VERSION_MIN)\'.split(\'.\'))))")\n+ifeq ($(PYTHON_VERSION_OK),0)\n+ $(error "Need python $(PYTHON_VERSION) >= $(PYTHON_VERSION_MIN)")\n+endif\n+\n+# Set distributions still in development\n+DISTRIBUTIONS="volto"\n \n all: build\n \n@@ -33,95 +46,81 @@ all: build\n help: ## This help message\n \t@grep -E \'^[a-zA-Z_-]+:.*?## .*$$\' $(MAKEFILE_LIST) | sort | awk \'BEGIN {FS = ":.*?## "}; {printf "\\033[36m%-30s\\033[0m %s\\n", $$1, $$2}\'\n \n-bin/pip:\n-\t@echo "$(GREEN)==> Setup Virtual Env$(RESET)"\n-\tpython3 -m venv .\n-\tbin/pip install -U pip wheel\n-\n-bin/black bin/isort bin/pyroma bin/zpretty: bin/pip\n-\t@echo "$(GREEN)==> Install Code Quality tools$(RESET)"\n-\tbin/pip install -r https://raw.githubusercontent.com/plone/code-quality/v$(CODE_QUALITY_VERSION)/requirements.txt\n-\t@echo "$(GREEN)==> Install pre-commit hook$(RESET)"\n-\techo -e \'#!/usr/bin/env bash\\nmake lint\' > .git/hooks/pre-commit && chmod ug+x .git/hooks/pre-commit\n-\n-bin/i18ndude: bin/pip\n-\t@echo "$(GREEN)==> Install i18ndude$(RESET)"\n-\tbin/pip install i18ndude\n-\n-.PHONY: build-plone-5.2\n-build-plone-5.2: bin/pip bin/black ## Build Plone 5.2\n-\t@echo "$(GREEN)==> Build with Plone 5.2$(RESET)"\n-\tbin/pip install Plone plone.app.testing -c https://dist.plone.org/release/$(PLONE5)/constraints.txt\n-\tbin/pip install -e ".[test]"\n-\tbin/mkwsgiinstance -d . -u admin:admin\n-\n-.PHONY: build-plone-6.0\n-build-plone-6.0: bin/pip bin/black ## Build Plone 6.0\n-\t@echo "$(GREEN)==> Build with Plone 6.0$(RESET)"\n-\tbin/pip install Plone plone.app.testing -c https://dist.plone.org/release/$(PLONE6)/constraints.txt\n-\tbin/pip install -e ".[test]"\n-\tbin/pip install zest.releaser[recommended] zestreleaser.towncrier\n-\tbin/mkwsgiinstance -d . -u admin:admin\n-\n-.PHONY: build\n-build: build-plone-6.0 ## Build Plone 6.0\n-\n .PHONY: clean\n-clean: ## Remove old virtualenv and creates a new one\n-\t@echo "$(RED)==> Cleaning environment and build$(RESET)"\n-\trm -rf bin lib lib64 include share etc var inituser pyvenv.cfg .installed.cfg\n-\n-.PHONY: black\n-black: bin/black ## Format codebase\n-\tbin/black $(CHECK_PATH)\n-\n-.PHONY: isort\n-isort: bin/isort ## Format imports in the codebase\n-\tbin/isort $(CHECK_PATH)\n-\n-.PHONY: zpretty\n-zpretty: bin/zpretty ## Format xml and zcml with zpretty\n-\tfind "${PACKAGE_PATH}" -name \'*.xml\' | xargs bin/zpretty -x -i\n-\tfind "${PACKAGE_PATH}" -name \'*.zcml\' | xargs bin/zpretty -z -i\n-\n-.PHONY: format\n-format: black isort zpretty ## Format the codebase according to our standards\n+clean: clean-build clean-pyc clean-test clean-venv clean-instance ## remove all build, test, coverage and Python artifacts\n+\n+.PHONY: clean-instance\n+clean-instance: ## remove existing instance\n+\trm -fr instance etc inituser var\n+\n+.PHONY: clean-venv\n+clean-venv: ## remove virtual environment\n+\trm -fr $(BIN_FOLDER) env pyvenv.cfg .tox .pytest_cache requirements-mxdev.txt\n+\n+.PHONY: clean-build\n+clean-build: ## remove build artifacts\n+\trm -fr build/\n+\trm -fr dist/\n+\trm -fr .eggs/\n+\tfind . -name \'*.egg-info\' -exec rm -fr {} +\n+\tfind . -name \'*.egg\' -exec rm -rf {} +\n+\n+.PHONY: clean-pyc\n+clean-pyc: ## remove Python file artifacts\n+\tfind . -name \'*.pyc\' -exec rm -f {} +\n+\tfind . -name \'*.pyo\' -exec rm -f {} +\n+\tfind . -name \'*~\' -exec rm -f {} +\n+\tfind . -name \'__pycache__\' -exec rm -fr {} +\n+\n+.PHONY: clean-test\n+clean-test: ## remove test and coverage artifacts\n+\trm -f .coverage\n+\trm -fr htmlcov/\n+\n+$(BIN_FOLDER)/pip $(BIN_FOLDER)/tox $(BIN_FOLDER)/mxdev:\n+\t@echo "$(GREEN)==> Setup Virtual Env$(RESET)"\n+\t$(PYTHON) -m venv $(VENV_FOLDER)\n+\t$(BIN_FOLDER)/pip install -U "pip" "pipx" "wheel" "cookiecutter" "mxdev" "tox" "pre-commit"\n+\t$(BIN_FOLDER)/pre-commit install\n \n-.PHONY: i18n\n-i18n: bin/i18ndude ## update translations\n-\t./scripts/update_translations.sh\n+.PHONY: config\n+config: $(BIN_FOLDER)/pip ## Create instance configuration\n+\t@echo "$(GREEN)==> Create instance configuration$(RESET)"\n+\t$(BIN_FOLDER)/pipx run cookiecutter -f --no-input --config-file instance.yaml gh:plone/cookiecutter-zope-instance\n \n-.PHONY: lint\n-lint: lint-isort lint-black lint-flake8 lint-zpretty ## check code style\n+.PHONY: install-plone-6\n+install-plone-6: config ## pip install Plone packages\n+\t@echo "$(GREEN)==> Setup Build$(RESET)"\n+\t$(BIN_FOLDER)/mxdev -c mx.ini\n+\t$(BIN_FOLDER)/pip install -r requirements-mxdev.txt\n \n-.PHONY: lint-black\n-lint-black: ## validate black formating\n-\t$(LINT) black "$(CHECK_PATH)"\n+.PHONY: install\n+install: install-plone-6 ## Install Plone 6\n \n-.PHONY: lint-flake8\n-lint-flake8: ## validate black formating\n-\t$(LINT) flake8 "$(CHECK_PATH)"\n+.PHONY: start\n+start: ## Start a Plone instance on localhost:8080\n+\tDEVELOP_DISTRIBUTIONS=$(DISTRIBUTIONS) PYTHONWARNINGS=ignore $(BIN_FOLDER)/runwsgi instance/etc/zope.ini\n \n-.PHONY: lint-isort\n-lint-isort: ## validate using isort\n-\t$(LINT) isort "$(CHECK_PATH)"\n+.PHONY: check\n+check: $(BIN_FOLDER)/tox ## Format the codebase according to our standards\n+\t@echo "$(GREEN)==> Format codebase$(RESET)"\n+\t$(BIN_FOLDER)/tox -e lint\n \n-.PHONY: lint-pyroma\n-lint-pyroma: ## validate using pyroma\n-\t$(LINT) .\n+# i18n\n+$(BIN_FOLDER)/i18ndude:\t$(BIN_FOLDER)/pip\n+\t@echo "$(GREEN)==> Install translation tools$(RESET)"\n+\t$(BIN_FOLDER)/pip install i18ndude\n \n-.PHONY: lint-zpretty\n-lint-zpretty: ## validate ZCML/XML using zpretty\n-\t$(LINT) zpretty "$(PACKAGE_PATH)"\n+.PHONY: i18n\n+i18n: $(BIN_FOLDER)/i18ndude ## Update locales\n+\t@echo "$(GREEN)==> Updating locales$(RESET)"\n+\t$(BIN_FOLDER)/update_locale\n \n+# Tests\n .PHONY: test\n-test: ## run tests\n-\tPYTHONWARNINGS=ignore ./bin/zope-testrunner --auto-color --auto-progress --test-path $(PACKAGE_PATH)\n-\n-.PHONY: start\n-start: ## Start a Plone instance on localhost:8080\n-\tPYTHONWARNINGS=ignore ./bin/runwsgi etc/zope.ini\n+test: $(BIN_FOLDER)/tox ## run tests\n+\tDEVELOP_DISTRIBUTIONS=$(DISTRIBUTIONS) $(BIN_FOLDER)/tox -e test\n \n-.PHONY: release\n-release: ## Make a release\n-\t./bin/fullrelease\n+.PHONY: test-coverage\n+test-coverage: $(BIN_FOLDER)/tox ## run tests with coverage\n+\tDEVELOP_DISTRIBUTIONS=$(DISTRIBUTIONS) $(BIN_FOLDER)/tox -e coverage\ndiff --git a/README.md b/README.md\nnew file mode 100644\nindex 00000000..70b61547\n--- /dev/null\n+++ b/README.md\n@@ -0,0 +1,279 @@\n+

\n+ Plone Logo\n+

\n+\n+

plone.volto

\n+\n+
\n+\n+[![PyPI](https://img.shields.io/pypi/v/plone.volto)](https://pypi.org/project/plone.volto/)\n+[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/plone.volto)](https://pypi.org/project/plone.volto/)\n+[![PyPI - Wheel](https://img.shields.io/pypi/wheel/plone.volto)](https://pypi.org/project/plone.volto/)\n+[![PyPI - License](https://img.shields.io/pypi/l/plone.volto)](https://pypi.org/project/plone.volto/)\n+[![PyPI - Status](https://img.shields.io/pypi/status/plone.volto)](https://pypi.org/project/plone.volto/)\n+\n+\n+[![PyPI - Plone Versions](https://img.shields.io/pypi/frameworkversions/plone/plone.volto)](https://pypi.org/project/plone.volto/)\n+\n+[![Meta](https://github.com/plone/plone.volto/actions/workflows/meta.yml/badge.svg)](https://github.com/plone/plone.volto/actions/workflows/meta.yml)\n+![Code Style](https://img.shields.io/badge/Code%20Style-Black-000000)\n+\n+[![GitHub contributors](https://img.shields.io/github/contributors/plone/plone.volto)](https://github.com/plone/plone.volto)\n+[![GitHub Repo stars](https://img.shields.io/github/stars/plone/plone.volto?style=social)](https://github.com/plone/plone.volto)\n+\n+
\n+\n+`plone.volto` configures [Plone](https://plone.org/) to work with [Volto](https://www.npmjs.com/package/@plone/volto), the default frontend of Plone since version 6.0.\n+\n+## Installation\n+\n+Add `plone.volto` either to the Plone installation using `pip`:\n+\n+```shell\n+pip install plone.volto\n+```\n+\n+or add it as a dependency in your package\'s `setup.py`:\n+\n+```python\n+ install_requires = [\n+ "plone.volto",\n+ "setuptools",\n+ ],\n+```\n+\n+## Compatibility\n+\n+`plone.volto` version 5.x works with Plone 6.1 (pre-alpha and alpha), and supports Python 3.10, 3.11, and 3.12.\n+\n+Volto requires specific versions of `plone.volto` and `plone.restapi`:\n+\n+| `plone.volto` | `Plone` | `plone.restapi` | Comments |\n+| --- | --- | --- | --- |\n+| 5.x | 6.1 | 8.41.0 and above | |\n+| 4.x | 5.2, 6.0 | 8.41.0 and above | |\n+| 3.x | 5.1, 5.2 | 8.13.0 and above | Requires new `JSONSummarySerializerMetadata` serializer added in `plone.restapi` 8.13.|\n+| 2.x (`kitconcept.volto`) | 5.1, 5.2 | 7.0.0 and above | New image scales |\n+| 1.x (`kitconcept.volto`) | 5.1, 5.2 | 6.0.0 and below | New transforms and features |\n+\n+Volto only supports the latest `plone.restapi` branch, therefore it is recommended to always use the latest version in your Volto projects.\n+\n+## Plone 6 architecture\n+\n+Architectural diagram of Plone 6:\n+\n+```text\n+ Frontend\n+ \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n+ \xe2\x94\x82 \xe2\x94\x82\n+ \xe2\x94\x82 Volto \xe2\x94\x82\n+ \xe2\x94\x82 \xe2\x94\x82\n+ \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n+ \xe2\x94\x82 \xe2\x96\xb2\n+ \xe2\x94\x82 HTTP \xe2\x94\x82\n+ Backend \xe2\x96\xbc \xe2\x94\x82\n+ \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n+ \xe2\x94\x82\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\xe2\x94\x82\n+ \xe2\x94\x82\xe2\x94\x82 plone.restapi \xe2\x94\x82\xe2\x94\x82\n+ \xe2\x94\x82\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\xe2\x94\x82\n+ \xe2\x94\x82\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\xe2\x94\x82\n+ \xe2\x94\x82\xe2\x94\x82 plone.volto \xe2\x94\x82\xe2\x94\x82\n+ \xe2\x94\x82\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\xe2\x94\x82\n+ \xe2\x94\x82\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90 \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\xe2\x94\x82\n+ \xe2\x94\x82\xe2\x94\x82 Plone Core \xe2\x94\x82 \xe2\x94\x82 Add-Ons \xe2\x94\x82\xe2\x94\x82\n+ \xe2\x94\x82\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\xe2\x94\x82\n+ \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n+```\n+\n+## Features\n+\n+`plone.volto` provides the following features:\n+\n+\n+### Volto blocks support\n+\n+\n+`plone.volto` enables the new Volto blocks editor on `Document`, `Language Root Folder`, and `Site Root`.\n+\n+\n+### Block types index\n+\n+`plone.volto` adds a `block_types` index to the Plone catalog.\n+It can be used to query for items that use a particular type of block.\n+\n+```python\n+from plone import api\n+portal_catalog = api.portal.get_tool("portal_catalog")\n+portal_catalog.searchResults(block_types="image")\n+```\n+\n+The `block_types` index was added in `plone.volto` 4.1.0.\n+By default it is only added for new Plone sites.\n+To add it to an existing site, run `plone.volto.upgrades.add_block_types_index` manually.\n+\n+\n+### Multilingual support\n+\n+`plone.volto` supports multilingual websites.\n+Install PAM before installing this package, and demo homepages will be created in each enabled language.\n+Support is currently only for `EN` and `DE`.\n+\n+### Document content type\n+\n+`plone.volto` disables the `Richtext` and `Table of Contents` behaviors for the `Document` content type.\n+Rich text functionality is provided by the new Volto blocks editor.\n+The `Table of Contents` functionality is provided by the `Table of Contents` block in Volto.\n+\n+\n+### CORS profile\n+\n+A quick helper to enable CORS for development configuration is also provided in the\n+`plone.volto` module. You can call:\n+\n+```xml\n+\n+```\n+\n+from your ZCML while developing.\n+\n+Enable it on demand, since it\'s considered a security issue if you enable CORS in your\n+productions sites.\n+\n+It\'s planned that Volto will feature a development pass-through proxy to the backend in\n+the future. It will be addressed in next sprints.\n+\n+### ZLog patch\n+\n+`plone.restapi` low level errors are routed through the ancient ZLog and are `plone_error`\n+enabled, making it difficult to follow since all are marked with a UUID, specifically when\n+using helpers like Sentry. This patch removes the UUID so the same error is categorized\n+all together. This is planned to be addressed in next sprints.\n+\n+\n+### Patch for `subject` field\n+\n+There are some problems of serialization on special characters derived from the\n+current shape of the Plone\'s default Dexterity `subjects` field that have to be\n+addressed in order to make it work properly with Volto (and other systems that are not\n+Plone). This will be fixed in core in upcoming sprints.\n+\n+\n+### Preview image behavior\n+\n+The preview image behavior makes content types provide a `preview_image` field that can store a preview image that Volto views can pick up.\n+This is especially useful for listings (e.g. listing block customizations) and teaser elements (e.g. teaser blocks).\n+\n+The `volto.preview_image` behavior can be enabled in the generic setup XML definition of a content type (e.g. `/profiles/default/types/MyContentType.xml`):\n+\n+```xml\n+\n+\n+\n+ ...\n+\n+ \n+ \n+ ...\n+ \n+ \n+ ...\n+\n+```\n+\n+There is also another variation of the preview image behavior called `volto.preview_image_link`.\n+This one stores preview images using a relation to an image content type, rather than in an image field. This might be preferable if many content items use the same preview image.\n+\n+### Navigation title behavior\n+\n+The navigation title makes content types provide a `nav_title` field that is used by Volto in the main navigation, the breadcrumbs, and the navigation portlet.\n+\n+The `volto.navtitle` behavior can be enabled in the generic setup XML definition of a content type, for example in `/profiles/default/types/MyContentType.xml`:\n+\n+```xml\n+\n+\n+\n+ ...\n+\n+ \n+ \n+ ...\n+ \n+ \n+ ...\n+\n+```\n+\n+### Kicker behavior\n+\n+The `volto.kicker` behavior adds a Kicker field that can be used to display a line of text above the title.\n+\n+(The internal name of the field is `head_title`, for backwards-compatibility reasons.)\n+\n+This behavior can be enabled in the generic setup XML definition of a content type, for example in `/profiles/default/types/MyContentType.xml`:\n+\n+```xml\n+\n+\n+\n+ ...\n+\n+ \n+ \n+ ...\n+ \n+ \n+ ...\n+\n+```\n+\n+> [!NOTE]\n+> The previous name of this behavior, `volto.head_title`, was deprecated in `plone.volto` 5.0.\n+\n+### Image scales\n+\n+This package introduces new Plone image scales in Plone and redefines a couple of existing ones.\n+These are know to work well with the Volto layout and grid system:\n+\n+| Scale | Dimensions |\n+| --- | --- |\n+| icon | 32:32 |\n+| tile | 64:64 |\n+| thumb | 128:128 |\n+| mini | 200:65536 |\n+| preview | 400:65536 |\n+| teaser | 600:65536 |\n+| large | 800:65536 |\n+| larger | 1000:65536 |\n+| great | 1200:65536 |\n+| huge | 1600:65536 |\n+\n+**This change is opinionated and may collide with your previously defined ones, so make sure your add-on\'s profiles are applied AFTER this one.**\n+\n+\n+## History\n+\n+

\n+ \n+ Plone Logo\n+ \n+

\n+\n+The code of `plone.volto` has been under active development and is used in production since 2018.\n+It was first named `kitconcept.voltodemo` (deprecated since March, 5th 2020), then `kitconcept.volto`.\n+In September 2021 `kitconcept.volto` was renamed to `plone.volto`, and was contributed to the Plone core as part of [PLIP #2703](https://github.com/plone/Products.CMFPlone/issues/2703).\n+\n+## This project is supported by\n+\n+

\n+ \n+ Plone Logo\n+ \n+

\n+\n+## License\n+\n+The project is licensed under the GPLv2.\ndiff --git a/README.rst b/README.rst\ndeleted file mode 100644\nindex 06ab223f..00000000\n--- a/README.rst\n+++ /dev/null\n@@ -1,274 +0,0 @@\n-.. This README is meant for consumption by humans and pypi. Pypi can render rst files so please do not use Sphinx features.\n- If you want to learn more about writing documentation, please check out: http://docs.plone.org/about/documentation_styleguide.html\n- This text does not appear on pypi or github. It is a comment.\n-\n-.. image:: https://img.shields.io/pypi/v/plone.volto.svg\n- :target: https://pypi.python.org/pypi/plone.volto\n-\n-.. image:: https://github.com/plone/plone.volto/actions/workflows/tests.yml/badge.svg\n- :target: https://github.com/plone/plone.volto/actions/workflows/tests.yml\n-\n-==============================================================================\n-plone.volto\n-==============================================================================\n-\n-plone.volto configures Plone to work with `Volto `_, the new default frontend for Plone 6.\n-\n-\n-Installation\n-============\n-\n-Install plone.volto by adding it to your buildout::\n-\n- [buildout]\n- ...\n-\n- [instance]\n- ...\n-\n- eggs =\n- plone.volto\n- ...\n-\n-\n-Compatibility\n-=============\n-\n-plone.volto currently works for both Plone 5.2 and Plone 6 (pre-alpha and alpha).\n-It support Python 3.7, 3.8 and 3.9.\n-\n-Though, Volto requires specific versions of plone.volto and plone.restapi:\n-\n-+---------------------------+-----------------------+-------------------------------------------------------------------------------------------------+\n-| plone.volto | plone.restapi | Reason |\n-+---------------------------+-----------------------+-------------------------------------------------------------------------------------------------+\n-| 3.1.x | 8.13.0 and above | Requires new JSONSummarySerializerMetadata serializer added in plone.restapi 8.13.0 |\n-+---------------------------+-----------------------+-------------------------------------------------------------------------------------------------+\n-| 2.x (kitconcept.volto) | 7.0.0 and above | New image scales |\n-+---------------------------+-----------------------+-------------------------------------------------------------------------------------------------+\n-| 1.x (kitconcept.volto) | 6.0.0 and below | New transforms and features |\n-+---------------------------+-----------------------+-------------------------------------------------------------------------------------------------+\n-\n-plone.restapi 7.x.x is included in Plone 5.2.4 (and later).\n-\n-You can still use 2.x in p.restapi 7.0.0 based installations but the transforms included won\'t work.\n-\n-Volto only supports the latest plone.restapi branch, therefore it is recommended to always use the latest version in your Volto projects.\n-\n-Plone 6 Architecture\n-====================\n-\n-Architectural Diagram of Plone 6::\n-\n- Frontend\n- \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n- \xe2\x94\x82 \xe2\x94\x82\n- \xe2\x94\x82 Volto \xe2\x94\x82\n- \xe2\x94\x82 \xe2\x94\x82\n- \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n- \xe2\x94\x82 \xe2\x96\xb2\n- \xe2\x94\x82 HTTP \xe2\x94\x82\n- Backend \xe2\x96\xbc \xe2\x94\x82\n- \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n- \xe2\x94\x82\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\xe2\x94\x82\n- \xe2\x94\x82\xe2\x94\x82 plone.restapi \xe2\x94\x82\xe2\x94\x82\n- \xe2\x94\x82\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\xe2\x94\x82\n- \xe2\x94\x82\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\xe2\x94\x82\n- \xe2\x94\x82\xe2\x94\x82 plone.volto \xe2\x94\x82\xe2\x94\x82\n- \xe2\x94\x82\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\xe2\x94\x82\n- \xe2\x94\x82\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90 \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\xe2\x94\x82\n- \xe2\x94\x82\xe2\x94\x82 Plone Core \xe2\x94\x82 \xe2\x94\x82 Add-Ons \xe2\x94\x82\xe2\x94\x82\n- \xe2\x94\x82\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\xe2\x94\x82\n- \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n-\n-\n-Features\n-========\n-\n-plone.volto provides the following features:\n-\n-\n-Volto Blocks Support\n---------------------\n-\n-plone.volto enables the new Volto Blocks editor on ``Document``, ``Language Root Folder`` and ``Site Root``.\n-\n-\n-Multilingual Support\n---------------------\n-\n-plone.volto supports multilingual websites.\n-Install PAM before installing this package and demo homepages will be created in each enabled language.\n-Currently only support for EN/DE.\n-\n-\n-Volto Blocks for Plone Site Root\n---------------------------------\n-\n-plone.volto contains a hack to make the Plone site Volto blocks-enabled with some demo content.\n-You can take only the hack to enable the blocks on your site.\n-\n-You can see it in action in the Volto demo: https://6.demo.plone.org\n-\n-Install the provided profile to install it by default:\n-\n- plone.volto:default-homepage\n-\n-e.g. in your GS ``metadata.xml`` along with your other dependencies::\n-\n- \n- 1000\n- \n- plone.volto:default-homepage\n- \n- \n-\n-**NOTE**: The default block for creating the default content in the root (or\n-corresponding Language Root Folders) is "draftJS" text block. ``plone.volto`` provides a\n-profile if you want to create Slate blocks: you need to use the ``default-homepage-slate``\n-profile.\n-\n-Document Content Type\n----------------------\n-\n-plone.volto disables the ``Richtext`` and ``Table of Contents`` behaviors for the ``Document`` content type.\n-Rich Text functionality is provided by the new Volto Blocks editor.\n-The ``Table of Contents`` functionality is provided by the ``Table of Contents Block`` in Volto.\n-\n-\n-CORS Profile\n-------------\n-\n-A quick helper for enable CORS for development config is also provided in the\n-``plone.volto`` module. So you can call::\n-\n- \n-\n-from your ZCML while developing.\n-\n-Enable it on demand, since it\'s considered a security issue if you enable CORS in your\n-productions sites.\n-\n-It\'s planned that Volto will feature a development pass-through proxy to the backend in\n-the future. It will be addressed in next sprints.\n-\n-ZLog Patch\n-----------\n-\n-p.restapi low level errors are routed through the ancient ZLog and are ``plone_error``\n-enabled, making it difficult to follow since all are marked with a UUID. Specially if\n-using helpers like Sentry. This patch removes the UUID so the same error is categorized\n-all together. This is planned to be addressed in next sprints.\n-\n-\n-Patch for ``subject`` Field\n----------------------------\n-\n-There are some problems of serialization on special characters derivated from how the\n-current shape of the Plone\'s default Dexterity ``subjects`` field that has to be\n-addressed in order to make it work properly with Volto (and other systems that are not\n-Plone). This will be fixed in core in upcoming sprints.\n-\n-\n-Preview Image Behavior\n-----------------------\n-\n-The preview image behavior makes content types provide a ``preview_image`` field that can store a preview image that Volto views can pick up.\n-This is especially userful for listings (e.g. listing block customizations) and teaser elements (e.g. teaser blocks such as [volto-blocks-grid](https://github.com/kitconcept/volto-blocks-grid)).\n-\n-The ``volto.preview_image`` behavior can be enabled in the generic setup XML definition of a content type (e.g. ``/profiles/default/types/MyContentType.xml``)::\n-\n- \n- \n-\n- ...\n-\n- \n- \n- ...\n- \n- \n- ...\n- \n-\n-There is also another variation of the preview image behavior called ``volto.preview_image_link``.\n-This one stores preview images using a relation to an Image content type, rather than in an image field. This might be preferable if many content items use the same preview image.\n-\n-Navigation Title Behavior\n--------------------------\n-\n-The navigation title makes content types provide a nav_title field that is used by Volto in the main navigation, the breadcrumbs and the navigation portlet.\n-\n-The "volto.navtitle behavior can be enabled in the generic setup XML definition of a content type (e.g. "/profiles/default/types/MyContentType.xml")::\n-\n- \n- \n-\n- ...\n-\n- \n- \n- ...\n- \n- \n- ...\n- \n-\n-\n-Head Title Behavior\n--------------------\n-\n-The headtitle makes content types provide a headtitle field that can be used by Volto in teasers and alikes.\n-\n-The "volto.head_title" behavior can be enabled in the generic setup XML definition of a content type (e.g. "/profiles/default/types/MyContentType.xml")::\n-\n- \n- \n-\n- ...\n-\n- \n- \n- ...\n- \n- \n- ...\n- \n-\n-\n-Image Scales\n-------------\n-\n-This package introduces new Plone image scales in Plone and redefines a couple of\n-existing ones. These are know to work well with Volto layout and grid system::\n-\n- icon 32:32\n- tile 64:64\n- thumb 128:128\n- mini 200:65536\n- preview 400:65536\n- teaser 600:65536\n- large 800:65536\n- larger 1000:65536\n- great 1200:65536\n- huge 1600:65536\n-\n-**This change is opinionated and may collide with your previously defined ones, so make\n-sure your add-on\'s profiles are applied AFTER this one.**\n-\n-\n-Credits and History\n--------------------\n-\n-.. image:: https://kitconcept.com/logo.svg\n- :width: 150px\n- :alt: kitconcept\n- :target: https://kitconcept.com/\n-\n-The code of plone.volto has been under active development and is used in production since 2018.\n-First as kitconcept.voltodemo (deprecated since March, 5th 2020), then as kitconcept.volto.\n-In September 2021 kitconcept.volto has been renamed to plone.volto and has been contributed to the Plone core as part of `PLIP #2703\n-`_.\ndiff --git a/base.cfg b/base.cfg\ndeleted file mode 100644\nindex 1e722080..00000000\n--- a/base.cfg\n+++ /dev/null\n@@ -1,130 +0,0 @@\n-[buildout]\n-index = https://pypi.org/simple/\n-parts =\n- instance\n- plonesite\n- # code-analysis (Move to Makefile)\n- dependencies\n- zpretty\n- test\n- omelette\n- update-translations\n- find-untranslated\n-develop = .\n-sources-dir = extras\n-\n-extensions = mr.developer\n-auto-checkout =\n-always-checkout = force\n-\n-[sources]\n-plone.restapi = git git://github.com/plone/plone.restapi.git pushurl=git@github.com:plone/plone.restapi.git branch=master\n-\n-[instance]\n-recipe = plone.recipe.zope2instance\n-user = admin:admin\n-http-address = 8080\n-eggs =\n- Plone\n- Pillow\n- plone.volto [test]\n-\n-zcml-additional =\n- \n- \n- \n-\n-[plonesite]\n-recipe = collective.recipe.plonesite\n-site-id = Plone\n-instance = instance\n-profiles-initial = Products.CMFPlone:dependencies\n-profiles =\n- plonetheme.barceloneta:default\n- plone.app.contenttypes:plone-content\n- plone.volto:default-homepage\n-upgrade-portal = False\n-upgrade-all-profiles = False\n-site-replace = True\n-\n-[omelette]\n-recipe = collective.recipe.omelette\n-eggs = ${instance:eggs}\n-\n-[test]\n-recipe = collective.xmltestreport\n-eggs = ${instance:eggs}\n-defaults = [\'-s\', \'plone.volto\', \'--auto-color\', \'--auto-progress\']\n-environment = environment\n-\n-[environment]\n-ROBOT_SELENIUM2LIBRARY_RUN_ON_FAILURE = Capture page screenshot and log source\n-\n-[code-analysis]\n-recipe = plone.recipe.codeanalysis\n-directory = ${buildout:directory}/src\n-flake8-exclude = bootstrap.py,bootstrap-buildout.py,docs,*.egg.,omelette,plone.*\n-flake8-max-complexity = 30\n-flake8-max-line-length = 200\n-flake8-ignore = E501,W503,E203\n-return-status-codes = True\n-pre-commit-hook = True\n-\n-[dependencies]\n-recipe = zc.recipe.egg\n-eggs =\n- zest.releaser[recommended]\n- zest.pocompile\n- readme\n- docutils\n- i18ndude\n- zpretty\n-\n-\n-[zpretty]\n-recipe = collective.recipe.template\n-input = inline:\n- #!/bin/bash\n- find src -name \'*.zcml\' | xargs bin/zpretty -i\n-output = ${buildout:directory}/bin/zpretty-run\n-mode = 755\n-\n-[update-translations]\n-recipe = collective.recipe.template\n-input = inline:\n- domain=plone.volto\n- maindir=src/plone/volto\n- locales=$maindir/locales\n- echo "Update translations for $domain"\n- if [ ! -f $locales/$domain.pot ]; then\n- # Create .pot file if it does not exist yet\n- touch $locales/$domain.pot\n- fi\n- if [ ! -f $locales/de/LC_MESSAGES ]; then\n- # Create de/LC_MESSAGES directory if it does not exist yet\n- mkdir -p $locales/de/LC_MESSAGES\n- fi\n- if [ ! -f $locales/de/LC_MESSAGES/$domain.po ]; then\n- # Create .po file if it does not exist yet\n- touch $locales/de/LC_MESSAGES/$domain.po\n- fi\n- ${buildout:directory}/bin/i18ndude rebuild-pot --pot $locales/$domain.pot --create $domain $maindir\n- ${buildout:directory}/bin/i18ndude sync --pot $locales/$domain.pot $locales/*/LC_MESSAGES/$domain.po\n-output = ${buildout:directory}/bin/update-translations\n-mode = 755\n-\n-[find-untranslated]\n-recipe = collective.recipe.template\n-input = inline:\n- #!/bin/sh\n- bin/i18ndude find-untranslated `find -L src/plone/volto -regex ".*\\.[cz]?pt"`\n-output = ${buildout:directory}/bin/find-untranslated\n-mode = 755\ndiff --git a/buildout.cfg b/buildout.cfg\ndeleted file mode 100644\nindex b9d56c13..00000000\n--- a/buildout.cfg\n+++ /dev/null\n@@ -1,2 +0,0 @@\n-[buildout]\n-extends = plone-6.0.x.cfg\n\\ No newline at end of file\ndiff --git a/constraints.txt b/constraints.txt\nnew file mode 100644\nindex 00000000..00e902ab\n--- /dev/null\n+++ b/constraints.txt\n@@ -0,0 +1 @@\n+-c https://dist.plone.org/release/6.1-dev/constraints.txt\ndiff --git a/dependabot.yml b/dependabot.yml\nnew file mode 100644\nindex 00000000..bbd3ab05\n--- /dev/null\n+++ b/dependabot.yml\n@@ -0,0 +1,11 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/main/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+version: 2\n+updates:\n+\n+ - package-ecosystem: "github-actions"\n+ directory: "/"\n+ schedule:\n+ # Check for updates to GitHub Actions every week\n+ interval: "weekly"\ndiff --git a/instance.yaml b/instance.yaml\nnew file mode 100644\nindex 00000000..64954ce9\n--- /dev/null\n+++ b/instance.yaml\n@@ -0,0 +1,7 @@\n+default_context:\n+ initial_user_name: \'admin\'\n+ initial_user_password: \'admin\'\n+\n+ zcml_package_includes: [\'plone.volto\']\n+\n+ db_storage: direct\ndiff --git a/mx.ini b/mx.ini\nnew file mode 100644\nindex 00000000..d0999aba\n--- /dev/null\n+++ b/mx.ini\n@@ -0,0 +1,14 @@\n+; This is a mxdev configuration file\n+; it can be used to override versions of packages already defined in the\n+; constraints files and to add new packages from VCS like git.\n+; to learn more about mxdev visit https://pypi.org/project/mxdev/\n+\n+[settings]\n+main-package = -e .[test]\n+ignores =\n+ plone.volto\n+\n+[plone.distribution]\n+url = https://github.com/plone/plone.distribution.git\n+branch = main\n+extras = test\ndiff --git a/news/.changelog_template.jinja b/news/.changelog_template.jinja\nnew file mode 100644\nindex 00000000..b35bff39\n--- /dev/null\n+++ b/news/.changelog_template.jinja\n@@ -0,0 +1,15 @@\n+{% if sections[""] %}\n+{% for category, val in definitions.items() if category in sections[""] %}\n+\n+### {{ definitions[category][\'name\'] }}\n+\n+{% for text, values in sections[""][category].items() %}\n+- {{ text }} {{ values|join(\', \') }}\n+{% endfor %}\n+\n+{% endfor %}\n+{% else %}\n+No significant changes.\n+\n+\n+{% endif %}\n\\ No newline at end of file\ndiff --git a/news/164.breaking b/news/164.breaking\nnew file mode 100644\nindex 00000000..bd68fa01\n--- /dev/null\n+++ b/news/164.breaking\n@@ -0,0 +1 @@\n+Rename head_title behaviour to Kicker @iRohitSingh\n\\ No newline at end of file\ndiff --git a/news/164.bugfix b/news/164.bugfix\nnew file mode 100644\nindex 00000000..b92c3fb0\n--- /dev/null\n+++ b/news/164.bugfix\n@@ -0,0 +1,4 @@\n+The `volto.head_title` behavior has been renamed to `volto.kicker`.\n+The old name still works, but is deprecated.\n+Content types should be updated to use the new name.\n+@iRohitSingh, @davisagli\ndiff --git a/news/167.internal b/news/167.internal\nnew file mode 100644\nindex 00000000..f8429540\n--- /dev/null\n+++ b/news/167.internal\n@@ -0,0 +1 @@\n+Remove unused ZCML conditions. @davisagli\ndiff --git a/news/168.bugfix b/news/168.bugfix\nnew file mode 100644\nindex 00000000..6d765924\n--- /dev/null\n+++ b/news/168.bugfix\n@@ -0,0 +1 @@\n+Fix plone.app.multilingual dependency to be a dependency for tests only. @davisagli\ndiff --git a/plone-5.2.x.cfg b/plone-5.2.x.cfg\ndeleted file mode 100644\nindex 82926b3a..00000000\n--- a/plone-5.2.x.cfg\n+++ /dev/null\n@@ -1,17 +0,0 @@\n-[buildout]\n-extends =\n- base.cfg\n- http://dist.plone.org/release/5.2.10/versions.cfg\n-find-links += http://dist.plone.org/thirdparty/\n-\n-[versions]\n-# Do not use the plone.volto release\n-plone.volto =\n-\n-# Error: The requirement (\'importlib-metadata>=1\') is not allowed by your [versions] constraint (0.23)\n-importlib-metadata = 1.7.0\n-\n-# Error: The requirement (\'importlib-metadata>=3.6\') is not allowed by your [versions] constraint (1.7.0)\n-keyring = 22.0.1\n-secretstorage = 3.3.1\n-jeepney = 0.7.1\ndiff --git a/plone-6.0.x.cfg b/plone-6.0.x.cfg\ndeleted file mode 100644\nindex 2ef8a1bd..00000000\n--- a/plone-6.0.x.cfg\n+++ /dev/null\n@@ -1,19 +0,0 @@\n-[buildout]\n-extends =\n- https://dist.plone.org/release/6.0.0/versions.cfg\n- base.cfg\n-\n-[instance]\n-recipe = plone.recipe.zope2instance\n-zodb-temporary-storage = off\n-\n-[versions]\n-# Do not use the plone.volto release\n-plone.volto =\n-\n-# code analysis (should go into versions.cfg to sync versions with CI)\n-black = 21.7b0\n-\n-# cffi 1.14.3 fails on apple m1\n-# cffi 1.14.4 fails with "ModuleNotFoundError: No module named \'_cffi_backend\'"\n-cffi = 1.14.6\ndiff --git a/pyproject.toml b/pyproject.toml\nindex 13e6ff27..876dadc6 100644\n--- a/pyproject.toml\n+++ b/pyproject.toml\n@@ -1,8 +1,16 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/main/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[build-system]\n+requires = ["setuptools>=68.2"]\n+\n [tool.towncrier]\n-filename = "CHANGES.rst"\n directory = "news/"\n-title_format = "{version} ({project_date})"\n-underlines = ["-", ""]\n+filename = "CHANGES.md"\n+start_string = "\\n"\n+title_format = "## {version} ({project_date})"\n+template = "news/.changelog_template.jinja"\n+underlines = ["", "", ""]\n \n [[tool.towncrier.type]]\n directory = "breaking"\n@@ -24,14 +32,141 @@ directory = "internal"\n name = "Internal:"\n showcontent = true\n \n-[tool.flakeheaven.plugins]\n-# Disable some checks.\n-# - E501 line too long\n-# flake8 is already testing this, with max-line-length=100000 in .flake8,\n-# so pycodestyle should not test it.\n-# - W503 line break before binary operator\n-# Outdated recommendation, see https://www.flake8rules.com/rules/W503.html\n-mccabe = ["+*"]\n-pycodestyle = ["+*", "-E501", "-W503"]\n-pyflakes = ["+*"]\n-pylint = ["+*"]\n+[[tool.towncrier.type]]\n+directory = "documentation"\n+name = "Documentation:"\n+showcontent = true\n+\n+[[tool.towncrier.type]]\n+directory = "tests"\n+name = "Tests"\n+showcontent = true\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# towncrier_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.isort]\n+profile = "plone"\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# isort_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.black]\n+target-version = ["py38"]\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# black_extra_lines = """\n+# extra_configuration\n+# """\n+##\n+\n+[tool.codespell]\n+ignore-words-list = "discreet,vew"\n+skip = "*.po,*.min.js,*lock.yaml"\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# codespell_ignores = "foo,bar"\n+# codespell_skip = "*.po,*.map,package-lock.json"\n+##\n+\n+[tool.dependencychecker]\n+Zope = [\n+ # Zope own provided namespaces\n+ \'App\', \'OFS\', \'Products.Five\', \'Products.OFSP\', \'Products.PageTemplates\',\n+ \'Products.SiteAccess\', \'Shared\', \'Testing\', \'ZPublisher\', \'ZTUtils\',\n+ \'Zope2\', \'webdav\', \'zmi\',\n+ # ExtensionClass own provided namespaces\n+ \'ExtensionClass\', \'ComputedAttribute\', \'MethodObject\',\n+ # Zope dependencies\n+ \'AccessControl\', \'Acquisition\', \'AuthEncoding\', \'beautifulsoup4\', \'BTrees\',\n+ \'cffi\', \'Chameleon\', \'DateTime\', \'DocumentTemplate\',\n+ \'MultiMapping\', \'multipart\', \'PasteDeploy\', \'Persistence\', \'persistent\',\n+ \'pycparser\', \'python-gettext\', \'pytz\', \'RestrictedPython\', \'roman\',\n+ \'soupsieve\', \'transaction\', \'waitress\', \'WebOb\', \'WebTest\', \'WSGIProxy2\',\n+ \'z3c.pt\', \'zc.lockfile\', \'ZConfig\', \'zExceptions\', \'ZODB\', \'zodbpickle\',\n+ \'zope.annotation\', \'zope.browser\', \'zope.browsermenu\', \'zope.browserpage\',\n+ \'zope.browserresource\', \'zope.cachedescriptors\', \'zope.component\',\n+ \'zope.configuration\', \'zope.container\', \'zope.contentprovider\',\n+ \'zope.contenttype\', \'zope.datetime\', \'zope.deferredimport\',\n+ \'zope.deprecation\', \'zope.dottedname\', \'zope.event\', \'zope.exceptions\',\n+ \'zope.filerepresentation\', \'zope.globalrequest\', \'zope.hookable\',\n+ \'zope.i18n\', \'zope.i18nmessageid\', \'zope.interface\', \'zope.lifecycleevent\',\n+ \'zope.location\', \'zope.pagetemplate\', \'zope.processlifetime\', \'zope.proxy\',\n+ \'zope.ptresource\', \'zope.publisher\', \'zope.schema\', \'zope.security\',\n+ \'zope.sequencesort\', \'zope.site\', \'zope.size\', \'zope.structuredtext\',\n+ \'zope.tal\', \'zope.tales\', \'zope.testbrowser\', \'zope.testing\',\n+ \'zope.traversing\', \'zope.viewlet\'\n+]\n+\'Products.CMFCore\' = [\n+ \'docutils\', \'five.localsitemanager\', \'Missing\', \'Products.BTreeFolder2\',\n+ \'Products.GenericSetup\', \'Products.MailHost\', \'Products.PythonScripts\',\n+ \'Products.StandardCacheManagers\', \'Products.ZCatalog\', \'Record\',\n+ \'zope.sendmail\', \'Zope\'\n+]\n+\'plone.base\' = [\n+ \'plone.batching\', \'plone.registry\', \'plone.schema\',\'plone.z3cform\',\n+ \'Products.CMFCore\', \'Products.CMFDynamicViewFTI\',\n+]\n+python-dateutil = [\'dateutil\']\n+pytest-plone = [\'pytest\', \'zope.pytestlayer\', \'plone.testing\', \'plone.app.testing\']\n+\'Products.CMFPlone\' = [\'Acquisition\', \'BTrees\', \'Missing\', \'OFS\', \'plone.app.contenttypes\', \'plone.app.layout\', \'plone.app.linkintegrity\', \'plone.app.redirector\', \'plone.app.registry\', \'plone.app.textfield\', \'plone.app.vocabularies\', \'plone.app.z3cform\', \'plone.autoform\', \'plone.base\', \'plone.behavior\', \'plone.dexterity\', \'plone.indexer\', \'plone.namedfile\', \'plone.protect\', \'plone.registry\', \'plone.rfc822\', \'plone.schema\', \'plone.supermodel\', \'Products.BTreeFolder2\', \'Products.CMFCore\', \'Products.Five\', \'Products.GenericSetup\', \'Products.SiteErrorLog\', \'transaction\', \'z3c.form\', \'z3c.relationfield\', \'zope.component\', \'zope.i18n\', \'zope.i18nmessageid\', \'zope.interface\', \'zope.lifecycleevent\', \'zope.publisher\', \'zope.schema\', \'Zope\']\n+\'plone.restapi\' = [\'plone.rest\']\n+ignore-packages = [\'collective.folderishtypes\', \'plone.app.caching\', \'plone.app.multilingual\', \'requests\', \'responses\', \'scripts.utils\', \'zest.releaser\', \'zestreleaser.towncrier\']\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# dependencies_ignores = "[\'zestreleaser.towncrier\']"\n+# dependencies_mappings = [\n+# "gitpython = [\'git\']",\n+# "pygithub = [\'github\']",\n+# ]\n+##\n+\n+[tool.check-manifest]\n+ignore = [\n+ ".editorconfig",\n+ ".flake8",\n+ ".meta.toml",\n+ ".pre-commit-config.yaml",\n+ "dependabot.yml",\n+ "mx.ini",\n+ "tox.ini",\n+\n+]\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# check_manifest_ignores = """\n+# "*.map.js",\n+# "*.pyc",\n+# """\n+# check_manifest_extra_lines = """\n+# ignore-bad-ideas = [\n+# "some/test/file/PKG-INFO",\n+# ]\n+# """\n+##\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [pyproject]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/requirements.txt b/requirements.txt\nindex 60844c79..da443200 100644\n--- a/requirements.txt\n+++ b/requirements.txt\n@@ -1,11 +1 @@\n-# Keep this file in sync with: https://github.com/kitconcept/buildout/edit/master/requirements.txt\n-setuptools==54.0.0\n-zc.buildout==3.0.0b2\n-pip==21.0.1\n-\n-# Windows specific down here (has to be installed here, fails in buildout)\n-# Dependency of zope.sendmail:\n-pywin32 ; platform_system == \'Windows\'\n-\n-# SSL Certs on windows, because Python is missing them otherwise:\n-certifi ; platform_system == \'Windows\'\n\\ No newline at end of file\n+-c constraints.txt\ndiff --git a/requirements/dev.txt b/requirements/dev.txt\ndeleted file mode 100644\nindex 17e79de8..00000000\n--- a/requirements/dev.txt\n+++ /dev/null\n@@ -1 +0,0 @@\n--e ".[test]"\n\\ No newline at end of file\ndiff --git a/requirements/plone-5.2.txt b/requirements/plone-5.2.txt\ndeleted file mode 100644\nindex cd1dfbbc..00000000\n--- a/requirements/plone-5.2.txt\n+++ /dev/null\n@@ -1,4 +0,0 @@\n--c https://dist.plone.org/release/5.2.6/constraints.txt\n-wheel\n-Plone\n-Paste\n\\ No newline at end of file\ndiff --git a/requirements/plone-6.0.txt b/requirements/plone-6.0.txt\ndeleted file mode 100644\nindex 3a0e3a80..00000000\n--- a/requirements/plone-6.0.txt\n+++ /dev/null\n@@ -1,3 +0,0 @@\n--c https://dist.plone.org/release/6.0.0a2/constraints.txt\n-wheel\n-Plone\n\\ No newline at end of file\ndiff --git a/requirements/prod.txt b/requirements/prod.txt\ndeleted file mode 100644\nindex 9c558e35..00000000\n--- a/requirements/prod.txt\n+++ /dev/null\n@@ -1 +0,0 @@\n-.\ndiff --git a/scripts/update_translations.sh b/scripts/update_translations.sh\ndeleted file mode 100755\nindex 314e7c82..00000000\n--- a/scripts/update_translations.sh\n+++ /dev/null\n@@ -1,22 +0,0 @@\n-#!/bin/bash\n-\n-set -euxo pipefail\n-\n-domain=plone.volto\n-maindir=src/plone/volto\n-locales=$maindir/locales\n-echo "Update translations for $domain"\n-if [ ! -f $locales/$domain.pot ]; then\n- # Create .pot file if it does not exist yet\n- touch $locales/$domain.pot\n-fi\n-if [ ! -f $locales/de/LC_MESSAGES ]; then\n- # Create de/LC_MESSAGES directory if it does not exist yet\n- mkdir -p $locales/de/LC_MESSAGES\n-fi\n-if [ ! -f $locales/de/LC_MESSAGES/$domain.po ]; then\n- # Create .po file if it does not exist yet\n- touch $locales/de/LC_MESSAGES/$domain.po\n-fi\n-bin/i18ndude rebuild-pot --pot $locales/$domain.pot --create $domain $maindir\n-bin/i18ndude sync --pot $locales/$domain.pot $locales/*/LC_MESSAGES/$domain.po\ndiff --git a/setup.cfg b/setup.cfg\ndeleted file mode 100644\nindex cd4ad7ca..00000000\n--- a/setup.cfg\n+++ /dev/null\n@@ -1,16 +0,0 @@\n-[check-manifest]\n-ignore =\n- *.cfg\n- .coveragerc\n- .editorconfig\n- .gitattributes\n- scripts/update_translations.sh\n-\n-[isort]\n-# black compatible Plone isort rules:\n-# for details see\n-# https://github.com/plone/Products.CMFPlone/issues/3497\n-profile = black\n-force_alphabetical_sort = True\n-force_single_line = True\n-lines_after_imports = 2\ndiff --git a/setup.py b/setup.py\nindex 67910950..d6a548d3 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -1,46 +1,31 @@\n-# -*- coding: utf-8 -*-\n-"""Installer for the plone.volto package."""\n-\n from setuptools import find_packages\n from setuptools import setup\n \n-import sys\n-\n-\n-assert sys.version_info >= (3, 6, 0), "plone.volto requires Python 3.7.0."\n-\n-\n-def readfile(name):\n- with open(name, encoding="utf-8") as myfile:\n- return myfile.read()\n-\n \n+# We must specify the encoding, otherwise it fails on Windows as it defaults to cp1252.\n long_description = "\\n\\n".join(\n [\n- readfile("README.rst"),\n- readfile("CONTRIBUTORS.rst"),\n- readfile("CHANGES.rst"),\n+ open("README.md", encoding="utf-8").read(),\n+ open("CHANGES.md", encoding="utf-8").read(),\n ]\n )\n \n+\n setup(\n name="plone.volto",\n- version="4.0.10.dev0",\n+ version="5.0.0b3.dev0",\n description="Volto integration add-on for Plone",\n long_description=long_description,\n- # Get more from https://pypi.org/classifiers/\n+ long_description_content_type="text/markdown",\n classifiers=[\n "Development Status :: 5 - Production/Stable",\n "Environment :: Web Environment",\n "Framework :: Plone",\n- "Framework :: Plone :: 5.2",\n- "Framework :: Plone :: 6.0",\n+ "Framework :: Plone :: 6.1",\n "Programming Language :: Python",\n- "Programming Language :: Python :: 3.7",\n- "Programming Language :: Python :: 3.8",\n- "Programming Language :: Python :: 3.9",\n "Programming Language :: Python :: 3.10",\n "Programming Language :: Python :: 3.11",\n+ "Programming Language :: Python :: 3.12",\n "Operating System :: OS Independent",\n "License :: OSI Approved :: GNU General Public License v2 (GPLv2)",\n ],\n@@ -54,26 +39,36 @@ def readfile(name):\n package_dir={"": "src"},\n include_package_data=True,\n zip_safe=False,\n- python_requires=">=3.7",\n+ python_requires=">=3.10",\n install_requires=[\n+ "collective.monkeypatcher",\n "plone.api",\n- "Products.GenericSetup",\n+ "plone.app.caching",\n+ "plone.distribution",\n+ "plone.restapi>=8.41.0",\n+ "Products.CMFPlone",\n "setuptools",\n- "plone.restapi>=8.13.0",\n- "plone.app.vocabularies>=4.3.0",\n- "collective.monkeypatcher",\n ],\n extras_require={\n "test": [\n+ "responses",\n+ "plone.app.discussion",\n+ "plone.app.iterate",\n+ "plone.app.multilingual",\n+ "plone.app.robotframework",\n "plone.app.testing",\n+ "plone.app.upgrade",\n+ "plone.restapi[test]",\n "plone.testing",\n- "plone.app.contenttypes",\n- "plone.app.robotframework[debug]",\n- "collective.MockMailHost",\n- "responses",\n+ "Products.CMFPlacefulWorkflow",\n+ "pytest-plone>=0.5.0",\n+ "zest.releaser[recommended]",\n+ "zestreleaser.towncrier",\n ]\n },\n entry_points="""\n+ [console_scripts]\n+ update_locale = plone.volto.locales.update:update_locale\n [z3c.autoinclude.plugin]\n target = plone\n """,\ndiff --git a/src/plone/__init__.py b/src/plone/__init__.py\nindex 03d08ffd..5284146e 100644\n--- a/src/plone/__init__.py\n+++ b/src/plone/__init__.py\n@@ -1,2 +1 @@\n-# -*- coding: utf-8 -*-\n __import__("pkg_resources").declare_namespace(__name__)\ndiff --git a/src/plone/volto/__init__.py b/src/plone/volto/__init__.py\nindex 9b42905b..f367862a 100644\n--- a/src/plone/volto/__init__.py\n+++ b/src/plone/volto/__init__.py\n@@ -1,11 +1,11 @@\n-# -*- coding: utf-8 -*-\n """Init and utils."""\n+\n from zope.i18nmessageid import MessageFactory\n \n import logging\n \n \n-PROJECTNAME = "plone.volto"\n-_ = MessageFactory(PROJECTNAME)\n-logger = logging.getLogger(PROJECTNAME)\n+PACKAGE_NAME = "plone.volto"\n+_ = MessageFactory(PACKAGE_NAME)\n+logger = logging.getLogger(PACKAGE_NAME)\n config = {}\ndiff --git a/src/plone/volto/bbb.py b/src/plone/volto/bbb.py\nnew file mode 100644\nindex 00000000..6eeff5d0\n--- /dev/null\n+++ b/src/plone/volto/bbb.py\n@@ -0,0 +1,27 @@\n+# flake8: noqa\n+from types import ModuleType\n+\n+import sys\n+\n+\n+# This was copied from plone.app.upgrade\n+# to avoid a hard dependency on it.\n+def alias_module(name, target):\n+ parts = name.split(".")\n+ i = 0\n+ module = None\n+ while i < len(parts) - 1:\n+ i += 1\n+ module_name = ".".join(parts[:i])\n+ try:\n+ __import__(module_name)\n+ except ImportError:\n+ new_module = ModuleType(module_name)\n+ sys.modules[module_name] = new_module\n+ if module is not None:\n+ setattr(module, parts[i - 1], new_module)\n+ module = sys.modules[module_name]\n+\n+ setattr(module, parts[-1], target)\n+ # also make sure sys.modules is updated\n+ sys.modules[module_name + "." + parts[-1]] = target\ndiff --git a/src/plone/volto/behaviors/configure.zcml b/src/plone/volto/behaviors/configure.zcml\nindex 47f096e4..fdb4df64 100644\n--- a/src/plone/volto/behaviors/configure.zcml\n+++ b/src/plone/volto/behaviors/configure.zcml\n@@ -1,7 +1,6 @@\n \n \n@@ -17,15 +16,13 @@\n provides=".preview.IPreview"\n />\n \n- \n- \n- \n- \n+ \n+ \n \n \n+ \n \n \ndiff --git a/src/plone/volto/behaviors/headtitle.py b/src/plone/volto/behaviors/headtitle.py\ndeleted file mode 100644\nindex 192f5a53..00000000\n--- a/src/plone/volto/behaviors/headtitle.py\n+++ /dev/null\n@@ -1,19 +0,0 @@\n-# -*- coding: utf-8 -*-\n-from plone.autoform.interfaces import IFormFieldProvider\n-from plone.supermodel import model\n-from plone.volto import _\n-from zope import schema\n-from zope.interface import provider\n-\n-\n-@provider(IFormFieldProvider)\n-class IHeadTitle(model.Schema):\n-\n- head_title = schema.TextLine(\n- title=_("label_head_title", default="Header title"),\n- required=False,\n- description=_(\n- "help_head_title",\n- default="The header title is shown above the title in teasers.",\n- ),\n- )\ndiff --git a/src/plone/volto/behaviors/kicker.py b/src/plone/volto/behaviors/kicker.py\nnew file mode 100644\nindex 00000000..1f1ab37e\n--- /dev/null\n+++ b/src/plone/volto/behaviors/kicker.py\n@@ -0,0 +1,24 @@\n+from plone.autoform.interfaces import IFormFieldProvider\n+from plone.supermodel import model\n+from plone.volto import _\n+from zope import schema\n+from zope.interface import provider\n+\n+\n+@provider(IFormFieldProvider)\n+class IKicker(model.Schema):\n+\n+ # The field itself is named head_title, for backwards-compatibility.\n+ head_title = schema.TextLine(\n+ title=_("label_kicker", default="Kicker"),\n+ required=False,\n+ description=_(\n+ "help_kicker",\n+ default="The kicker is a line of text shown above the title.",\n+ ),\n+ )\n+\n+\n+@provider(IFormFieldProvider)\n+class IHeadTitle(IKicker):\n+ """alias for backwards-compatibility"""\ndiff --git a/src/plone/volto/behaviors/navtitle.py b/src/plone/volto/behaviors/navtitle.py\nindex f7392afe..2b68068c 100644\n--- a/src/plone/volto/behaviors/navtitle.py\n+++ b/src/plone/volto/behaviors/navtitle.py\n@@ -1,4 +1,3 @@\n-# -*- coding: utf-8 -*-\n from plone.autoform.interfaces import IFormFieldProvider\n from plone.supermodel import model\n from plone.volto import _\ndiff --git a/src/plone/volto/behaviors/preview.py b/src/plone/volto/behaviors/preview.py\nindex 705b23db..c5ea13c6 100644\n--- a/src/plone/volto/behaviors/preview.py\n+++ b/src/plone/volto/behaviors/preview.py\n@@ -1,4 +1,3 @@\n-# -*- coding: utf-8 -*-\n from plone.autoform.interfaces import IFormFieldProvider\n from plone.namedfile import field as namedfile\n from plone.supermodel import model\ndiff --git a/src/plone/volto/behaviors/preview_link.py b/src/plone/volto/behaviors/preview_link.py\nindex 838088fb..4f40e059 100644\n--- a/src/plone/volto/behaviors/preview_link.py\n+++ b/src/plone/volto/behaviors/preview_link.py\n@@ -1,4 +1,3 @@\n-# -*- coding: utf-8 -*-\n from plone import api\n from plone.app.z3cform.widget import RelatedItemsFieldWidget\n from plone.autoform import directives\n@@ -56,16 +55,19 @@ def __init__(self, field, context, request):\n \n def __call__(self):\n value = self.field.get(self.context)\n- linked_image = value.to_object\n- primary_field = IPrimaryFieldInfo(linked_image).field\n- serializer = queryMultiAdapter(\n- (primary_field, linked_image, self.request), IImageScalesFieldAdapter\n- )\n- if serializer is not None:\n- values = serializer()\n- if values:\n- portal_url = api.portal.get().absolute_url()\n- base_path = linked_image.absolute_url().replace(portal_url, "")\n- for value in values:\n- value["base_path"] = base_path\n- return values\n+ if value:\n+ linked_image = value.to_object\n+ primary_field = IPrimaryFieldInfo(linked_image).field\n+ serializer = queryMultiAdapter(\n+ (primary_field, linked_image, self.request), IImageScalesFieldAdapter\n+ )\n+ if serializer is not None:\n+ values = serializer()\n+ if values:\n+ portal_url = api.portal.get().absolute_url()\n+ base_path = linked_image.absolute_url().replace(portal_url, "")\n+ for value in values:\n+ value["base_path"] = base_path\n+ return values\n+\n+ return []\ndiff --git a/src/plone/volto/blocksuuidfixer.py b/src/plone/volto/blocksuuidfixer.py\nindex 05071739..f1bf0fbf 100644\n--- a/src/plone/volto/blocksuuidfixer.py\n+++ b/src/plone/volto/blocksuuidfixer.py\n@@ -36,9 +36,7 @@ def __call__(self):\n obj.blocks_layout = new_blocks_layout\n \n output.append("\\n")\n- output.append(\n- "New blocks for {}\\n {}\\n".format(obj.absolute_url(), new_blocks)\n- )\n+ output.append(f"New blocks for {obj.absolute_url()}\\n {new_blocks}\\n")\n output.append(\n "New layout for {}\\n {}\\n".format(\n obj.absolute_url(), new_blocks_layout\ndiff --git a/src/plone/volto/browser/breadcrumbs.py b/src/plone/volto/browser/breadcrumbs.py\nindex c66bb1dc..9799865c 100644\n--- a/src/plone/volto/browser/breadcrumbs.py\n+++ b/src/plone/volto/browser/breadcrumbs.py\n@@ -1,4 +1,3 @@\n-# -*- coding: utf-8 -*-\n from Acquisition import aq_base\n from Acquisition import aq_inner\n from Acquisition import aq_parent\ndiff --git a/src/plone/volto/browser/configure.zcml b/src/plone/volto/browser/configure.zcml\nindex faffda5c..fae56fa4 100644\n--- a/src/plone/volto/browser/configure.zcml\n+++ b/src/plone/volto/browser/configure.zcml\n@@ -19,7 +19,6 @@\n allowed_attributes="breadcrumbs"\n permission="zope.Public"\n layer="plone.volto.interfaces.IPloneVoltoCoreLayer"\n- zcml:condition="have plone-5"\n />\n \n \n \n- \n+ \n+ \n \n- \n+ \n+ \n \n \n+ metal:use-macro="context/main_template/macros/master"\n+ i18n:domain="plone.volto"\n+>\n \n-
\n+
\n \n \n-

Migrate Richtext to Slate Block

\n+

Migrate Richtext to Slate Block

\n \n-

Migrate text from RichText-fields to text in the Volto Editor

\n+

Migrate text from RichText-fields to text in the Volto Editor

\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-
\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+
\n \n \ndiff --git a/src/plone/volto/browser/migrate_richtext.py b/src/plone/volto/browser/migrate_richtext.py\nindex c0e74c8c..4e86281d 100644\n--- a/src/plone/volto/browser/migrate_richtext.py\n+++ b/src/plone/volto/browser/migrate_richtext.py\n@@ -1,7 +1,7 @@\n from logging import getLogger\n from operator import itemgetter\n from plone import api\n-from plone.app.contenttypes.behaviors.leadimage import ILeadImage\n+from plone.app.contenttypes.behaviors.leadimage import ILeadImageBehavior\n from plone.app.textfield.value import RichTextValue\n from Products.Five import BrowserView\n from uuid import uuid4\n@@ -35,7 +35,7 @@ def __call__(self):\n slate=self.slate,\n )\n api.portal.show_message(\n- "Migrated {} items from richtext to blocks".format(results),\n+ f"Migrated {results} items from richtext to blocks",\n request=self.request,\n )\n return self.index()\n@@ -102,7 +102,7 @@ def migrate_richtext_to_blocks(\n blocks[uuid] = {"@type": "description"}\n blocks_layout["items"].append(uuid)\n \n- if ILeadImage(obj, None) and ILeadImage(obj).image:\n+ if ILeadImageBehavior(obj, None) and ILeadImageBehavior(obj).image:\n uuid = str(uuid4())\n blocks[uuid] = {"@type": "leadimage"}\n blocks_layout["items"].append(uuid)\n@@ -127,7 +127,7 @@ def migrate_richtext_to_blocks(\n logger.debug(f"Migrated richtext to blocks for: {obj.absolute_url()}")\n \n if not index % 1000:\n- logger.info(f"Commiting after {index} items...")\n+ logger.info(f"Committing after {index} items...")\n transaction.commit()\n msg = f"Migrated {index} {portal_type} to blocks"\n logger.info(msg)\n@@ -161,7 +161,7 @@ def get_blocks_from_richtext(\n \n \n def types_with_blocks():\n- """A list of content types with volto.blocks behavior"""\n+ """A list of content types with volto.blocks behavior."""\n portal_types = api.portal.get_tool("portal_types")\n results = []\n for fti in portal_types.listTypeInfo():\ndiff --git a/src/plone/volto/browser/migrate_to_volto.pt b/src/plone/volto/browser/migrate_to_volto.pt\nindex 684298b3..eb887c66 100644\n--- a/src/plone/volto/browser/migrate_to_volto.pt\n+++ b/src/plone/volto/browser/migrate_to_volto.pt\n@@ -1,52 +1,75 @@\n \n+ metal:use-macro="context/main_template/macros/master"\n+ i18n:domain="plone.volto"\n+>\n \n-
\n-\n+
\n+ \n \n-

Migrate to Volto

\n+

Migrate to Volto

\n \n-

Here you can prepare this site for Volto.

\n+

Here you can prepare this site for Volto.

\n \n-

What is Volto?

\n-

Volto is a React-based frontend for Plone. It is the default UI for Plone 6. Volto is a separate server-side application.

\n+

What is Volto?

\n+

Volto is a React-based frontend for Plone. It is the default UI for Plone 6. Volto is a separate server-side application.

\n \n-

What do you need for Volto?

\n-

Volto needs to run continuously alongside the current Plone backend service from which you access this wizard. The Volto \n+

What do you need for Volto?

\n+

Volto needs to run continuously alongside the current Plone backend service from which you access this wizard. The Volto\n server performs initial server-side rendering (SSR) of the React application for pages. It also delivers the JavaScript frontend\n to your browser. Without a Volto frontend prepared for this website and the means to host it, continuing this migration makes no\n- sense! Read the Volto Frontend documentation for more information.

\n-\n-

What will happen?

\n-

When you click on "Migrate to Volto" at the end of the form, the following things will happen:

\n-
    \n-
  1. Install the package plone.volto and plone.restapi.
  2. \n+ sense! Read the\n+ Volto Frontend documentation\n+ for more information.

    \n+\n+

    What will happen?

    \n+

    When you click on "Migrate to Volto" at the end of the form, the following things will happen:

    \n+
      \n+
    1. Install the package\n+ plone.volto\n+ and\n+ plone.restapi.
    2. \n
    3. The HTML of RichText fields (previously edited using TinyMCE) is converted into Volto blocks so you can edit it in Volto.
    4. \n
    5. Pages, News Items, and Events are made folderish. That means they can contain other content, such as Images or Pages.
    6. \n
    7. Default Pages of Folders are merged with the Folderish Pages that replace the Folder wherever that is possible.\n- This works well with Pages and Collections where the text and/or query are added to the folderish page that replaces the Folder.
    8. \n+ This works well with Pages and Collections where the text and/or query are added to the folderish page that replaces the Folder.\n
    9. Collections are migrated to Pages with Listing Blocks configured like the Collection.
    10. \n-
    \n+
\n \n-

A site migrated to Volto in this Plone backend will still be accessible through the Plone Classic User Interface but with\n+

A site migrated to Volto in this Plone backend will still be accessible through the Plone Classic User Interface but with\n limited functionality. The core content types will have all their GUI RichText fields replaced by the blocks behavior for\n- the composition of the main content. So after migration you can only edit this content using the Volto UI.

\n+ the composition of the main content. So after migration you can only edit this content using the Volto UI.

\n \n-
\n+ \n \n \n \n-

Requirements for this migration wizard

\n+

Requirements for this migration wizard

\n
    \n-
  • \n- To migrate RichText to Volto Blocks you need to have blocks-conversion-tool running on an accessible URL.\n- The easiest way to have that running on your machine is: docker run -it -p 5000:5000 plone/blocks-conversion-tool:latest.\n- More for options read https://github.com/plone/blocks-conversion-tool.\n-
  • \n+
  • \n+ To migrate RichText to Volto Blocks you need to have\n+ blocks-conversion-tool\n+ running on an accessible URL.\n+ The easiest way to have that running on your machine is:\n+ docker run -it -p 5000:5000 plone/blocks-conversion-tool:latest.\n+ More for options read\n+ https://github.com/plone/blocks-conversion-tool.\n+
  • \n
\n \n

Advanced settings

\n@@ -55,78 +78,122 @@\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 \n-
\n+ \n \n-
\n-
\n+
\n+
\n \n \ndiff --git a/src/plone/volto/browser/migrate_to_volto.py b/src/plone/volto/browser/migrate_to_volto.py\nindex d10fa7a6..355e49ef 100644\n--- a/src/plone/volto/browser/migrate_to_volto.py\n+++ b/src/plone/volto/browser/migrate_to_volto.py\n@@ -271,7 +271,7 @@ def generate_listing_block_from_collection(obj, move_relative_path=False):\n "summary_view": "summary",\n "album_view": "imageGallery",\n }\n- variation = variation_mapping.get(obj.getLayout, "default")\n+ variation = variation_mapping.get(obj.getLayout(), "default")\n block = {\n "@type": "listing",\n "querystring": qs,\n@@ -299,7 +299,7 @@ def make_document(obj, service_url="http://localhost:5000/html", slate=True):\n blocks_layout["items"].insert(1, uuid)\n \n fti = getUtility(IDexterityFTI, name=obj.portal_type)\n- # When volto.blocks is there was alrady done by migrate_richtext\n+ # When volto.blocks is there was already done by migrate_richtext\n # This happens with Collections\n if "volto.blocks" not in fti.behaviors:\n text = getattr(obj.aq_base, "text", None)\ndiff --git a/src/plone/volto/browser/navigation.py b/src/plone/volto/browser/navigation.py\nindex 20a5050d..66941a84 100644\n--- a/src/plone/volto/browser/navigation.py\n+++ b/src/plone/volto/browser/navigation.py\n@@ -1,4 +1,3 @@\n-# -*- coding: utf-8 -*-\n from Acquisition import aq_inner\n from Missing import Missing\n from plone.app.layout.navigation.root import getNavigationRoot\ndiff --git a/src/plone/volto/browser/voltobackendwarning.pt b/src/plone/volto/browser/voltobackendwarning.pt\nindex 068a4a68..cef8966b 100644\n--- a/src/plone/volto/browser/voltobackendwarning.pt\n+++ b/src/plone/volto/browser/voltobackendwarning.pt\n@@ -1,25 +1,29 @@\n-\n+\n \n- \n \n \ndiff --git a/src/plone/volto/configure.zcml b/src/plone/volto/configure.zcml\nindex 84dec901..f2875b30 100644\n--- a/src/plone/volto/configure.zcml\n+++ b/src/plone/volto/configure.zcml\n@@ -5,7 +5,6 @@\n xmlns:i18n="http://namespaces.zope.org/i18n"\n xmlns:monkey="http://namespaces.plone.org/monkey"\n xmlns:plone="http://namespaces.plone.org/plone"\n- xmlns:zcml="http://namespaces.zope.org/zcml"\n i18n_domain="plone.volto"\n >\n \n@@ -15,21 +14,23 @@\n \n \n \n+ \n \n \n \n \n+ \n \n \n \n \n@@ -39,64 +40,35 @@\n name="volto-settings"\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 \n \ndiff --git a/src/plone/volto/content.py b/src/plone/volto/content.py\nindex 0756a2b1..97c96d3c 100644\n--- a/src/plone/volto/content.py\n+++ b/src/plone/volto/content.py\n@@ -1,4 +1,3 @@\n-# -*- coding: utf-8 -*-\n from plone.app.contenttypes.interfaces import IDocument\n from plone.app.contenttypes.interfaces import IEvent\n from plone.app.contenttypes.interfaces import INewsItem\ndiff --git a/src/plone/volto/controlpanel.py b/src/plone/volto/controlpanel.py\nindex 77007fde..2dfda982 100644\n--- a/src/plone/volto/controlpanel.py\n+++ b/src/plone/volto/controlpanel.py\n@@ -1,4 +1,3 @@\n-# -*- coding: UTF-8 -*-\n from plone.app.registry.browser.controlpanel import ControlPanelFormWrapper\n from plone.app.registry.browser.controlpanel import RegistryEditForm\n from plone.restapi.controlpanels import RegistryConfigletPanel\n@@ -13,10 +12,10 @@ class VoltoSettingsEditForm(RegistryEditForm):\n schema_prefix = "volto"\n \n def updateFields(self):\n- super(VoltoSettingsEditForm, self).updateFields()\n+ super().updateFields()\n \n def updateWidgets(self):\n- super(VoltoSettingsEditForm, self).updateWidgets()\n+ super().updateWidgets()\n \n \n class VoltoSettingsControlPanel(ControlPanelFormWrapper):\ndiff --git a/src/plone/volto/coresandbox/example.py b/src/plone/volto/coresandbox/example.py\nindex 7b9524f1..535ac7ec 100644\n--- a/src/plone/volto/coresandbox/example.py\n+++ b/src/plone/volto/coresandbox/example.py\n@@ -1,4 +1,3 @@\n-# -*- coding: utf-8 -*-\n from plone.app.textfield import RichText\n from plone.app.vocabularies.catalog import CatalogSource\n from plone.app.vocabularies.catalog import StaticCatalogVocabulary\ndiff --git a/src/plone/volto/default_homepage/default.py b/src/plone/volto/default_homepage/default.py\ndeleted file mode 100644\nindex 9a97897a..00000000\n--- a/src/plone/volto/default_homepage/default.py\n+++ /dev/null\n@@ -1,737 +0,0 @@\n-# flake8: noqa\n-from datetime import datetime\n-\n-\n-default_home = {\n- "draftJS": {\n- "title": "Welcome to Volto!",\n- "description": "The React powered content management system",\n- "blocks": {\n- "0358abe2-b4f1-463d-a279-a63ea80daf19": {"@type": "description"},\n- "07c273fc-8bfc-4e7d-a327-d513e5a945bb": {"@type": "title"},\n- "2dfe8e4c-5bf6-43f1-93e1-6c320ede7226": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [\n- {"length": 10, "offset": 0, "style": "BOLD"}\n- ],\n- "key": "6470b",\n- "text": "Disclaimer: This instance is reset every night, so all changes will be lost afterwards.",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "3c881f51-f75b-4959-834a-6e1d5edc32ae": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [\n- {"length": 5, "offset": 6, "style": "BOLD"}\n- ],\n- "key": "ekn3l",\n- "text": "user: admin",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "5e1c30b1-ec6c-4dc0-9483-9768c3c416e4": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [\n- {"key": 0, "length": 5, "offset": 0},\n- {"key": 1, "length": 8, "offset": 455},\n- ],\n- "inlineStyleRanges": [],\n- "key": "behki",\n- "text": "Plone is a CMS built on Python with over 19 years of experience. Plone has very interesting features that appeal to developers and users alike, such as customizable content types, hierarchical URL object traversing and a sophisticated content workflow powered by a granular permissions model. This allows you to build anything from simple websites to enterprise-grade intranets. Volto exposes all these features and communicates with Plone via its mature REST API. Volto can be esily themed and is highly customizable.",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {\n- "0": {\n- "data": {\n- "href": "https://plone.org",\n- "rel": "nofollow",\n- "url": "https://plone.org/",\n- },\n- "mutability": "MUTABLE",\n- "type": "LINK",\n- },\n- "1": {\n- "data": {\n- "href": "https://github.com/plone/plone.restapi",\n- "url": "https://github.com/plone/plone.restapi",\n- },\n- "mutability": "MUTABLE",\n- "type": "LINK",\n- },\n- },\n- },\n- },\n- "61cc1bc0-d4f5-4e2b-9152-79512045a4dd": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "9qsa4",\n- "text": "Demo",\n- "type": "header-two",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "874049e7-629e-489a-b46c-1adf35ad40ee": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "9pnjr",\n- "text": "Happy hacking!",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "942b6530-2407-420f-9c24-597adda6b2ce": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [{"key": 0, "length": 36, "offset": 39}],\n- "inlineStyleRanges": [],\n- "key": "6a248",\n- "text": "Last but not least, it also supports a Volto Nodejs-based backend reference API implementation that demos how other systems could also use Volto to display and create content through it.",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {\n- "0": {\n- "data": {\n- "href": "https://github.com/plone/volto-reference-backend",\n- "url": "https://github.com/plone/volto-reference-backend",\n- },\n- "mutability": "MUTABLE",\n- "type": "LINK",\n- }\n- },\n- },\n- },\n- "9a976b8e-72ba-468a-bea8-b37a31bb386b": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [\n- {"length": 12, "offset": 51, "style": "BOLD"}\n- ],\n- "key": "94arl",\n- "text": "You can log in and use it as admin user using these credentials:",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "b3717238-448f-406e-b06f-57a9715c3326": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [{"key": 0, "length": 5, "offset": 0}],\n- "inlineStyleRanges": [],\n- "key": "1bnna",\n- "text": "Volto is a React-based frontend for content management systems, currently supporting three backend implementations: Plone, Guillotina and a NodeJS reference implementation.",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {\n- "0": {\n- "data": {\n- "href": "https://github.com/plone/volto",\n- "url": "https://github.com/plone/volto",\n- },\n- "mutability": "MUTABLE",\n- "type": "LINK",\n- }\n- },\n- },\n- },\n- "c049ff8b-3e5a-4cfb-bca6-e4a6cca9be28": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "55n44",\n- "text": "You can use this site to test Volto. It runs on the master branch of Volto using latest Plone 5.2 Backend running on Python 3.",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "c91f0fe9-f2e9-4a17-84a5-8e4f2678ed3c": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [\n- {"length": 5, "offset": 10, "style": "BOLD"}\n- ],\n- "key": "buncq",\n- "text": "password: admin",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "e0ca2fbc-7800-4b9b-afe5-8e42af9f5dd6": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "f0prj",\n- "text": f"{datetime.now().year} - Volto Team - Plone Foundation",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "effbdcdc-253c-41a7-841e-5edb3b56ce32": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [{"key": 0, "length": 10, "offset": 36}],\n- "inlineStyleRanges": [],\n- "key": "68rve",\n- "text": "Volto also supports other APIs like Guillotina, a Python resource management system, inspired by Plone and using the same basic concepts like traversal, content types, and permissions model.",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {\n- "0": {\n- "data": {\n- "href": "https://guillotina.io/",\n- "rel": "nofollow",\n- "url": "https://guillotina.io/",\n- },\n- "mutability": "MUTABLE",\n- "type": "LINK",\n- }\n- },\n- },\n- },\n- },\n- "blocks_layout": {\n- "items": [\n- "07c273fc-8bfc-4e7d-a327-d513e5a945bb",\n- "0358abe2-b4f1-463d-a279-a63ea80daf19",\n- "b3717238-448f-406e-b06f-57a9715c3326",\n- "5e1c30b1-ec6c-4dc0-9483-9768c3c416e4",\n- "effbdcdc-253c-41a7-841e-5edb3b56ce32",\n- "942b6530-2407-420f-9c24-597adda6b2ce",\n- "61cc1bc0-d4f5-4e2b-9152-79512045a4dd",\n- "c049ff8b-3e5a-4cfb-bca6-e4a6cca9be28",\n- "9a976b8e-72ba-468a-bea8-b37a31bb386b",\n- "3c881f51-f75b-4959-834a-6e1d5edc32ae",\n- "c91f0fe9-f2e9-4a17-84a5-8e4f2678ed3c",\n- "2dfe8e4c-5bf6-43f1-93e1-6c320ede7226",\n- "874049e7-629e-489a-b46c-1adf35ad40ee",\n- "e0ca2fbc-7800-4b9b-afe5-8e42af9f5dd6",\n- ]\n- },\n- },\n- "slate": {\n- "title": "Welcome to Plone 6!",\n- "blocks": {\n- "07c273fc-8bfc-4e7d-a327-d513e5a945bb": {"@type": "title"},\n- "09bd0162-397d-4141-983d-8f03ac2c481c": {\n- "@type": "slate",\n- "plaintext": "If you\'re seeing this text instead of the web site you were expecting, the owner of this web site has just installed Plone. Do not contact the Plone Team or the Plone support channels about this.",\n- "value": [\n- {\n- "children": [\n- {\n- "text": "If you\'re seeing this text instead of the web site you were expecting, the owner of this web site has just installed Plone. Do not contact the Plone Team or the Plone support channels about this."\n- }\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "eec7a1b7-40ab-49e1-a1ba-a8bc3d838598": {\n- "@type": "slate",\n- "plaintext": "Get started",\n- "value": [{"children": [{"text": "Get started"}], "type": "h2"}],\n- },\n- "eb436460-6bd6-418d-b788-a9f09c0a1f73": {\n- "@type": "slate",\n- "plaintext": "Before you start exploring your newly created Plone site, please do the following:",\n- "value": [\n- {\n- "children": [\n- {\n- "text": "Before you start exploring your newly created Plone site, please do the following:"\n- }\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "4d8a7881-111b-4d57-b2e6-788e8ede90a9": {\n- "@type": "slate",\n- "plaintext": "Make sure you are logged in as an admin/manager user. You should have a Site Setup entry in the user menu. Set up your mail server . Plone needs a valid SMTP server to verify users and send out password reminders. Decide what security level you want on your site. Allow self registration, password policies, and more.",\n- "value": [\n- {\n- "children": [\n- {\n- "children": [\n- {\n- "text": "Make sure you are logged in as an admin/manager user. You should have a Site Setup entry in the user menu."\n- }\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [\n- {"text": "Set up your mail server"}\n- ],\n- "data": {"url": "/controlpanel/mail"},\n- "type": "link",\n- },\n- {\n- "text": ". Plone needs a valid SMTP server to verify users and send out password reminders."\n- },\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [\n- {\n- "text": "Decide what security level you want on your"\n- }\n- ],\n- "data": {"url": "/controlpanel/security"},\n- "type": "link",\n- },\n- {\n- "text": " site. Allow self registration, password policies, and more."\n- },\n- ],\n- "type": "li",\n- },\n- ],\n- "type": "ol",\n- }\n- ],\n- },\n- "97cd02b5-29fc-4993-afe2-3cc5fe5bd85b": {\n- "@type": "slate",\n- "plaintext": "Get comfortable",\n- "value": [{"children": [{"text": "Get comfortable"}], "type": "h2"}],\n- },\n- "b6ad38e2-1736-407e-a327-dcea2206f707": {\n- "@type": "slate",\n- "plaintext": "After that, we suggest you do one or more of the following:",\n- "value": [\n- {\n- "children": [\n- {\n- "text": "After that, we suggest you do one or more of the following:"\n- }\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "37997f0f-ed85-44b0-a579-d3ff00e5a974": {\n- "@type": "slate",\n- "plaintext": "Get the latest news about Plone. Read the documentation . Follow a training . Explore the available add-ons for Plone. Read or subscribe to the support channels .",\n- "value": [\n- {\n- "children": [\n- {\n- "children": [\n- {"text": "Get the latest "},\n- {\n- "children": [{"text": "news"}],\n- "data": {\n- "url": "https://plone.org/news-and-events"\n- },\n- "type": "link",\n- },\n- {"text": " about Plone."},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": "Read the "},\n- {\n- "children": [{"text": "documentation"}],\n- "data": {"url": "https://6.docs.plone.org"},\n- "type": "link",\n- },\n- {"text": "."},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": "Follow a "},\n- {\n- "children": [{"text": "training"}],\n- "data": {"url": "https://training.plone.org"},\n- "type": "link",\n- },\n- {"text": "."},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": "Explore the "},\n- {\n- "children": [{"text": "available add-ons"}],\n- "data": {\n- "url": "https://plone.org/download/add-ons"\n- },\n- "type": "link",\n- },\n- {"text": " for Plone."},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": "Read or subscribe to the "},\n- {\n- "children": [{"text": "support channels"}],\n- "data": {"url": "https://plone.org/support"},\n- "type": "link",\n- },\n- {"text": "."},\n- ],\n- "type": "li",\n- },\n- ],\n- "type": "ul",\n- }\n- ],\n- },\n- "35fb577b-bbc8-4e5a-b88e-b89631d13640": {\n- "@type": "slate",\n- "plaintext": "Make it your own",\n- "value": [{"children": [{"text": "Make it your own"}], "type": "h2"}],\n- },\n- "dbe0349e-6577-46bd-9ede-685b81d2e814": {\n- "@type": "slate",\n- "plaintext": "Plone has many settings to make it do what you want. Some examples include:",\n- "value": [\n- {\n- "children": [\n- {\n- "text": "Plone has many settings to make it do what you want. Some examples include:"\n- }\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "ffbec3a5-a970-4c43-8897-68cc1022bcb9": {\n- "@type": "slate",\n- "plaintext": "Create content-types and define their default-layout in the content types controlpanel Manage Users, Groups and their Roles in the users and groups controlpanels ...and many more settings are available in the Site Setup .",\n- "value": [\n- {\n- "children": [\n- {\n- "children": [\n- {\n- "text": "Create content-types and define their default-layout in the "\n- },\n- {\n- "children": [\n- {"text": "content types controlpanel"}\n- ],\n- "data": {\n- "url": "/controlpanel/dexterity-types"\n- },\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {\n- "text": "Manage Users, Groups and their Roles in the "\n- },\n- {\n- "children": [{"text": "users"}],\n- "data": {"url": "/controlpanel/users"},\n- "type": "link",\n- },\n- {"text": " and "},\n- {\n- "children": [{"text": "groups"}],\n- "data": {"url": "/controlpanel/groups"},\n- "type": "link",\n- },\n- {"text": " controlpanels"},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {\n- "text": "...and many more settings are available in the "\n- },\n- {\n- "children": [{"text": "Site Setup"}],\n- "data": {"url": "/controlpanel"},\n- "type": "link",\n- },\n- {"text": "."},\n- ],\n- "type": "li",\n- },\n- ],\n- "type": "ul",\n- }\n- ],\n- },\n- "c53b5868-ccba-4fee-b504-bf3867bb1ef0": {\n- "@type": "slate",\n- "plaintext": "About Plone and Volto",\n- "value": [\n- {"children": [{"text": "About Plone and Volto"}], "type": "h2"}\n- ],\n- },\n- "38ff6b46-4cbd-4933-a462-251c3e963b7a": {\n- "@type": "slate",\n- "plaintext": " Plone is a content management system built on Python, with its first release in 2001. Plone has features that appeal to developers and users alike, such as customizable content types, hierarchical URL object traversing, and a sophisticated content workflow powered by a granular permissions model. This allows you to build anything from simple websites to enterprise-grade intranets.",\n- "value": [\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [{"text": "Plone"}],\n- "data": {"url": "https://plone.org/"},\n- "type": "link",\n- },\n- {\n- "text": " is a content management system built on Python, with its first release in 2001. Plone has features that appeal to developers and users alike, such as customizable content types, hierarchical URL object traversing, and a sophisticated content workflow powered by a granular permissions model. This allows you to build anything from simple websites to enterprise-grade intranets. "\n- },\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "b4193840-3c95-4b28-a088-f679c11e2dcb": {\n- "@type": "slate",\n- "plaintext": " Volto is the frontent for Plone written in React. It exposes all these features and communicates with Plone via its mature REST API . Volto can be easily themed and is highly customizable.",\n- "value": [\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [{"text": "Volto"}],\n- "data": {\n- "url": "https://6.docs.plone.org/volto/index.html"\n- },\n- "type": "link",\n- },\n- {\n- "text": " is the frontent for Plone written in React. It exposes all these features and communicates with Plone via its mature "\n- },\n- {\n- "children": [{"text": "REST API"}],\n- "data": {\n- "url": "https://github.com/plone/plone.restapi"\n- },\n- "type": "link",\n- },\n- {\n- "text": ". Volto can be easily themed and is highly customizable."\n- },\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "b7922dfd-9aac-4494-b5f7-3701cc646f99": {\n- "@type": "slate",\n- "plaintext": "Support the Plone Foundation",\n- "value": [\n- {\n- "children": [{"text": "Support the Plone Foundation"}],\n- "type": "h2",\n- }\n- ],\n- },\n- "1fd6c4e5-c606-4d74-a725-0df3e715e995": {\n- "@type": "slate",\n- "plaintext": "Plone is made possible only through the efforts of thousands of dedicated individuals and hundreds of companies. The Plone Foundation:",\n- "value": [\n- {\n- "children": [\n- {\n- "text": "Plone is made possible only through the efforts of thousands of dedicated individuals and hundreds of companies. The Plone Foundation:"\n- }\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "958d0b18-d445-40df-8da4-cc4ef813678f": {\n- "@type": "slate",\n- "plaintext": "...protects and promotes Plone. ...is a recognized 501(c)(3) charitable organization with the United States Internal Revenue Service. ...receives donations that may be tax-deductible. Support the Foundation and help make Plone better! ",\n- "value": [\n- {\n- "children": [\n- {\n- "children": [\n- {"text": "...protects and promotes Plone."}\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {\n- "text": "...is a recognized 501(c)(3) charitable organization with the United States Internal Revenue Service."\n- }\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {\n- "text": "...receives donations that may be tax-deductible."\n- }\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [\n- {\n- "text": "Support the Foundation and help make Plone better!"\n- }\n- ],\n- "data": {\n- "url": "https://plone.org/foundation/sponsorship"\n- },\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- ],\n- "type": "ul",\n- }\n- ],\n- },\n- "e775170b-cc9f-4372-8d05-35ae43e8556b": {\n- "@type": "slate",\n- "plaintext": "Thanks for using our product. We hope you like it!",\n- "value": [\n- {\n- "children": [\n- {\n- "text": "Thanks for using our product. We hope you like it!"\n- }\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "a9b59282-1f01-4030-93c0-ae8e0dd0ca5c": {\n- "@type": "slate",\n- "plaintext": "\xe2\x80\x93 The Plone Team",\n- "value": [{"children": [{"text": "\xe2\x80\x93 The Plone Team"}], "type": "p"}],\n- },\n- },\n- "blocks_layout": {\n- "items": [\n- "07c273fc-8bfc-4e7d-a327-d513e5a945bb",\n- "09bd0162-397d-4141-983d-8f03ac2c481c",\n- "eec7a1b7-40ab-49e1-a1ba-a8bc3d838598",\n- "eb436460-6bd6-418d-b788-a9f09c0a1f73",\n- "4d8a7881-111b-4d57-b2e6-788e8ede90a9",\n- "97cd02b5-29fc-4993-afe2-3cc5fe5bd85b",\n- "b6ad38e2-1736-407e-a327-dcea2206f707",\n- "37997f0f-ed85-44b0-a579-d3ff00e5a974",\n- "35fb577b-bbc8-4e5a-b88e-b89631d13640",\n- "dbe0349e-6577-46bd-9ede-685b81d2e814",\n- "ffbec3a5-a970-4c43-8897-68cc1022bcb9",\n- "c53b5868-ccba-4fee-b504-bf3867bb1ef0",\n- "38ff6b46-4cbd-4933-a462-251c3e963b7a",\n- "b4193840-3c95-4b28-a088-f679c11e2dcb",\n- "b7922dfd-9aac-4494-b5f7-3701cc646f99",\n- "1fd6c4e5-c606-4d74-a725-0df3e715e995",\n- "958d0b18-d445-40df-8da4-cc4ef813678f",\n- "e775170b-cc9f-4372-8d05-35ae43e8556b",\n- "a9b59282-1f01-4030-93c0-ae8e0dd0ca5c",\n- ]\n- },\n- },\n-}\ndiff --git a/src/plone/volto/default_homepage/demo.py b/src/plone/volto/default_homepage/demo.py\ndeleted file mode 100644\nindex 5880966d..00000000\n--- a/src/plone/volto/default_homepage/demo.py\n+++ /dev/null\n@@ -1,637 +0,0 @@\n-# flake8: noqa\n-from datetime import datetime\n-\n-\n-demo_home_page = {\n- "draftJS": {\n- "title": "Welcome to Plone 6!",\n- "description": "Congratulations! You have successfully installed Plone.",\n- "blocks": {\n- "0358abe2-b4f1-463d-a279-a63ea80daf19": {"@type": "description"},\n- "07c273fc-8bfc-4e7d-a327-d513e5a945bb": {"@type": "title"},\n- "2dfe8e4c-5bf6-43f1-93e1-6c320ede7226": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [\n- {"length": 10, "offset": 0, "style": "BOLD"}\n- ],\n- "key": "6470b",\n- "text": "Disclaimer: This instance is reset every night, so all changes will be lost afterwards.",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "3c881f51-f75b-4959-834a-6e1d5edc32ae": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [\n- {"length": 5, "offset": 6, "style": "BOLD"}\n- ],\n- "key": "ekn3l",\n- "text": "user: admin",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "5e1c30b1-ec6c-4dc0-9483-9768c3c416e4": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "behki",\n- "text": "Plone is a powerful content management system built on a rock-solid application stack written using the Python programming language. More about these technologies:",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "5f7e6846-e27c-48c4-8c9a-f0d93eadb185": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "75pke",\n- "text": "\\u2026protects and promotes Plone.",\n- "type": "unordered-list-item",\n- },\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "2mo73",\n- "text": "\\u2026is a registered 501(c)(3) charitable organization.",\n- "type": "unordered-list-item",\n- },\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "9qhkg",\n- "text": "\\u2026donations are tax-deductible.",\n- "type": "unordered-list-item",\n- },\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [{"key": 0, "length": 50, "offset": 0}],\n- "inlineStyleRanges": [],\n- "key": "5528b",\n- "text": "Support the Foundation and help make Plone better!",\n- "type": "unordered-list-item",\n- },\n- ],\n- "entityMap": {\n- "0": {\n- "data": {"url": "https://plone.org/sponsors/be-a-hero"},\n- "mutability": "MUTABLE",\n- "type": "LINK",\n- }\n- },\n- },\n- },\n- "61cc1bc0-d4f5-4e2b-9152-79512045a4dd": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "9qsa4",\n- "text": "Demo",\n- "type": "header-two",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "874049e7-629e-489a-b46c-1adf35ad40ee": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "9pnjr",\n- "text": "Happy hacking!",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "8bba235c-7a52-4ce2-bde1-c505e5746dce": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "692gs",\n- "text": "Plone is made possible only through the efforts of thousands of dedicated individuals and hundreds of companies. The Plone Foundation:",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "942b6530-2407-420f-9c24-597adda6b2ce": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "6a248",\n- "text": "Support the Plone Foundation",\n- "type": "header-two",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "9a976b8e-72ba-468a-bea8-b37a31bb386b": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [\n- {"length": 12, "offset": 51, "style": "BOLD"}\n- ],\n- "key": "94arl",\n- "text": "You can log in and use it as admin user using these credentials:",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "b3717238-448f-406e-b06f-57a9715c3326": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "1bnna",\n- "text": "Find out more about Plone",\n- "type": "header-two",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "c049ff8b-3e5a-4cfb-bca6-e4a6cca9be28": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "55n44",\n- "text": "You can use this site to test Plone 6. These are the versions used in this demo:",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "c91f0fe9-f2e9-4a17-84a5-8e4f2678ed3c": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [\n- {"length": 5, "offset": 10, "style": "BOLD"}\n- ],\n- "key": "buncq",\n- "text": "password: admin",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "e0ca2fbc-7800-4b9b-afe5-8e42af9f5dd6": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [],\n- "inlineStyleRanges": [],\n- "key": "f0prj",\n- "text": f"{datetime.now().year} - Plone Foundation",\n- "type": "unstyled",\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- "effbdcdc-253c-41a7-841e-5edb3b56ce32": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [{"key": 0, "length": 43, "offset": 4}],\n- "inlineStyleRanges": [],\n- "key": "68rve",\n- "text": "The Plone open source Content Management System web site for evaluators and decision makers.",\n- "type": "unordered-list-item",\n- },\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [{"key": 1, "length": 16, "offset": 4}],\n- "inlineStyleRanges": [],\n- "key": "4ec08",\n- "text": "The Plone community web site for developers.",\n- "type": "unordered-list-item",\n- },\n- {\n- "data": {},\n- "depth": 0,\n- "entityRanges": [{"key": 2, "length": 27, "offset": 4}],\n- "inlineStyleRanges": [],\n- "key": "4q5m2",\n- "text": "The Python programming language web site.",\n- "type": "unordered-list-item",\n- },\n- ],\n- "entityMap": {\n- "0": {\n- "data": {"url": "https://plone.com/"},\n- "mutability": "MUTABLE",\n- "type": "LINK",\n- },\n- "1": {\n- "data": {"url": "https://plone.org/"},\n- "mutability": "MUTABLE",\n- "type": "LINK",\n- },\n- "2": {\n- "data": {"url": "https://www.python.org/"},\n- "mutability": "MUTABLE",\n- "type": "LINK",\n- },\n- },\n- },\n- },\n- "3b5ac7a5-2d98-423e-807c-5eebc0bf0054": {"@type": "system"},\n- },\n- "blocks_layout": {\n- "items": [\n- "07c273fc-8bfc-4e7d-a327-d513e5a945bb",\n- "0358abe2-b4f1-463d-a279-a63ea80daf19",\n- "b3717238-448f-406e-b06f-57a9715c3326",\n- "5e1c30b1-ec6c-4dc0-9483-9768c3c416e4",\n- "effbdcdc-253c-41a7-841e-5edb3b56ce32",\n- "942b6530-2407-420f-9c24-597adda6b2ce",\n- "8bba235c-7a52-4ce2-bde1-c505e5746dce",\n- "5f7e6846-e27c-48c4-8c9a-f0d93eadb185",\n- "61cc1bc0-d4f5-4e2b-9152-79512045a4dd",\n- "c049ff8b-3e5a-4cfb-bca6-e4a6cca9be28",\n- "3b5ac7a5-2d98-423e-807c-5eebc0bf0054",\n- "9a976b8e-72ba-468a-bea8-b37a31bb386b",\n- "3c881f51-f75b-4959-834a-6e1d5edc32ae",\n- "c91f0fe9-f2e9-4a17-84a5-8e4f2678ed3c",\n- "2dfe8e4c-5bf6-43f1-93e1-6c320ede7226",\n- "874049e7-629e-489a-b46c-1adf35ad40ee",\n- "e0ca2fbc-7800-4b9b-afe5-8e42af9f5dd6",\n- ]\n- },\n- },\n- "slate": {\n- "title": "Welcome to Plone 6!",\n- "description": "This site is Plone 6 with Volto for its frontend.",\n- "blocks": {\n- "07c273fc-8bfc-4e7d-a327-d513e5a945bb": {"@type": "title"},\n- "0358abe2-b4f1-463d-a279-a63ea80daf19": {"@type": "description"},\n- "e1220183-552c-45d9-a661-5ad0854615ac": {\n- "@type": "slate",\n- "plaintext": "Demo",\n- "value": [{"children": [{"text": "Demo"}], "type": "h2"}],\n- },\n- "9509e96d-5718-4687-95c1-f9d3db115b92": {\n- "@type": "slate",\n- "plaintext": "You can use this site to test Plone 6.\\n\\nYou can log in and use it as an admin user using these credentials :\\n\\nusername: admin password: admin Disclaimer : This instance is reset every night, so all changes will be lost afterwards.\\n\\nHappy hacking!",\n- "value": [\n- {\n- "children": [\n- {\n- "text": "You can use this site to test Plone 6.\\n\\nYou can log in and use it as an admin user using these "\n- },\n- {"children": [{"text": "credentials"}], "type": "strong"},\n- {"text": ":\\n\\nusername: "},\n- {"children": [{"text": "admin"}], "type": "strong"},\n- {"text": "\\npassword: "},\n- {"children": [{"text": "admin\\n\\n"}], "type": "strong"},\n- {"text": ""},\n- {"children": [{"text": "Disclaimer"}], "type": "strong"},\n- {\n- "text": ": This instance is reset every night, so all changes will be lost afterwards.\\n\\nHappy hacking!"\n- },\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "249cb267-394b-4e18-991d-8d5038fc60b7": {\n- "@type": "slate",\n- "plaintext": "More demo sites",\n- "value": [{"children": [{"text": "More demo sites"}], "type": "h2"}],\n- },\n- "b918c45d-e817-4231-9711-ec5a0bc41505": {\n- "@type": "slate",\n- "plaintext": " Plone 6 Plone 6 Classic UI",\n- "value": [\n- {\n- "children": [\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [{"text": "Plone 6 (this site)"}],\n- "data": {"url": "https://demo.plone.org/"},\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [{"text": "Plone 6 Classic UI"}],\n- "data": {\n- "url": "https://classic.demo.plone.org/"\n- },\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- ],\n- "type": "ul",\n- }\n- ],\n- },\n- "bedf0ed6-3237-46ac-8c91-994826b1cf05": {\n- "@type": "slate",\n- "plaintext": "Find out more about Plone",\n- "value": [\n- {"children": [{"text": "Find out more about Plone"}], "type": "h2"}\n- ],\n- },\n- "577b38a2-84ed-4911-9644-72b73b79bf9b": {\n- "@type": "slate",\n- "plaintext": "Plone is a powerful content management system built on a rock-solid application stack written in the Python and JavaScript programming languages.",\n- "value": [\n- {\n- "children": [\n- {\n- "text": "Plone is a powerful content management system built on a rock-solid application stack written in the Python and JavaScript programming languages."\n- }\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "539b7bb6-23e1-425c-8d93-70c03d52806e": {\n- "@type": "slate",\n- "plaintext": " The features of Plone Plone Documentation Plone Training Plone Community Forum Add-ons for Plone (backend) Add-ons for Volto (frontend) ",\n- "value": [\n- {\n- "children": [\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [{"text": "The features of Plone"}],\n- "data": {\n- "url": "https://plone.org/why-plone/features"\n- },\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [{"text": "Plone Documentation"}],\n- "data": {"url": "https://docs.plone.org/"},\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [{"text": "Plone Training"}],\n- "data": {"url": "https://training.plone.org/"},\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [{"text": "Plone Community Forum"}],\n- "data": {"url": "https://community.plone.org/"},\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [\n- {"text": "Add-ons for Plone (backend)"}\n- ],\n- "data": {\n- "url": "https://github.com/collective/awesome-plone#contents"\n- },\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [\n- {"text": "Add-ons for Volto (frontend)"}\n- ],\n- "data": {\n- "url": "https://github.com/collective/awesome-volto#awesome-volto"\n- },\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- ],\n- "type": "ul",\n- }\n- ],\n- },\n- "5d166d4b-195b-4dc2-ac11-8d283673ee8d": {\n- "@type": "slate",\n- "plaintext": "Support the Plone Foundation",\n- "value": [\n- {\n- "children": [{"text": "Support the Plone Foundation"}],\n- "type": "h2",\n- }\n- ],\n- },\n- "8696b042-7119-4700-9e7f-2b22e8982a7b": {\n- "@type": "slate",\n- "plaintext": "Plone is made possible only through the efforts of thousands of dedicated individuals and hundreds of companies. The Plone Foundation:",\n- "value": [\n- {\n- "children": [\n- {\n- "text": "Plone is made possible only through the efforts of thousands of dedicated individuals and hundreds of companies. The Plone Foundation:"\n- }\n- ],\n- "type": "p",\n- }\n- ],\n- },\n- "7ab29abe-b38c-406b-94d7-b270e544a998": {\n- "@type": "slate",\n- "plaintext": "\xe2\x80\xa6protects and promotes Plone. \xe2\x80\xa6is a registered 501(c)(3) charitable organization. \xe2\x80\xa6donations are tax-deductible. Support the Foundation and help make Plone better! ",\n- "value": [\n- {\n- "children": [\n- {\n- "children": [{"text": "\xe2\x80\xa6protects and promotes Plone."}],\n- "type": "li",\n- },\n- {\n- "children": [\n- {\n- "text": "\xe2\x80\xa6is a registered 501(c)(3) charitable organization."\n- }\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": "\xe2\x80\xa6donations are tax-deductible."}\n- ],\n- "type": "li",\n- },\n- {\n- "children": [\n- {"text": ""},\n- {\n- "children": [\n- {\n- "text": "Support the Foundation and help make Plone better!"\n- }\n- ],\n- "data": {\n- "url": "https://plone.org/sponsors/be-a-hero"\n- },\n- "type": "link",\n- },\n- {"text": ""},\n- ],\n- "type": "li",\n- },\n- ],\n- "type": "ul",\n- }\n- ],\n- },\n- "5026c0b5-cb0e-4e74-bd9b-461ad6cc40c0": {\n- "@type": "slate",\n- "plaintext": "Technical Details",\n- "value": [{"children": [{"text": "Technical Details"}], "type": "h2"}],\n- },\n- "3b5ac7a5-2d98-423e-807c-5eebc0bf0054": {"@type": "system"},\n- },\n- "blocks_layout": {\n- "items": [\n- "07c273fc-8bfc-4e7d-a327-d513e5a945bb",\n- "0358abe2-b4f1-463d-a279-a63ea80daf19",\n- "e1220183-552c-45d9-a661-5ad0854615ac",\n- "9509e96d-5718-4687-95c1-f9d3db115b92",\n- "249cb267-394b-4e18-991d-8d5038fc60b7",\n- "b918c45d-e817-4231-9711-ec5a0bc41505",\n- "bedf0ed6-3237-46ac-8c91-994826b1cf05",\n- "577b38a2-84ed-4911-9644-72b73b79bf9b",\n- "539b7bb6-23e1-425c-8d93-70c03d52806e",\n- "5d166d4b-195b-4dc2-ac11-8d283673ee8d",\n- "8696b042-7119-4700-9e7f-2b22e8982a7b",\n- "7ab29abe-b38c-406b-94d7-b270e544a998",\n- "5026c0b5-cb0e-4e74-bd9b-461ad6cc40c0",\n- "3b5ac7a5-2d98-423e-807c-5eebc0bf0054",\n- ]\n- },\n- },\n-}\ndiff --git a/src/plone/volto/default_homepage/lrf.py b/src/plone/volto/default_homepage/lrf.py\ndeleted file mode 100644\nindex ff997ded..00000000\n--- a/src/plone/volto/default_homepage/lrf.py\n+++ /dev/null\n@@ -1,55 +0,0 @@\n-default_lrf_home = {\n- "draftJS": {\n- "blocks": {\n- "15068807-cfc9-444a-97db-8c736809ff52": {"@type": "title"},\n- "59d41d8a-ef05-4e21-8820-2a64f5878092": {\n- "@type": "text",\n- "text": {\n- "blocks": [\n- {\n- "key": "618bl",\n- "text": "Nulla porttitor accumsan tincidunt. Sed porttitor lectus nibh. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Nulla porttitor accumsan tincidunt. Nulla porttitor accumsan tincidunt. Nulla porttitor accumsan tincidunt. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Sed porttitor lectus nibh. Pellentesque in ipsum id orci porta dapibus.",\n- "type": "unstyled",\n- "depth": 0,\n- "inlineStyleRanges": [],\n- "entityRanges": [],\n- "data": {},\n- }\n- ],\n- "entityMap": {},\n- },\n- },\n- },\n- "blocks_layout": {\n- "items": [\n- "15068807-cfc9-444a-97db-8c736809ff52",\n- "59d41d8a-ef05-4e21-8820-2a64f5878092",\n- ]\n- },\n- },\n- "slate": {\n- "blocks": {\n- "15068807-cfc9-444a-97db-8c736809ff52": {"@type": "title"},\n- "59d41d8a-ef05-4e21-8820-2a64f5878092": {\n- "@type": "slate",\n- "value": [\n- {\n- "type": "p",\n- "children": [\n- {\n- "text": "Nulla porttitor accumsan tincidunt. Sed porttitor lectus nibh. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Nulla porttitor accumsan tincidunt. Nulla porttitor accumsan tincidunt. Nulla porttitor accumsan tincidunt. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Sed porttitor lectus nibh. Pellentesque in ipsum id orci porta dapibus."\n- }\n- ],\n- }\n- ],\n- "plaintext": "Nulla porttitor accumsan tincidunt. Sed porttitor lectus nibh. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Nulla porttitor accumsan tincidunt. Nulla porttitor accumsan tincidunt. Nulla porttitor accumsan tincidunt. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Sed porttitor lectus nibh. Pellentesque in ipsum id orci porta dapibus.",\n- },\n- },\n- "blocks_layout": {\n- "items": [\n- "15068807-cfc9-444a-97db-8c736809ff52",\n- "59d41d8a-ef05-4e21-8820-2a64f5878092",\n- ]\n- },\n- },\n-}\ndiff --git a/src/plone/volto/dependencies.zcml b/src/plone/volto/dependencies.zcml\nindex bd61c7df..fce6a2b3 100644\n--- a/src/plone/volto/dependencies.zcml\n+++ b/src/plone/volto/dependencies.zcml\n@@ -1,11 +1,4 @@\n-\n-\n- \n- \n- \n+\n \n \n+ \n \n \n \ndiff --git a/src/plone/volto/distributions.zcml b/src/plone/volto/distributions.zcml\nnew file mode 100644\nindex 00000000..bb62bbd0\n--- /dev/null\n+++ b/src/plone/volto/distributions.zcml\n@@ -0,0 +1,16 @@\n+\n+\n+ \n+\n+\ndiff --git a/src/plone/volto/distributions/volto/content/content/__metadata__.json b/src/plone/volto/distributions/volto/content/content/__metadata__.json\nnew file mode 100644\nindex 00000000..810dc1a6\n--- /dev/null\n+++ b/src/plone/volto/distributions/volto/content/content/__metadata__.json\n@@ -0,0 +1,19 @@\n+{\n+ "__version__": "1.0.0",\n+ "_blob_files_": [],\n+ "_data_files_": [\n+ "plone_site_root/data.json"\n+ ],\n+ "default_page": {},\n+ "local_roles": {\n+ "plone_site_root": {\n+ "local_roles": {\n+ "admin": [\n+ "Owner"\n+ ]\n+ }\n+ }\n+ },\n+ "ordering": {},\n+ "relations": []\n+}\n\\ No newline at end of file\ndiff --git a/src/plone/volto/distributions/volto/content/content/plone_site_root/data.json b/src/plone/volto/distributions/volto/content/content/plone_site_root/data.json\nnew file mode 100644\nindex 00000000..ae07f85a\n--- /dev/null\n+++ b/src/plone/volto/distributions/volto/content/content/plone_site_root/data.json\n@@ -0,0 +1,466 @@\n+{\n+ "@id": "/default",\n+ "@type": "Plone Site",\n+ "UID": "plone_site_root",\n+ "allow_discussion": null,\n+ "blocks": {\n+ "07c273fc-8bfc-4e7d-a327-d513e5a945bb": { "@type": "title" },\n+ "09bd0162-397d-4141-983d-8f03ac2c481c": {\n+ "@type": "slate",\n+ "plaintext": "If you\'re seeing this text instead of the web site you were expecting, the owner of this web site has just installed Plone. Do not contact the Plone Team or the Plone support channels about this.",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "text": "If you\'re seeing this text instead of the web site you were expecting, the owner of this web site has just installed Plone. Do not contact the Plone Team or the Plone support channels about this."\n+ }\n+ ],\n+ "type": "p"\n+ }\n+ ]\n+ },\n+ "eec7a1b7-40ab-49e1-a1ba-a8bc3d838598": {\n+ "@type": "slate",\n+ "plaintext": "Get started",\n+ "value": [{ "children": [{ "text": "Get started" }], "type": "h2" }]\n+ },\n+ "eb436460-6bd6-418d-b788-a9f09c0a1f73": {\n+ "@type": "slate",\n+ "plaintext": "Before you start exploring your newly created Plone site, please do the following:",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "text": "Before you start exploring your newly created Plone site, please do the following:"\n+ }\n+ ],\n+ "type": "p"\n+ }\n+ ]\n+ },\n+ "4d8a7881-111b-4d57-b2e6-788e8ede90a9": {\n+ "@type": "slate",\n+ "plaintext": "Make sure you are logged in as an admin/manager user. You should have a Site Setup entry in the user menu. Set up your mail server . Plone needs a valid SMTP server to verify users and send out password reminders. Decide what security level you want on your site. Allow self registration, password policies, and more.",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "children": [\n+ {\n+ "text": "Make sure you are logged in as an admin/manager user. You should have a Site Setup entry in the user menu."\n+ }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ { "text": "" },\n+ {\n+ "children": [{ "text": "Set up your mail server" }],\n+ "data": { "url": "/controlpanel/mail" },\n+ "type": "link"\n+ },\n+ {\n+ "text": ". Plone needs a valid SMTP server to verify users and send out password reminders."\n+ }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ { "text": "" },\n+ {\n+ "children": [\n+ {\n+ "text": "Decide what security level you want on your"\n+ }\n+ ],\n+ "data": { "url": "/controlpanel/security" },\n+ "type": "link"\n+ },\n+ {\n+ "text": " site. Allow self registration, password policies, and more."\n+ }\n+ ],\n+ "type": "li"\n+ }\n+ ],\n+ "type": "ol"\n+ }\n+ ]\n+ },\n+ "97cd02b5-29fc-4993-afe2-3cc5fe5bd85b": {\n+ "@type": "slate",\n+ "plaintext": "Get comfortable",\n+ "value": [{ "children": [{ "text": "Get comfortable" }], "type": "h2" }]\n+ },\n+ "b6ad38e2-1736-407e-a327-dcea2206f707": {\n+ "@type": "slate",\n+ "plaintext": "After that, we suggest you do one or more of the following:",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "text": "After that, we suggest you do one or more of the following:"\n+ }\n+ ],\n+ "type": "p"\n+ }\n+ ]\n+ },\n+ "37997f0f-ed85-44b0-a579-d3ff00e5a974": {\n+ "@type": "slate",\n+ "plaintext": "Get the latest news about Plone. Read the documentation . Follow a training . Explore the available add-ons for Plone. Read or subscribe to the support channels .",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "children": [\n+ { "text": "Get the latest " },\n+ {\n+ "children": [{ "text": "news" }],\n+ "data": {\n+ "url": "https://plone.org/news-and-events"\n+ },\n+ "type": "link"\n+ },\n+ { "text": " about Plone." }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ { "text": "Read the " },\n+ {\n+ "children": [{ "text": "documentation" }],\n+ "data": { "url": "https://6.docs.plone.org" },\n+ "type": "link"\n+ },\n+ { "text": "." }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ { "text": "Follow a " },\n+ {\n+ "children": [{ "text": "training" }],\n+ "data": { "url": "https://training.plone.org" },\n+ "type": "link"\n+ },\n+ { "text": "." }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ { "text": "Explore the " },\n+ {\n+ "children": [{ "text": "available add-ons" }],\n+ "data": {\n+ "url": "https://plone.org/download/add-ons"\n+ },\n+ "type": "link"\n+ },\n+ { "text": " for Plone." }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ { "text": "Read or subscribe to the " },\n+ {\n+ "children": [{ "text": "support channels" }],\n+ "data": { "url": "https://plone.org/support" },\n+ "type": "link"\n+ },\n+ { "text": "." }\n+ ],\n+ "type": "li"\n+ }\n+ ],\n+ "type": "ul"\n+ }\n+ ]\n+ },\n+ "35fb577b-bbc8-4e5a-b88e-b89631d13640": {\n+ "@type": "slate",\n+ "plaintext": "Make it your own",\n+ "value": [{ "children": [{ "text": "Make it your own" }], "type": "h2" }]\n+ },\n+ "dbe0349e-6577-46bd-9ede-685b81d2e814": {\n+ "@type": "slate",\n+ "plaintext": "Plone has many settings to make it do what you want. Some examples include:",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "text": "Plone has many settings to make it do what you want. Some examples include:"\n+ }\n+ ],\n+ "type": "p"\n+ }\n+ ]\n+ },\n+ "ffbec3a5-a970-4c43-8897-68cc1022bcb9": {\n+ "@type": "slate",\n+ "plaintext": "Create content-types and define their default-layout in the content types controlpanel Manage Users, Groups and their Roles in the users and groups controlpanels ...and many more settings are available in the Site Setup .",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "children": [\n+ {\n+ "text": "Create content-types and define their default-layout in the "\n+ },\n+ {\n+ "children": [{ "text": "content types controlpanel" }],\n+ "data": {\n+ "url": "/controlpanel/dexterity-types"\n+ },\n+ "type": "link"\n+ },\n+ { "text": "" }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ {\n+ "text": "Manage Users, Groups and their Roles in the "\n+ },\n+ {\n+ "children": [{ "text": "users" }],\n+ "data": { "url": "/controlpanel/users" },\n+ "type": "link"\n+ },\n+ { "text": " and " },\n+ {\n+ "children": [{ "text": "groups" }],\n+ "data": { "url": "/controlpanel/groups" },\n+ "type": "link"\n+ },\n+ { "text": " controlpanels" }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ {\n+ "text": "...and many more settings are available in the "\n+ },\n+ {\n+ "children": [{ "text": "Site Setup" }],\n+ "data": { "url": "/controlpanel" },\n+ "type": "link"\n+ },\n+ { "text": "." }\n+ ],\n+ "type": "li"\n+ }\n+ ],\n+ "type": "ul"\n+ }\n+ ]\n+ },\n+ "c53b5868-ccba-4fee-b504-bf3867bb1ef0": {\n+ "@type": "slate",\n+ "plaintext": "About Plone and Volto",\n+ "value": [\n+ { "children": [{ "text": "About Plone and Volto" }], "type": "h2" }\n+ ]\n+ },\n+ "38ff6b46-4cbd-4933-a462-251c3e963b7a": {\n+ "@type": "slate",\n+ "plaintext": " Plone is a content management system built on Python, with its first release in 2001. Plone has features that appeal to developers and users alike, such as customizable content types, hierarchical URL object traversing, and a sophisticated content workflow powered by a granular permissions model. This allows you to build anything from simple websites to enterprise-grade intranets.",\n+ "value": [\n+ {\n+ "children": [\n+ { "text": "" },\n+ {\n+ "children": [{ "text": "Plone" }],\n+ "data": { "url": "https://plone.org/" },\n+ "type": "link"\n+ },\n+ {\n+ "text": " is a content management system built on Python, with its first release in 2001. Plone has features that appeal to developers and users alike, such as customizable content types, hierarchical URL object traversing, and a sophisticated content workflow powered by a granular permissions model. This allows you to build anything from simple websites to enterprise-grade intranets. "\n+ }\n+ ],\n+ "type": "p"\n+ }\n+ ]\n+ },\n+ "b4193840-3c95-4b28-a088-f679c11e2dcb": {\n+ "@type": "slate",\n+ "plaintext": " Volto is the frontend for Plone written in React. It exposes all these features and communicates with Plone via its mature REST API . Volto can be easily themed and is highly customizable.",\n+ "value": [\n+ {\n+ "children": [\n+ { "text": "" },\n+ {\n+ "children": [{ "text": "Volto" }],\n+ "data": {\n+ "url": "https://6.docs.plone.org/volto/index.html"\n+ },\n+ "type": "link"\n+ },\n+ {\n+ "text": " is the frontend for Plone written in React. It exposes all these features and communicates with Plone via its mature "\n+ },\n+ {\n+ "children": [{ "text": "REST API" }],\n+ "data": {\n+ "url": "https://github.com/plone/plone.restapi"\n+ },\n+ "type": "link"\n+ },\n+ {\n+ "text": ". Volto can be easily themed and is highly customizable."\n+ }\n+ ],\n+ "type": "p"\n+ }\n+ ]\n+ },\n+ "b7922dfd-9aac-4494-b5f7-3701cc646f99": {\n+ "@type": "slate",\n+ "plaintext": "Support the Plone Foundation",\n+ "value": [\n+ {\n+ "children": [{ "text": "Support the Plone Foundation" }],\n+ "type": "h2"\n+ }\n+ ]\n+ },\n+ "1fd6c4e5-c606-4d74-a725-0df3e715e995": {\n+ "@type": "slate",\n+ "plaintext": "Plone is made possible only through the efforts of thousands of dedicated individuals and hundreds of companies. The Plone Foundation:",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "text": "Plone is made possible only through the efforts of thousands of dedicated individuals and hundreds of companies. The Plone Foundation:"\n+ }\n+ ],\n+ "type": "p"\n+ }\n+ ]\n+ },\n+ "958d0b18-d445-40df-8da4-cc4ef813678f": {\n+ "@type": "slate",\n+ "plaintext": "...protects and promotes Plone. ...is a recognized 501(c)(3) charitable organization with the United States Internal Revenue Service. ...receives donations that may be tax-deductible. Support the Foundation and help make Plone better! ",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "children": [{ "text": "...protects and promotes Plone." }],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ {\n+ "text": "...is a recognized 501(c)(3) charitable organization with the United States Internal Revenue Service."\n+ }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ {\n+ "text": "...receives donations that may be tax-deductible."\n+ }\n+ ],\n+ "type": "li"\n+ },\n+ {\n+ "children": [\n+ { "text": "" },\n+ {\n+ "children": [\n+ {\n+ "text": "Support the Foundation and help make Plone better!"\n+ }\n+ ],\n+ "data": {\n+ "url": "https://plone.org/foundation/sponsorship"\n+ },\n+ "type": "link"\n+ },\n+ { "text": "" }\n+ ],\n+ "type": "li"\n+ }\n+ ],\n+ "type": "ul"\n+ }\n+ ]\n+ },\n+ "e775170b-cc9f-4372-8d05-35ae43e8556b": {\n+ "@type": "slate",\n+ "plaintext": "Thanks for using our product. We hope you like it!",\n+ "value": [\n+ {\n+ "children": [\n+ {\n+ "text": "Thanks for using our product. We hope you like it!"\n+ }\n+ ],\n+ "type": "p"\n+ }\n+ ]\n+ },\n+ "a9b59282-1f01-4030-93c0-ae8e0dd0ca5c": {\n+ "@type": "slate",\n+ "plaintext": "\xe2\x80\x93 The Plone Team",\n+ "value": [{ "children": [{ "text": "\xe2\x80\x93 The Plone Team" }], "type": "p" }]\n+ }\n+ },\n+ "blocks_layout": {\n+ "items": [\n+ "07c273fc-8bfc-4e7d-a327-d513e5a945bb",\n+ "09bd0162-397d-4141-983d-8f03ac2c481c",\n+ "eec7a1b7-40ab-49e1-a1ba-a8bc3d838598",\n+ "eb436460-6bd6-418d-b788-a9f09c0a1f73",\n+ "4d8a7881-111b-4d57-b2e6-788e8ede90a9",\n+ "97cd02b5-29fc-4993-afe2-3cc5fe5bd85b",\n+ "b6ad38e2-1736-407e-a327-dcea2206f707",\n+ "37997f0f-ed85-44b0-a579-d3ff00e5a974",\n+ "35fb577b-bbc8-4e5a-b88e-b89631d13640",\n+ "dbe0349e-6577-46bd-9ede-685b81d2e814",\n+ "ffbec3a5-a970-4c43-8897-68cc1022bcb9",\n+ "c53b5868-ccba-4fee-b504-bf3867bb1ef0",\n+ "38ff6b46-4cbd-4933-a462-251c3e963b7a",\n+ "b4193840-3c95-4b28-a088-f679c11e2dcb",\n+ "b7922dfd-9aac-4494-b5f7-3701cc646f99",\n+ "1fd6c4e5-c606-4d74-a725-0df3e715e995",\n+ "958d0b18-d445-40df-8da4-cc4ef813678f",\n+ "e775170b-cc9f-4372-8d05-35ae43e8556b",\n+ "a9b59282-1f01-4030-93c0-ae8e0dd0ca5c"\n+ ]\n+ },\n+ "contributors": [],\n+ "creators": ["admin"],\n+ "description": "A Plone Site to be used with a Volto frontend",\n+ "effective": null,\n+ "exclude_from_nav": false,\n+ "expires": null,\n+ "exportimport.constrains": {},\n+ "exportimport.conversation": [],\n+ "exportimport.versions": {},\n+ "id": "default",\n+ "is_folderish": true,\n+ "items_total": 0,\n+ "language": "##DEFAULT##",\n+ "lock": {\n+ "locked": false,\n+ "stealable": true\n+ },\n+ "parent": {},\n+ "review_state": null,\n+ "rights": "",\n+ "subjects": [],\n+ "table_of_contents": null,\n+ "title": "Plone Site",\n+ "type_title": "Plone Site",\n+ "workflow_history": {}\n+}\ndiff --git a/src/plone/volto/distributions/volto/content/discussions.json b/src/plone/volto/distributions/volto/content/discussions.json\nnew file mode 100644\nindex 00000000..9e26dfee\n--- /dev/null\n+++ b/src/plone/volto/distributions/volto/content/discussions.json\n@@ -0,0 +1 @@\n+{}\n\\ No newline at end of file\ndiff --git a/src/plone/volto/distributions/volto/content/principals.json b/src/plone/volto/distributions/volto/content/principals.json\nnew file mode 100644\nindex 00000000..96b5eb0e\n--- /dev/null\n+++ b/src/plone/volto/distributions/volto/content/principals.json\n@@ -0,0 +1,38 @@\n+{\n+ "groups": [\n+ {\n+ "description": "",\n+ "email": "",\n+ "groupid": "Administrators",\n+ "groups": [],\n+ "principals": [],\n+ "roles": [\n+ "Manager"\n+ ],\n+ "title": "Administrators"\n+ },\n+ {\n+ "description": "",\n+ "email": "",\n+ "groupid": "Reviewers",\n+ "groups": [],\n+ "principals": [],\n+ "roles": [\n+ "Reviewer"\n+ ],\n+ "title": "Reviewers"\n+ },\n+ {\n+ "description": "",\n+ "email": "",\n+ "groupid": "Site Administrators",\n+ "groups": [],\n+ "principals": [],\n+ "roles": [\n+ "Site Administrator"\n+ ],\n+ "title": "Site Administrators"\n+ }\n+ ],\n+ "members": []\n+}\n\\ No newline at end of file\ndiff --git a/src/plone/volto/distributions/volto/content/redirects.json b/src/plone/volto/distributions/volto/content/redirects.json\nnew file mode 100644\nindex 00000000..9e26dfee\n--- /dev/null\n+++ b/src/plone/volto/distributions/volto/content/redirects.json\n@@ -0,0 +1 @@\n+{}\n\\ No newline at end of file\ndiff --git a/src/plone/volto/distributions/volto/content/relations.json b/src/plone/volto/distributions/volto/content/relations.json\nnew file mode 100644\nindex 00000000..0637a088\n--- /dev/null\n+++ b/src/plone/volto/distributions/volto/content/relations.json\n@@ -0,0 +1 @@\n+[]\n\\ No newline at end of file\ndiff --git a/src/plone/volto/distributions/volto/content/translations.json b/src/plone/volto/distributions/volto/content/translations.json\nnew file mode 100644\nindex 00000000..0637a088\n--- /dev/null\n+++ b/src/plone/volto/distributions/volto/content/translations.json\n@@ -0,0 +1 @@\n+[]\n\\ No newline at end of file\ndiff --git a/src/plone/volto/distributions/volto/image.png b/src/plone/volto/distributions/volto/image.png\nnew file mode 100644\nindex 00000000..8adacef1\nBinary files /dev/null and b/src/plone/volto/distributions/volto/image.png differ\ndiff --git a/src/plone/volto/distributions/volto/profiles.json b/src/plone/volto/distributions/volto/profiles.json\nnew file mode 100644\nindex 00000000..3019c3f8\n--- /dev/null\n+++ b/src/plone/volto/distributions/volto/profiles.json\n@@ -0,0 +1,10 @@\n+{\n+ "base": [\n+ "plone.app.contenttypes:default",\n+ "plone.app.caching:default",\n+ "plonetheme.barceloneta:default",\n+ "plone.volto:default"\n+ ],\n+ "content": [\n+ ]\n+}\ndiff --git a/src/plone/volto/distributions/volto/schema.json b/src/plone/volto/distributions/volto/schema.json\nnew file mode 100644\nindex 00000000..f700102f\n--- /dev/null\n+++ b/src/plone/volto/distributions/volto/schema.json\n@@ -0,0 +1,45 @@\n+{\n+ "schema": {\n+ "title": "Create a Plone site",\n+ "description": "Adds a new Plone content management system site to the underlying application server.",\n+ "type": "object",\n+ "required": [\n+ "site_id",\n+ "title"\n+ ],\n+ "properties": {\n+ "site_id": {\n+ "type": "string",\n+ "title": "Path Identifier",\n+ "default": "Plone",\n+ "description": "The ID of the site. No special characters or spaces are allowed. This ends up as part of the URL unless hidden by an upstream web server."\n+ },\n+ "title": {\n+ "type": "string",\n+ "title": "Title",\n+ "default": "Site",\n+ "description": "A short title for the site. This will be shown as part of the title of the browser window on each page."\n+ },\n+ "description": {\n+ "type": "string",\n+ "title": "Site Description",\n+ "default": "A Plone Site"\n+ },\n+ "site_logo": {\n+ "type": "string",\n+ "format": "data-url",\n+ "title": "Site logo"\n+ },\n+ "default_language": {"$ref": "#/definitions/languages"},\n+ "portal_timezone": {"$ref": "#/definitions/timezones"},\n+ "setup_content": {\n+ "type": "boolean",\n+ "title": "Create Example Content",\n+ "description": "Should example content be added during site creation?",\n+ "default": true\n+ }\n+ }\n+ },\n+ "uischema": {\n+ }\n+}\ndiff --git a/src/plone/volto/default_homepage/__init__.py b/src/plone/volto/indexers/__init__.py\nsimilarity index 100%\nrename from src/plone/volto/default_homepage/__init__.py\nrename to src/plone/volto/indexers/__init__.py\ndiff --git a/src/plone/volto/indexers/configure.zcml b/src/plone/volto/indexers/configure.zcml\nnew file mode 100644\nindex 00000000..4e121eee\n--- /dev/null\n+++ b/src/plone/volto/indexers/configure.zcml\n@@ -0,0 +1,15 @@\n+\n+\n+ \n+ \n+ \n+\ndiff --git a/src/plone/volto/indexers.py b/src/plone/volto/indexers/indexers.py\nsimilarity index 69%\nrename from src/plone/volto/indexers.py\nrename to src/plone/volto/indexers/indexers.py\nindex b8e92ff3..3470a621 100644\n--- a/src/plone/volto/indexers.py\n+++ b/src/plone/volto/indexers/indexers.py\n@@ -1,6 +1,7 @@\n from Acquisition import aq_base\n from plone.dexterity.interfaces import IDexterityContent\n from plone.indexer.decorator import indexer\n+from plone.restapi.blocks import visit_blocks\n from plone.volto.behaviors.preview import IPreview\n \n \n@@ -23,13 +24,25 @@ def image_field_indexer(obj):\n base_obj = aq_base(obj)\n \n image_field = ""\n- if getattr(base_obj, "preview_image", False):\n- image_field = "preview_image"\n- elif (\n+ if (\n getattr(base_obj, "preview_image_link", False)\n and not base_obj.preview_image_link.isBroken()\n ):\n image_field = "preview_image_link"\n+ elif getattr(base_obj, "preview_image", False):\n+ image_field = "preview_image"\n elif getattr(base_obj, "image", False):\n image_field = "image"\n return image_field\n+\n+\n+@indexer(IDexterityContent)\n+def block_types_indexer(obj):\n+ """Indexer for all block types included in a page."""\n+ obj = aq_base(obj)\n+ block_types = set()\n+ for block in visit_blocks(obj, obj.blocks):\n+ block_type = block.get("@type")\n+ if block_type:\n+ block_types.add(block_type)\n+ return block_types\ndiff --git a/src/plone/volto/interfaces.py b/src/plone/volto/interfaces.py\nindex 8d7b8834..c072ee67 100644\n--- a/src/plone/volto/interfaces.py\n+++ b/src/plone/volto/interfaces.py\n@@ -1,5 +1,5 @@\n-# -*- coding: utf-8 -*-\n """Module where all interfaces, events and exceptions live."""\n+\n from zope import schema\n from zope.interface import Interface\n from zope.publisher.interfaces.browser import IDefaultBrowserLayer\ndiff --git a/src/plone/volto/tests/__init__.py b/src/plone/volto/locales/__init__.py\nsimilarity index 100%\nrename from src/plone/volto/tests/__init__.py\nrename to src/plone/volto/locales/__init__.py\ndiff --git a/src/plone/volto/locales/de/LC_MESSAGES/plone.volto.po b/src/plone/volto/locales/de/LC_MESSAGES/plone.volto.po\nindex 85cfcab1..370cfe32 100644\n--- a/src/plone/volto/locales/de/LC_MESSAGES/plone.volto.po\n+++ b/src/plone/volto/locales/de/LC_MESSAGES/plone.volto.po\n@@ -4,7 +4,7 @@\n msgid ""\n msgstr ""\n "Project-Id-Version: PACKAGE VERSION\\n"\n-"POT-Creation-Date: 2022-08-11 23:31+0000\\n"\n+"POT-Creation-Date: 2024-12-11 17:41+0000\\n"\n "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\\n"\n "Last-Translator: FULL NAME \\n"\n "Language-Team: LANGUAGE \\n"\n@@ -17,131 +17,262 @@ msgstr ""\n "Preferred-Encodings: utf-8 latin1\\n"\n "Domain: plone.volto\\n"\n \n-#: plone/volto/behaviors/configure.zcml:31\n-msgid "Adds Head title field"\n-msgstr "Kopftitel Feld hinzuf\xc3\xbcgen"\n+#: plone/volto/browser/migrate_to_volto.pt:45\n+msgid "A site migrated to Volto in this Plone backend will still be accessible through the Plone Classic User Interface but with limited functionality. The core content types will have all their GUI RichText fields replaced by the blocks behavior for the composition of the main content. So after migration you can only edit this content using the Volto UI."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Adds kicker field (text to be shown above the headline)"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/browser/migrate_to_volto.pt:75\n+msgid "Advanced settings"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:120\n+msgid "Collections and Pages that are the default-page of a Folder will be applied on the migrated Folderish Page. For Collections that means adding a listing block with the same query. This only happens if you also you migrate Folders to Folderish Pages."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:42\n+msgid "Collections are migrated to Pages with Listing Blocks configured like the Collection."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n msgid "Configures the Plone backend to work with Volto, the new default frontend for Plone 6."\n msgstr "Konfiguration des Plone Backends f\xc3\xbcr Volto, dem neuen Standard-Frontend von Plone 6"\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Creates a default page for the site"\n-msgstr "Erstellt eine Startseite f\xc3\xbcr die Webseite"\n+#: plone/volto/browser/migrate_richtext.pt:33\n+msgid "Content Types to handle"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Creates a default page for the site using (legacy) draftJS blocks"\n+#: plone/volto/browser/migrate_richtext.pt:83\n+msgid "Convert to Slate (default)"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:51\n-msgid "Creates a default page for the site using slate blocks"\n+#: plone/volto/browser/migrate_richtext.pt:97\n+msgid "Convert to draftjs (a old format used until Volto 15)"\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:31\n+#: plone/volto/browser/migrate_to_volto.pt:40\n+msgid "Default Pages of Folders are merged with the Folderish Pages that replace the Folder wherever that is possible. This works well with Pages and Collections where the text and/or query are added to the folderish page that replaces the Folder."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n+msgid "Deprecated (use volto.kicker instead)"\n+msgstr ""\n+\n+#: plone/volto/profiles/coresandbox/types/example.xml\n+msgid "Example"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n msgid "Head title field"\n msgstr "Kopftitel Feld"\n \n-#: plone/volto/behaviors/headtitle.py:13\n-msgid "Header title"\n-msgstr "Kopftitel"\n+#: plone/volto/browser/migrate_to_volto.pt:16\n+msgid "Here you can prepare this site for Volto."\n+msgstr ""\n \n-#: plone/volto/behaviors/headtitle.py:15\n-msgid "Header title should consist of year and number of the report"\n-msgstr "Kopftitel sollte aus Jahr und Nummer des Berichts bestehen"\n+#: plone/volto/browser/migrate_to_volto.pt:34\n+msgid "Install the package plone.volto and plone.restapi."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:76\n+msgid "It is recommendet to use the default settings but here you can disable some of the migration-steps."\n+msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:24\n-#: plone/volto/behaviors/navtitle.py:12\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Kicker field"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:130\n+msgid "Migrate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:93\n+msgid "Migrate Folders to Folderish Pages"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:12\n+msgid "Migrate Richtext to Slate Block"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:114\n+msgid "Migrate default Pages into the Folderish Pages if possible"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:16\n+msgid "Migrate text from RichText-fields to text in the Volto Editor"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:12\n+msgid "Migrate to Volto"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+#: plone/volto/behaviors/navtitle.py:11\n msgid "Navigation title"\n msgstr "Navigationstitel"\n \n-#: plone/volto/behaviors/configure.zcml:24\n+#: plone/volto/behaviors/configure.zcml:35\n msgid "Navigation title used in sections, menus and doormats"\n msgstr "Navigationstitel der in der Navigation, Brotkrumen und Auflistungen verwendet wird"\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Plone 6 Frontend (Default content on homepage with draftJS blocks)"\n-msgstr ""\n-\n-#: plone/volto/profiles.zcml:51\n-msgid "Plone 6 Frontend (Default content on homepage with slate blocks)"\n+#: plone/volto/browser/migrate_to_volto.pt:39\n+msgid "Pages, News Items, and Events are made folderish. That means they can contain other content, such as Images or Pages."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Plone 6 Frontend (Default content on homepage)"\n-msgstr "Plone 6 Frontend (Standard Inhalte)"\n-\n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/profiles.zcml:16\n msgid "Plone 6 Frontend (plone.volto)"\n msgstr "Plone 6 Frontend (plone.volto)"\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/profiles.zcml:25\n msgid "Plone 6 Frontend (plone.volto): uninstall"\n msgstr "Plone 6 Frontend (plone.volto): Deinstallation"\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview Image"\n msgstr "Vorschaubild"\n \n-#: plone/volto/behaviors/preview.py:23\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview Image Link"\n+msgstr ""\n+\n+#: plone/volto/behaviors/preview.py:22\n+#: plone/volto/behaviors/preview_link.py:42\n msgid "Preview image caption"\n msgstr "Legende zum Vorschaubild"\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview image for listings"\n msgstr "Vorschaubild f\xc3\xbcr Auflistungen"\n \n-#: plone/volto/profiles.zcml:60\n-msgid "Special requirements and setup for demo site"\n-msgstr "Setup f\xc3\xbcr Demo Website"\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview image for listings based on links"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/browser/migrate_richtext.pt:115\n+msgid "Purge Richtext-fields after migrating to Slate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:142\n+msgid "Purge old Richtext-fields after migrating to Volto blocks"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:60\n+msgid "Requirements for this migration wizard"\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:35\n msgid "Special test fixture for coresandbox use cases"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n+#: plone/volto/profiles.zcml:46\n msgid "Special test fixture for multilingual use case"\n msgstr "Text Fixture f\xc3\xbcr Mehrsprachigkeit"\n \n-#: plone/volto/profiles.zcml:88\n-msgid "Specific profile for re-adding the richtext behavior"\n-msgstr "Profil um das Rich-Text Behavior erneut hinzuzuf\xc3\xbcgen"\n+#: plone/volto/browser/migrate_to_volto.pt:38\n+msgid "The HTML of RichText fields (previously edited using TinyMCE) is converted into Volto blocks so you can edit it in Volto."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:148\n+msgid "The RichtextValue objects will be removed from the migrated objects. The old fields (from the behavior plone.volto) are no longer available."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:172\n+msgid "The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:64\n+msgid "To migrate RichText to Volto Blocks you need to have blocks-conversion-tool running on an accessible URL. The easiest way to have that running on your machine is: docker run -it -p 5000:5000 plone/blocks-conversion-tool:latest. More for options read https://github.com/plone/blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:157\n+msgid "URL of blocks-conversion-tool."\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/browser/migrate_richtext.pt:57\n+msgid "URL of blocks-conversion-tool. The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:25\n msgid "Uninstalls the plone.volto add-on."\n msgstr "Deinstalliert die Erweiterung plone.volto"\n \n+#: plone/volto/browser/migrate_to_volto.pt:21\n+msgid "Volto is a React-based frontend for Plone. It is the default UI for Plone 6. Volto is a separate server-side application."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:24\n+msgid "Volto needs to run continuously alongside the current Plone backend service from which you access this wizard. The Volto server performs initial server-side rendering (SSR) of the React application for pages. It also delivers the JavaScript frontend to your browser. Without a Volto frontend prepared for this website and the means to host it, continuing this migration makes no sense! Read the Volto Frontend documentation for more information."\n+msgstr ""\n+\n+#: plone/volto/browser/voltobackendwarning.pt:11\n+msgid "Warning"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:23\n+msgid "What do you need for Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:20\n+msgid "What is Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:31\n+msgid "What will happen?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:32\n+msgid "When you click on \\"Migrate to Volto\\" at the end of the form, the following things will happen:"\n+msgstr ""\n+\n #. Default: "The languages in which the site should be translatable."\n-#: plone/volto/coresandbox/example.py:811\n+#: plone/volto/coresandbox/example.py:810\n msgid "description_available_languages"\n msgstr ""\n \n #. Default: "Available languages"\n-#: plone/volto/coresandbox/example.py:810\n+#: plone/volto/coresandbox/example.py:809\n msgid "heading_available_languages"\n msgstr ""\n \n+#. Default: "The kicker is a line of text shown above the title."\n+#: plone/volto/behaviors/kicker.py:14\n+msgid "help_kicker"\n+msgstr "Der Kopftitel wird in Teaser-Bl\xc3\xb6cken \xc3\xbcber dem Titel angezeigt."\n+\n #. Default: "Insert an image that will be used in listing and teaser blocks."\n-#: plone/volto/behaviors/preview.py:15\n+#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview_link.py:24\n msgid "help_previewimage"\n msgstr "Bild einf\xc3\xbcgen welches in Auflistungen und Anrei\xc3\x9fer-Bl\xc3\xb6cken verwendet wird."\n \n+#. Default: "Kicker"\n+#: plone/volto/behaviors/kicker.py:12\n+msgid "label_kicker"\n+msgstr "Kopftitel"\n+\n #. Default: "Preview image"\n-#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview.py:13\n+#: plone/volto/behaviors/preview_link.py:23\n msgid "label_previewimage"\n msgstr "Vorschaubild"\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/profiles.zcml:35\n msgid "plone.volto coresandbox Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:60\n-msgid "plone.volto demo special requirements"\n+#: plone/volto/profiles.zcml:46\n+msgid "plone.volto multilingual Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n-msgid "plone.volto multilingual Cypress tests fixtures"\n+#. Default: "You have accessed the Plone backend through its Classic UI frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:13\n+msgid "volto_backend_warning"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:88\n-msgid "plone.volto p51 profile"\n+#. Default: "If you want to use Plone\'s new frontend Volto instead:
  • Install Volto, if not already installed.
  • Start Volto, if not already started.
  • Visit the Volto frontend.
For more information, please read the documentation for how to Install Plone from its packages and refer to the full Volto documentation Frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:16\n+msgid "volto_backend_warning_link"\n msgstr ""\ndiff --git a/src/plone/volto/locales/en/LC_MESSAGES/plone.volto.po b/src/plone/volto/locales/en/LC_MESSAGES/plone.volto.po\nindex 2d699359..98656a61 100644\n--- a/src/plone/volto/locales/en/LC_MESSAGES/plone.volto.po\n+++ b/src/plone/volto/locales/en/LC_MESSAGES/plone.volto.po\n@@ -4,7 +4,7 @@\n msgid ""\n msgstr ""\n "Project-Id-Version: PACKAGE VERSION\\n"\n-"POT-Creation-Date: 2022-08-11 23:31+0000\\n"\n+"POT-Creation-Date: 2024-12-11 17:41+0000\\n"\n "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\\n"\n "Last-Translator: FULL NAME \\n"\n "Language-Team: LANGUAGE \\n"\n@@ -17,131 +17,262 @@ msgstr ""\n "Preferred-Encodings: utf-8 latin1\\n"\n "Domain: plone.volto\\n"\n \n-#: plone/volto/behaviors/configure.zcml:31\n-msgid "Adds Head title field"\n+#: plone/volto/browser/migrate_to_volto.pt:45\n+msgid "A site migrated to Volto in this Plone backend will still be accessible through the Plone Classic User Interface but with limited functionality. The core content types will have all their GUI RichText fields replaced by the blocks behavior for the composition of the main content. So after migration you can only edit this content using the Volto UI."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Adds kicker field (text to be shown above the headline)"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:75\n+msgid "Advanced settings"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:120\n+msgid "Collections and Pages that are the default-page of a Folder will be applied on the migrated Folderish Page. For Collections that means adding a listing block with the same query. This only happens if you also you migrate Folders to Folderish Pages."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:42\n+msgid "Collections are migrated to Pages with Listing Blocks configured like the Collection."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n msgid "Configures the Plone backend to work with Volto, the new default frontend for Plone 6."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Creates a default page for the site"\n+#: plone/volto/browser/migrate_richtext.pt:33\n+msgid "Content Types to handle"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:83\n+msgid "Convert to Slate (default)"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Creates a default page for the site using (legacy) draftJS blocks"\n+#: plone/volto/browser/migrate_richtext.pt:97\n+msgid "Convert to draftjs (a old format used until Volto 15)"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:51\n-msgid "Creates a default page for the site using slate blocks"\n+#: plone/volto/browser/migrate_to_volto.pt:40\n+msgid "Default Pages of Folders are merged with the Folderish Pages that replace the Folder wherever that is possible. This works well with Pages and Collections where the text and/or query are added to the folderish page that replaces the Folder."\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:31\n+#: plone/volto/behaviors/configure.zcml:42\n+msgid "Deprecated (use volto.kicker instead)"\n+msgstr ""\n+\n+#: plone/volto/profiles/coresandbox/types/example.xml\n+msgid "Example"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n msgid "Head title field"\n msgstr ""\n \n-#: plone/volto/behaviors/headtitle.py:13\n-msgid "Header title"\n+#: plone/volto/browser/migrate_to_volto.pt:16\n+msgid "Here you can prepare this site for Volto."\n msgstr ""\n \n-#: plone/volto/behaviors/headtitle.py:15\n-msgid "Header title should consist of year and number of the report"\n+#: plone/volto/browser/migrate_to_volto.pt:34\n+msgid "Install the package plone.volto and plone.restapi."\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:24\n-#: plone/volto/behaviors/navtitle.py:12\n-msgid "Navigation title"\n-msgstr "Navigation title"\n+#: plone/volto/browser/migrate_to_volto.pt:76\n+msgid "It is recommendet to use the default settings but here you can disable some of the migration-steps."\n+msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:24\n-msgid "Navigation title used in sections, menus and doormats"\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Kicker field"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Plone 6 Frontend (Default content on homepage with draftJS blocks)"\n+#: plone/volto/browser/migrate_richtext.pt:130\n+msgid "Migrate"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:51\n-msgid "Plone 6 Frontend (Default content on homepage with slate blocks)"\n+#: plone/volto/browser/migrate_to_volto.pt:93\n+msgid "Migrate Folders to Folderish Pages"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Plone 6 Frontend (Default content on homepage)"\n+#: plone/volto/browser/migrate_richtext.pt:12\n+msgid "Migrate Richtext to Slate Block"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/browser/migrate_to_volto.pt:114\n+msgid "Migrate default Pages into the Folderish Pages if possible"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:16\n+msgid "Migrate text from RichText-fields to text in the Volto Editor"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:12\n+msgid "Migrate to Volto"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+#: plone/volto/behaviors/navtitle.py:11\n+msgid "Navigation title"\n+msgstr "Navigation title"\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+msgid "Navigation title used in sections, menus and doormats"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:39\n+msgid "Pages, News Items, and Events are made folderish. That means they can contain other content, such as Images or Pages."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n msgid "Plone 6 Frontend (plone.volto)"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/profiles.zcml:25\n msgid "Plone 6 Frontend (plone.volto): uninstall"\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview Image"\n msgstr ""\n \n-#: plone/volto/behaviors/preview.py:23\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview Image Link"\n+msgstr ""\n+\n+#: plone/volto/behaviors/preview.py:22\n+#: plone/volto/behaviors/preview_link.py:42\n msgid "Preview image caption"\n msgstr "Preview image caption"\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview image for listings"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:60\n-msgid "Special requirements and setup for demo site"\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview image for listings based on links"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:115\n+msgid "Purge Richtext-fields after migrating to Slate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:142\n+msgid "Purge old Richtext-fields after migrating to Volto blocks"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:60\n+msgid "Requirements for this migration wizard"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/profiles.zcml:35\n msgid "Special test fixture for coresandbox use cases"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n+#: plone/volto/profiles.zcml:46\n msgid "Special test fixture for multilingual use case"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:88\n-msgid "Specific profile for re-adding the richtext behavior"\n+#: plone/volto/browser/migrate_to_volto.pt:38\n+msgid "The HTML of RichText fields (previously edited using TinyMCE) is converted into Volto blocks so you can edit it in Volto."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:148\n+msgid "The RichtextValue objects will be removed from the migrated objects. The old fields (from the behavior plone.volto) are no longer available."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/browser/migrate_to_volto.pt:172\n+msgid "The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:64\n+msgid "To migrate RichText to Volto Blocks you need to have blocks-conversion-tool running on an accessible URL. The easiest way to have that running on your machine is: docker run -it -p 5000:5000 plone/blocks-conversion-tool:latest. More for options read https://github.com/plone/blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:157\n+msgid "URL of blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:57\n+msgid "URL of blocks-conversion-tool. The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:25\n msgid "Uninstalls the plone.volto add-on."\n msgstr ""\n \n+#: plone/volto/browser/migrate_to_volto.pt:21\n+msgid "Volto is a React-based frontend for Plone. It is the default UI for Plone 6. Volto is a separate server-side application."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:24\n+msgid "Volto needs to run continuously alongside the current Plone backend service from which you access this wizard. The Volto server performs initial server-side rendering (SSR) of the React application for pages. It also delivers the JavaScript frontend to your browser. Without a Volto frontend prepared for this website and the means to host it, continuing this migration makes no sense! Read the Volto Frontend documentation for more information."\n+msgstr ""\n+\n+#: plone/volto/browser/voltobackendwarning.pt:11\n+msgid "Warning"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:23\n+msgid "What do you need for Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:20\n+msgid "What is Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:31\n+msgid "What will happen?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:32\n+msgid "When you click on \\"Migrate to Volto\\" at the end of the form, the following things will happen:"\n+msgstr ""\n+\n #. Default: "The languages in which the site should be translatable."\n-#: plone/volto/coresandbox/example.py:811\n+#: plone/volto/coresandbox/example.py:810\n msgid "description_available_languages"\n msgstr ""\n \n #. Default: "Available languages"\n-#: plone/volto/coresandbox/example.py:810\n+#: plone/volto/coresandbox/example.py:809\n msgid "heading_available_languages"\n msgstr ""\n \n+#. Default: "The kicker is a line of text shown above the title."\n+#: plone/volto/behaviors/kicker.py:14\n+msgid "help_kicker"\n+msgstr ""\n+\n #. Default: "Insert an image that will be used in listing and teaser blocks."\n-#: plone/volto/behaviors/preview.py:15\n+#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview_link.py:24\n msgid "help_previewimage"\n msgstr ""\n \n+#. Default: "Kicker"\n+#: plone/volto/behaviors/kicker.py:12\n+msgid "label_kicker"\n+msgstr ""\n+\n #. Default: "Preview image"\n-#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview.py:13\n+#: plone/volto/behaviors/preview_link.py:23\n msgid "label_previewimage"\n msgstr "Preview image"\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/profiles.zcml:35\n msgid "plone.volto coresandbox Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:60\n-msgid "plone.volto demo special requirements"\n+#: plone/volto/profiles.zcml:46\n+msgid "plone.volto multilingual Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n-msgid "plone.volto multilingual Cypress tests fixtures"\n+#. Default: "You have accessed the Plone backend through its Classic UI frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:13\n+msgid "volto_backend_warning"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:88\n-msgid "plone.volto p51 profile"\n+#. Default: "If you want to use Plone\'s new frontend Volto instead:
  • Install Volto, if not already installed.
  • Start Volto, if not already started.
  • Visit the Volto frontend.
For more information, please read the documentation for how to Install Plone from its packages and refer to the full Volto documentation Frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:16\n+msgid "volto_backend_warning_link"\n msgstr ""\ndiff --git a/src/plone/volto/locales/es/LC_MESSAGES/plone.volto.po b/src/plone/volto/locales/es/LC_MESSAGES/plone.volto.po\nindex 3e69abf1..d255e841 100644\n--- a/src/plone/volto/locales/es/LC_MESSAGES/plone.volto.po\n+++ b/src/plone/volto/locales/es/LC_MESSAGES/plone.volto.po\n@@ -4,7 +4,7 @@\n msgid ""\n msgstr ""\n "Project-Id-Version: \\n"\n-"POT-Creation-Date: 2022-08-11 23:31+0000\\n"\n+"POT-Creation-Date: 2024-12-11 17:41+0000\\n"\n "PO-Revision-Date: 2021-11-21 16:58+0100\\n"\n "Last-Translator: \\n"\n "Language-Team: \\n"\n@@ -19,131 +19,262 @@ msgstr ""\n "Language: es\\n"\n "X-Generator: Poedit 2.3\\n"\n \n-#: plone/volto/behaviors/configure.zcml:31\n-msgid "Adds Head title field"\n-msgstr "A\xc3\xb1ade el campo de t\xc3\xadtulo de cabecera"\n+#: plone/volto/browser/migrate_to_volto.pt:45\n+msgid "A site migrated to Volto in this Plone backend will still be accessible through the Plone Classic User Interface but with limited functionality. The core content types will have all their GUI RichText fields replaced by the blocks behavior for the composition of the main content. So after migration you can only edit this content using the Volto UI."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Adds kicker field (text to be shown above the headline)"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/browser/migrate_to_volto.pt:75\n+msgid "Advanced settings"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:120\n+msgid "Collections and Pages that are the default-page of a Folder will be applied on the migrated Folderish Page. For Collections that means adding a listing block with the same query. This only happens if you also you migrate Folders to Folderish Pages."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:42\n+msgid "Collections are migrated to Pages with Listing Blocks configured like the Collection."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n msgid "Configures the Plone backend to work with Volto, the new default frontend for Plone 6."\n msgstr "Configura Plone para funcionar con Volto, el nuevo frontal de Plone 6."\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Creates a default page for the site"\n-msgstr "Crea la p\xc3\xa1gina por defecto del sitio"\n+#: plone/volto/browser/migrate_richtext.pt:33\n+msgid "Content Types to handle"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Creates a default page for the site using (legacy) draftJS blocks"\n+#: plone/volto/browser/migrate_richtext.pt:83\n+msgid "Convert to Slate (default)"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:51\n-msgid "Creates a default page for the site using slate blocks"\n+#: plone/volto/browser/migrate_richtext.pt:97\n+msgid "Convert to draftjs (a old format used until Volto 15)"\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:31\n+#: plone/volto/browser/migrate_to_volto.pt:40\n+msgid "Default Pages of Folders are merged with the Folderish Pages that replace the Folder wherever that is possible. This works well with Pages and Collections where the text and/or query are added to the folderish page that replaces the Folder."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n+msgid "Deprecated (use volto.kicker instead)"\n+msgstr ""\n+\n+#: plone/volto/profiles/coresandbox/types/example.xml\n+msgid "Example"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n msgid "Head title field"\n msgstr "Campo de t\xc3\xadtulo de cabecera"\n \n-#: plone/volto/behaviors/headtitle.py:13\n-msgid "Header title"\n-msgstr "T\xc3\xadtulo de cabecera"\n+#: plone/volto/browser/migrate_to_volto.pt:16\n+msgid "Here you can prepare this site for Volto."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:34\n+msgid "Install the package plone.volto and plone.restapi."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:76\n+msgid "It is recommendet to use the default settings but here you can disable some of the migration-steps."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Kicker field"\n+msgstr ""\n \n-#: plone/volto/behaviors/headtitle.py:15\n-msgid "Header title should consist of year and number of the report"\n-msgstr "El t\xc3\xadtulo de cabecera deber\xc3\xada tener el a\xc3\xb1o y n\xc3\xbamero de informe"\n+#: plone/volto/browser/migrate_richtext.pt:130\n+msgid "Migrate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:93\n+msgid "Migrate Folders to Folderish Pages"\n+msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:24\n-#: plone/volto/behaviors/navtitle.py:12\n+#: plone/volto/browser/migrate_richtext.pt:12\n+msgid "Migrate Richtext to Slate Block"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:114\n+msgid "Migrate default Pages into the Folderish Pages if possible"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:16\n+msgid "Migrate text from RichText-fields to text in the Volto Editor"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:12\n+msgid "Migrate to Volto"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+#: plone/volto/behaviors/navtitle.py:11\n msgid "Navigation title"\n msgstr "T\xc3\xadtulo de la navegaci\xc3\xb3n"\n \n-#: plone/volto/behaviors/configure.zcml:24\n+#: plone/volto/behaviors/configure.zcml:35\n msgid "Navigation title used in sections, menus and doormats"\n msgstr "T\xc3\xadtulo de la navegaci\xc3\xb3n utilizado en secciones, men\xc3\xbas y acordeones"\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Plone 6 Frontend (Default content on homepage with draftJS blocks)"\n-msgstr ""\n-\n-#: plone/volto/profiles.zcml:51\n-msgid "Plone 6 Frontend (Default content on homepage with slate blocks)"\n+#: plone/volto/browser/migrate_to_volto.pt:39\n+msgid "Pages, News Items, and Events are made folderish. That means they can contain other content, such as Images or Pages."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Plone 6 Frontend (Default content on homepage)"\n-msgstr "Frontal Plone 6 (contenido por defecto en la portada)"\n-\n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/profiles.zcml:16\n msgid "Plone 6 Frontend (plone.volto)"\n msgstr "Frontal Plone 6 (plone.volto)"\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/profiles.zcml:25\n msgid "Plone 6 Frontend (plone.volto): uninstall"\n msgstr "Frontal Plone 6 (plone.volto): desinstalar"\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview Image"\n msgstr "Imagen"\n \n-#: plone/volto/behaviors/preview.py:23\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview Image Link"\n+msgstr ""\n+\n+#: plone/volto/behaviors/preview.py:22\n+#: plone/volto/behaviors/preview_link.py:42\n msgid "Preview image caption"\n msgstr "Preview image caption"\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview image for listings"\n msgstr "Imagen para listados"\n \n-#: plone/volto/profiles.zcml:60\n-msgid "Special requirements and setup for demo site"\n-msgstr "Configuraci\xc3\xb3n especial para instalar el sitio de demo"\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview image for listings based on links"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/browser/migrate_richtext.pt:115\n+msgid "Purge Richtext-fields after migrating to Slate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:142\n+msgid "Purge old Richtext-fields after migrating to Volto blocks"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:60\n+msgid "Requirements for this migration wizard"\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:35\n msgid "Special test fixture for coresandbox use cases"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n+#: plone/volto/profiles.zcml:46\n msgid "Special test fixture for multilingual use case"\n msgstr "Perfil especial para configurar los tests de un sitio multiling\xc3\xbce"\n \n-#: plone/volto/profiles.zcml:88\n-msgid "Specific profile for re-adding the richtext behavior"\n-msgstr "Perfil espec\xc3\xadfico para a\xc3\xb1adir otra vez el comportamiento de texto"\n+#: plone/volto/browser/migrate_to_volto.pt:38\n+msgid "The HTML of RichText fields (previously edited using TinyMCE) is converted into Volto blocks so you can edit it in Volto."\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/browser/migrate_to_volto.pt:148\n+msgid "The RichtextValue objects will be removed from the migrated objects. The old fields (from the behavior plone.volto) are no longer available."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:172\n+msgid "The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:64\n+msgid "To migrate RichText to Volto Blocks you need to have blocks-conversion-tool running on an accessible URL. The easiest way to have that running on your machine is: docker run -it -p 5000:5000 plone/blocks-conversion-tool:latest. More for options read https://github.com/plone/blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:157\n+msgid "URL of blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:57\n+msgid "URL of blocks-conversion-tool. The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:25\n msgid "Uninstalls the plone.volto add-on."\n msgstr "Desinstalar plone.volto"\n \n+#: plone/volto/browser/migrate_to_volto.pt:21\n+msgid "Volto is a React-based frontend for Plone. It is the default UI for Plone 6. Volto is a separate server-side application."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:24\n+msgid "Volto needs to run continuously alongside the current Plone backend service from which you access this wizard. The Volto server performs initial server-side rendering (SSR) of the React application for pages. It also delivers the JavaScript frontend to your browser. Without a Volto frontend prepared for this website and the means to host it, continuing this migration makes no sense! Read the Volto Frontend documentation for more information."\n+msgstr ""\n+\n+#: plone/volto/browser/voltobackendwarning.pt:11\n+msgid "Warning"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:23\n+msgid "What do you need for Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:20\n+msgid "What is Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:31\n+msgid "What will happen?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:32\n+msgid "When you click on \\"Migrate to Volto\\" at the end of the form, the following things will happen:"\n+msgstr ""\n+\n #. Default: "The languages in which the site should be translatable."\n-#: plone/volto/coresandbox/example.py:811\n+#: plone/volto/coresandbox/example.py:810\n msgid "description_available_languages"\n msgstr ""\n \n #. Default: "Available languages"\n-#: plone/volto/coresandbox/example.py:810\n+#: plone/volto/coresandbox/example.py:809\n msgid "heading_available_languages"\n msgstr ""\n \n+#. Default: "The kicker is a line of text shown above the title."\n+#: plone/volto/behaviors/kicker.py:14\n+msgid "help_kicker"\n+msgstr "El t\xc3\xadtulo del cabecera se muestra encima del t\xc3\xadtulo en los bloques teaser."\n+\n #. Default: "Insert an image that will be used in listing and teaser blocks."\n-#: plone/volto/behaviors/preview.py:15\n+#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview_link.py:24\n msgid "help_previewimage"\n msgstr "Introduzca la imagen que se utilizar\xc3\xa1 en los listados y otros bloques"\n \n+#. Default: "Kicker"\n+#: plone/volto/behaviors/kicker.py:12\n+msgid "label_kicker"\n+msgstr "T\xc3\xadtulo de cabecera"\n+\n #. Default: "Preview image"\n-#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview.py:13\n+#: plone/volto/behaviors/preview_link.py:23\n msgid "label_previewimage"\n msgstr "Imagen"\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/profiles.zcml:35\n msgid "plone.volto coresandbox Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:60\n-msgid "plone.volto demo special requirements"\n-msgstr "Requisitos especiales de la demo de plone.volto"\n-\n-#: plone/volto/profiles.zcml:80\n+#: plone/volto/profiles.zcml:46\n msgid "plone.volto multilingual Cypress tests fixtures"\n msgstr "Tests de plone.volto multiling\xc3\xbce"\n \n-#: plone/volto/profiles.zcml:88\n-msgid "plone.volto p51 profile"\n-msgstr "Perfil plone.volto p51"\n+#. Default: "You have accessed the Plone backend through its Classic UI frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:13\n+msgid "volto_backend_warning"\n+msgstr ""\n+\n+#. Default: "If you want to use Plone\'s new frontend Volto instead:
  • Install Volto, if not already installed.
  • Start Volto, if not already started.
  • Visit the Volto frontend.
For more information, please read the documentation for how to Install Plone from its packages and refer to the full Volto documentation Frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:16\n+msgid "volto_backend_warning_link"\n+msgstr ""\ndiff --git a/src/plone/volto/locales/eu/LC_MESSAGES/plone.volto.po b/src/plone/volto/locales/eu/LC_MESSAGES/plone.volto.po\nindex fba03572..11117030 100644\n--- a/src/plone/volto/locales/eu/LC_MESSAGES/plone.volto.po\n+++ b/src/plone/volto/locales/eu/LC_MESSAGES/plone.volto.po\n@@ -4,7 +4,7 @@\n msgid ""\n msgstr ""\n "Project-Id-Version: \\n"\n-"POT-Creation-Date: 2022-08-11 23:31+0000\\n"\n+"POT-Creation-Date: 2024-12-11 17:41+0000\\n"\n "PO-Revision-Date: 2021-11-21 16:50+0100\\n"\n "Last-Translator: \\n"\n "Language-Team: \\n"\n@@ -19,131 +19,262 @@ msgstr ""\n "Language: eu\\n"\n "X-Generator: Poedit 2.3\\n"\n \n-#: plone/volto/behaviors/configure.zcml:31\n-msgid "Adds Head title field"\n-msgstr "Goiburuko izenburua gehitu"\n+#: plone/volto/browser/migrate_to_volto.pt:45\n+msgid "A site migrated to Volto in this Plone backend will still be accessible through the Plone Classic User Interface but with limited functionality. The core content types will have all their GUI RichText fields replaced by the blocks behavior for the composition of the main content. So after migration you can only edit this content using the Volto UI."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Adds kicker field (text to be shown above the headline)"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/browser/migrate_to_volto.pt:75\n+msgid "Advanced settings"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:120\n+msgid "Collections and Pages that are the default-page of a Folder will be applied on the migrated Folderish Page. For Collections that means adding a listing block with the same query. This only happens if you also you migrate Folders to Folderish Pages."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:42\n+msgid "Collections are migrated to Pages with Listing Blocks configured like the Collection."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n msgid "Configures the Plone backend to work with Volto, the new default frontend for Plone 6."\n msgstr "Plone Voltorekin funtzionatzeko konfiguratzen du, Plone 6rako Frontend berria."\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Creates a default page for the site"\n-msgstr "Atariaren defektuzko orri berria sortzen du"\n+#: plone/volto/browser/migrate_richtext.pt:33\n+msgid "Content Types to handle"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:83\n+msgid "Convert to Slate (default)"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:97\n+msgid "Convert to draftjs (a old format used until Volto 15)"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Creates a default page for the site using (legacy) draftJS blocks"\n+#: plone/volto/browser/migrate_to_volto.pt:40\n+msgid "Default Pages of Folders are merged with the Folderish Pages that replace the Folder wherever that is possible. This works well with Pages and Collections where the text and/or query are added to the folderish page that replaces the Folder."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:51\n-msgid "Creates a default page for the site using slate blocks"\n+#: plone/volto/behaviors/configure.zcml:42\n+msgid "Deprecated (use volto.kicker instead)"\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:31\n+#: plone/volto/profiles/coresandbox/types/example.xml\n+msgid "Example"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n msgid "Head title field"\n msgstr "Goiburuko izenburuaren eremua"\n \n-#: plone/volto/behaviors/headtitle.py:13\n-msgid "Header title"\n-msgstr "Goiburuko izenburua"\n+#: plone/volto/browser/migrate_to_volto.pt:16\n+msgid "Here you can prepare this site for Volto."\n+msgstr ""\n \n-#: plone/volto/behaviors/headtitle.py:15\n-msgid "Header title should consist of year and number of the report"\n-msgstr "Goiburukoan erabiliko den izenburua"\n+#: plone/volto/browser/migrate_to_volto.pt:34\n+msgid "Install the package plone.volto and plone.restapi."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:76\n+msgid "It is recommendet to use the default settings but here you can disable some of the migration-steps."\n+msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:24\n-#: plone/volto/behaviors/navtitle.py:12\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Kicker field"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:130\n+msgid "Migrate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:93\n+msgid "Migrate Folders to Folderish Pages"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:12\n+msgid "Migrate Richtext to Slate Block"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:114\n+msgid "Migrate default Pages into the Folderish Pages if possible"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:16\n+msgid "Migrate text from RichText-fields to text in the Volto Editor"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:12\n+msgid "Migrate to Volto"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+#: plone/volto/behaviors/navtitle.py:11\n msgid "Navigation title"\n msgstr "Nabigazioaren izenburua"\n \n-#: plone/volto/behaviors/configure.zcml:24\n+#: plone/volto/behaviors/configure.zcml:35\n msgid "Navigation title used in sections, menus and doormats"\n msgstr "Atal, menu eta akordeoietan erabiliko den nabigazioaren izenburua"\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Plone 6 Frontend (Default content on homepage with draftJS blocks)"\n-msgstr ""\n-\n-#: plone/volto/profiles.zcml:51\n-msgid "Plone 6 Frontend (Default content on homepage with slate blocks)"\n+#: plone/volto/browser/migrate_to_volto.pt:39\n+msgid "Pages, News Items, and Events are made folderish. That means they can contain other content, such as Images or Pages."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Plone 6 Frontend (Default content on homepage)"\n-msgstr "Plone 6 Frontenda (hasiera orria defektuzko edukiarekin)"\n-\n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/profiles.zcml:16\n msgid "Plone 6 Frontend (plone.volto)"\n msgstr "Plone 6 Frontenda (plone.volto)"\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/profiles.zcml:25\n msgid "Plone 6 Frontend (plone.volto): uninstall"\n msgstr "Plone 6 Frontenda (plone.volto): kendu"\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview Image"\n msgstr "Irudia"\n \n-#: plone/volto/behaviors/preview.py:23\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview Image Link"\n+msgstr ""\n+\n+#: plone/volto/behaviors/preview.py:22\n+#: plone/volto/behaviors/preview_link.py:42\n msgid "Preview image caption"\n msgstr "Irudi-oina"\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview image for listings"\n msgstr "Zerrendetan erabiliko den irudia"\n \n-#: plone/volto/profiles.zcml:60\n-msgid "Special requirements and setup for demo site"\n-msgstr "Demo webgunea konfiguratzeko profil berezia"\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview image for listings based on links"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/browser/migrate_richtext.pt:115\n+msgid "Purge Richtext-fields after migrating to Slate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:142\n+msgid "Purge old Richtext-fields after migrating to Volto blocks"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:60\n+msgid "Requirements for this migration wizard"\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:35\n msgid "Special test fixture for coresandbox use cases"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n+#: plone/volto/profiles.zcml:46\n msgid "Special test fixture for multilingual use case"\n msgstr "Webgune eleanitzetan erabiltzeko profila"\n \n-#: plone/volto/profiles.zcml:88\n-msgid "Specific profile for re-adding the richtext behavior"\n-msgstr "Testu aberatseko portaera gehitzeko profila"\n+#: plone/volto/browser/migrate_to_volto.pt:38\n+msgid "The HTML of RichText fields (previously edited using TinyMCE) is converted into Volto blocks so you can edit it in Volto."\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/browser/migrate_to_volto.pt:148\n+msgid "The RichtextValue objects will be removed from the migrated objects. The old fields (from the behavior plone.volto) are no longer available."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:172\n+msgid "The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:64\n+msgid "To migrate RichText to Volto Blocks you need to have blocks-conversion-tool running on an accessible URL. The easiest way to have that running on your machine is: docker run -it -p 5000:5000 plone/blocks-conversion-tool:latest. More for options read https://github.com/plone/blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:157\n+msgid "URL of blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:57\n+msgid "URL of blocks-conversion-tool. The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:25\n msgid "Uninstalls the plone.volto add-on."\n msgstr "plone.volto kendu"\n \n+#: plone/volto/browser/migrate_to_volto.pt:21\n+msgid "Volto is a React-based frontend for Plone. It is the default UI for Plone 6. Volto is a separate server-side application."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:24\n+msgid "Volto needs to run continuously alongside the current Plone backend service from which you access this wizard. The Volto server performs initial server-side rendering (SSR) of the React application for pages. It also delivers the JavaScript frontend to your browser. Without a Volto frontend prepared for this website and the means to host it, continuing this migration makes no sense! Read the Volto Frontend documentation for more information."\n+msgstr ""\n+\n+#: plone/volto/browser/voltobackendwarning.pt:11\n+msgid "Warning"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:23\n+msgid "What do you need for Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:20\n+msgid "What is Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:31\n+msgid "What will happen?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:32\n+msgid "When you click on \\"Migrate to Volto\\" at the end of the form, the following things will happen:"\n+msgstr ""\n+\n #. Default: "The languages in which the site should be translatable."\n-#: plone/volto/coresandbox/example.py:811\n+#: plone/volto/coresandbox/example.py:810\n msgid "description_available_languages"\n msgstr ""\n \n #. Default: "Available languages"\n-#: plone/volto/coresandbox/example.py:810\n+#: plone/volto/coresandbox/example.py:809\n msgid "heading_available_languages"\n msgstr ""\n \n+#. Default: "The kicker is a line of text shown above the title."\n+#: plone/volto/behaviors/kicker.py:14\n+msgid "help_kicker"\n+msgstr "Goiburukoan erabiliko den izenburua"\n+\n #. Default: "Insert an image that will be used in listing and teaser blocks."\n-#: plone/volto/behaviors/preview.py:15\n+#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview_link.py:24\n msgid "help_previewimage"\n msgstr "Kargatu zerrendetan eta destakatuen blokeetan defektuz erabiliko den irudia"\n \n+#. Default: "Kicker"\n+#: plone/volto/behaviors/kicker.py:12\n+msgid "label_kicker"\n+msgstr "Goiburuko izenburua"\n+\n #. Default: "Preview image"\n-#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview.py:13\n+#: plone/volto/behaviors/preview_link.py:23\n msgid "label_previewimage"\n msgstr "Irudia"\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/profiles.zcml:35\n msgid "plone.volto coresandbox Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:60\n-msgid "plone.volto demo special requirements"\n-msgstr "plone.volto demoren konfigurazio berezia"\n-\n-#: plone/volto/profiles.zcml:80\n+#: plone/volto/profiles.zcml:46\n msgid "plone.volto multilingual Cypress tests fixtures"\n msgstr "plone.volto eleanitzaren Cypress testen konfigurazioa"\n \n-#: plone/volto/profiles.zcml:88\n-msgid "plone.volto p51 profile"\n-msgstr "plone.volto p51 profila"\n+#. Default: "You have accessed the Plone backend through its Classic UI frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:13\n+msgid "volto_backend_warning"\n+msgstr ""\n+\n+#. Default: "If you want to use Plone\'s new frontend Volto instead:
  • Install Volto, if not already installed.
  • Start Volto, if not already started.
  • Visit the Volto frontend.
For more information, please read the documentation for how to Install Plone from its packages and refer to the full Volto documentation Frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:16\n+msgid "volto_backend_warning_link"\n+msgstr ""\ndiff --git a/src/plone/volto/locales/it/LC_MESSAGES/plone.volto.po b/src/plone/volto/locales/it/LC_MESSAGES/plone.volto.po\nindex 090ca145..17b4c019 100644\n--- a/src/plone/volto/locales/it/LC_MESSAGES/plone.volto.po\n+++ b/src/plone/volto/locales/it/LC_MESSAGES/plone.volto.po\n@@ -4,7 +4,7 @@\n msgid ""\n msgstr ""\n "Project-Id-Version: PACKAGE VERSION\\n"\n-"POT-Creation-Date: 2022-08-11 23:31+0000\\n"\n+"POT-Creation-Date: 2024-12-11 17:41+0000\\n"\n "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\\n"\n "Last-Translator: FULL NAME \\n"\n "Language-Team: LANGUAGE \\n"\n@@ -17,131 +17,262 @@ msgstr ""\n "Preferred-Encodings: utf-8 latin1\\n"\n "Domain: plone.volto\\n"\n \n-#: plone/volto/behaviors/configure.zcml:31\n-msgid "Adds Head title field"\n+#: plone/volto/browser/migrate_to_volto.pt:45\n+msgid "A site migrated to Volto in this Plone backend will still be accessible through the Plone Classic User Interface but with limited functionality. The core content types will have all their GUI RichText fields replaced by the blocks behavior for the composition of the main content. So after migration you can only edit this content using the Volto UI."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Adds kicker field (text to be shown above the headline)"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:75\n+msgid "Advanced settings"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:120\n+msgid "Collections and Pages that are the default-page of a Folder will be applied on the migrated Folderish Page. For Collections that means adding a listing block with the same query. This only happens if you also you migrate Folders to Folderish Pages."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:42\n+msgid "Collections are migrated to Pages with Listing Blocks configured like the Collection."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n msgid "Configures the Plone backend to work with Volto, the new default frontend for Plone 6."\n msgstr "Configura il backend di Plone per lavorare con Volto."\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Creates a default page for the site"\n-msgstr "Crea una pagina di default per questo sito"\n+#: plone/volto/browser/migrate_richtext.pt:33\n+msgid "Content Types to handle"\n+msgstr ""\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Creates a default page for the site using (legacy) draftJS blocks"\n+#: plone/volto/browser/migrate_richtext.pt:83\n+msgid "Convert to Slate (default)"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:51\n-msgid "Creates a default page for the site using slate blocks"\n+#: plone/volto/browser/migrate_richtext.pt:97\n+msgid "Convert to draftjs (a old format used until Volto 15)"\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:31\n+#: plone/volto/browser/migrate_to_volto.pt:40\n+msgid "Default Pages of Folders are merged with the Folderish Pages that replace the Folder wherever that is possible. This works well with Pages and Collections where the text and/or query are added to the folderish page that replaces the Folder."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n+msgid "Deprecated (use volto.kicker instead)"\n+msgstr ""\n+\n+#: plone/volto/profiles/coresandbox/types/example.xml\n+msgid "Example"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n msgid "Head title field"\n msgstr ""\n \n-#: plone/volto/behaviors/headtitle.py:13\n-msgid "Header title"\n+#: plone/volto/browser/migrate_to_volto.pt:16\n+msgid "Here you can prepare this site for Volto."\n msgstr ""\n \n-#: plone/volto/behaviors/headtitle.py:15\n-msgid "Header title should consist of year and number of the report"\n+#: plone/volto/browser/migrate_to_volto.pt:34\n+msgid "Install the package plone.volto and plone.restapi."\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:24\n-#: plone/volto/behaviors/navtitle.py:12\n-msgid "Navigation title"\n-msgstr "Navigation title"\n+#: plone/volto/browser/migrate_to_volto.pt:76\n+msgid "It is recommendet to use the default settings but here you can disable some of the migration-steps."\n+msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:24\n-msgid "Navigation title used in sections, menus and doormats"\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Kicker field"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Plone 6 Frontend (Default content on homepage with draftJS blocks)"\n+#: plone/volto/browser/migrate_richtext.pt:130\n+msgid "Migrate"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:51\n-msgid "Plone 6 Frontend (Default content on homepage with slate blocks)"\n+#: plone/volto/browser/migrate_to_volto.pt:93\n+msgid "Migrate Folders to Folderish Pages"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Plone 6 Frontend (Default content on homepage)"\n+#: plone/volto/browser/migrate_richtext.pt:12\n+msgid "Migrate Richtext to Slate Block"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/browser/migrate_to_volto.pt:114\n+msgid "Migrate default Pages into the Folderish Pages if possible"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:16\n+msgid "Migrate text from RichText-fields to text in the Volto Editor"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:12\n+msgid "Migrate to Volto"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+#: plone/volto/behaviors/navtitle.py:11\n+msgid "Navigation title"\n+msgstr "Navigation title"\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+msgid "Navigation title used in sections, menus and doormats"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:39\n+msgid "Pages, News Items, and Events are made folderish. That means they can contain other content, such as Images or Pages."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n msgid "Plone 6 Frontend (plone.volto)"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/profiles.zcml:25\n msgid "Plone 6 Frontend (plone.volto): uninstall"\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview Image"\n msgstr "Immagine di anteprima"\n \n-#: plone/volto/behaviors/preview.py:23\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview Image Link"\n+msgstr ""\n+\n+#: plone/volto/behaviors/preview.py:22\n+#: plone/volto/behaviors/preview_link.py:42\n msgid "Preview image caption"\n msgstr "Didascalia dell\'immagine di anteprima"\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview image for listings"\n msgstr "Immagine di anteprima da utilizzare nei blocchi listing."\n \n-#: plone/volto/profiles.zcml:60\n-msgid "Special requirements and setup for demo site"\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview image for listings based on links"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:115\n+msgid "Purge Richtext-fields after migrating to Slate"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/browser/migrate_to_volto.pt:142\n+msgid "Purge old Richtext-fields after migrating to Volto blocks"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:60\n+msgid "Requirements for this migration wizard"\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:35\n msgid "Special test fixture for coresandbox use cases"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n+#: plone/volto/profiles.zcml:46\n msgid "Special test fixture for multilingual use case"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:88\n-msgid "Specific profile for re-adding the richtext behavior"\n+#: plone/volto/browser/migrate_to_volto.pt:38\n+msgid "The HTML of RichText fields (previously edited using TinyMCE) is converted into Volto blocks so you can edit it in Volto."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:148\n+msgid "The RichtextValue objects will be removed from the migrated objects. The old fields (from the behavior plone.volto) are no longer available."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/browser/migrate_to_volto.pt:172\n+msgid "The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:64\n+msgid "To migrate RichText to Volto Blocks you need to have blocks-conversion-tool running on an accessible URL. The easiest way to have that running on your machine is: docker run -it -p 5000:5000 plone/blocks-conversion-tool:latest. More for options read https://github.com/plone/blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:157\n+msgid "URL of blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:57\n+msgid "URL of blocks-conversion-tool. The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:25\n msgid "Uninstalls the plone.volto add-on."\n msgstr ""\n \n+#: plone/volto/browser/migrate_to_volto.pt:21\n+msgid "Volto is a React-based frontend for Plone. It is the default UI for Plone 6. Volto is a separate server-side application."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:24\n+msgid "Volto needs to run continuously alongside the current Plone backend service from which you access this wizard. The Volto server performs initial server-side rendering (SSR) of the React application for pages. It also delivers the JavaScript frontend to your browser. Without a Volto frontend prepared for this website and the means to host it, continuing this migration makes no sense! Read the Volto Frontend documentation for more information."\n+msgstr ""\n+\n+#: plone/volto/browser/voltobackendwarning.pt:11\n+msgid "Warning"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:23\n+msgid "What do you need for Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:20\n+msgid "What is Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:31\n+msgid "What will happen?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:32\n+msgid "When you click on \\"Migrate to Volto\\" at the end of the form, the following things will happen:"\n+msgstr ""\n+\n #. Default: "The languages in which the site should be translatable."\n-#: plone/volto/coresandbox/example.py:811\n+#: plone/volto/coresandbox/example.py:810\n msgid "description_available_languages"\n msgstr ""\n \n #. Default: "Available languages"\n-#: plone/volto/coresandbox/example.py:810\n+#: plone/volto/coresandbox/example.py:809\n msgid "heading_available_languages"\n msgstr ""\n \n+#. Default: "The kicker is a line of text shown above the title."\n+#: plone/volto/behaviors/kicker.py:14\n+msgid "help_kicker"\n+msgstr ""\n+\n #. Default: "Insert an image that will be used in listing and teaser blocks."\n-#: plone/volto/behaviors/preview.py:15\n+#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview_link.py:24\n msgid "help_previewimage"\n msgstr "Immagine che verr\xc3\xa0 utilizzata nei blocchi listing e teaser."\n \n+#. Default: "Kicker"\n+#: plone/volto/behaviors/kicker.py:12\n+msgid "label_kicker"\n+msgstr ""\n+\n #. Default: "Preview image"\n-#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview.py:13\n+#: plone/volto/behaviors/preview_link.py:23\n msgid "label_previewimage"\n msgstr "Immagine di anteprima"\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/profiles.zcml:35\n msgid "plone.volto coresandbox Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:60\n-msgid "plone.volto demo special requirements"\n+#: plone/volto/profiles.zcml:46\n+msgid "plone.volto multilingual Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n-msgid "plone.volto multilingual Cypress tests fixtures"\n+#. Default: "You have accessed the Plone backend through its Classic UI frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:13\n+msgid "volto_backend_warning"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:88\n-msgid "plone.volto p51 profile"\n+#. Default: "If you want to use Plone\'s new frontend Volto instead:
  • Install Volto, if not already installed.
  • Start Volto, if not already started.
  • Visit the Volto frontend.
For more information, please read the documentation for how to Install Plone from its packages and refer to the full Volto documentation Frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:16\n+msgid "volto_backend_warning_link"\n msgstr ""\ndiff --git a/src/plone/volto/locales/plone.volto.pot b/src/plone/volto/locales/plone.volto.pot\nindex ca45ff8b..2da16c42 100644\n--- a/src/plone/volto/locales/plone.volto.pot\n+++ b/src/plone/volto/locales/plone.volto.pot\n@@ -4,7 +4,7 @@\n msgid ""\n msgstr ""\n "Project-Id-Version: PACKAGE VERSION\\n"\n-"POT-Creation-Date: 2022-08-11 23:31+0000\\n"\n+"POT-Creation-Date: 2024-12-11 17:41+0000\\n"\n "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\\n"\n "Last-Translator: FULL NAME \\n"\n "Language-Team: LANGUAGE \\n"\n@@ -17,131 +17,262 @@ msgstr ""\n "Preferred-Encodings: utf-8 latin1\\n"\n "Domain: plone.volto\\n"\n \n-#: plone/volto/behaviors/configure.zcml:31\n-msgid "Adds Head title field"\n+#: plone/volto/browser/migrate_to_volto.pt:45\n+msgid "A site migrated to Volto in this Plone backend will still be accessible through the Plone Classic User Interface but with limited functionality. The core content types will have all their GUI RichText fields replaced by the blocks behavior for the composition of the main content. So after migration you can only edit this content using the Volto UI."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Adds kicker field (text to be shown above the headline)"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:75\n+msgid "Advanced settings"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:120\n+msgid "Collections and Pages that are the default-page of a Folder will be applied on the migrated Folderish Page. For Collections that means adding a listing block with the same query. This only happens if you also you migrate Folders to Folderish Pages."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:42\n+msgid "Collections are migrated to Pages with Listing Blocks configured like the Collection."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n msgid "Configures the Plone backend to work with Volto, the new default frontend for Plone 6."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Creates a default page for the site"\n+#: plone/volto/browser/migrate_richtext.pt:33\n+msgid "Content Types to handle"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:83\n+msgid "Convert to Slate (default)"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:97\n+msgid "Convert to draftjs (a old format used until Volto 15)"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:40\n+msgid "Default Pages of Folders are merged with the Folderish Pages that replace the Folder wherever that is possible. This works well with Pages and Collections where the text and/or query are added to the folderish page that replaces the Folder."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Creates a default page for the site using (legacy) draftJS blocks"\n+#: plone/volto/behaviors/configure.zcml:42\n+msgid "Deprecated (use volto.kicker instead)"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:51\n-msgid "Creates a default page for the site using slate blocks"\n+#: plone/volto/profiles/coresandbox/types/example.xml\n+msgid "Example"\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:31\n+#: plone/volto/behaviors/configure.zcml:42\n msgid "Head title field"\n msgstr ""\n \n-#: plone/volto/behaviors/headtitle.py:13\n-msgid "Header title"\n+#: plone/volto/browser/migrate_to_volto.pt:16\n+msgid "Here you can prepare this site for Volto."\n msgstr ""\n \n-#: plone/volto/behaviors/headtitle.py:15\n-msgid "Header title should consist of year and number of the report"\n+#: plone/volto/browser/migrate_to_volto.pt:34\n+msgid "Install the package plone.volto and plone.restapi."\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:24\n-#: plone/volto/behaviors/navtitle.py:12\n-msgid "Navigation title"\n+#: plone/volto/browser/migrate_to_volto.pt:76\n+msgid "It is recommendet to use the default settings but here you can disable some of the migration-steps."\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:24\n-msgid "Navigation title used in sections, menus and doormats"\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Kicker field"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:130\n+msgid "Migrate"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:42\n-msgid "Plone 6 Frontend (Default content on homepage with draftJS blocks)"\n+#: plone/volto/browser/migrate_to_volto.pt:93\n+msgid "Migrate Folders to Folderish Pages"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:51\n-msgid "Plone 6 Frontend (Default content on homepage with slate blocks)"\n+#: plone/volto/browser/migrate_richtext.pt:12\n+msgid "Migrate Richtext to Slate Block"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:33\n-msgid "Plone 6 Frontend (Default content on homepage)"\n+#: plone/volto/browser/migrate_to_volto.pt:114\n+msgid "Migrate default Pages into the Folderish Pages if possible"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:15\n+#: plone/volto/browser/migrate_richtext.pt:16\n+msgid "Migrate text from RichText-fields to text in the Volto Editor"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:12\n+msgid "Migrate to Volto"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+#: plone/volto/behaviors/navtitle.py:11\n+msgid "Navigation title"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+msgid "Navigation title used in sections, menus and doormats"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:39\n+msgid "Pages, News Items, and Events are made folderish. That means they can contain other content, such as Images or Pages."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n msgid "Plone 6 Frontend (plone.volto)"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/profiles.zcml:25\n msgid "Plone 6 Frontend (plone.volto): uninstall"\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview Image"\n msgstr ""\n \n-#: plone/volto/behaviors/preview.py:23\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview Image Link"\n+msgstr ""\n+\n+#: plone/volto/behaviors/preview.py:22\n+#: plone/volto/behaviors/preview_link.py:42\n msgid "Preview image caption"\n msgstr ""\n \n-#: plone/volto/behaviors/configure.zcml:17\n+#: plone/volto/behaviors/configure.zcml:18\n msgid "Preview image for listings"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:60\n-msgid "Special requirements and setup for demo site"\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview image for listings based on links"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:115\n+msgid "Purge Richtext-fields after migrating to Slate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:142\n+msgid "Purge old Richtext-fields after migrating to Volto blocks"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/browser/migrate_to_volto.pt:60\n+msgid "Requirements for this migration wizard"\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:35\n msgid "Special test fixture for coresandbox use cases"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n+#: plone/volto/profiles.zcml:46\n msgid "Special test fixture for multilingual use case"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:88\n-msgid "Specific profile for re-adding the richtext behavior"\n+#: plone/volto/browser/migrate_to_volto.pt:38\n+msgid "The HTML of RichText fields (previously edited using TinyMCE) is converted into Volto blocks so you can edit it in Volto."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:148\n+msgid "The RichtextValue objects will be removed from the migrated objects. The old fields (from the behavior plone.volto) are no longer available."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:172\n+msgid "The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:64\n+msgid "To migrate RichText to Volto Blocks you need to have blocks-conversion-tool running on an accessible URL. The easiest way to have that running on your machine is: docker run -it -p 5000:5000 plone/blocks-conversion-tool:latest. More for options read https://github.com/plone/blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:157\n+msgid "URL of blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:57\n+msgid "URL of blocks-conversion-tool. The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n msgstr ""\n \n-#: plone/volto/profiles.zcml:24\n+#: plone/volto/profiles.zcml:25\n msgid "Uninstalls the plone.volto add-on."\n msgstr ""\n \n+#: plone/volto/browser/migrate_to_volto.pt:21\n+msgid "Volto is a React-based frontend for Plone. It is the default UI for Plone 6. Volto is a separate server-side application."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:24\n+msgid "Volto needs to run continuously alongside the current Plone backend service from which you access this wizard. The Volto server performs initial server-side rendering (SSR) of the React application for pages. It also delivers the JavaScript frontend to your browser. Without a Volto frontend prepared for this website and the means to host it, continuing this migration makes no sense! Read the Volto Frontend documentation for more information."\n+msgstr ""\n+\n+#: plone/volto/browser/voltobackendwarning.pt:11\n+msgid "Warning"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:23\n+msgid "What do you need for Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:20\n+msgid "What is Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:31\n+msgid "What will happen?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:32\n+msgid "When you click on \\"Migrate to Volto\\" at the end of the form, the following things will happen:"\n+msgstr ""\n+\n #. Default: "The languages in which the site should be translatable."\n-#: plone/volto/coresandbox/example.py:811\n+#: plone/volto/coresandbox/example.py:810\n msgid "description_available_languages"\n msgstr ""\n \n #. Default: "Available languages"\n-#: plone/volto/coresandbox/example.py:810\n+#: plone/volto/coresandbox/example.py:809\n msgid "heading_available_languages"\n msgstr ""\n \n+#. Default: "The kicker is a line of text shown above the title."\n+#: plone/volto/behaviors/kicker.py:14\n+msgid "help_kicker"\n+msgstr ""\n+\n #. Default: "Insert an image that will be used in listing and teaser blocks."\n-#: plone/volto/behaviors/preview.py:15\n+#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview_link.py:24\n msgid "help_previewimage"\n msgstr ""\n \n+#. Default: "Kicker"\n+#: plone/volto/behaviors/kicker.py:12\n+msgid "label_kicker"\n+msgstr ""\n+\n #. Default: "Preview image"\n-#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview.py:13\n+#: plone/volto/behaviors/preview_link.py:23\n msgid "label_previewimage"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:70\n+#: plone/volto/profiles.zcml:35\n msgid "plone.volto coresandbox Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:60\n-msgid "plone.volto demo special requirements"\n+#: plone/volto/profiles.zcml:46\n+msgid "plone.volto multilingual Cypress tests fixtures"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:80\n-msgid "plone.volto multilingual Cypress tests fixtures"\n+#. Default: "You have accessed the Plone backend through its Classic UI frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:13\n+msgid "volto_backend_warning"\n msgstr ""\n \n-#: plone/volto/profiles.zcml:88\n-msgid "plone.volto p51 profile"\n+#. Default: "If you want to use Plone\'s new frontend Volto instead:
  • Install Volto, if not already installed.
  • Start Volto, if not already started.
  • Visit the Volto frontend.
For more information, please read the documentation for how to Install Plone from its packages and refer to the full Volto documentation Frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:16\n+msgid "volto_backend_warning_link"\n msgstr ""\ndiff --git a/src/plone/volto/locales/pt_BR/LC_MESSAGES/plone.volto.po b/src/plone/volto/locales/pt_BR/LC_MESSAGES/plone.volto.po\nnew file mode 100644\nindex 00000000..eecba650\n--- /dev/null\n+++ b/src/plone/volto/locales/pt_BR/LC_MESSAGES/plone.volto.po\n@@ -0,0 +1,279 @@\n+# --- PLEASE EDIT THE LINES BELOW CORRECTLY ---\n+# SOME DESCRIPTIVE TITLE.\n+msgid ""\n+msgstr ""\n+"Project-Id-Version: \\n"\n+"POT-Creation-Date: 2024-12-11 17:41+0000\\n"\n+"PO-Revision-Date: 2021-11-21 16:58+0100\\n"\n+"Last-Translator: \\n"\n+"Language-Team: \\n"\n+"MIME-Version: 1.0\\n"\n+"Content-Type: text/plain; charset=utf-8\\n"\n+"Content-Transfer-Encoding: 8bit\\n"\n+"Plural-Forms: nplurals=1; plural=0;\\n"\n+"Language-Code: pt-br\\n"\n+"Language-Name: Portugu\xc3\xaas do Brasil\\n"\n+"Preferred-Encodings: utf-8 latin1\\n"\n+"Domain: plone.volto\\n"\n+"Language: pt_BR\\n"\n+"X-Generator: Poedit 2.3\\n"\n+\n+#: plone/volto/browser/migrate_to_volto.pt:45\n+msgid "A site migrated to Volto in this Plone backend will still be accessible through the Plone Classic User Interface but with limited functionality. The core content types will have all their GUI RichText fields replaced by the blocks behavior for the composition of the main content. So after migration you can only edit this content using the Volto UI."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Adds kicker field (text to be shown above the headline)"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:75\n+msgid "Advanced settings"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:120\n+msgid "Collections and Pages that are the default-page of a Folder will be applied on the migrated Folderish Page. For Collections that means adding a listing block with the same query. This only happens if you also you migrate Folders to Folderish Pages."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:42\n+msgid "Collections are migrated to Pages with Listing Blocks configured like the Collection."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n+msgid "Configures the Plone backend to work with Volto, the new default frontend for Plone 6."\n+msgstr "Configura o backend do Plone para funcionar com o Volto, o novo frontend padr\xc3\xa3o do Plone 6."\n+\n+#: plone/volto/browser/migrate_richtext.pt:33\n+msgid "Content Types to handle"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:83\n+msgid "Convert to Slate (default)"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:97\n+msgid "Convert to draftjs (a old format used until Volto 15)"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:40\n+msgid "Default Pages of Folders are merged with the Folderish Pages that replace the Folder wherever that is possible. This works well with Pages and Collections where the text and/or query are added to the folderish page that replaces the Folder."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n+msgid "Deprecated (use volto.kicker instead)"\n+msgstr ""\n+\n+#: plone/volto/profiles/coresandbox/types/example.xml\n+msgid "Example"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:42\n+msgid "Head title field"\n+msgstr "Campo T\xc3\xadtulo de cabe\xc3\xa7alho"\n+\n+#: plone/volto/browser/migrate_to_volto.pt:16\n+msgid "Here you can prepare this site for Volto."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:34\n+msgid "Install the package plone.volto and plone.restapi."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:76\n+msgid "It is recommendet to use the default settings but here you can disable some of the migration-steps."\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:48\n+msgid "Kicker field"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:130\n+msgid "Migrate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:93\n+msgid "Migrate Folders to Folderish Pages"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:12\n+msgid "Migrate Richtext to Slate Block"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:114\n+msgid "Migrate default Pages into the Folderish Pages if possible"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:16\n+msgid "Migrate text from RichText-fields to text in the Volto Editor"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:12\n+msgid "Migrate to Volto"\n+msgstr ""\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+#: plone/volto/behaviors/navtitle.py:11\n+msgid "Navigation title"\n+msgstr "T\xc3\xadtulo de navega\xc3\xa7\xc3\xa3o"\n+\n+#: plone/volto/behaviors/configure.zcml:35\n+msgid "Navigation title used in sections, menus and doormats"\n+msgstr "T\xc3\xadtulo de navega\xc3\xa7\xc3\xa3o usado em se\xc3\xa7\xc3\xb5es, menus e rodap\xc3\xa9s"\n+\n+#: plone/volto/browser/migrate_to_volto.pt:39\n+msgid "Pages, News Items, and Events are made folderish. That means they can contain other content, such as Images or Pages."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:16\n+msgid "Plone 6 Frontend (plone.volto)"\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:25\n+msgid "Plone 6 Frontend (plone.volto): uninstall"\n+msgstr "Plone 6 Frontend (plone.volto): desinstalar"\n+\n+#: plone/volto/behaviors/configure.zcml:18\n+msgid "Preview Image"\n+msgstr "Imagem de Pr\xc3\xa9-visualiza\xc3\xa7\xc3\xa3o"\n+\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview Image Link"\n+msgstr "Imagem de Pr\xc3\xa9-visualiza\xc3\xa7\xc3\xa3o de Link"\n+\n+#: plone/volto/behaviors/preview.py:22\n+#: plone/volto/behaviors/preview_link.py:42\n+msgid "Preview image caption"\n+msgstr "Legenda da Imagem de Pr\xc3\xa9-visualiza\xc3\xa7\xc3\xa3o"\n+\n+#: plone/volto/behaviors/configure.zcml:18\n+msgid "Preview image for listings"\n+msgstr "Imagem de Pr\xc3\xa9-visualiza\xc3\xa7\xc3\xa3o para listagens"\n+\n+#: plone/volto/behaviors/configure.zcml:26\n+msgid "Preview image for listings based on links"\n+msgstr "Imagem de Pr\xc3\xa9-visualiza\xc3\xa7\xc3\xa3o para listagens baseada em links"\n+\n+#: plone/volto/browser/migrate_richtext.pt:115\n+msgid "Purge Richtext-fields after migrating to Slate"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:142\n+msgid "Purge old Richtext-fields after migrating to Volto blocks"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:60\n+msgid "Requirements for this migration wizard"\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:35\n+msgid "Special test fixture for coresandbox use cases"\n+msgstr "Teste fixture especial para casos de uso do codesandbox"\n+\n+#: plone/volto/profiles.zcml:46\n+msgid "Special test fixture for multilingual use case"\n+msgstr "Teste fixture especial para caso de uso multil\xc3\xadngue"\n+\n+#: plone/volto/browser/migrate_to_volto.pt:38\n+msgid "The HTML of RichText fields (previously edited using TinyMCE) is converted into Volto blocks so you can edit it in Volto."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:148\n+msgid "The RichtextValue objects will be removed from the migrated objects. The old fields (from the behavior plone.volto) are no longer available."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:172\n+msgid "The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:64\n+msgid "To migrate RichText to Volto Blocks you need to have blocks-conversion-tool running on an accessible URL. The easiest way to have that running on your machine is: docker run -it -p 5000:5000 plone/blocks-conversion-tool:latest. More for options read https://github.com/plone/blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:157\n+msgid "URL of blocks-conversion-tool."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_richtext.pt:57\n+msgid "URL of blocks-conversion-tool. The migration requires a service to run. See https://github.com/plone/blocks-conversion-tool for details."\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:25\n+msgid "Uninstalls the plone.volto add-on."\n+msgstr "Desintalar o complemento plone.volto."\n+\n+#: plone/volto/browser/migrate_to_volto.pt:21\n+msgid "Volto is a React-based frontend for Plone. It is the default UI for Plone 6. Volto is a separate server-side application."\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:24\n+msgid "Volto needs to run continuously alongside the current Plone backend service from which you access this wizard. The Volto server performs initial server-side rendering (SSR) of the React application for pages. It also delivers the JavaScript frontend to your browser. Without a Volto frontend prepared for this website and the means to host it, continuing this migration makes no sense! Read the Volto Frontend documentation for more information."\n+msgstr ""\n+\n+#: plone/volto/browser/voltobackendwarning.pt:11\n+msgid "Warning"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:23\n+msgid "What do you need for Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:20\n+msgid "What is Volto?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:31\n+msgid "What will happen?"\n+msgstr ""\n+\n+#: plone/volto/browser/migrate_to_volto.pt:32\n+msgid "When you click on \\"Migrate to Volto\\" at the end of the form, the following things will happen:"\n+msgstr ""\n+\n+#. Default: "The languages in which the site should be translatable."\n+#: plone/volto/coresandbox/example.py:810\n+msgid "description_available_languages"\n+msgstr "Idiomas nos quais o site deve ser traduz\xc3\xadvel."\n+\n+#. Default: "Available languages"\n+#: plone/volto/coresandbox/example.py:809\n+msgid "heading_available_languages"\n+msgstr "Idiomas dispon\xc3\xadveis"\n+\n+#. Default: "The kicker is a line of text shown above the title."\n+#: plone/volto/behaviors/kicker.py:14\n+msgid "help_kicker"\n+msgstr "O t\xc3\xadtulo de cabe\xc3\xa7alho \xc3\xa9 exibido acima do t\xc3\xadtulo nos teasers"\n+\n+#. Default: "Insert an image that will be used in listing and teaser blocks."\n+#: plone/volto/behaviors/preview.py:14\n+#: plone/volto/behaviors/preview_link.py:24\n+msgid "help_previewimage"\n+msgstr "Inserir uma imagem que ser\xc3\xa1 utilizada em blocos de listagem e teaser"\n+\n+#. Default: "Kicker"\n+#: plone/volto/behaviors/kicker.py:12\n+msgid "label_kicker"\n+msgstr "T\xc3\xadtulo de cabe\xc3\xa7alho"\n+\n+#. Default: "Preview image"\n+#: plone/volto/behaviors/preview.py:13\n+#: plone/volto/behaviors/preview_link.py:23\n+msgid "label_previewimage"\n+msgstr "Imagem de Pr\xc3\xa9-visualiza\xc3\xa7\xc3\xa3o"\n+\n+#: plone/volto/profiles.zcml:35\n+msgid "plone.volto coresandbox Cypress tests fixtures"\n+msgstr ""\n+\n+#: plone/volto/profiles.zcml:46\n+msgid "plone.volto multilingual Cypress tests fixtures"\n+msgstr ""\n+\n+#. Default: "You have accessed the Plone backend through its Classic UI frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:13\n+msgid "volto_backend_warning"\n+msgstr ""\n+\n+#. Default: "If you want to use Plone\'s new frontend Volto instead:
  • Install Volto, if not already installed.
  • Start Volto, if not already started.
  • Visit the Volto frontend.
For more information, please read the documentation for how to Install Plone from its packages and refer to the full Volto documentation Frontend."\n+#: plone/volto/browser/voltobackendwarning.pt:16\n+msgid "volto_backend_warning_link"\n+msgstr ""\ndiff --git a/src/plone/volto/locales/update.py b/src/plone/volto/locales/update.py\nnew file mode 100644\nindex 00000000..dcd993e9\n--- /dev/null\n+++ b/src/plone/volto/locales/update.py\n@@ -0,0 +1,108 @@\n+"""Update locales."""\n+\n+from pathlib import Path\n+\n+import logging\n+import re\n+import subprocess\n+\n+\n+logging.basicConfig()\n+logger = logging.getLogger("i18n")\n+logger.setLevel(logging.DEBUG)\n+\n+\n+PATTERN = r"^[a-z]{2}.*"\n+cwd = Path.cwd()\n+target_path = Path(__file__).parent.parent.relative_to(cwd)\n+locale_path = target_path / "locales"\n+\n+\n+def get_i18ndude() -> Path:\n+ possible_locations = [\n+ cwd,\n+ cwd / "bin",\n+ cwd / ".venv" / "bin",\n+ ]\n+ for path in possible_locations:\n+ i18ndude = path / "i18ndude"\n+ if i18ndude.exists():\n+ return i18ndude\n+ else:\n+ raise RuntimeError("Not able to find i18ndude script")\n+\n+\n+i18ndude = get_i18ndude()\n+\n+# ignore node_modules files resulting in errors\n+excludes = \'"*.html *json-schema*.xml"\'\n+\n+\n+def _get_languages_folders():\n+ folders = [path for path in locale_path.glob("*") if path.is_dir()]\n+ language_folders = sorted(\n+ [path for path in folders if not path.name.startswith("_")],\n+ key=lambda item: item.name,\n+ )\n+ return language_folders\n+\n+\n+def locale_folder_setup(domain: str):\n+ languages = _get_languages_folders()\n+ for lang_folder in languages:\n+ lc_messages_path = lang_folder / "LC_MESSAGES"\n+ lang = lang_folder.name\n+ if lc_messages_path.exists():\n+ continue\n+ elif re.match(PATTERN, lang):\n+ lc_messages_path.mkdir()\n+ cmd = (\n+ f"msginit --locale={lang} "\n+ f"--input={locale_path}/{domain}.pot "\n+ f"--output={locale_path}/{lang}/LC_MESSAGES/{domain}.po"\n+ )\n+ subprocess.call(\n+ cmd,\n+ shell=True,\n+ )\n+\n+\n+def _rebuild(domain: str):\n+ cmd = (\n+ f"{i18ndude} rebuild-pot --pot {locale_path}/{domain}.pot "\n+ f"--exclude {excludes} "\n+ f"--create {domain} {target_path}"\n+ )\n+ subprocess.call(\n+ cmd,\n+ shell=True,\n+ )\n+\n+\n+def _sync(domain: str):\n+ for path in locale_path.glob("*/LC_MESSAGES/"):\n+ # Check if domain file exists\n+ domain_file = path / f"{domain}.po"\n+ if not domain_file.exists():\n+ # Create an empty file\n+ domain_file.write_text("")\n+ cmd = (\n+ f"{i18ndude} sync --pot {locale_path}/{domain}.pot "\n+ f"{locale_path}/*/LC_MESSAGES/{domain}.po"\n+ )\n+ subprocess.call(\n+ cmd,\n+ shell=True,\n+ )\n+\n+\n+def update_locale():\n+ domains = [path.name[:-4] for path in locale_path.glob("*.pot")]\n+ if i18ndude.exists():\n+ for domain in domains:\n+ logger.info(f"Updating translations for {domain}")\n+ locale_folder_setup(domain)\n+ _rebuild(domain)\n+ _sync(domain)\n+ else:\n+ logger.error("Not able to find i18ndude")\ndiff --git a/src/plone/volto/locales/update.sh b/src/plone/volto/locales/update.sh\ndeleted file mode 100755\nindex 777a5645..00000000\n--- a/src/plone/volto/locales/update.sh\n+++ /dev/null\n@@ -1,12 +0,0 @@\n-#!/bin/bash\n-# i18ndude should be available in current $PATH (eg by running\n-# ``export PATH=$PATH:$BUILDOUT_DIR/bin`` when i18ndude is located in your buildout\'s bin directory)\n-#\n-# For every language you want to translate into you need a\n-# locales/[language]/LC_MESSAGES/plone.volto.po\n-# (e.g. locales/de/LC_MESSAGES/plone.volto.po)\n-\n-domain=plone.volto\n-\n-../../../../bin/i18ndude rebuild-pot --pot $domain.pot --create $domain ../\n-../../../../bin/i18ndude sync --pot $domain.pot */LC_MESSAGES/$domain.po\ndiff --git a/src/plone/volto/overrides.zcml b/src/plone/volto/overrides.zcml\nindex 2bd571ba..00b3440b 100644\n--- a/src/plone/volto/overrides.zcml\n+++ b/src/plone/volto/overrides.zcml\n@@ -1,7 +1,4 @@\n-\n+\n \n \n \n@@ -20,7 +19,6 @@\n class="Products.CMFPlone.browser.login.password_reset.PasswordResetToolView"\n docstringWarning="True"\n description="Patch password reset tool construct URL to cater for different frontend domain"\n- zcml:condition="have plone-52"\n />\n \n \ndiff --git a/src/plone/volto/profiles.zcml b/src/plone/volto/profiles.zcml\nindex 60e759fc..a6ca1867 100644\n--- a/src/plone/volto/profiles.zcml\n+++ b/src/plone/volto/profiles.zcml\n@@ -2,6 +2,7 @@\n xmlns="http://namespaces.zope.org/zope"\n xmlns:genericsetup="http://namespaces.zope.org/genericsetup"\n xmlns:i18n="http://namespaces.zope.org/i18n"\n+ xmlns:zcml="http://namespaces.zope.org/zcml"\n i18n_domain="plone.volto"\n >\n \n@@ -23,42 +24,6 @@\n post_handler=".setuphandlers.uninstall"\n />\n \n- \n-\n- \n-\n- \n-\n- \n-\n \n \n-\n- \n \n \n+\n \n \n \ndiff --git a/src/plone/volto/profiles/coresandbox/metadata.xml b/src/plone/volto/profiles/coresandbox/metadata.xml\nindex 27e17a3b..eec40a34 100644\n--- a/src/plone/volto/profiles/coresandbox/metadata.xml\n+++ b/src/plone/volto/profiles/coresandbox/metadata.xml\n@@ -1,3 +1,4 @@\n+\n \n 1000\n \ndiff --git a/src/plone/volto/profiles/coresandbox/repositorytool.xml b/src/plone/volto/profiles/coresandbox/repositorytool.xml\nindex 1799d9bb..400f94f1 100644\n--- a/src/plone/volto/profiles/coresandbox/repositorytool.xml\n+++ b/src/plone/volto/profiles/coresandbox/repositorytool.xml\n@@ -1,4 +1,4 @@\n-\n+\n \n \n \ndiff --git a/src/plone/volto/profiles/coresandbox/types.xml b/src/plone/volto/profiles/coresandbox/types.xml\nindex fd3127e5..d6ab21a1 100644\n--- a/src/plone/volto/profiles/coresandbox/types.xml\n+++ b/src/plone/volto/profiles/coresandbox/types.xml\n@@ -1,4 +1,4 @@\n-\n+\n \ndiff --git a/src/plone/volto/profiles/coresandbox/types/example.xml b/src/plone/volto/profiles/coresandbox/types/example.xml\nindex df795b20..80a90de1 100644\n--- a/src/plone/volto/profiles/coresandbox/types/example.xml\n+++ b/src/plone/volto/profiles/coresandbox/types/example.xml\n@@ -1,8 +1,8 @@\n-\n+\n \n plone.volto.coresandbox.example.Example\n plone.volto.coresandbox.example.IExample\n \n+ \n \n \n \ndiff --git a/src/plone/volto/profiles/default/actions.xml b/src/plone/volto/profiles/default/actions.xml\nindex a36c9b29..ec9d131c 100644\n--- a/src/plone/volto/profiles/default/actions.xml\n+++ b/src/plone/volto/profiles/default/actions.xml\n@@ -1,4 +1,4 @@\n-\n+\n \n+\n \n \n+\n \n \n \n \n \n+ \n+ \n+ \n \ndiff --git a/src/plone/volto/profiles/default/controlpanel.xml b/src/plone/volto/profiles/default/controlpanel.xml\nindex 71bd9c1d..c8406ee8 100644\n--- a/src/plone/volto/profiles/default/controlpanel.xml\n+++ b/src/plone/volto/profiles/default/controlpanel.xml\n@@ -1,4 +1,4 @@\n-\n+\n \n+\n \n- 1016\n+ 1018\n \n profile-plone.restapi:blocks\n \ndiff --git a/src/plone/volto/profiles/default/registry.xml b/src/plone/volto/profiles/default/registry.xml\nindex 130c2e00..d888c911 100644\n--- a/src/plone/volto/profiles/default/registry.xml\n+++ b/src/plone/volto/profiles/default/registry.xml\n@@ -1,11 +1,5 @@\n-\n+\n \n- \n- False\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 \n \n \ndiff --git a/src/plone/volto/profiles/demo/metadata.xml b/src/plone/volto/profiles/demo/metadata.xml\ndeleted file mode 100644\nindex 27e17a3b..00000000\n--- a/src/plone/volto/profiles/demo/metadata.xml\n+++ /dev/null\n@@ -1,6 +0,0 @@\n-\n- 1000\n- \n- profile-plone.volto:default\n- \n-\ndiff --git a/src/plone/volto/profiles/demo/rolemap.xml b/src/plone/volto/profiles/demo/rolemap.xml\ndeleted file mode 100644\nindex 4ce6e3e9..00000000\n--- a/src/plone/volto/profiles/demo/rolemap.xml\n+++ /dev/null\n@@ -1,12 +0,0 @@\n-\n- \n- \n- \n- \n- \n- \n- \n- \n-\ndiff --git a/src/plone/volto/profiles/homepage/metadata.xml b/src/plone/volto/profiles/homepage/metadata.xml\ndeleted file mode 100644\nindex 27e17a3b..00000000\n--- a/src/plone/volto/profiles/homepage/metadata.xml\n+++ /dev/null\n@@ -1,6 +0,0 @@\n-\n- 1000\n- \n- profile-plone.volto:default\n- \n-\ndiff --git a/src/plone/volto/profiles/multilingual/metadata.xml b/src/plone/volto/profiles/multilingual/metadata.xml\nindex ffa492fd..989472e6 100644\n--- a/src/plone/volto/profiles/multilingual/metadata.xml\n+++ b/src/plone/volto/profiles/multilingual/metadata.xml\n@@ -1,3 +1,4 @@\n+\n \n 1000\n \ndiff --git a/src/plone/volto/profiles/multilingual/registry.xml b/src/plone/volto/profiles/multilingual/registry.xml\nindex fdb0995c..916629bd 100644\n--- a/src/plone/volto/profiles/multilingual/registry.xml\n+++ b/src/plone/volto/profiles/multilingual/registry.xml\n@@ -1,19 +1,19 @@\n-\n+\n \n \n en\n \n- \n \n \n it\n en\n+ de\n \n \n \ndiff --git a/src/plone/volto/profiles/richtext/metadata.xml b/src/plone/volto/profiles/richtext/metadata.xml\ndeleted file mode 100644\nindex 27e17a3b..00000000\n--- a/src/plone/volto/profiles/richtext/metadata.xml\n+++ /dev/null\n@@ -1,6 +0,0 @@\n-\n- 1000\n- \n- profile-plone.volto:default\n- \n-\ndiff --git a/src/plone/volto/profiles/richtext/types.xml b/src/plone/volto/profiles/richtext/types.xml\ndeleted file mode 100644\nindex 885235ad..00000000\n--- a/src/plone/volto/profiles/richtext/types.xml\n+++ /dev/null\n@@ -1,8 +0,0 @@\n-\n-\n- \n-\ndiff --git a/src/plone/volto/profiles/uninstall/browserlayer.xml b/src/plone/volto/profiles/uninstall/browserlayer.xml\nindex 70d1c969..e86343de 100644\n--- a/src/plone/volto/profiles/uninstall/browserlayer.xml\n+++ b/src/plone/volto/profiles/uninstall/browserlayer.xml\n@@ -1,4 +1,4 @@\n-\n+\n \n \n \n \n+ \n+ \n+ \n+\n \ndiff --git a/src/plone/volto/vocabularies/subject.py b/src/plone/volto/vocabularies/subject.py\nindex 84bde6b3..c5f76ac9 100644\n--- a/src/plone/volto/vocabularies/subject.py\n+++ b/src/plone/volto/vocabularies/subject.py\n@@ -14,7 +14,7 @@\n \n \n @implementer(ITokenizedTerm)\n-class UnsafeSimpleSubjectTerm(object):\n+class UnsafeSimpleSubjectTerm:\n """Simple tokenized term that allows unicode in the token"""\n \n def __init__(self, value, token, title):\n@@ -50,7 +50,7 @@ def unsafe_simplevocabulary_from_values(values, query=None):\n \n \n @implementer(IVocabularyFactory)\n-class KeywordsVocabulary(object):\n+class KeywordsVocabulary:\n """Override Keywords vocabulary to provide the real Keyword as the token."""\n \n # Allow users to customize the index to easily create\ndiff --git a/tests/conftest.py b/tests/conftest.py\nnew file mode 100644\nindex 00000000..3d31873e\n--- /dev/null\n+++ b/tests/conftest.py\n@@ -0,0 +1,98 @@\n+from plone import api\n+from plone.dexterity.utils import iterSchemata\n+from plone.restapi.interfaces import IDeserializeFromJson\n+from plone.restapi.interfaces import IFieldSerializer\n+from plone.volto.testing import PLONE_VOLTO_CORE_ACCEPTANCE_TESTING\n+from plone.volto.testing import PLONE_VOLTO_CORE_FUNCTIONAL_TESTING\n+from plone.volto.testing import PLONE_VOLTO_CORE_INTEGRATION_TESTING\n+from plone.volto.testing import PLONE_VOLTO_CORESANDBOX_ACCEPTANCE_TESTING\n+from plone.volto.testing import PLONE_VOLTO_CORESANDBOX_FUNCTIONAL_TESTING\n+from plone.volto.testing import PLONE_VOLTO_CORESANDBOX_INTEGRATION_TESTING\n+from plone.volto.testing import PLONE_VOLTO_MIGRATION_FUNCTIONAL_TESTING\n+from plone.volto.testing import PLONE_VOLTO_MIGRATION_INTEGRATION_TESTING\n+from pytest_plone import fixtures_factory\n+from z3c.form.interfaces import IDataManager\n+from zope.component import getMultiAdapter\n+\n+import json\n+import pytest\n+\n+\n+pytest_plugins = ["pytest_plone"]\n+\n+\n+globals().update(\n+ fixtures_factory(\n+ (\n+ (PLONE_VOLTO_CORE_ACCEPTANCE_TESTING, "acceptance"),\n+ (PLONE_VOLTO_CORE_FUNCTIONAL_TESTING, "functional"),\n+ (PLONE_VOLTO_CORE_INTEGRATION_TESTING, "integration"),\n+ (PLONE_VOLTO_CORESANDBOX_ACCEPTANCE_TESTING, "coresandbox_acceptance"),\n+ (PLONE_VOLTO_CORESANDBOX_FUNCTIONAL_TESTING, "coresandbox_functional"),\n+ (PLONE_VOLTO_CORESANDBOX_INTEGRATION_TESTING, "coresandbox_integration"),\n+ (PLONE_VOLTO_MIGRATION_FUNCTIONAL_TESTING, "migration_functional"),\n+ (PLONE_VOLTO_MIGRATION_INTEGRATION_TESTING, "migration_integration"),\n+ )\n+ )\n+)\n+\n+\n+@pytest.fixture\n+def distribution_name() -> str:\n+ """Distribution name."""\n+ return "volto"\n+\n+\n+@pytest.fixture\n+def contents(portal) -> dict:\n+ with api.env.adopt_roles(\n+ [\n+ "Manager",\n+ ]\n+ ):\n+ doc = api.content.create(\n+ container=portal,\n+ type="Document",\n+ id="doc1",\n+ title="Lorem Ipsum",\n+ description="Description",\n+ )\n+ image = api.content.create(\n+ container=portal,\n+ type="Image",\n+ id="image1",\n+ title="Target image",\n+ )\n+ return {\n+ "doc": doc,\n+ "image": image,\n+ }\n+\n+\n+@pytest.fixture\n+def serialize(http_request):\n+ def func(context, blocks):\n+ fieldname = "blocks"\n+ for schema in iterSchemata(context):\n+ if fieldname in schema:\n+ field = schema.get(fieldname)\n+ break\n+ dm = getMultiAdapter((context, field), IDataManager)\n+ dm.set(blocks)\n+ serializer = getMultiAdapter((field, context, http_request), IFieldSerializer)\n+ return serializer()\n+\n+ return func\n+\n+\n+@pytest.fixture\n+def deserialize(http_request):\n+ def func(blocks=None, validate_all=False, context=None):\n+ request = http_request\n+ blocks = blocks or ""\n+ context = context\n+ request["BODY"] = json.dumps({"blocks": blocks})\n+ deserializer = getMultiAdapter((context, request), IDeserializeFromJson)\n+ return deserializer(validate_all=validate_all)\n+\n+ return func\ndiff --git a/tests/coresandbox/conftest.py b/tests/coresandbox/conftest.py\nnew file mode 100644\nindex 00000000..de12bb2d\n--- /dev/null\n+++ b/tests/coresandbox/conftest.py\n@@ -0,0 +1,38 @@\n+from plone.app.testing import SITE_OWNER_NAME\n+from plone.app.testing import SITE_OWNER_PASSWORD\n+from plone.restapi.testing import RelativeSession\n+\n+import pytest\n+\n+\n+@pytest.fixture\n+def app(coresandbox_functional):\n+ return coresandbox_functional["app"]\n+\n+\n+@pytest.fixture\n+def portal(app):\n+ return app["plone"]\n+\n+\n+@pytest.fixture()\n+def http_request(coresandbox_functional):\n+ return coresandbox_functional["request"]\n+\n+\n+@pytest.fixture()\n+def request_api_factory(portal):\n+ def factory():\n+ url = portal.absolute_url()\n+ api_session = RelativeSession(f"{url}/++api++")\n+ return api_session\n+\n+ return factory\n+\n+\n+@pytest.fixture()\n+def api_manager_request(request_api_factory):\n+ request = request_api_factory()\n+ request.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)\n+ yield request\n+ request.auth = ()\ndiff --git a/tests/coresandbox/test_coresandbox.py b/tests/coresandbox/test_coresandbox.py\nnew file mode 100644\nindex 00000000..de9984ff\n--- /dev/null\n+++ b/tests/coresandbox/test_coresandbox.py\n@@ -0,0 +1,5 @@\n+class TestCoresandbox:\n+\n+ def test_coresandbox_example_content_schema_endpoint(self, api_manager_request):\n+ response = api_manager_request.get("/@types/example")\n+ assert response.status_code == 200\ndiff --git a/tests/distribution/test_creation.py b/tests/distribution/test_creation.py\nnew file mode 100644\nindex 00000000..5e9744bc\n--- /dev/null\n+++ b/tests/distribution/test_creation.py\n@@ -0,0 +1,106 @@\n+from copy import deepcopy\n+from plone import api\n+from plone.distribution.api import site as site_api\n+from Products.CMFPlone.Portal import PloneSite\n+from zope.component.hooks import setSite\n+\n+import pytest\n+\n+\n+@pytest.fixture()\n+def app(functional):\n+ return functional["app"]\n+\n+\n+@pytest.fixture()\n+def http_request(functional):\n+ return functional["request"]\n+\n+\n+@pytest.fixture()\n+def answers():\n+ return {\n+ "site_id": "default",\n+ "title": "A Plone Site",\n+ "description": "A newly created Plone Site with Classic UI",\n+ "site_logo": "name=teste;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", # noQA\n+ "default_language": "en",\n+ "portal_timezone": "America/Sao_Paulo",\n+ "setup_content": True,\n+ }\n+\n+\n+@pytest.fixture()\n+def answers_no_logo(answers):\n+ answers = deepcopy(answers)\n+ answers.pop("site_logo")\n+ answers["title"] = "Plone Site with default logo"\n+ return answers\n+\n+\n+@pytest.fixture\n+def create_site(app, distribution_name):\n+ def func(answers: dict) -> PloneSite:\n+ with api.env.adopt_roles(["Manager"]):\n+ site = site_api.create(app, distribution_name, answers)\n+ setSite(site)\n+ return site\n+\n+ return func\n+\n+\n+class TestCreationSite:\n+\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, create_site, answers):\n+ self.site = create_site(answers)\n+\n+ @pytest.mark.parametrize(\n+ "attr,expected",\n+ [\n+ ["id", "default"],\n+ ],\n+ )\n+ def test_properties(self, attr, expected):\n+ site = self.site\n+ assert getattr(site, attr) == expected\n+\n+ @pytest.mark.parametrize(\n+ "key,expected",\n+ [\n+ ["plone.site_title", "A Plone Site"],\n+ [\n+ "plone.site_logo",\n+ b"filenameb64:dGVzdGU7ZGF0YTppbWFnZS9wbmc=;datab64:iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", # noQA\n+ ],\n+ ],\n+ )\n+ def test_registry_entries(self, key, expected):\n+ assert api.portal.get_registry_record(key) == expected\n+\n+\n+class TestCreationSiteNoLogo:\n+\n+ @pytest.fixture(autouse=True)\n+ def _create_site(self, create_site, answers_no_logo):\n+ self.site = create_site(answers_no_logo)\n+\n+ @pytest.mark.parametrize(\n+ "attr,expected",\n+ [\n+ ["id", "default"],\n+ ],\n+ )\n+ def test_properties(self, attr, expected):\n+ site = self.site\n+ assert getattr(site, attr) == expected\n+\n+ @pytest.mark.parametrize(\n+ "key,expected",\n+ [\n+ ["plone.site_title", "Plone Site with default logo"],\n+ ["plone.site_logo", None],\n+ ],\n+ )\n+ def test_registry_entries(self, key, expected):\n+ assert api.portal.get_registry_record(key) == expected\ndiff --git a/tests/distribution/test_distribution.py b/tests/distribution/test_distribution.py\nnew file mode 100644\nindex 00000000..a01a18a1\n--- /dev/null\n+++ b/tests/distribution/test_distribution.py\n@@ -0,0 +1,55 @@\n+from plone import api\n+from Products.CMFCore.WorkflowCore import WorkflowException\n+\n+import pytest\n+\n+\n+class TestDistribution:\n+ @pytest.mark.parametrize(\n+ "attr,expected",\n+ [\n+ ("title", "Plone Site"),\n+ ("description", "A Plone Site to be used with a Volto frontend"),\n+ ("exclude_from_nav", False),\n+ ],\n+ )\n+ def test_plone_site_attributes(self, portal, attr, expected):\n+ assert getattr(portal, attr) == expected\n+\n+ @pytest.mark.parametrize(\n+ "package,expected",\n+ [\n+ ("plone.app.contenttypes", True),\n+ ("plonetheme.barceloneta", True),\n+ ("plone.restapi", True),\n+ ("plone.volto", True),\n+ ],\n+ )\n+ def test_dependencies_installed(self, installer, package, expected):\n+ assert installer.is_product_installed(package) is expected\n+\n+ @pytest.mark.parametrize(\n+ "path,title,portal_type,review_state",\n+ [\n+ ("/", "Plone Site", "Plone Site", ""),\n+ ],\n+ )\n+ def test_content_created(self, portal, path, title, portal_type, review_state):\n+ with api.env.adopt_roles(\n+ [\n+ "Manager",\n+ ]\n+ ):\n+ content = api.content.get(path=path)\n+ assert content.title == title\n+ assert content.portal_type == portal_type\n+ if review_state:\n+ assert api.content.get_state(content) == review_state\n+ else:\n+ with pytest.raises(WorkflowException) as exc:\n+ api.content.get_state(content)\n+ assert "No workflow provides" in str(exc)\n+\n+ def test_plone_logo_applied(self, portal):\n+ expected_result = b"filenameb64:dGVzdGU7ZGF0YTppbWFnZS9wbmc=;datab64:iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" # noQA\n+ assert api.portal.get_registry_record("plone.site_logo") == expected_result\ndiff --git a/tests/distribution/test_registration.py b/tests/distribution/test_registration.py\nnew file mode 100644\nindex 00000000..c5059830\n--- /dev/null\n+++ b/tests/distribution/test_registration.py\n@@ -0,0 +1,62 @@\n+from pathlib import Path\n+from plone.distribution.api import distribution as dist_api\n+from plone.distribution.core import Distribution\n+\n+import pytest\n+\n+\n+class TestRegistration:\n+\n+ distribution: Distribution = None\n+\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, integration, distribution_name) -> Distribution:\n+ self.distribution = dist_api.get(name=distribution_name)\n+\n+ def test_distribution_class(self):\n+ distribution = self.distribution\n+ assert isinstance(distribution, Distribution)\n+\n+ @pytest.mark.parametrize(\n+ "attr,expected",\n+ [\n+ ["title", "Plone Site (Volto)"],\n+ [\n+ "description",\n+ "A Plone Site to be used with a Volto frontend",\n+ ],\n+ ],\n+ )\n+ def test_distribution_name_description(self, attr, expected):\n+ distribution = self.distribution\n+ assert isinstance(distribution, Distribution)\n+ assert getattr(distribution, attr) == expected\n+\n+ def test_distribution_has_no_handler(self):\n+ distribution = self.distribution\n+ assert distribution.handler is None\n+\n+ def test_distribution_has_post_handler(self):\n+ distribution = self.distribution\n+ assert distribution.post_handler is not None\n+\n+ @pytest.mark.parametrize(\n+ "profile",\n+ [\n+ "plone.app.contenttypes:default",\n+ "plonetheme.barceloneta:default",\n+ ],\n+ )\n+ def test_distribution_profiles(self, profile):\n+ distribution = self.distribution\n+ assert profile in distribution.profiles\n+\n+ def test_distribution_has_image(self):\n+ distribution = self.distribution\n+ assert isinstance(distribution.image, Path)\n+ assert distribution.image.exists()\n+\n+ def test_distribution_has_local_directory(self):\n+ distribution = self.distribution\n+ assert isinstance(distribution.directory, Path)\n+ assert distribution.directory.exists()\ndiff --git a/tests/features/test_indexers.py b/tests/features/test_indexers.py\nnew file mode 100644\nindex 00000000..77f3ae2b\n--- /dev/null\n+++ b/tests/features/test_indexers.py\n@@ -0,0 +1,104 @@\n+from plone import api\n+\n+import pytest\n+\n+\n+@pytest.fixture\n+def contents(portal) -> dict:\n+ with api.env.adopt_roles(\n+ [\n+ "Manager",\n+ ]\n+ ):\n+ portal.blocks = {}\n+ portal.blocks_layout = {"items": []}\n+ portal.reindexObject()\n+ doc = api.content.create(\n+ container=portal,\n+ type="Document",\n+ id="doc1",\n+ title="Lorem Ipsum",\n+ description="Description",\n+ blocks={\n+ "1": {"@type": "image", "url": ""},\n+ "2": {"@type": "teaser", "styles": {"align": "left"}},\n+ },\n+ )\n+ return {\n+ "doc": doc,\n+ }\n+\n+\n+@pytest.fixture\n+def block_types_index(contents):\n+ ct = api.portal.get_tool("portal_catalog")\n+ return ct._catalog.indexes["block_types"]\n+\n+\n+class TestBlockTypesIndexer:\n+\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, http_request, portal, contents):\n+ self.request = http_request\n+ self.doc = contents["doc"]\n+\n+ @pytest.mark.parametrize(\n+ "block_type,expected",\n+ [\n+ ["image", 1],\n+ ["teaser", 1],\n+ ],\n+ )\n+ def test_block_types_are_indexed(self, block_type, expected):\n+ brains = api.content.find(block_types=block_type)\n+ assert len(brains) == expected\n+\n+ def test_index_has_results(self, block_types_index):\n+ brains = api.content.find(block_types="teaser")\n+ assert len(brains) == 1\n+ assert block_types_index.numObjects() == 1\n+\n+ def test_mixed_blocks(self, block_types_index):\n+ """Check that when some blocks have type and others don\'t, it doesn\'t fail."""\n+ doc = self.doc\n+ blocks = {\n+ "1": {"url": ""},\n+ "2": {"@type": "teaser", "styles": {"align": "left"}},\n+ }\n+ doc.blocks = blocks\n+ doc.reindexObject(idxs=["block_types"])\n+ brains = api.content.find(block_types="teaser")\n+ assert len(brains) == 1\n+ assert block_types_index.numObjects() == 1\n+\n+ def test_removed_blocks(self, block_types_index):\n+ """Ensure that when blocks are removed, the block_types index is updated."""\n+ doc = self.doc\n+ doc.blocks = {}\n+ doc.reindexObject(idxs=["block_types"])\n+ brains = api.content.find(block_types="teaser")\n+ assert len(brains) == 0\n+ assert block_types_index.numObjects() == 0\n+\n+ def test_nested_blocks(self):\n+ """Ensure that nested block types are also included in block_types."""\n+ doc = self.doc\n+ blocks = {\n+ "1": {\n+ "@type": "gridBlock",\n+ "blocks": {\n+ "2": {"@type": "teaser"},\n+ },\n+ },\n+ }\n+ doc.blocks = blocks\n+ doc.reindexObject(idxs=["block_types"])\n+ brains = api.content.find(block_types="teaser")\n+ assert len(brains) == 1\n+\n+ def test_block_types_not_acquired(self):\n+ """Ensure that block_types is not acquired"""\n+ doc = self.doc\n+ api.content.create(container=doc, type="Image", id="image-1")\n+ brains = api.content.find(block_types="image")\n+ assert len(brains) == 1\ndiff --git a/tests/features/test_linkintegrity.py b/tests/features/test_linkintegrity.py\nnew file mode 100644\nindex 00000000..233e7b50\n--- /dev/null\n+++ b/tests/features/test_linkintegrity.py\n@@ -0,0 +1,102 @@\n+from plone import api\n+from plone.app.linkintegrity.interfaces import IRetriever\n+\n+import pytest\n+\n+\n+@pytest.fixture\n+def retrieve_links():\n+ def func(content):\n+ retriever = IRetriever(content)\n+ return retriever.retrieveLinks()\n+\n+ return func\n+\n+\n+@pytest.fixture\n+def contents(portal) -> dict:\n+ with api.env.adopt_roles(\n+ [\n+ "Manager",\n+ ]\n+ ):\n+ doc1 = api.content.create(\n+ container=portal,\n+ type="Document",\n+ id="doc1",\n+ title="Document with Blocks",\n+ description="Description",\n+ )\n+ doc2 = api.content.create(\n+ container=portal,\n+ type="Document",\n+ id="doc2",\n+ UID="e663af38-9111-4dd2-adf9-0bbd135c8a78",\n+ title="Target Document",\n+ description="Description",\n+ )\n+ return {\n+ "doc1": doc1,\n+ "doc2": doc2,\n+ }\n+\n+\n+class TestBlocksLinkintegrity:\n+\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, http_request, portal, contents):\n+ self.request = http_request\n+ self.doc1 = contents["doc1"]\n+ self.doc2 = contents["doc2"]\n+\n+ @pytest.mark.parametrize(\n+ "case,blocks",\n+ [\n+ [\n+ "internal_links_in_nested_columns",\n+ {\n+ "111": {\n+ "@type": "__grid",\n+ "columns": [\n+ {\n+ "@type": "teaser",\n+ "href": "../resolveuid/e663af38-9111-4dd2-adf9-0bbd135c8a78",\n+ }\n+ ],\n+ },\n+ },\n+ ],\n+ [\n+ "internal_links_in_nested_hrefList",\n+ {\n+ "111": {\n+ "hrefList": [\n+ {\n+ "href": "../resolveuid/e663af38-9111-4dd2-adf9-0bbd135c8a78",\n+ }\n+ ],\n+ },\n+ },\n+ ],\n+ [\n+ "internal_links_in_nested_slides",\n+ {\n+ "111": {\n+ "@type": "__grid",\n+ "columns": [\n+ {\n+ "@type": "teaser",\n+ "href": "../resolveuid/e663af38-9111-4dd2-adf9-0bbd135c8a78",\n+ }\n+ ],\n+ },\n+ },\n+ ],\n+ ],\n+ )\n+ def test_links_retriever(self, retrieve_links, case, blocks):\n+ self.doc1.blocks = blocks\n+ value = retrieve_links(self.doc1)\n+\n+ assert len(value) == 1\n+ assert "../resolveuid/e663af38-9111-4dd2-adf9-0bbd135c8a78" in value\ndiff --git a/tests/features/test_preview_link_behavior.py b/tests/features/test_preview_link_behavior.py\nnew file mode 100644\nindex 00000000..12700432\n--- /dev/null\n+++ b/tests/features/test_preview_link_behavior.py\n@@ -0,0 +1,65 @@\n+from plone import api\n+from plone.dexterity.schema import invalidate_cache\n+from plone.namedfile.file import NamedBlobImage\n+from plone.restapi.interfaces import ISerializeToJsonSummary\n+from z3c.form.interfaces import IDataManager\n+from zope.component import getMultiAdapter\n+from zope.component.hooks import setSite\n+\n+import pytest\n+\n+\n+TEST_GIF = (\n+ b"GIF89a\\x01\\x00\\x01\\x00\\x00\\xff\\x00,\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\x02\\x00;"\n+)\n+\n+\n+@pytest.fixture\n+def portal(app, get_fti):\n+ portal = app["plone"]\n+ setSite(portal)\n+ fti = get_fti("Document")\n+ base_behaviors = fti.behaviors\n+ fti.behaviors += ("volto.preview_image_link",)\n+ invalidate_cache(fti)\n+ yield portal\n+ fti.behaviors = base_behaviors\n+ invalidate_cache(fti)\n+\n+\n+@pytest.fixture\n+def contents(portal) -> dict:\n+ from plone.volto.behaviors.preview_link import IPreviewLink\n+\n+ with api.env.adopt_roles(\n+ [\n+ "Manager",\n+ ]\n+ ):\n+ doc = api.content.create(\n+ container=portal, type="Document", id="doc1", title="Document"\n+ )\n+ image = api.content.create(\n+ container=portal,\n+ type="Image",\n+ id="image-1",\n+ title="Target image",\n+ image=NamedBlobImage(data=TEST_GIF, filename="test.gif"),\n+ )\n+ dm = getMultiAdapter((doc, IPreviewLink["preview_image_link"]), IDataManager)\n+ dm.set(image)\n+ doc.reindexObject()\n+ return {"doc": doc, "image": image}\n+\n+\n+class TestPreviewLinkBehavior:\n+\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, portal, contents):\n+ self.doc = contents["doc"]\n+ self.image = contents["image"]\n+\n+ def test_image_scales_includes_preview_image_link(self, http_request):\n+ brain = api.content.find(UID=self.doc.UID())[0]\n+ summary = getMultiAdapter((brain, http_request), ISerializeToJsonSummary)()\n+ assert "preview_image_link" in summary["image_scales"]\ndiff --git a/tests/features/test_scripts.py b/tests/features/test_scripts.py\nnew file mode 100644\nindex 00000000..a1876e22\n--- /dev/null\n+++ b/tests/features/test_scripts.py\n@@ -0,0 +1,40 @@\n+from plone.volto.scripts.listingaddsummary import migrate_listing_block_to_summary\n+from plone.volto.scripts.searchscalesinimageblocks import remove_image_scales\n+\n+import pytest\n+\n+\n+class TestScripts:\n+\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, http_request, portal, contents):\n+ self.request = http_request\n+ self.doc = contents["doc"]\n+ self.image = contents["image"]\n+\n+ def test_migrate_listing_block_to_summary(self):\n+ blocks = {"@type": "listing"}\n+ result = migrate_listing_block_to_summary(blocks)\n+ assert result["template"] == "summary"\n+\n+ def test_remove_image_scales(self):\n+ blocks = {\n+ "b53feefa-e6f7-42f0-8f04-534655c6c594": {\n+ "@type": "image",\n+ "url": "/foo/bar/@@images/image/large",\n+ }\n+ }\n+\n+ result = remove_image_scales(blocks)\n+ assert result["b53feefa-e6f7-42f0-8f04-534655c6c594"]["url"] == "/foo/bar"\n+ assert result["b53feefa-e6f7-42f0-8f04-534655c6c594"]["size"] == "l"\n+\n+ def test_remove_image_scales_no_large(self):\n+ blocks = {\n+ "b53feefa-e6f7-42f0-8f04-534655c6c594": {\n+ "@type": "image",\n+ "url": "/foo/bar/@@images/image/teaser",\n+ }\n+ }\n+ result = remove_image_scales(blocks)\n+ assert result["b53feefa-e6f7-42f0-8f04-534655c6c594"]["url"] == "/foo/bar"\ndiff --git a/tests/features/test_summary_serialization.py b/tests/features/test_summary_serialization.py\nnew file mode 100644\nindex 00000000..0a2be878\n--- /dev/null\n+++ b/tests/features/test_summary_serialization.py\n@@ -0,0 +1,55 @@\n+from plone import api\n+from plone.restapi.interfaces import ISerializeToJsonSummary\n+from zope.component import getMultiAdapter\n+\n+import pytest\n+\n+\n+@pytest.fixture\n+def contents(portal) -> dict:\n+ with api.env.adopt_roles(\n+ [\n+ "Manager",\n+ ]\n+ ):\n+ doc = api.content.create(\n+ container=portal,\n+ type="Document",\n+ id="doc1",\n+ title="Lorem Ipsum",\n+ description="Description",\n+ )\n+ return {\n+ "doc": doc,\n+ }\n+\n+\n+@pytest.fixture\n+def catalog(portal):\n+ ct = api.portal.get_tool("portal_catalog")\n+ column = "image_field"\n+ column_exists = column in ct.schema()\n+ if column_exists:\n+ ct.delColumn(column)\n+ yield ct\n+ if column_exists:\n+ ct.addColumn(column)\n+\n+\n+class TestSummarySerialization:\n+\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, http_request, portal, contents):\n+ self.request = http_request\n+ self.doc1 = contents["doc"]\n+\n+ def test_brain_summary_contains_default_metadata_fields(self):\n+ brain = api.content.find(UID=self.doc1.UID())[0]\n+ summary = getMultiAdapter((brain, self.request), ISerializeToJsonSummary)()\n+ assert "image_field" in summary\n+ assert "image_scales" in summary\n+\n+ def test_brain_summary_does_not_fail_if_column_not_there(self, catalog):\n+ brain = api.content.find(UID=self.doc1.UID())[0]\n+ summary = getMultiAdapter((brain, self.request), ISerializeToJsonSummary)()\n+ assert "image_field" in summary\ndiff --git a/src/plone/volto/tests/test_transforms.py b/tests/features/test_transforms.py\nsimilarity index 55%\nrename from src/plone/volto/tests/test_transforms.py\nrename to tests/features/test_transforms.py\nindex f79baf2a..670aacc4 100644\n--- a/src/plone/volto/tests/test_transforms.py\n+++ b/tests/features/test_transforms.py\n@@ -1,177 +1,133 @@\n-# -*- coding: utf-8 -*-\n+from plone import api\n \n-from plone.dexterity.interfaces import IDexterityFTI\n-from plone.dexterity.utils import iterSchemata\n-from plone.restapi.interfaces import IDeserializeFromJson\n-from plone.restapi.interfaces import IFieldSerializer\n-from plone.uuid.interfaces import IUUID\n-from plone.volto.testing import PLONE_VOLTO_CORE_INTEGRATION_TESTING # noqa\n-from z3c.form.interfaces import IDataManager\n-from zope.component import getMultiAdapter\n-from zope.component import queryUtility\n+import pytest\n \n-import json\n-import unittest\n \n+class TestBlocksTransforms:\n \n-class TestBlocksTransforms(unittest.TestCase):\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, app, http_request, portal, contents):\n+ self.app = app\n+ self.portal = portal\n+ self.request = http_request\n+ self.doc = contents["doc"]\n+ self.image = contents["image"]\n \n- layer = PLONE_VOLTO_CORE_INTEGRATION_TESTING\n-\n- def setUp(self):\n- self.app = self.layer["app"]\n- self.portal = self.layer["portal"]\n- self.request = self.layer["request"]\n-\n- fti = queryUtility(IDexterityFTI, name="Document")\n- behavior_list = [a for a in fti.behaviors]\n- behavior_list.append("volto.blocks")\n- fti.behaviors = tuple(behavior_list)\n-\n- self.portal.invokeFactory("Document", id="doc1")\n- self.image = self.portal[\n- self.portal.invokeFactory("Image", id="image-1", title="Target image")\n- ]\n-\n- def deserialize(self, blocks=None, validate_all=False, context=None):\n- blocks = blocks or ""\n- context = context or self.portal.doc1\n- self.request["BODY"] = json.dumps({"blocks": blocks})\n- deserializer = getMultiAdapter((context, self.request), IDeserializeFromJson)\n-\n- return deserializer(validate_all=validate_all)\n-\n- def serialize(self, context, blocks):\n- fieldname = "blocks"\n- for schema in iterSchemata(context):\n- if fieldname in schema:\n- field = schema.get(fieldname)\n- break\n- dm = getMultiAdapter((context, field), IDataManager)\n- dm.set(blocks)\n- serializer = getMultiAdapter((field, context, self.request), IFieldSerializer)\n- return serializer()\n-\n- def test_deserialize_nested_fields_resolveuid(self):\n- self.deserialize(\n+ def test_deserialize_nested_fields_resolveuid(self, deserialize):\n+ doc = self.doc\n+ deserialize(\n blocks={\n "123": {\n "@type": "teaserGrid",\n "columns": [\n {\n- "href": self.portal.doc1.absolute_url(),\n+ "href": doc.absolute_url(),\n "preview_image": self.image.absolute_url(),\n }\n ],\n }\n- }\n+ },\n+ context=doc,\n )\n- doc_uid = IUUID(self.portal.doc1)\n- image_uid = IUUID(self.image)\n+ doc_uid = api.content.get_uuid(doc)\n+ image_uid = api.content.get_uuid(self.image)\n \n- self.assertEqual(\n- self.portal.doc1.blocks["123"]["columns"][0]["href"],\n- "../resolveuid/{}".format(doc_uid),\n- )\n- self.assertEqual(\n- self.portal.doc1.blocks["123"]["columns"][0]["preview_image"],\n- "../resolveuid/{}".format(image_uid),\n+ assert doc.blocks["123"]["columns"][0]["href"] == f"../resolveuid/{doc_uid}"\n+ assert (\n+ doc.blocks["123"]["columns"][0]["preview_image"]\n+ == f"../resolveuid/{image_uid}"\n )\n \n- def test_deserialize_nested_fields_arrayed_resolveuid(self):\n- self.deserialize(\n+ def test_deserialize_nested_fields_arrayed_resolveuid(self, deserialize):\n+ doc = self.doc\n+ deserialize(\n blocks={\n "123": {\n "@type": "teaserGrid",\n- "columns": [{"href": [self.portal.doc1.absolute_url()]}],\n+ "columns": [{"href": [doc.absolute_url()]}],\n }\n- }\n- )\n- doc_uid = IUUID(self.portal.doc1)\n-\n- self.assertEqual(\n- self.portal.doc1.blocks["123"]["columns"][0]["href"][0],\n- "../resolveuid/{}".format(doc_uid),\n+ },\n+ context=doc,\n )\n-\n- def test_deserialize_nested_fields_arrayed_object_browser_resolveuid(self):\n- self.deserialize(\n+ doc_uid = api.content.get_uuid(doc)\n+ assert doc.blocks["123"]["columns"][0]["href"][0] == f"../resolveuid/{doc_uid}"\n+\n+ def test_deserialize_nested_fields_arrayed_object_browser_resolveuid(\n+ self, deserialize\n+ ):\n+ doc = self.doc\n+ deserialize(\n blocks={\n "123": {\n "@type": "teaserGrid",\n- "columns": [{"href": [{"@id": self.portal.doc1.absolute_url()}]}],\n+ "columns": [{"href": [{"@id": doc.absolute_url()}]}],\n }\n- }\n+ },\n+ context=doc,\n )\n- doc_uid = IUUID(self.portal.doc1)\n+ doc_uid = api.content.get_uuid(doc)\n \n- self.assertEqual(\n- self.portal.doc1.blocks["123"]["columns"][0]["href"][0]["@id"],\n- "../resolveuid/{}".format(doc_uid),\n+ assert (\n+ doc.blocks["123"]["columns"][0]["href"][0]["@id"]\n+ == f"../resolveuid/{doc_uid}"\n )\n \n- def test_serialize_nested_fields_resolveuid(self):\n- doc_uid = IUUID(self.portal.doc1)\n- image_uid = IUUID(self.image)\n- value = self.serialize(\n- context=self.portal.doc1,\n+ def test_serialize_nested_fields_resolveuid(self, serialize):\n+ doc = self.doc\n+ doc_uid = api.content.get_uuid(doc)\n+ image_uid = api.content.get_uuid(self.image)\n+ value = serialize(\n+ context=doc,\n blocks={\n "123": {\n "@type": "teaserGrid",\n "columns": [\n {\n- "href": "../resolveuid/{}".format(doc_uid),\n- "preview_image": "../resolveuid/{}".format(image_uid),\n+ "href": f"../resolveuid/{doc_uid}",\n+ "preview_image": f"../resolveuid/{image_uid}",\n }\n ],\n }\n },\n )\n \n- self.assertEqual(\n- value["123"]["columns"][0]["href"], self.portal.doc1.absolute_url()\n- )\n- self.assertEqual(\n- value["123"]["columns"][0]["preview_image"], self.image.absolute_url()\n- )\n+ assert value["123"]["columns"][0]["href"] == doc.absolute_url()\n+ assert value["123"]["columns"][0]["preview_image"] == self.image.absolute_url()\n \n- def test_serialize_nested_fields_arrayed_resolveuid(self):\n- doc_uid = IUUID(self.portal.doc1)\n- value = self.serialize(\n- context=self.portal.doc1,\n+ def test_serialize_nested_fields_arrayed_resolveuid(self, serialize):\n+ doc = self.doc\n+ doc_uid = api.content.get_uuid(doc)\n+ value = serialize(\n+ context=doc,\n blocks={\n "123": {\n "@type": "teaserGrid",\n- "columns": [{"href": ["../resolveuid/{}".format(doc_uid)]}],\n+ "columns": [{"href": [f"../resolveuid/{doc_uid}"]}],\n }\n },\n )\n \n- self.assertEqual(\n- value["123"]["columns"][0]["href"][0], self.portal.doc1.absolute_url()\n- )\n+ assert value["123"]["columns"][0]["href"][0] == doc.absolute_url()\n \n- def test_serialize_nested_fields_arrayed_object_browser_resolveuid(self):\n- doc_uid = IUUID(self.portal.doc1)\n- value = self.serialize(\n- context=self.portal.doc1,\n+ def test_serialize_nested_fields_arrayed_object_browser_resolveuid(self, serialize):\n+ doc = self.doc\n+ doc_uid = api.content.get_uuid(doc)\n+ value = serialize(\n+ context=doc,\n blocks={\n "123": {\n "@type": "teaserGrid",\n- "columns": [\n- {"href": [{"@id": "../resolveuid/{}".format(doc_uid)}]}\n- ],\n+ "columns": [{"href": [{"@id": f"../resolveuid/{doc_uid}"}]}],\n }\n },\n )\n \n- self.assertEqual(\n- value["123"]["columns"][0]["href"][0]["@id"],\n- self.portal.doc1.absolute_url(),\n- )\n+ assert value["123"]["columns"][0]["href"][0]["@id"] == doc.absolute_url()\n \n- def test_deserialize_slate(self):\n- res = self.deserialize(\n+ def test_deserialize_slate(self, deserialize):\n+ portal_url = self.portal.absolute_url()\n+ doc = self.doc\n+ res = deserialize(\n blocks={\n "e248ecb5-b787-4e04-b1b3-98febf4539d1": {\n "@type": "__grid",\n@@ -197,8 +153,7 @@ def test_deserialize_slate(self):\n "internal": {\n "internal_link": [\n {\n- "@id": "%s/image-1"\n- % self.portal.absolute_url(),\n+ "@id": f"{portal_url}/image1",\n "title": "Image 1",\n }\n ]\n@@ -218,7 +173,8 @@ def test_deserialize_slate(self):\n }\n ],\n }\n- }\n+ },\n+ context=doc,\n )\n \n value = res.blocks["e248ecb5-b787-4e04-b1b3-98febf4539d1"]["columns"][0][\n@@ -226,10 +182,11 @@ def test_deserialize_slate(self):\n ]\n link = value[0]["children"][1]["children"][1]\n resolve_link = link["data"]["link"]["internal"]["internal_link"][0]["@id"]\n- self.assertTrue(resolve_link.startswith("../resolveuid/"))\n+ assert resolve_link.startswith("../resolveuid/") is True\n \n- def test_serialize_slate(self):\n- doc_uid = IUUID(self.portal["doc1"])\n+ def test_serialize_slate(self, serialize):\n+ doc = self.doc\n+ doc_uid = api.content.get_uuid(doc)\n resolve_uid_link = {\n "@id": f"../resolveuid/{doc_uid}",\n "title": "Welcome to Plone",\n@@ -276,10 +233,10 @@ def test_serialize_slate(self):\n "6b2be2e6-9857-4bcc-a21a-29c0449e1c68": {"@type": "title"},\n }\n \n- res = self.serialize(context=self.portal["doc1"], blocks=blocks)\n+ res = serialize(context=doc, blocks=blocks)\n \n value = res["e248ecb5-b787-4e04-b1b3-98febf4539d1"]["columns"][0]["value"]\n link = value[0]["children"][1]["children"][1]\n resolve_link = link["data"]["link"]["internal"]["internal_link"][0]["@id"]\n \n- self.assertTrue(resolve_link == self.portal.absolute_url() + "/doc1")\n+ assert resolve_link == f"{self.portal.absolute_url()}/doc1"\ndiff --git a/tests/migration/conftest.py b/tests/migration/conftest.py\nnew file mode 100644\nindex 00000000..b339f3ca\n--- /dev/null\n+++ b/tests/migration/conftest.py\n@@ -0,0 +1,16 @@\n+import pytest\n+\n+\n+@pytest.fixture\n+def app(migration_functional):\n+ return migration_functional["app"]\n+\n+\n+@pytest.fixture\n+def portal(app):\n+ return app["plone"]\n+\n+\n+@pytest.fixture()\n+def http_request(migration_functional):\n+ return migration_functional["request"]\ndiff --git a/tests/migration/test_migrate_to_volto.py b/tests/migration/test_migrate_to_volto.py\nnew file mode 100644\nindex 00000000..06cac209\n--- /dev/null\n+++ b/tests/migration/test_migrate_to_volto.py\n@@ -0,0 +1,301 @@\n+from Acquisition import aq_base\n+from plone import api\n+from plone.app.testing import setRoles\n+from plone.app.testing import TEST_USER_ID\n+from plone.app.textfield.value import RichTextValue\n+from plone.volto.content import FolderishDocument\n+from plone.volto.content import FolderishEvent\n+from plone.volto.content import FolderishNewsItem\n+\n+import json\n+import pytest\n+import responses\n+\n+\n+@pytest.fixture\n+def migration(portal, http_request):\n+ def func(submit: bool = True):\n+ view = portal.restrictedTraverse("@@migrate_to_volto")\n+ if submit:\n+ http_request.form["form.submitted"] = True\n+ return view()\n+\n+ return func\n+\n+\n+class TestMigrateToVolto:\n+\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, app, http_request, portal):\n+ self.app = app\n+ self.portal = portal\n+ self.request = http_request\n+ setRoles(self.portal, TEST_USER_ID, ["Manager"])\n+\n+ def test_form_renders(self, migration):\n+ html = migration(submit=False)\n+ assert "Migrate to Volto" in html\n+\n+ def test_plonevolto_is_installed(self, installer, migration):\n+ assert installer.is_product_installed("plone.volto") is False\n+ migration()\n+ assert installer.is_product_installed("plone.volto") is True\n+\n+ @pytest.mark.parametrize(\n+ "portal_type,id,title,klass",\n+ [\n+ ["Document", "doc", "Document", FolderishDocument],\n+ ["News Item", "news", "News Item", FolderishNewsItem],\n+ ["Event", "event", "Event", FolderishEvent],\n+ ],\n+ )\n+ def test_items_are_migrated_to_folderish(\n+ self, migration, portal_type, id, title, klass\n+ ):\n+ api.content.create(\n+ container=self.portal,\n+ type=portal_type,\n+ id=id,\n+ title=title,\n+ )\n+ migration()\n+\n+ content = self.portal[id]\n+ assert content.portal_type == portal_type\n+ assert aq_base(content).isPrincipiaFolderish\n+ assert content.__class__ == klass\n+\n+ # Test that doc renders without error.\n+ content.__call__()\n+ # We can add content\n+ sub_object = api.content.create(\n+ container=content,\n+ type="Document",\n+ id="subdoc",\n+ title="Sub Document",\n+ )\n+ assert sub_object.__class__ == FolderishDocument\n+\n+ def test_folders_are_migrated(self, migration):\n+ api.content.create(\n+ container=self.portal,\n+ type="Folder",\n+ id="folder1",\n+ title="Folder 1",\n+ )\n+ assert self.portal["folder1"].portal_type == "Folder"\n+\n+ migration()\n+\n+ doc = self.portal["folder1"]\n+ assert doc.portal_type == "Document"\n+ assert aq_base(doc).isPrincipiaFolderish\n+ assert doc.__class__ == FolderishDocument\n+\n+ def test_collections_are_migrated(self, migration):\n+ collection = api.content.create(\n+ container=self.portal,\n+ type="Collection",\n+ id="collection",\n+ title="Collection",\n+ )\n+ collection.query = [\n+ {\n+ "i": "portal_type",\n+ "o": "plone.app.querystring.operation.selection.any",\n+ "v": ["Document"],\n+ }\n+ ]\n+ collection.sort_on = "effective"\n+ collection.sort_reversed = False\n+ collection.limit = 100\n+ collection.item_count = 10\n+ assert self.portal["collection"].portal_type == "Collection"\n+\n+ migration()\n+\n+ collection = self.portal["collection"]\n+ assert collection.portal_type == "Document"\n+ assert aq_base(collection).isPrincipiaFolderish\n+ assert collection.__class__ == FolderishDocument\n+\n+ listing = collection.blocks[collection.blocks_layout["items"][1]]\n+ assert listing["@type"] == "listing"\n+ assert listing["querystring"] == {\n+ "b_size": 10,\n+ "limit": 100,\n+ "query": [\n+ {\n+ "i": "portal_type",\n+ "o": "plone.app.querystring.operation.selection.any",\n+ "v": ["Document"],\n+ }\n+ ],\n+ "sort_on": "effective",\n+ "sort_order_boolean": False,\n+ "sort_order": "ascending",\n+ }\n+\n+ def test_default_pages_are_migrated(self, migration):\n+ folder = api.content.create(\n+ container=self.portal,\n+ type="Folder",\n+ id="folder",\n+ title="Folder",\n+ )\n+ api.content.create(\n+ container=folder,\n+ type="Document",\n+ id="doc",\n+ title="Document",\n+ description="This is a default page",\n+ )\n+ folder.setDefaultPage("doc")\n+\n+ migration()\n+\n+ folder = self.portal["folder"]\n+ assert folder.portal_type == "Document"\n+ assert getattr(folder, "default_page", None) is None\n+ assert folder.title == "Document"\n+ assert folder.description == "This is a default page"\n+\n+ def test_default_page_collections_are_migrated(self, migration):\n+ folder = api.content.create(\n+ container=self.portal,\n+ type="Folder",\n+ id="folder",\n+ title="Folder",\n+ )\n+ collection = api.content.create(\n+ container=folder,\n+ type="Collection",\n+ id="collection",\n+ title="Collection",\n+ description="This is a default collection",\n+ limit=1000,\n+ item_count=30,\n+ sort_on="modified",\n+ sort_reversed=True,\n+ )\n+ collection.query = [\n+ {\n+ "i": "path",\n+ "o": "plone.app.querystring.operation.string.relativePath",\n+ "v": "..::1",\n+ },\n+ {\n+ "i": "portal_type",\n+ "o": "plone.app.querystring.operation.selection.any",\n+ "v": ["Document"],\n+ },\n+ ]\n+ folder.setDefaultPage("collection")\n+ api.content.create(\n+ container=folder,\n+ type="Document",\n+ id="doc1",\n+ title="Doc 1",\n+ description="This is a document",\n+ )\n+ api.content.create(\n+ container=folder,\n+ type="Document",\n+ id="doc2",\n+ title="Doc 2",\n+ description="This is a document",\n+ )\n+ assert "collection" in folder.keys()\n+ assert len(collection.results()) == 2\n+\n+ migration()\n+\n+ folder = self.portal["folder"]\n+ assert folder.portal_type == "Document"\n+ assert getattr(folder, "default_page", None) is None\n+ assert "collection" not in folder.keys()\n+ assert folder.title == "Collection"\n+ assert folder.description == "This is a default collection"\n+ listing = collection.blocks[collection.blocks_layout["items"][1]]\n+ assert listing["@type"] == "listing"\n+ assert listing["querystring"] == {\n+ "b_size": 30,\n+ "limit": 1000,\n+ "query": [\n+ {\n+ "i": "path",\n+ "o": "plone.app.querystring.operation.string.relativePath",\n+ "v": ".::1",\n+ },\n+ {\n+ "i": "portal_type",\n+ "o": "plone.app.querystring.operation.selection.any",\n+ "v": ["Document"],\n+ },\n+ ],\n+ "sort_on": "modified",\n+ "sort_order_boolean": True,\n+ "sort_order": "descending",\n+ }\n+\n+ def test_default_page_news_are_not_migrated(self, migration):\n+ folder = api.content.create(\n+ container=self.portal,\n+ type="Folder",\n+ id="folder",\n+ title="Folder",\n+ description="This of the folder",\n+ )\n+ api.content.create(\n+ container=folder,\n+ type="News Item",\n+ id="news",\n+ title="News Item",\n+ description="This is a default news item",\n+ )\n+ folder.setDefaultPage("news")\n+ assert "news" in folder.keys()\n+\n+ migration()\n+\n+ folder = self.portal["folder"]\n+ assert folder.portal_type == "Document"\n+ # the default_page attr is not removed\n+ assert folder.default_page == "news"\n+ assert folder.title == "Folder"\n+ assert folder.description == "This of the folder"\n+\n+ assert "news" in folder.keys()\n+ assert folder["news"].portal_type == "News Item"\n+ assert folder["news"].title == "News Item"\n+ assert folder["news"].description == "This is a default news item"\n+\n+ @responses.activate\n+ def test_richtext_is_migrated(self, migration):\n+ # Mock response of blocks-conversion-tool for slate\n+ html = "

I am html text

"\n+ result = json.loads(\n+ """{"data":[{"@type":"slate","value":[{"type":"p","children":[{"text":"I am "},{"type":"link","data":{"url":"https://www.plone.org","title":null,"target":null},"children":[{"text":"html"}]},{"text":" text"}]}],"plaintext":"I am html text"}]}"""\n+ )\n+ responses.add(\n+ responses.POST,\n+ url="http://localhost:5000/html",\n+ json=result,\n+ )\n+\n+ doc = api.content.create(\n+ container=self.portal,\n+ type="Document",\n+ id="doc",\n+ title="Document",\n+ text=RichTextValue(html, "text/plain", "text/html"),\n+ )\n+ assert isinstance(doc.text, RichTextValue)\n+\n+ migration()\n+\n+ doc = self.portal["doc"]\n+ assert doc.text is None\n+ uuid = doc.blocks_layout["items"][1]\n+ block = doc.blocks[uuid]\n+ assert block["plaintext"] == "I am html text"\ndiff --git a/tests/setup/test_setup_install.py b/tests/setup/test_setup_install.py\nnew file mode 100644\nindex 00000000..b2ac0bfe\n--- /dev/null\n+++ b/tests/setup/test_setup_install.py\n@@ -0,0 +1,52 @@\n+from plone.volto import PACKAGE_NAME\n+\n+import pytest\n+\n+\n+class TestSetupInstall:\n+ def test_addon_installed(self, installer):\n+ """Test if plone.volto is installed."""\n+ assert installer.is_product_installed(PACKAGE_NAME) is True\n+\n+ def test_browserlayer(self, browser_layers):\n+ """Test that IBrowserLayer is registered."""\n+ from plone.volto.interfaces import IPloneVoltoCoreLayer\n+\n+ assert IPloneVoltoCoreLayer in browser_layers\n+\n+ def test_latest_version(self, profile_last_version):\n+ """Test latest version of default profile."""\n+ assert profile_last_version(f"{PACKAGE_NAME}:default") == "1018"\n+\n+ @pytest.mark.parametrize(\n+ "portal_type,behavior",\n+ [\n+ ["Document", "volto.blocks"],\n+ ["Document", "volto.preview_image"],\n+ ["Event", "volto.blocks"],\n+ ["Event", "volto.preview_image"],\n+ ["News Item", "volto.blocks"],\n+ ["Plone Site", "volto.blocks"],\n+ ],\n+ )\n+ def test_portal_type_has_behavior(\n+ self, portal, get_behaviors, portal_type: str, behavior: str\n+ ):\n+ assert behavior in get_behaviors(portal_type)\n+\n+ @pytest.mark.parametrize(\n+ "portal_type,expected",\n+ [\n+ ["Document", True],\n+ ["Event", True],\n+ ["News Item", True],\n+ ["Plone Site", False],\n+ ["Collection", False],\n+ ["Folder", False],\n+ ],\n+ )\n+ def test_portal_type_global_allow(\n+ self, portal, get_fti, portal_type: str, expected: bool\n+ ):\n+ fti = get_fti(portal_type)\n+ assert fti.global_allow is expected\ndiff --git a/tests/setup/test_setup_uninstall.py b/tests/setup/test_setup_uninstall.py\nnew file mode 100644\nindex 00000000..cdfc5798\n--- /dev/null\n+++ b/tests/setup/test_setup_uninstall.py\n@@ -0,0 +1,19 @@\n+from plone.volto import PACKAGE_NAME\n+\n+import pytest\n+\n+\n+class TestSetupUninstall:\n+ @pytest.fixture(autouse=True)\n+ def uninstalled(self, installer):\n+ installer.uninstall_product(PACKAGE_NAME)\n+\n+ def test_addon_uninstalled(self, installer):\n+ """Test if plone.volto is uninstalled."""\n+ assert installer.is_product_installed(PACKAGE_NAME) is False\n+\n+ def test_browserlayer_not_registered(self, browser_layers):\n+ """Test that IBrowserLayer is not registered."""\n+ from plone.volto.interfaces import IPloneVoltoCoreLayer\n+\n+ assert IPloneVoltoCoreLayer not in browser_layers\ndiff --git a/tests/setup/test_upgrades.py b/tests/setup/test_upgrades.py\nnew file mode 100644\nindex 00000000..24607215\n--- /dev/null\n+++ b/tests/setup/test_upgrades.py\n@@ -0,0 +1,140 @@\n+from plone.volto.upgrades import from12to13_migrate_listings\n+\n+import pytest\n+\n+\n+class TestUpgrades:\n+\n+ @pytest.fixture(autouse=True)\n+ def _setup(self, app, http_request, portal, contents):\n+ self.app = app\n+ self.request = http_request\n+ self.doc = contents["doc"]\n+ self.image = contents["image"]\n+\n+ @pytest.mark.parametrize(\n+ "blocks,expected",\n+ [\n+ [\n+ {"123": {"@type": "listing", "template": "summary"}},\n+ {"@type": "listing", "variation": "summary", "querystring": {}},\n+ ],\n+ [\n+ {"123": {"@type": "listing", "query": []}},\n+ {"@type": "listing", "querystring": {"query": []}},\n+ ],\n+ [\n+ {"123": {"@type": "listing", "variation": "summary", "query": []}},\n+ {\n+ "@type": "listing",\n+ "variation": "summary",\n+ "querystring": {"query": []},\n+ },\n+ ],\n+ [\n+ {\n+ "123": {\n+ "@type": "listing",\n+ "template": "summary",\n+ "variation": "summary",\n+ "query": [],\n+ }\n+ },\n+ {\n+ "@type": "listing",\n+ "variation": "summary",\n+ "querystring": {"query": []},\n+ },\n+ ],\n+ [\n+ {\n+ "123": {\n+ "@type": "listing",\n+ "template": "summary",\n+ "variation": "summary",\n+ "query": [],\n+ },\n+ "222": {"@type": "image", "url": ""},\n+ },\n+ {\n+ "@type": "listing",\n+ "variation": "summary",\n+ "querystring": {"query": []},\n+ },\n+ ],\n+ ],\n+ )\n+ def test_upgradefrom12to13listing_block(self, deserialize, blocks, expected):\n+ doc = self.doc\n+ deserialize(blocks=blocks, context=doc)\n+ from12to13_migrate_listings(self.app)\n+ assert self.doc.blocks["123"] == expected\n+\n+ @pytest.mark.parametrize(\n+ "blocks,expected",\n+ [\n+ [\n+ {\n+ "123": {\n+ "@type": "listing",\n+ "id": "87def7d6-e019-4026-a8a2-e1c289941fac",\n+ "limit": "2",\n+ "sort_on": "created",\n+ "sort_order": True,\n+ "batch_size": "10",\n+ "depth": "3",\n+ "query": [\n+ {\n+ "i": "path",\n+ "o": "plone.app.querystring.operation.string.absolutePath",\n+ "v": "/de/beispiele",\n+ },\n+ {\n+ "i": "portal_type",\n+ "o": "plone.app.querystring.operation.selection.any",\n+ "v": ["Document"],\n+ },\n+ ],\n+ "template": "newsListing",\n+ }\n+ },\n+ {\n+ "@type": "listing",\n+ "id": "87def7d6-e019-4026-a8a2-e1c289941fac",\n+ "querystring": {\n+ "limit": "2",\n+ "sort_on": "created",\n+ "sort_order": "descending",\n+ "b_size": "10",\n+ "depth": "3",\n+ "sort_order_boolean": True,\n+ "query": [\n+ {\n+ "i": "path",\n+ "o": "plone.app.querystring.operation.string.absolutePath",\n+ "v": "/de/beispiele",\n+ },\n+ {\n+ "i": "portal_type",\n+ "o": "plone.app.querystring.operation.selection.any",\n+ "v": ["Document"],\n+ },\n+ ],\n+ },\n+ "variation": "newsListing",\n+ },\n+ ],\n+ [\n+ {"123": {"@type": "listing", "query": []}},\n+ {"@type": "listing", "querystring": {"query": []}},\n+ ],\n+ ],\n+ )\n+ def test_upgradefrom12to13listing_block_query_part(\n+ self, deserialize, blocks, expected\n+ ):\n+ doc = self.doc\n+ deserialize(blocks=blocks, context=doc)\n+ from12to13_migrate_listings(self.app)\n+\n+ assert self.doc.blocks["123"] == expected\ndiff --git a/tox.ini b/tox.ini\nnew file mode 100644\nindex 00000000..f02f7147\n--- /dev/null\n+++ b/tox.ini\n@@ -0,0 +1,230 @@\n+# Generated from:\n+# https://github.com/plone/meta/tree/main/config/default\n+# See the inline comments on how to expand/tweak this configuration file\n+[tox]\n+# We need 4.4.0 for constrain_package_deps.\n+min_version = 4.4.0\n+envlist =\n+ lint\n+ test\n+ dependencies\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# envlist_lines = """\n+# my_other_environment\n+# """\n+# config_lines = """\n+# my_extra_top_level_tox_configuration_lines\n+# """\n+##\n+\n+[testenv]\n+skip_install = true\n+allowlist_externals =\n+ echo\n+ false\n+# Make sure typos like `tox -e formaat` are caught instead of silently doing nothing.\n+# See https://github.com/tox-dev/tox/issues/2858.\n+commands =\n+ echo "Unrecognized environment name {envname}"\n+ false\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# testenv_options = """\n+# basepython = /usr/bin/python3.8\n+# """\n+##\n+\n+[testenv:init]\n+description = Prepare environment\n+skip_install = true\n+deps =\n+ mxdev\n+commands =\n+ mxdev -c mx.ini\n+ echo "Initial setup for mxdev"\n+\n+\n+[testenv:format]\n+description = automatically reformat code\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a pyupgrade\n+ pre-commit run -a isort\n+ pre-commit run -a black\n+ pre-commit run -a zpretty\n+\n+[testenv:lint]\n+description = run linters that will help improve the code style\n+skip_install = true\n+deps =\n+ pre-commit\n+commands =\n+ pre-commit run -a\n+\n+[testenv:dependencies]\n+description = check if the package defines all its dependencies\n+skip_install = true\n+deps =\n+ build\n+ z3c.dependencychecker==2.14.3\n+commands =\n+ python -m build --sdist\n+ dependencychecker\n+\n+[testenv:dependencies-graph]\n+description = generate a graph out of the dependencies of the package\n+skip_install = false\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree==2.5.1\n+ graphviz # optional dependency of pipdeptree\n+commands =\n+ sh -c \'pipdeptree --exclude setuptools,wheel,pipdeptree,zope.interface,zope.component --graph-output svg > dependencies.svg\'\n+\n+[testenv:test]\n+description = run the distribution tests\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = false\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+#\n+# Set constrain_package_deps .meta.toml:\n+# [tox]\n+# constrain_package_deps = false\n+##\n+deps =\n+ pytest-plone\n+ pytest\n+ -c constraints-mxdev.txt\n+\n+\n+##\n+# Specify additional deps in .meta.toml:\n+# [tox]\n+# test_deps_additional = """\n+# -esources/plonegovbr.portal_base[test]\n+# """\n+#\n+# Specify a custom constraints file in .meta.toml:\n+# [tox]\n+# constraints_file = "https://my-server.com/constraints.txt"\n+##\n+commands =\n+ pytest --disable-warnings {posargs} {toxinidir}/tests\n+extras =\n+ test\n+\n+\n+[testenv:coverage]\n+description = get a test coverage report\n+use_develop = true\n+skip_install = false\n+constrain_package_deps = false\n+set_env =\n+ ROBOT_BROWSER=headlesschrome\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+#\n+# Set constrain_package_deps .meta.toml:\n+# [tox]\n+# constrain_package_deps = "false"\n+#\n+# Explicitly set the package name .meta.toml:\n+# (For cases where the repository name is not the same of\n+# the package name)\n+# [tox]\n+# package_name = "pytest_plone"\n+#\n+##\n+deps =\n+ pytest-plone\n+ pytest\n+ coverage\n+ -c constraints-mxdev.txt\n+\n+commands =\n+ coverage run --source plone.volto -m pytest {posargs} --disable-warnings {toxinidir}/tests\n+ coverage report -m --format markdown\n+ coverage xml\n+extras =\n+ test\n+\n+\n+[testenv:release-check]\n+description = ensure that the distribution is ready to release\n+skip_install = true\n+deps =\n+ twine\n+ build\n+ towncrier\n+ -c constraints-mxdev.txt\n+\n+commands =\n+ # fake version to not have to install the package\n+ # we build the change log as news entries might break\n+ # the README that is displayed on PyPI\n+ towncrier build --version=100.0.0 --yes\n+ python -m build --sdist\n+ twine check dist/*\n+\n+[testenv:circular]\n+description = ensure there are no cyclic dependencies\n+use_develop = true\n+skip_install = false\n+# Here we must always constrain the package deps to what is already installed,\n+# otherwise we simply get the latest from PyPI, which may not work.\n+constrain_package_deps = true\n+set_env =\n+\n+##\n+# Specify extra test environment variables in .meta.toml:\n+# [tox]\n+# test_environment_variables = """\n+# PIP_EXTRA_INDEX_URL=https://my-pypi.my-server.com/\n+# """\n+##\n+allowlist_externals =\n+ sh\n+deps =\n+ pipdeptree\n+ pipforester\n+ -c constraints-mxdev.txt\n+\n+commands =\n+ # Generate the full dependency tree\n+ sh -c \'pipdeptree -j > forest.json\'\n+ # Generate a DOT graph with the circular dependencies, if any\n+ pipforester -i forest.json -o forest.dot --cycles\n+ # Report if there are any circular dependencies, i.e. error if there are any\n+ pipforester -i forest.json --check-cycles -o /dev/null\n+\n+\n+##\n+# Add extra configuration options in .meta.toml:\n+# [tox]\n+# extra_lines = """\n+# _your own configuration lines_\n+# """\n+##\ndiff --git a/versions.cfg b/versions.cfg\ndeleted file mode 100644\nindex 070cb8aa..00000000\n--- a/versions.cfg\n+++ /dev/null\n@@ -1,42 +0,0 @@\n-[versions]\n-# Buildout\n-setuptools =\n-zc.buildout =\n-zc.recipe.egg = 2.0.3\n-\n-# fixes Getting distribution for \'configparser\'. assert newdist is not None # newloc above is missing our dist?!\n-configparser = 3.5.3\n-\n-# fixes Error: The requirement (\'Pygments>=2.5.1\') is not allowed by your [versions] constraint (2.2.0)\n-Pygments = 2.5.1\n-\n-# plone.recipe.varnish\n-plone.recipe.varnish = 1.3\n-\n-# Code-analysis\n-plone.recipe.codeanalysis = 3.0.1\n-coverage = 3.7.1\n-pep8 = 1.7.1\n-flake8 = 3.5.0\n-flake8-coding = 1.3.2\n-pycodestyle = 2.3.1\n-\n-# Release\n-zest.releaser = 6.22.2\n-twine = 1.11.0\n-towncrier = 19.9.0\n-zestreleaser.towncrier = 1.3.0\n-docutils = 0.13.1\n-\n-# Sphinx\n-Sphinx = 1.6.5\n-docutils = 0.14\n-Pygments = 2.2.0\n-sphinxcontrib-httpexample = 0.7.0\n-sphinxcontrib-httpdomain = 1.5.0\n-sphinx-rtd-theme = 0.2.4\n-Jinja2 = 2.10\n-Babel = 2.5.1\n-\n-# Test requirement\n-responses = 0.20.0\n' + +Repository: plone.volto + + +Branch: refs/heads/main +Date: 2024-12-11T14:30:09-08:00 +Author: David Glick (davisagli) +Commit: https://github.com/plone/plone.volto/commit/ac79143b17bb5cf8080ae95ad8b704bef8ab9a7d + +fix one more import + +Files changed: +A news/128.internal +M src/plone/volto/browser/migrate_to_volto.py +D news/128.bugfix + +b'diff --git a/news/128.bugfix b/news/128.bugfix\ndeleted file mode 100644\nindex 5375b8e2..00000000\n--- a/news/128.bugfix\n+++ /dev/null\n@@ -1,2 +0,0 @@\n-Fix deprecated imports.\n-[petschki]\ndiff --git a/news/128.internal b/news/128.internal\nnew file mode 100644\nindex 00000000..5fa45a0f\n--- /dev/null\n+++ b/news/128.internal\n@@ -0,0 +1 @@\n+Fix deprecated imports. @petschki\ndiff --git a/src/plone/volto/browser/migrate_to_volto.py b/src/plone/volto/browser/migrate_to_volto.py\nindex 355e49ef..c7510fa9 100644\n--- a/src/plone/volto/browser/migrate_to_volto.py\n+++ b/src/plone/volto/browser/migrate_to_volto.py\n@@ -4,6 +4,7 @@\n from plone.app.contenttypes.behaviors.collection import ICollection\n from plone.app.contenttypes.utils import get_old_class_name_string\n from plone.app.contenttypes.utils import get_portal_type_name_string\n+from plone.app.contenttypes.utils import migrate_base_class_to_new_class\n from plone.app.linkintegrity.utils import referencedRelationship\n from plone.app.redirector.interfaces import IRedirectionStorage\n from plone.app.textfield.value import RichTextValue\n@@ -20,14 +21,6 @@\n from zope.lifecycleevent import modified\n \n \n-try:\n- from plone.app.contenttypes.utils import migrate_base_class_to_new_class\n-except ImportError:\n- # BBB: Plone 5\n- from plone.app.contenttypes.migration.dxmigration import (\n- migrate_base_class_to_new_class,\n- )\n-\n logger = getLogger(__name__)\n \n \n' + +Repository: plone.volto + + +Branch: refs/heads/main +Date: 2024-12-11T15:07:02-08:00 +Author: David Glick (davisagli) +Commit: https://github.com/plone/plone.volto/commit/f54450d628760ec1cf466800f205a96491d666dd + +Merge remote-tracking branch 'origin/main' into petschki-cleanup-deprecations + +Files changed: +A news/157.bugfix +D src/plone/volto/overrides.zcml +D src/plone/volto/vocabularies/__init__.py +D src/plone/volto/vocabularies/configure.zcml +D src/plone/volto/vocabularies/subject.py + +b'diff --git a/news/157.bugfix b/news/157.bugfix\nnew file mode 100644\nindex 00000000..ec311370\n--- /dev/null\n+++ b/news/157.bugfix\n@@ -0,0 +1 @@\n+Remove override of Plone\'s `plone.app.vocabularies.Keywords` vocabulary. @davisagli\ndiff --git a/src/plone/volto/overrides.zcml b/src/plone/volto/overrides.zcml\ndeleted file mode 100644\nindex 00b3440b..00000000\n--- a/src/plone/volto/overrides.zcml\n+++ /dev/null\n@@ -1,8 +0,0 @@\n-\n-\n- \n-\n-\ndiff --git a/src/plone/volto/vocabularies/__init__.py b/src/plone/volto/vocabularies/__init__.py\ndeleted file mode 100644\nindex e69de29b..00000000\ndiff --git a/src/plone/volto/vocabularies/configure.zcml b/src/plone/volto/vocabularies/configure.zcml\ndeleted file mode 100644\nindex 71af777b..00000000\n--- a/src/plone/volto/vocabularies/configure.zcml\n+++ /dev/null\n@@ -1,6 +0,0 @@\n-\n-\n-\ndiff --git a/src/plone/volto/vocabularies/subject.py b/src/plone/volto/vocabularies/subject.py\ndeleted file mode 100644\nindex c5f76ac9..00000000\n--- a/src/plone/volto/vocabularies/subject.py\n+++ /dev/null\n@@ -1,110 +0,0 @@\n-from BTrees.IIBTree import intersection\n-from plone.app.layout.navigation.root import getNavigationRootObject\n-from plone.base.utils import safe_bytes\n-from plone.registry.interfaces import IRegistry\n-from Products.CMFCore.utils import getToolByName\n-from zope.component import queryUtility\n-from zope.component.hooks import getSite\n-from zope.interface import directlyProvides\n-from zope.interface import implementer\n-from zope.schema.interfaces import ITitledTokenizedTerm\n-from zope.schema.interfaces import ITokenizedTerm\n-from zope.schema.interfaces import IVocabularyFactory\n-from zope.schema.vocabulary import SimpleVocabulary\n-\n-\n-@implementer(ITokenizedTerm)\n-class UnsafeSimpleSubjectTerm:\n- """Simple tokenized term that allows unicode in the token"""\n-\n- def __init__(self, value, token, title):\n- """Create a term for value and token. If token is omitted,\n- str(value) is used for the token. If title is provided,\n- term implements ITitledTokenizedTerm.\n- """\n- self.value = value\n- self.token = token\n- self.title = title\n- if title is not None:\n- directlyProvides(self, ITitledTokenizedTerm)\n-\n-\n-# Override the keywords vocabulary with an unsafe version. plone.restapi\n-# currently store the raw token for the subject field. Override the vocabulary\n-# with a version that uses the Keyword as a token and does not encode it.\n-# Mostly copied from plone.app.vocabularies.catalog.\n-# See https://github.com/plone/plone.restapi/issues/782\n-\n-\n-def unsafe_simplevocabulary_from_values(values, query=None):\n- return SimpleVocabulary(\n- [\n- UnsafeSimpleSubjectTerm(value, value, value)\n- for value in values\n- if query is None or safe_bytes(query) in safe_bytes(value)\n- ]\n- )\n-\n-\n-safe_simplevocabulary_from_values = unsafe_simplevocabulary_from_values\n-\n-\n-@implementer(IVocabularyFactory)\n-class KeywordsVocabulary:\n- """Override Keywords vocabulary to provide the real Keyword as the token."""\n-\n- # Allow users to customize the index to easily create\n- # KeywordVocabularies for other keyword indexes\n- keyword_index = "Subject"\n- path_index = "path"\n-\n- def section(self, context):\n- """gets section from which subjects are used."""\n- registry = queryUtility(IRegistry)\n- if registry is None:\n- return None\n- if registry.get("plone.subjects_of_navigation_root", False):\n- portal = getToolByName(context, "portal_url").getPortalObject()\n- return getNavigationRootObject(context, portal)\n- return None\n-\n- def all_keywords(self, kwfilter):\n- site = getSite()\n- self.catalog = getToolByName(site, "portal_catalog", None)\n- if self.catalog is None:\n- return SimpleVocabulary([])\n- index = self.catalog._catalog.getIndex(self.keyword_index)\n- return safe_simplevocabulary_from_values(index._index, query=kwfilter)\n-\n- def keywords_of_section(self, section, kwfilter):\n- """Valid keywords under the given section."""\n- pcat = getToolByName(section, "portal_catalog")\n- cat = pcat._catalog\n- path_idx = cat.indexes[self.path_index]\n- tags_idx = cat.indexes[self.keyword_index]\n- result = []\n- # query all oids of path - low level\n- pquery = {\n- self.path_index: {"query": "/".join(section.getPhysicalPath()), "depth": -1}\n- }\n- kwfilter = safe_bytes(kwfilter)\n- # uses internal zcatalog specific details to quickly get the values.\n- path_result, info = path_idx._apply_index(pquery)\n- for tag in tags_idx.uniqueValues():\n- if kwfilter and kwfilter not in safe_bytes(tag):\n- continue\n- tquery = {self.keyword_index: tag}\n- tags_result, info = tags_idx._apply_index(tquery)\n- if intersection(path_result, tags_result):\n- result.append(tag)\n- # result should be sorted, because uniqueValues are.\n- return safe_simplevocabulary_from_values(result)\n-\n- def __call__(self, context, query=None):\n- section = self.section(context)\n- if section is None:\n- return self.all_keywords(query)\n- return self.keywords_of_section(section, query)\n-\n-\n-KeywordsVocabularyFactory = KeywordsVocabulary()\n' + +Repository: plone.volto + + +Branch: refs/heads/main +Date: 2024-12-11T16:07:30-08:00 Author: David Glick (davisagli) -Commit: https://github.com/plone/plone.restapi/commit/d012d3f784c5897d5b70164daabdb99b3903ebca +Commit: https://github.com/plone/plone.volto/commit/847a7c3aea47f7bbd59458d0b29ac68b97b8970b -fix time-dependence of event recurrent tests (#1850) +Merge pull request #128 from plone/petschki-cleanup-deprecations -* fix time-dependence of event recurrent tests - -* changelog +Fix deprecated imports Files changed: -A news/1850.internal -M src/plone/restapi/tests/test_serializer_summary.py +A news/128.internal +M src/plone/volto/browser/breadcrumbs.py +M src/plone/volto/browser/migrate_to_volto.py +M src/plone/volto/browser/navigation.py -b'diff --git a/news/1850.internal b/news/1850.internal\nnew file mode 100644\nindex 000000000..d4a67450a\n--- /dev/null\n+++ b/news/1850.internal\n@@ -0,0 +1 @@\n+Fix time-dependence of tests. @davisagli\ndiff --git a/src/plone/restapi/tests/test_serializer_summary.py b/src/plone/restapi/tests/test_serializer_summary.py\nindex 9a7b7db45..e186c2f31 100644\n--- a/src/plone/restapi/tests/test_serializer_summary.py\n+++ b/src/plone/restapi/tests/test_serializer_summary.py\n@@ -17,6 +17,7 @@\n from zope.interface import alsoProvides\n \n import Missing\n+import pytz\n import unittest\n \n \n@@ -234,14 +235,15 @@ def setUp(self):\n )\n self.portal.portal_types.DXTestDocument.behaviors = behaviors\n \n+ self.start = datetime(1995, 7, 31, 13, 45, tzinfo=pytz.timezone("UTC"))\n self.event = createContentInContainer(\n self.portal,\n "DXTestDocument",\n id="doc1",\n title="Lorem Ipsum event",\n description="Description event",\n- start=datetime.now(),\n- end=datetime.now() + timedelta(hours=1),\n+ start=self.start,\n+ end=self.start + timedelta(hours=1),\n recurrence="RRULE:FREQ=DAILY;COUNT=3", # see https://github.com/plone/plone.app.event/blob/master/plone/app/event/tests/base_setup.py\n )\n \n@@ -256,7 +258,7 @@ def tearDown(self):\n "this test needs a plone.app.event version that does not include a IContentListingObject adapter",\n )\n def test_dx_event_with_recurrence_old_version(self):\n- tomorrow = datetime.now() + timedelta(days=1)\n+ tomorrow = self.start + timedelta(days=1)\n tomorrow_str = tomorrow.strftime("%Y-%m-%d")\n ot = OccurrenceTraverser(self.event, self.request)\n ocurrence = ot.publishTraverse(self.request, tomorrow_str)\n@@ -269,7 +271,7 @@ def test_dx_event_with_recurrence_old_version(self):\n "this test needs a plone.app.event version that includes a IContentListingObject adapter",\n )\n def test_dx_event_with_recurrence_new_version(self):\n- tomorrow = datetime.now() + timedelta(days=1)\n+ tomorrow = self.start + timedelta(days=1)\n tomorrow_str = tomorrow.strftime("%Y-%m-%d")\n ot = OccurrenceTraverser(self.event, self.request)\n ocurrence = ot.publishTraverse(self.request, tomorrow_str)\n' +b'diff --git a/news/128.internal b/news/128.internal\nnew file mode 100644\nindex 0000000..5fa45a0\n--- /dev/null\n+++ b/news/128.internal\n@@ -0,0 +1 @@\n+Fix deprecated imports. @petschki\ndiff --git a/src/plone/volto/browser/breadcrumbs.py b/src/plone/volto/browser/breadcrumbs.py\nindex 663f19f..9799865 100644\n--- a/src/plone/volto/browser/breadcrumbs.py\n+++ b/src/plone/volto/browser/breadcrumbs.py\n@@ -1,8 +1,11 @@\n from Acquisition import aq_base\n from Acquisition import aq_inner\n+from Acquisition import aq_parent\n from plone.app.layout.navigation.interfaces import INavigationRoot\n from plone.app.layout.navigation.root import getNavigationRoot\n-from Products.CMFPlone import utils\n+from plone.base.defaultpage import check_default_page_via_view\n+from plone.base.interfaces import IHideFromBreadcrumbs\n+from plone.base.utils import pretty_title_or_id\n from Products.CMFPlone.browser.interfaces import INavigationBreadcrumbs\n from Products.CMFPlone.browser.navigation import get_view_url\n from Products.Five import BrowserView\n@@ -10,25 +13,17 @@\n from zope.interface import implementer\n \n \n-try:\n- from plone.base.defaultpage import check_default_page_via_view\n- from plone.base.interfaces import IHideFromBreadcrumbs\n-except ImportError:\n- from Products.CMFPlone.defaultpage import check_default_page_via_view\n- from Products.CMFPlone.interfaces import IHideFromBreadcrumbs\n-\n-\n @implementer(INavigationBreadcrumbs)\n class PhysicalNavigationBreadcrumbs(BrowserView):\n def breadcrumbs(self):\n context = aq_inner(self.context)\n request = self.request\n- container = utils.parent(context)\n+ container = aq_parent(context)\n \n name, item_url = get_view_url(context)\n last_crumb = {\n "absolute_url": item_url,\n- "Title": utils.pretty_title_or_id(context, context),\n+ "Title": pretty_title_or_id(context, context),\n "nav_title": getattr(aq_base(context), "nav_title", ""),\n }\n \ndiff --git a/src/plone/volto/browser/migrate_to_volto.py b/src/plone/volto/browser/migrate_to_volto.py\nindex 355e49e..c7510fa 100644\n--- a/src/plone/volto/browser/migrate_to_volto.py\n+++ b/src/plone/volto/browser/migrate_to_volto.py\n@@ -4,6 +4,7 @@\n from plone.app.contenttypes.behaviors.collection import ICollection\n from plone.app.contenttypes.utils import get_old_class_name_string\n from plone.app.contenttypes.utils import get_portal_type_name_string\n+from plone.app.contenttypes.utils import migrate_base_class_to_new_class\n from plone.app.linkintegrity.utils import referencedRelationship\n from plone.app.redirector.interfaces import IRedirectionStorage\n from plone.app.textfield.value import RichTextValue\n@@ -20,14 +21,6 @@\n from zope.lifecycleevent import modified\n \n \n-try:\n- from plone.app.contenttypes.utils import migrate_base_class_to_new_class\n-except ImportError:\n- # BBB: Plone 5\n- from plone.app.contenttypes.migration.dxmigration import (\n- migrate_base_class_to_new_class,\n- )\n-\n logger = getLogger(__name__)\n \n \ndiff --git a/src/plone/volto/browser/navigation.py b/src/plone/volto/browser/navigation.py\nindex fdb373d..66941a8 100644\n--- a/src/plone/volto/browser/navigation.py\n+++ b/src/plone/volto/browser/navigation.py\n@@ -1,9 +1,10 @@\n from Acquisition import aq_inner\n from Missing import Missing\n from plone.app.layout.navigation.root import getNavigationRoot\n+from plone.base import utils\n+from plone.base.interfaces import INavigationSchema\n from plone.registry.interfaces import IRegistry\n from Products.CMFCore.utils import getToolByName\n-from Products.CMFPlone import utils\n from Products.CMFPlone.browser.interfaces import INavigationTabs\n from Products.CMFPlone.browser.navigation import get_id\n from Products.CMFPlone.browser.navigation import get_view_url\n@@ -13,12 +14,6 @@\n from zope.interface import implementer\n \n \n-try:\n- from plone.base.interfaces import INavigationSchema\n-except ImportError:\n- from Products.CMFPlone.interfaces import INavigationSchema\n-\n-\n @implementer(INavigationTabs)\n class CatalogNavigationTabs(BrowserView):\n def _getNavQuery(self):\n'