diff --git a/last_commit.txt b/last_commit.txt index 87aeb3dd06..2e0bd3c42c 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,168 +1,173 @@ -Repository: plone.volto +Repository: plone.rest Branch: refs/heads/main -Date: 2025-01-21T17:58:54-03:00 -Author: Érico Andrei (ericof) -Commit: https://github.com/plone/plone.volto/commit/8b72e77dbe287e09dba3cf265f7b7237fc81ac69 +Date: 2025-01-20T22:48:51+01:00 +Author: Maurits van Rees (mauritsvanrees) +Commit: https://github.com/plone/plone.rest/commit/4b8e567efc7751cdb5d41474fddb86476067228f -Implement a specific robots.txt for Volto sites (Fixes #178) +Fix DeprecationWarnings. Files changed: -A news/178.feature -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.IImagingSchema.xml -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISearchSchema.xml -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ITypesSchema.xml -A src/plone/volto/profiles/default/registry/plone.volto.interfaces.IVoltoSettings.xml -A src/plone/volto/profiles/default/registry/registry.xml -M src/plone/volto/profiles/default/metadata.xml -M src/plone/volto/upgrades.py -M src/plone/volto/upgrades.zcml -D src/plone/volto/profiles/default/registry.xml +A news/4090.bugfix +A src/plone/rest/bbb.py +M .meta.toml +M README.rst +M pyproject.toml +M setup.py +M src/plone/rest/testing.py +M src/plone/rest/testing.zcml +M src/plone/rest/tests/test_traversal.py -b'diff --git a/news/178.feature b/news/178.feature\nnew file mode 100644\nindex 0000000..0fde902\n--- /dev/null\n+++ b/news/178.feature\n@@ -0,0 +1 @@\n+Implement a specific robots.txt for Volto sites [@ericof]\ndiff --git a/src/plone/volto/profiles/default/metadata.xml b/src/plone/volto/profiles/default/metadata.xml\nindex d08f418..b4653f2 100644\n--- a/src/plone/volto/profiles/default/metadata.xml\n+++ b/src/plone/volto/profiles/default/metadata.xml\n@@ -1,6 +1,6 @@\n \n \n- 1018\n+ 1019\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\ndeleted file mode 100644\nindex aa8d206..0000000\n--- a/src/plone/volto/profiles/default/registry.xml\n+++ /dev/null\n@@ -1,60 +0,0 @@\n-\n-\n- \n- \n- False\n- \n-\n- \n-\n-\n- \n- \n- \n-\n- \n- \n- \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- \n-\n- \n- \n- Plone Icon Volto Control Panel\n- \n- ++plone++plone.volto/volto.svg\n- \n-\n- \n- \n- \n-\n-\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.IImagingSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.IImagingSchema.xml\nnew file mode 100644\nindex 0000000..4d487bb\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.IImagingSchema.xml\n@@ -0,0 +1,24 @@\n+\n+\n+\n+ \n+ \n+ \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+ \n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml\nnew file mode 100644\nindex 0000000..c4f997d\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml\n@@ -0,0 +1,11 @@\n+\n+\n+\n+ \n+ False\n+ \n+\n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISearchSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISearchSchema.xml\nnew file mode 100644\nindex 0000000..d66c885\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISearchSchema.xml\n@@ -0,0 +1,12 @@\n+\n+\n+\n+ \n+ \n+ \n+\n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml\nnew file mode 100644\nindex 0000000..6ca5b86\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml\n@@ -0,0 +1,28 @@\n+\n+\n+ \n+ Sitemap: {portal_url}/sitemap.xml.gz\n+\n+# Define access-restrictions for robots/spiders\n+# http://www.robotstxt.org/wc/norobots.html\n+\n+User-agent: *\n+Disallow: /search\n+Disallow: /login\n+\n+# Add Googlebot-specific syntax extension to exclude forms\n+# that are repeated for each piece of content in the site\n+# the wildcard is only supported by Googlebot\n+# http://www.google.com/support/webmasters/bin/answer.py?answer=40367&ctx=sibling\n+\n+User-Agent: Googlebot\n+Disallow: /*login\n+Disallow: /*search\n+Disallow: /*edit\n+\n+ \n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ITypesSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ITypesSchema.xml\nnew file mode 100644\nindex 0000000..a4fb108\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ITypesSchema.xml\n@@ -0,0 +1,10 @@\n+\n+\n+ \n+ \n+ \n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.volto.interfaces.IVoltoSettings.xml b/src/plone/volto/profiles/default/registry/plone.volto.interfaces.IVoltoSettings.xml\nnew file mode 100644\nindex 0000000..ae44de1\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.volto.interfaces.IVoltoSettings.xml\n@@ -0,0 +1,8 @@\n+\n+\n+\n+ \n+\n+\ndiff --git a/src/plone/volto/profiles/default/registry/registry.xml b/src/plone/volto/profiles/default/registry/registry.xml\nnew file mode 100644\nindex 0000000..d2d96e0\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/registry.xml\n@@ -0,0 +1,11 @@\n+\n+\n+\n+ \n+ \n+ Plone Icon Volto Control Panel\n+ \n+ ++plone++plone.volto/volto.svg\n+ \n+\n+\ndiff --git a/src/plone/volto/upgrades.py b/src/plone/volto/upgrades.py\nindex 703a18c..aa88720 100644\n--- a/src/plone/volto/upgrades.py\n+++ b/src/plone/volto/upgrades.py\n@@ -156,3 +156,37 @@ def rename_distribution(context):\n report.name = "volto"\n if report.answers.get("distribution") == "default":\n report.answers["distribution"] = "volto"\n+\n+\n+ROBOTS_TXT = """Sitemap: {portal_url}/sitemap.xml.gz\n+\n+# Define access-restrictions for robots/spiders\n+# http://www.robotstxt.org/wc/norobots.html\n+\n+User-agent: *\n+Disallow: /search\n+Disallow: /login\n+\n+# Add Googlebot-specific syntax extension to exclude forms\n+# that are repeated for each piece of content in the site\n+# the wildcard is only supported by Googlebot\n+# http://www.google.com/support/webmasters/bin/answer.py?answer=40367&ctx=sibling\n+\n+User-Agent: Googlebot\n+Disallow: /*login\n+Disallow: /*search\n+Disallow: /*edit\n+"""\n+\n+\n+def update_robots_txt(context):\n+ from plone.base.interfaces.controlpanel import ROBOTS_TXT as CLASSIC_ROBOTS\n+\n+ current_value = api.portal.get_registry_record("plone.robots_txt")\n+ if current_value == CLASSIC_ROBOTS:\n+ api.portal.set_registry_record("plone.robots_txt", ROBOTS_TXT)\n+ logger.info("Updated plone.robots_txt registry with sane value.")\n+ else:\n+ logger.info(\n+ "Ignoring plone.robots_txt registry as it was modified in this portal."\n+ )\ndiff --git a/src/plone/volto/upgrades.zcml b/src/plone/volto/upgrades.zcml\nindex b5da40c..0531c6b 100644\n--- a/src/plone/volto/upgrades.zcml\n+++ b/src/plone/volto/upgrades.zcml\n@@ -86,4 +86,14 @@\n />\n \n \n+ \n+ \n+ \n \n' +b'diff --git a/.meta.toml b/.meta.toml\nindex 2ca393b..d870133 100644\n--- a/.meta.toml\n+++ b/.meta.toml\n@@ -14,4 +14,4 @@ jobs = [\n ]\n \n [pyproject]\n-dependencies_ignores = "[\'plone.app.redirector\']"\n+dependencies_ignores = "[\'plone.app.layout\', \'plone.app.redirector\', \'plone.base\', \'Products.CMFPlone\']"\ndiff --git a/README.rst b/README.rst\nindex f6923eb..3a2cf0f 100644\n--- a/README.rst\n+++ b/README.rst\n@@ -180,7 +180,7 @@ Named services can be registered by providing a \'name\' attribute in the service\n \n \n \n \n \n \n \n \n \n \n \n \ndiff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py\nindex 43ee632..a8d10f2 100644\n--- a/src/plone/rest/tests/test_traversal.py\n+++ b/src/plone/rest/tests/test_traversal.py\n@@ -1,9 +1,9 @@\n from base64 import b64encode\n-from plone.app.layout.navigation.interfaces import INavigationRoot\n from plone.app.testing import setRoles\n from plone.app.testing import SITE_OWNER_NAME\n from plone.app.testing import SITE_OWNER_PASSWORD\n from plone.app.testing import TEST_USER_ID\n+from plone.rest.bbb import INavigationRoot\n from plone.rest.service import Service\n from plone.rest.testing import PLONE_REST_INTEGRATION_TESTING\n from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster\n' -Repository: plone.volto +Repository: plone.rest Branch: refs/heads/main -Date: 2025-01-21T18:00:18-03:00 -Author: Érico Andrei (ericof) -Commit: https://github.com/plone/plone.volto/commit/385b2b931e4f409d411c39d5303d288058c2e9b1 - -Merge branch 'main' into issue-178-robots_txt - -Files changed: -A news/181.bugfix -M src/plone/volto/summary.py - -b'diff --git a/news/181.bugfix b/news/181.bugfix\nnew file mode 100644\nindex 0000000..70193a8\n--- /dev/null\n+++ b/news/181.bugfix\n@@ -0,0 +1 @@\n+Add nav_title and head_title to the default summary serializer metadata fields. @davisagli\ndiff --git a/src/plone/volto/summary.py b/src/plone/volto/summary.py\nindex b2e5dda..0a71a45 100644\n--- a/src/plone/volto/summary.py\n+++ b/src/plone/volto/summary.py\n@@ -6,6 +6,8 @@\n class JSONSummarySerializerMetadata:\n def default_metadata_fields(self):\n return {\n+ "head_title",\n "image_field",\n "image_scales",\n+ "nav_title",\n }\n' +Date: 2025-01-20T22:51:51+01:00 +Author: Maurits van Rees (mauritsvanrees) +Commit: https://github.com/plone/plone.rest/commit/0b2786d8b65fcc53cec492846c9b487ee4250938 -Repository: plone.volto +Test on Plone 6.0.13. +6.0.9 is too old, giving various errors. See https://github.com/plone/plone.rest/actions/runs/12875351288?pr=184 -Branch: refs/heads/main -Date: 2025-01-22T09:24:15-03:00 -Author: Érico Andrei (ericof) -Commit: https://github.com/plone/plone.volto/commit/3ae181f9d6a94eb8004c8c08fe95685c11eb990a - -Rename Changelog entry +And 6.0.14 may be too new, because it officially drops support for Python 3.8. Files changed: -A news/178.bugfix -D news/178.feature +M plone-6.0.x.cfg +M requirements-6.0.txt -b'diff --git a/news/178.feature b/news/178.bugfix\nsimilarity index 100%\nrename from news/178.feature\nrename to news/178.bugfix\n' +b'diff --git a/plone-6.0.x.cfg b/plone-6.0.x.cfg\nindex 3564243..8a4ca92 100644\n--- a/plone-6.0.x.cfg\n+++ b/plone-6.0.x.cfg\n@@ -1,4 +1,4 @@\n [buildout]\n extends =\n- https://dist.plone.org/release/6.0.9/versions.cfg\n+ https://dist.plone.org/release/6.0.13/versions.cfg\n base.cfg\ndiff --git a/requirements-6.0.txt b/requirements-6.0.txt\nindex 12977a8..2e4627d 100644\n--- a/requirements-6.0.txt\n+++ b/requirements-6.0.txt\n@@ -1 +1 @@\n--r https://dist.plone.org/release/6.0.9/requirements.txt\n+-r https://dist.plone.org/release/6.0.13/requirements.txt\n' -Repository: plone.volto +Repository: plone.rest Branch: refs/heads/main -Date: 2025-01-22T09:27:03-03:00 -Author: Érico Andrei (ericof) -Commit: https://github.com/plone/plone.volto/commit/02479bd6fc84818a260ef3c1a001219684058f36 +Date: 2025-01-20T23:10:53+01:00 +Author: Maurits van Rees (mauritsvanrees) +Commit: https://github.com/plone/plone.rest/commit/7a95d54d2127cb281a7159f0896424641650a029 + +Test Python 3.8 with Plone 6.0.13, newer Pythons on 6.0.14. -Fix volto sitemap location +Otherwise on 3.12 you get a too old Pillow and on 3.9-3.11 a too old docutils. Files changed: -M src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml -M src/plone/volto/upgrades.py +M plone-6.0.x.cfg +M requirements-6.0.txt -b'diff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml\nindex 6ca5b86..f643ef6 100644\n--- a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml\n@@ -5,7 +5,7 @@\n name="plone.robots_txt"\n purge="true"\n >\n- Sitemap: {portal_url}/sitemap.xml.gz\n+ Sitemap: {portal_url}/sitemap-index.xml\n \n # Define access-restrictions for robots/spiders\n # http://www.robotstxt.org/wc/norobots.html\ndiff --git a/src/plone/volto/upgrades.py b/src/plone/volto/upgrades.py\nindex aa88720..bdf4d78 100644\n--- a/src/plone/volto/upgrades.py\n+++ b/src/plone/volto/upgrades.py\n@@ -158,7 +158,7 @@ def rename_distribution(context):\n report.answers["distribution"] = "volto"\n \n \n-ROBOTS_TXT = """Sitemap: {portal_url}/sitemap.xml.gz\n+ROBOTS_TXT = """Sitemap: {portal_url}/sitemap-index.xml\n \n # Define access-restrictions for robots/spiders\n # http://www.robotstxt.org/wc/norobots.html\n' +b'diff --git a/plone-6.0.x.cfg b/plone-6.0.x.cfg\nindex 8a4ca92..10faaa8 100644\n--- a/plone-6.0.x.cfg\n+++ b/plone-6.0.x.cfg\n@@ -1,4 +1,8 @@\n [buildout]\n extends =\n- https://dist.plone.org/release/6.0.13/versions.cfg\n+ https://dist.plone.org/release/6.0.14/versions.cfg\n base.cfg\n+\n+[buildout:python38]\n+extends =\n+ https://dist.plone.org/release/6.0.13/versions.cfg\ndiff --git a/requirements-6.0.txt b/requirements-6.0.txt\nindex 2e4627d..d75ea5c 100644\n--- a/requirements-6.0.txt\n+++ b/requirements-6.0.txt\n@@ -1 +1 @@\n--r https://dist.plone.org/release/6.0.13/requirements.txt\n+-r https://dist.plone.org/release/6.0.14/requirements.txt\n' -Repository: plone.volto +Repository: plone.rest Branch: refs/heads/main -Date: 2025-01-22T09:27:33-03:00 -Author: Érico Andrei (ericof) -Commit: https://github.com/plone/plone.volto/commit/dac150ca99b987598217105aac687bbfecdac9dc +Date: 2025-01-20T23:25:08+01:00 +Author: Maurits van Rees (mauritsvanrees) +Commit: https://github.com/plone/plone.rest/commit/62e7fea91dc94dc7f1c845b95d86df3a919c189a -Update Changelog entry - -Files changed: -M news/178.bugfix +Do not test Plone 6.0 on Python 3.8. Do start testing 6.1. -b'diff --git a/news/178.bugfix b/news/178.bugfix\nindex 0fde902..0df4fbd 100644\n--- a/news/178.bugfix\n+++ b/news/178.bugfix\n@@ -1 +1,3 @@\n-Implement a specific robots.txt for Volto sites [@ericof]\n+Implement a specific robots.txt for Volto sites.\n+There is an upgrade step which will update the existing plone.robots_txt registry setting unless it has been customized.\n+@ericof\n' +Python 3.8 is not supported since Plone 6.0.14. -Repository: plone.volto +And it is too hard to use 6.0.13 on 3.8 and 6.0.14 on 3.9+: we would need a different requirements file for 3.8, otherwise pip fails with: - -Branch: refs/heads/main -Date: 2025-01-22T09:28:35-03:00 -Author: Érico Andrei (ericof) -Commit: https://github.com/plone/plone.volto/commit/91cb7e7e754fd2ed7cc1cb3e23af3780d169aa0e - -Update upgrade step title +``` +No matching distribution found for setuptools==75.6.0 +``` Files changed: -M src/plone/volto/upgrades.zcml +A plone-6.1.x.cfg +A requirements-6.1.txt +M .github/workflows/tests.yml +M plone-6.0.x.cfg -b'diff --git a/src/plone/volto/upgrades.zcml b/src/plone/volto/upgrades.zcml\nindex 0531c6b..b030682 100644\n--- a/src/plone/volto/upgrades.zcml\n+++ b/src/plone/volto/upgrades.zcml\n@@ -92,7 +92,7 @@\n destination="1019"\n >\n \n \n' +b'diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml\nindex 8622555..5cebf31 100644\n--- a/.github/workflows/tests.yml\n+++ b/.github/workflows/tests.yml\n@@ -6,17 +6,25 @@ jobs:\n strategy:\n fail-fast: false\n matrix:\n- python-version: ["3.12", "3.11", "3.10", "3.9", "3.8"]\n- plone-version: ["6.0", "5.2"]\n+ python-version: ["3.13", "3.12", "3.11", "3.10", "3.9", "3.8"]\n+ plone-version: ["6.1", "6.0", "5.2"]\n exclude:\n+ - python-version: 3.13\n+ plone-version: 5.2\n - python-version: 3.12\n plone-version: 5.2\n - python-version: 3.11\n plone-version: 5.2\n - python-version: 3.10\n plone-version: 5.2\n+ - python-version: 3.9\n+ plone-version: 6.1\n - python-version: 3.9\n plone-version: 5.2\n+ - python-version: 3.8\n+ plone-version: 6.1\n+ - python-version: 3.8\n+ plone-version: 6.0\n steps:\n # git checkout\n - uses: actions/checkout@v2\ndiff --git a/plone-6.0.x.cfg b/plone-6.0.x.cfg\nindex 10faaa8..e35457e 100644\n--- a/plone-6.0.x.cfg\n+++ b/plone-6.0.x.cfg\n@@ -2,7 +2,3 @@\n extends =\n https://dist.plone.org/release/6.0.14/versions.cfg\n base.cfg\n-\n-[buildout:python38]\n-extends =\n- https://dist.plone.org/release/6.0.13/versions.cfg\ndiff --git a/plone-6.1.x.cfg b/plone-6.1.x.cfg\nnew file mode 100644\nindex 0000000..a37de09\n--- /dev/null\n+++ b/plone-6.1.x.cfg\n@@ -0,0 +1,4 @@\n+[buildout]\n+extends =\n+ https://dist.plone.org/release/6.1.0b1/versions.cfg\n+ base.cfg\ndiff --git a/requirements-6.1.txt b/requirements-6.1.txt\nnew file mode 100644\nindex 0000000..d088e28\n--- /dev/null\n+++ b/requirements-6.1.txt\n@@ -0,0 +1 @@\n+-r https://dist.plone.org/release/6.1.0b1/requirements.txt\n' -Repository: plone.volto +Repository: plone.rest Branch: refs/heads/main -Date: 2025-01-22T09:30:13-03:00 -Author: Érico Andrei (ericof) -Commit: https://github.com/plone/plone.volto/commit/3aaa3387f72fc4616631641b6453af1e6bb528fe +Date: 2025-01-24T11:07:06-08:00 +Author: David Glick (davisagli) +Commit: https://github.com/plone/plone.rest/commit/bafb5a20130bbfbadad20b84061e9841bfe27a55 -Fix tests +Drop support for Plone 5.2 Files changed: -M tests/setup/test_setup_install.py - -b'diff --git a/tests/setup/test_setup_install.py b/tests/setup/test_setup_install.py\nindex b2ac0bf..ee7c05a 100644\n--- a/tests/setup/test_setup_install.py\n+++ b/tests/setup/test_setup_install.py\n@@ -16,7 +16,7 @@ def test_browserlayer(self, 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+ assert profile_last_version(f"{PACKAGE_NAME}:default") == "1019"\n \n @pytest.mark.parametrize(\n "portal_type,behavior",\n' - -Repository: plone.volto +A news/4090.breaking +M .github/workflows/tests.yml +M Makefile +M README.rst +M news/178.internal +M plone-6.1.x.cfg +M requirements-6.1.txt +M requirements.txt +M setup.py +M src/plone/rest/patches.py +M src/plone/rest/patches.zcml +M src/plone/rest/testing.zcml +M src/plone/rest/tests/test_traversal.py +M tox.ini +D plone-5.2.x.cfg +D requirements-5.2.txt +D src/plone/rest/bbb.py + +b'diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml\nindex 5cebf31..c703bce 100644\n--- a/.github/workflows/tests.yml\n+++ b/.github/workflows/tests.yml\n@@ -6,47 +6,24 @@ jobs:\n strategy:\n fail-fast: false\n matrix:\n- python-version: ["3.13", "3.12", "3.11", "3.10", "3.9", "3.8"]\n- plone-version: ["6.1", "6.0", "5.2"]\n+ python-version: ["3.13", "3.12", "3.11", "3.10", "3.9"]\n+ plone-version: ["6.1", "6.0"]\n exclude:\n- - python-version: 3.13\n- plone-version: 5.2\n- - python-version: 3.12\n- plone-version: 5.2\n- - python-version: 3.11\n- plone-version: 5.2\n- - python-version: 3.10\n- plone-version: 5.2\n - python-version: 3.9\n plone-version: 6.1\n- - python-version: 3.9\n- plone-version: 5.2\n- - python-version: 3.8\n- plone-version: 6.1\n- - python-version: 3.8\n- plone-version: 6.0\n steps:\n # git checkout\n - uses: actions/checkout@v2\n \n # python setup\n - name: Set up Python ${{ matrix.python-version }}\n- uses: actions/setup-python@v4\n+ uses: actions/setup-python@v5\n with:\n python-version: ${{ matrix.python-version }}\n cache: "pip"\n-\n- # python cache\n- - uses: actions/cache@v1\n- with:\n- path: ~/.cache/pip\n- key: ${{ runner.os }}-pip-${{ hashFiles(\'**/requirements.txt\') }}\n- restore-keys: |\n- ${{ runner.os }}-pip-\n+ cache-dependency-path: "**/requirements.txt"\n \n # python install\n- - run: pip install virtualenv\n- - run: pip install wheel\n - name: pip install\n run: pip install -r requirements-${{ matrix.plone-version }}.txt\n \ndiff --git a/Makefile b/Makefile\nindex e1eb2a8..4a77f7b 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -32,29 +32,6 @@ bin/buildout: bin/pip\n bin/python bin/pip:\n \tpython$(version) -m venv . || virtualenv --python=python$(version) .\n \n-py2:\n-\tvirtualenv --python=python2 .\n-\tbin/pip install --upgrade pip\n-\tbin/pip install -r requirements.txt\n-\n-.PHONY: Build Plone 5.2 with Python 2\n-build-plone-5.2-py: py2 ## Build Plone 5.2 with Python 2\n-\tbin/pip install --upgrade pip\n-\tbin/pip install -r requirements.txt\n-\tbin/buildout -c plone-5.2.x.cfg\n-\n-.PHONY: Build Plone 5.2\n-build-plone-5.2: .installed.cfg ## Build Plone 5.2\n-\tbin/pip install --upgrade pip\n-\tbin/pip install -r requirements.txt\n-\tbin/buildout -c plone-5.2.x.cfg\n-\n-.PHONY: Build Plone 5.2 Performance\n-build-plone-5.2-performance: .installed.cfg ## Build Plone 5.2\n-\tbin/pip install --upgrade pip\n-\tbin/pip install -r requirements.txt\n-\tbin/buildout -c plone-5.2.x-performance.cfg\n-\n build-plone-6.0: ## Build Plone 6.0\n \tpython$(version) -m venv .\n \tbin/pip install --upgrade pip\ndiff --git a/README.rst b/README.rst\nindex 3a2cf0f..021f77a 100644\n--- a/README.rst\n+++ b/README.rst\n@@ -315,6 +315,8 @@ and then running "bin/buildout"\n Plone/Python Support\n --------------------\n \n+plone.rest 5.x.x supports Plone 6.x on Python 3.9 and newer.\n+\n plone.rest 4.x.x supports Plone 5.2 and 6.x on Python 3.8 and newer.\n \n plone.rest 3.x.x supports Plone 5.2 on Python 2.7 and 3.6 to 3.8 and Plone 6.0 on Python 3.8 to 3.11.\ndiff --git a/news/178.internal b/news/178.internal\nindex 634cb72..f175d57 100644\n--- a/news/178.internal\n+++ b/news/178.internal\n@@ -1 +1 @@\n-Update Plone to 6.0.9 and 5.2.14 in buildout. Also removes buildout of unsupported Plone versions. @wesleybl\n+Update Plone to 6.0.14 and 6.1.0b2 for testing. Also removes buildout of unsupported Plone versions. @wesleybl, @davisagli\ndiff --git a/news/4090.breaking b/news/4090.breaking\nnew file mode 100644\nindex 0000000..2c1f03a\n--- /dev/null\n+++ b/news/4090.breaking\n@@ -0,0 +1 @@\n+Drop support for Plone 5.2 and Python 3.8. @davisagli\ndiff --git a/plone-5.2.x.cfg b/plone-5.2.x.cfg\ndeleted file mode 100644\nindex dbc7af7..0000000\n--- a/plone-5.2.x.cfg\n+++ /dev/null\n@@ -1,4 +0,0 @@\n-[buildout]\n-extends =\n- https://dist.plone.org/release/5.2.14/versions.cfg\n- base.cfg\ndiff --git a/plone-6.1.x.cfg b/plone-6.1.x.cfg\nindex a37de09..3728066 100644\n--- a/plone-6.1.x.cfg\n+++ b/plone-6.1.x.cfg\n@@ -1,4 +1,4 @@\n [buildout]\n extends =\n- https://dist.plone.org/release/6.1.0b1/versions.cfg\n+ https://dist.plone.org/release/6.1.0b2/versions.cfg\n base.cfg\ndiff --git a/requirements-5.2.txt b/requirements-5.2.txt\ndeleted file mode 100644\nindex 37660fa..0000000\n--- a/requirements-5.2.txt\n+++ /dev/null\n@@ -1 +0,0 @@\n--r https://dist.plone.org/release/5.2.14/requirements.txt\ndiff --git a/requirements-6.1.txt b/requirements-6.1.txt\nindex d088e28..1abfefe 100644\n--- a/requirements-6.1.txt\n+++ b/requirements-6.1.txt\n@@ -1 +1 @@\n--r https://dist.plone.org/release/6.1.0b1/requirements.txt\n+-r https://dist.plone.org/release/6.1.0b2/requirements.txt\ndiff --git a/requirements.txt b/requirements.txt\nindex 9471139..ea41d45 100644\n--- a/requirements.txt\n+++ b/requirements.txt\n@@ -1 +1 @@\n--r requirements-6.0.txt\n+-r requirements-6.1.txt\ndiff --git a/setup.py b/setup.py\nindex a6c4ceb..2a6118f 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -8,7 +8,7 @@ def read(*rnames):\n return open(os.path.join(os.path.dirname(__file__), *rnames)).read()\n \n \n-version = "4.1.4.dev0"\n+version = "5.0.0.dev0"\n \n long_description = read("README.rst") + "\\n\\n" + read("CHANGES.rst") + "\\n\\n"\n \n@@ -24,17 +24,14 @@ def read(*rnames):\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 "Framework :: Plone :: Core",\n "Framework :: Zope2",\n- "Framework :: Zope :: 4",\n "Framework :: Zope :: 5",\n "License :: OSI Approved :: GNU General Public License (GPL)",\n "Operating System :: OS Independent",\n "Programming Language :: Python",\n- "Programming Language :: Python :: 3.8",\n "Programming Language :: Python :: 3.9",\n "Programming Language :: Python :: 3.10",\n "Programming Language :: Python :: 3.11",\ndiff --git a/src/plone/rest/bbb.py b/src/plone/rest/bbb.py\ndeleted file mode 100644\nindex 80d4a51..0000000\n--- a/src/plone/rest/bbb.py\n+++ /dev/null\n@@ -1,6 +0,0 @@\n-try:\n- from plone.base.interfaces import INavigationRoot # noqa\n- from plone.base.interfaces import IPloneSiteRoot # noqa\n-except ImportError:\n- from plone.app.layout.navigation.interfaces import INavigationRoot # noqa\n- from Products.CMFPlone.interfaces import IPloneSiteRoot # noqa\ndiff --git a/src/plone/rest/patches.py b/src/plone/rest/patches.py\nindex 8f4cb5d..e61bbdd 100644\n--- a/src/plone/rest/patches.py\n+++ b/src/plone/rest/patches.py\n@@ -12,30 +12,3 @@ def __before_publishing_traverse__(self, arg1, arg2=None):\n return\n \n return self._old___before_publishing_traverse__(arg1, arg2)\n-\n-\n-PERMANENT_REDIRECT = {308: "Permanent Redirect"}\n-\n-\n-def patch_zpublisher_status_codes(scope, unused_original, unused_replacement):\n- """Add \'308 Permanent Redirect\' to the list of status codes the ZPublisher\n- knows about. Otherwise setStatus() will turn it into a 500.\n-\n- This is needed for up to and including Plone 5.1.\n- """\n- status_reasons = getattr(scope, "status_reasons", {})\n- if 308 in status_reasons:\n- # Already present in zExceptions >= 3.2 / Zope >= 4.0a1 / Plone 5.2\n- return\n-\n- # Patch the forward mapping (code -> reason)\n- status_reasons.update(PERMANENT_REDIRECT)\n-\n- # Update the reverse mapping\n- status_codes = getattr(scope, "status_codes", {})\n- key, val = PERMANENT_REDIRECT.items()[0]\n-\n- status_codes["".join(val.split(" ")).lower()] = key\n- status_codes[val.lower()] = key\n- status_codes[key] = key\n- status_codes[str(key)] = key\ndiff --git a/src/plone/rest/patches.zcml b/src/plone/rest/patches.zcml\nindex a26791d..2b90ff8 100644\n--- a/src/plone/rest/patches.zcml\n+++ b/src/plone/rest/patches.zcml\n@@ -14,14 +14,4 @@\n preserveOriginal="true"\n />\n \n- \n-\n \ndiff --git a/src/plone/rest/testing.zcml b/src/plone/rest/testing.zcml\nindex 0869e99..c3f0295 100644\n--- a/src/plone/rest/testing.zcml\n+++ b/src/plone/rest/testing.zcml\n@@ -54,42 +54,42 @@\n \n \n \n \n \n \n \n \n \n \n \n \ndiff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py\nindex a8d10f2..a7be671 100644\n--- a/src/plone/rest/tests/test_traversal.py\n+++ b/src/plone/rest/tests/test_traversal.py\n@@ -3,7 +3,7 @@\n from plone.app.testing import SITE_OWNER_NAME\n from plone.app.testing import SITE_OWNER_PASSWORD\n from plone.app.testing import TEST_USER_ID\n-from plone.rest.bbb import INavigationRoot\n+from plone.base.interfaces import INavigationRoot\n from plone.rest.service import Service\n from plone.rest.testing import PLONE_REST_INTEGRATION_TESTING\n from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster\ndiff --git a/tox.ini b/tox.ini\nindex c30d780..081d87a 100644\n--- a/tox.ini\n+++ b/tox.ini\n@@ -100,7 +100,7 @@ set_env =\n ##\n deps =\n zope.testrunner\n- -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ -c https://dist.plone.org/release/6.1-dev/constraints.txt\n \n ##\n # Specify additional deps in .meta.toml:\n@@ -143,7 +143,7 @@ set_env =\n deps =\n coverage\n zope.testrunner\n- -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ -c https://dist.plone.org/release/6.1-dev/constraints.txt\n \n commands =\n coverage run --branch --source plone.rest {envbindir}/zope-testrunner --quiet --all --test-path={toxinidir}/src -s plone.rest {posargs}\n@@ -160,7 +160,7 @@ deps =\n twine\n build\n towncrier\n- -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ -c https://dist.plone.org/release/6.1-dev/constraints.txt\n \n commands =\n # fake version to not have to install the package\n@@ -188,7 +188,7 @@ allowlist_externals =\n deps =\n pipdeptree\n pipforester\n- -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ -c https://dist.plone.org/release/6.1-dev/constraints.txt\n \n commands =\n # Generate the full dependency tree\n' + +Repository: plone.rest Branch: refs/heads/main -Date: 2025-01-22T16:12:39-03:00 -Author: Érico Andrei (ericof) -Commit: https://github.com/plone/plone.volto/commit/2cf8db0804f6edabbe430fbcc4620cd075f446e4 +Date: 2025-01-24T11:14:46-08:00 +Author: David Glick (davisagli) +Commit: https://github.com/plone/plone.rest/commit/3a0142c8618681af6a2c21e43f678333eea8af39 -Merge branch 'main' into issue-178-robots_txt +fix CI Files changed: -A news/4090.bugfix -M src/plone/volto/behaviors/preview_link.py -M src/plone/volto/browser/breadcrumbs.py -M src/plone/volto/browser/navigation.py -M src/plone/volto/coresandbox/example.py -M src/plone/volto/testing.py +M .pre-commit-config.yaml +M setup.py -b'diff --git a/news/4090.bugfix b/news/4090.bugfix\nnew file mode 100644\nindex 0000000..8528aef\n--- /dev/null\n+++ b/news/4090.bugfix\n@@ -0,0 +1 @@\n+Fix DeprecationWarnings. [maurits]\ndiff --git a/src/plone/volto/behaviors/preview_link.py b/src/plone/volto/behaviors/preview_link.py\nindex 060d03f..d207c13 100644\n--- a/src/plone/volto/behaviors/preview_link.py\n+++ b/src/plone/volto/behaviors/preview_link.py\n@@ -1,5 +1,5 @@\n from plone import api\n-from plone.app.z3cform.widget import RelatedItemsFieldWidget\n+from plone.app.z3cform.widgets.relateditems import RelatedItemsFieldWidget\n from plone.autoform import directives\n from plone.autoform.interfaces import IFormFieldProvider\n from plone.base.interfaces import IImageScalesFieldAdapter\ndiff --git a/src/plone/volto/browser/breadcrumbs.py b/src/plone/volto/browser/breadcrumbs.py\nindex 9799865..690b5a7 100644\n--- a/src/plone/volto/browser/breadcrumbs.py\n+++ b/src/plone/volto/browser/breadcrumbs.py\n@@ -1,10 +1,10 @@\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 plone.base.defaultpage import check_default_page_via_view\n from plone.base.interfaces import IHideFromBreadcrumbs\n+from plone.base.interfaces import INavigationRoot\n+from plone.base.navigationroot import get_navigation_root\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@@ -42,7 +42,7 @@ def breadcrumbs(self):\n if IHideFromBreadcrumbs.providedBy(context):\n return base\n \n- rootPath = getNavigationRoot(context)\n+ rootPath = get_navigation_root(context)\n itemPath = "/".join(context.getPhysicalPath())\n \n # don\'t show default pages in breadcrumbs or pages above the navigation\ndiff --git a/src/plone/volto/browser/navigation.py b/src/plone/volto/browser/navigation.py\nindex 66941a8..a0c6bf8 100644\n--- a/src/plone/volto/browser/navigation.py\n+++ b/src/plone/volto/browser/navigation.py\n@@ -1,8 +1,8 @@\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.base.navigationroot import get_navigation_root\n from plone.registry.interfaces import IRegistry\n from Products.CMFCore.utils import getToolByName\n from Products.CMFPlone.browser.interfaces import INavigationTabs\n@@ -28,7 +28,7 @@ def _getNavQuery(self):\n else:\n query = {}\n \n- query["path"] = {"query": getNavigationRoot(self.context), "depth": 1}\n+ query["path"] = {"query": get_navigation_root(self.context), "depth": 1}\n query["portal_type"] = [t for t in navigation_settings.displayed_types]\n query["sort_on"] = navigation_settings.sort_tabs_on\n if navigation_settings.sort_tabs_reversed:\ndiff --git a/src/plone/volto/coresandbox/example.py b/src/plone/volto/coresandbox/example.py\nindex 535ac7e..675b00f 100644\n--- a/src/plone/volto/coresandbox/example.py\n+++ b/src/plone/volto/coresandbox/example.py\n@@ -1,9 +1,9 @@\n from plone.app.textfield import RichText\n from plone.app.vocabularies.catalog import CatalogSource\n from plone.app.vocabularies.catalog import StaticCatalogVocabulary\n-from plone.app.z3cform.widget import AjaxSelectFieldWidget\n-from plone.app.z3cform.widget import RelatedItemsFieldWidget\n-from plone.app.z3cform.widget import SelectFieldWidget\n+from plone.app.z3cform.widgets.relateditems import RelatedItemsFieldWidget\n+from plone.app.z3cform.widgets.select import AjaxSelectFieldWidget\n+from plone.app.z3cform.widgets.select import Select2FieldWidget\n from plone.autoform import directives\n from plone.dexterity.content import Container\n from plone.namedfile.field import NamedBlobFile\n@@ -183,7 +183,7 @@ class IExample(model.Schema):\n required=False,\n )\n \n- directives.widget(choice_field_select=SelectFieldWidget)\n+ directives.widget(choice_field_select=Select2FieldWidget)\n choice_field_select = schema.Choice(\n title="Choicefield with select2 widget",\n description="zope.schema.Choice",\n@@ -214,7 +214,7 @@ class IExample(model.Schema):\n default=[],\n )\n \n- directives.widget(list_field_select=SelectFieldWidget)\n+ directives.widget(list_field_select=Select2FieldWidget)\n list_field_select = schema.List(\n title="List field with select widget",\n description="zope.schema.List",\n@@ -437,7 +437,7 @@ class IExample(model.Schema):\n )\n directives.widget(\n "relationchoice_field_select",\n- SelectFieldWidget,\n+ Select2FieldWidget,\n )\n \n relationchoice_field_radio = RelationChoice(\n@@ -465,7 +465,7 @@ class IExample(model.Schema):\n )\n directives.widget(\n "relationlist_field_select",\n- SelectFieldWidget,\n+ Select2FieldWidget,\n pattern_options={\n "closeOnSelect": False, # Select2 option to leave dropdown open for multiple selection\n },\n@@ -620,7 +620,7 @@ class IExample(model.Schema):\n )\n directives.widget(\n "uuid_choice_field_select",\n- SelectFieldWidget,\n+ Select2FieldWidget,\n )\n \n uuid_choice_field_radio = schema.Choice(\n@@ -648,7 +648,7 @@ class IExample(model.Schema):\n )\n directives.widget(\n "uuid_list_field_select",\n- SelectFieldWidget,\n+ Select2FieldWidget,\n pattern_options={\n "closeOnSelect": False, # Select2 option to leave dropdown open for multiple selection\n },\ndiff --git a/src/plone/volto/testing.py b/src/plone/volto/testing.py\nindex d5f4304..2fb6677 100644\n--- a/src/plone/volto/testing.py\n+++ b/src/plone/volto/testing.py\n@@ -7,7 +7,7 @@\n from plone.app.testing import setRoles\n from plone.app.testing import TEST_USER_ID\n from plone.distribution.testing.layer import PloneDistributionFixture\n-from plone.testing import z2\n+from plone.testing import zope\n \n import plone.app.caching # noQA\n import plone.app.discussion # noQA\n@@ -62,13 +62,17 @@ class PloneVoltoCoreLayer(PloneSandboxLayer):\n \n \n PLONE_VOLTO_CORE_FUNCTIONAL_TESTING = FunctionalTesting(\n- bases=(PLONE_VOLTO_CORE_FIXTURE, z2.ZSERVER_FIXTURE),\n+ bases=(PLONE_VOLTO_CORE_FIXTURE, zope.WSGI_SERVER_FIXTURE),\n name="PloneVoltoCoreLayer:FunctionalTesting",\n )\n \n \n PLONE_VOLTO_CORE_ACCEPTANCE_TESTING = FunctionalTesting(\n- bases=(PLONE_VOLTO_CORE_FIXTURE, REMOTE_LIBRARY_BUNDLE_FIXTURE, z2.ZSERVER_FIXTURE),\n+ bases=(\n+ PLONE_VOLTO_CORE_FIXTURE,\n+ REMOTE_LIBRARY_BUNDLE_FIXTURE,\n+ zope.WSGI_SERVER_FIXTURE,\n+ ),\n name="PloneVoltoCoreLayer:AcceptanceTesting",\n )\n \n@@ -108,7 +112,7 @@ def setUpPloneSite(self, portal):\n \n \n PLONE_VOLTO_CORESANDBOX_FUNCTIONAL_TESTING = FunctionalTesting(\n- bases=(PLONE_VOLTO_CORESANDBOX_FIXTURE, z2.ZSERVER_FIXTURE),\n+ bases=(PLONE_VOLTO_CORESANDBOX_FIXTURE, zope.WSGI_SERVER_FIXTURE),\n name="PloneVoltoCoreSandboxLayer:FunctionalTesting",\n )\n \n@@ -117,7 +121,7 @@ def setUpPloneSite(self, portal):\n bases=(\n PLONE_VOLTO_CORESANDBOX_FIXTURE,\n REMOTE_LIBRARY_BUNDLE_FIXTURE,\n- z2.ZSERVER_FIXTURE,\n+ zope.WSGI_SERVER_FIXTURE,\n ),\n name="PloneVoltoCoreSandboxLayer:AcceptanceTesting",\n )\n@@ -144,6 +148,6 @@ def setUpPloneSite(self, portal):\n \n \n PLONE_VOLTO_MIGRATION_FUNCTIONAL_TESTING = FunctionalTesting(\n- bases=(PLONE_VOLTO_MIGRATION_FIXTURE, z2.ZSERVER_FIXTURE),\n+ bases=(PLONE_VOLTO_MIGRATION_FIXTURE, zope.WSGI_SERVER_FIXTURE),\n name="PloneVoltoMigrationLayer:FunctionalTesting",\n )\n' +b'diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml\nindex d63a1c8..7be8a0b 100644\n--- a/.pre-commit-config.yaml\n+++ b/.pre-commit-config.yaml\n@@ -66,7 +66,7 @@ repos:\n hooks:\n - id: pyroma\n - repo: https://github.com/mgedmin/check-python-versions\n- rev: "0.22.0"\n+ rev: "0.22.1"\n hooks:\n - id: check-python-versions\n args: [\'--only\', \'setup.py,pyproject.toml\']\ndiff --git a/setup.py b/setup.py\nindex 2a6118f..ce4735e 100644\n--- a/setup.py\n+++ b/setup.py\n@@ -32,6 +32,7 @@ def read(*rnames):\n "License :: OSI Approved :: GNU General Public License (GPL)",\n "Operating System :: OS Independent",\n "Programming Language :: Python",\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' -Repository: plone.volto +Repository: plone.rest Branch: refs/heads/main -Date: 2025-01-23T14:27:50-08:00 +Date: 2025-01-24T11:48:12-08:00 Author: David Glick (davisagli) -Commit: https://github.com/plone/plone.volto/commit/74788eddf83b57f6260225c37f372c672995b458 +Commit: https://github.com/plone/plone.rest/commit/6f4b6cf4912750bd3cde8ca2d04f2e6885712459 -Merge pull request #183 from plone/issue-178-robots_txt +Merge pull request #184 from plone/maurits-warnings -Implement a specific robots.txt for Volto sites +Fix DeprecationWarnings. Files changed: -A news/178.bugfix -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.IImagingSchema.xml -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISearchSchema.xml -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml -A src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ITypesSchema.xml -A src/plone/volto/profiles/default/registry/plone.volto.interfaces.IVoltoSettings.xml -A src/plone/volto/profiles/default/registry/registry.xml -M src/plone/volto/profiles/default/metadata.xml -M src/plone/volto/upgrades.py -M src/plone/volto/upgrades.zcml -M tests/setup/test_setup_install.py -D src/plone/volto/profiles/default/registry.xml - -b'diff --git a/news/178.bugfix b/news/178.bugfix\nnew file mode 100644\nindex 0000000..0df4fbd\n--- /dev/null\n+++ b/news/178.bugfix\n@@ -0,0 +1,3 @@\n+Implement a specific robots.txt for Volto sites.\n+There is an upgrade step which will update the existing plone.robots_txt registry setting unless it has been customized.\n+@ericof\ndiff --git a/src/plone/volto/profiles/default/metadata.xml b/src/plone/volto/profiles/default/metadata.xml\nindex d08f418..b4653f2 100644\n--- a/src/plone/volto/profiles/default/metadata.xml\n+++ b/src/plone/volto/profiles/default/metadata.xml\n@@ -1,6 +1,6 @@\n \n \n- 1018\n+ 1019\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\ndeleted file mode 100644\nindex 1a97e36..0000000\n--- a/src/plone/volto/profiles/default/registry.xml\n+++ /dev/null\n@@ -1,60 +0,0 @@\n-\n-\n- \n- \n- False\n- \n-\n- \n-\n-\n- \n- \n- \n-\n- \n- \n- \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- \n-\n- \n- \n- Plone Icon Volto Control Panel\n- \n- ++plone++plone.volto/volto.svg\n- \n-\n- \n- \n- \n-\n-\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.IImagingSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.IImagingSchema.xml\nnew file mode 100644\nindex 0000000..4d487bb\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.IImagingSchema.xml\n@@ -0,0 +1,24 @@\n+\n+\n+\n+ \n+ \n+ \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+ \n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml\nnew file mode 100644\nindex 0000000..c4f997d\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml\n@@ -0,0 +1,11 @@\n+\n+\n+\n+ \n+ False\n+ \n+\n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISearchSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISearchSchema.xml\nnew file mode 100644\nindex 0000000..d66c885\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISearchSchema.xml\n@@ -0,0 +1,12 @@\n+\n+\n+\n+ \n+ \n+ \n+\n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml\nnew file mode 100644\nindex 0000000..f643ef6\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ISiteSchema.xml\n@@ -0,0 +1,28 @@\n+\n+\n+ \n+ Sitemap: {portal_url}/sitemap-index.xml\n+\n+# Define access-restrictions for robots/spiders\n+# http://www.robotstxt.org/wc/norobots.html\n+\n+User-agent: *\n+Disallow: /search\n+Disallow: /login\n+\n+# Add Googlebot-specific syntax extension to exclude forms\n+# that are repeated for each piece of content in the site\n+# the wildcard is only supported by Googlebot\n+# http://www.google.com/support/webmasters/bin/answer.py?answer=40367&ctx=sibling\n+\n+User-Agent: Googlebot\n+Disallow: /*login\n+Disallow: /*search\n+Disallow: /*edit\n+\n+ \n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ITypesSchema.xml b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ITypesSchema.xml\nnew file mode 100644\nindex 0000000..a4fb108\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.base.interfaces.controlpanel.ITypesSchema.xml\n@@ -0,0 +1,10 @@\n+\n+\n+ \n+ \n+ \n+\ndiff --git a/src/plone/volto/profiles/default/registry/plone.volto.interfaces.IVoltoSettings.xml b/src/plone/volto/profiles/default/registry/plone.volto.interfaces.IVoltoSettings.xml\nnew file mode 100644\nindex 0000000..ae44de1\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/plone.volto.interfaces.IVoltoSettings.xml\n@@ -0,0 +1,8 @@\n+\n+\n+\n+ \n+\n+\ndiff --git a/src/plone/volto/profiles/default/registry/registry.xml b/src/plone/volto/profiles/default/registry/registry.xml\nnew file mode 100644\nindex 0000000..d2d96e0\n--- /dev/null\n+++ b/src/plone/volto/profiles/default/registry/registry.xml\n@@ -0,0 +1,11 @@\n+\n+\n+\n+ \n+ \n+ Plone Icon Volto Control Panel\n+ \n+ ++plone++plone.volto/volto.svg\n+ \n+\n+\ndiff --git a/src/plone/volto/upgrades.py b/src/plone/volto/upgrades.py\nindex 703a18c..bdf4d78 100644\n--- a/src/plone/volto/upgrades.py\n+++ b/src/plone/volto/upgrades.py\n@@ -156,3 +156,37 @@ def rename_distribution(context):\n report.name = "volto"\n if report.answers.get("distribution") == "default":\n report.answers["distribution"] = "volto"\n+\n+\n+ROBOTS_TXT = """Sitemap: {portal_url}/sitemap-index.xml\n+\n+# Define access-restrictions for robots/spiders\n+# http://www.robotstxt.org/wc/norobots.html\n+\n+User-agent: *\n+Disallow: /search\n+Disallow: /login\n+\n+# Add Googlebot-specific syntax extension to exclude forms\n+# that are repeated for each piece of content in the site\n+# the wildcard is only supported by Googlebot\n+# http://www.google.com/support/webmasters/bin/answer.py?answer=40367&ctx=sibling\n+\n+User-Agent: Googlebot\n+Disallow: /*login\n+Disallow: /*search\n+Disallow: /*edit\n+"""\n+\n+\n+def update_robots_txt(context):\n+ from plone.base.interfaces.controlpanel import ROBOTS_TXT as CLASSIC_ROBOTS\n+\n+ current_value = api.portal.get_registry_record("plone.robots_txt")\n+ if current_value == CLASSIC_ROBOTS:\n+ api.portal.set_registry_record("plone.robots_txt", ROBOTS_TXT)\n+ logger.info("Updated plone.robots_txt registry with sane value.")\n+ else:\n+ logger.info(\n+ "Ignoring plone.robots_txt registry as it was modified in this portal."\n+ )\ndiff --git a/src/plone/volto/upgrades.zcml b/src/plone/volto/upgrades.zcml\nindex b5da40c..b030682 100644\n--- a/src/plone/volto/upgrades.zcml\n+++ b/src/plone/volto/upgrades.zcml\n@@ -86,4 +86,14 @@\n />\n \n \n+ \n+ \n+ \n \ndiff --git a/tests/setup/test_setup_install.py b/tests/setup/test_setup_install.py\nindex b2ac0bf..ee7c05a 100644\n--- a/tests/setup/test_setup_install.py\n+++ b/tests/setup/test_setup_install.py\n@@ -16,7 +16,7 @@ def test_browserlayer(self, 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+ assert profile_last_version(f"{PACKAGE_NAME}:default") == "1019"\n \n @pytest.mark.parametrize(\n "portal_type,behavior",\n' +A news/4090.breaking +A news/4090.bugfix +A plone-6.1.x.cfg +A requirements-6.1.txt +M .github/workflows/tests.yml +M .meta.toml +M .pre-commit-config.yaml +M Makefile +M README.rst +M news/178.internal +M plone-6.0.x.cfg +M pyproject.toml +M requirements-6.0.txt +M requirements.txt +M setup.py +M src/plone/rest/patches.py +M src/plone/rest/patches.zcml +M src/plone/rest/testing.py +M src/plone/rest/testing.zcml +M src/plone/rest/tests/test_traversal.py +M tox.ini +D plone-5.2.x.cfg +D requirements-5.2.txt + +b'diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml\nindex 8622555..c703bce 100644\n--- a/.github/workflows/tests.yml\n+++ b/.github/workflows/tests.yml\n@@ -6,39 +6,24 @@ jobs:\n strategy:\n fail-fast: false\n matrix:\n- python-version: ["3.12", "3.11", "3.10", "3.9", "3.8"]\n- plone-version: ["6.0", "5.2"]\n+ python-version: ["3.13", "3.12", "3.11", "3.10", "3.9"]\n+ plone-version: ["6.1", "6.0"]\n exclude:\n- - python-version: 3.12\n- plone-version: 5.2\n- - python-version: 3.11\n- plone-version: 5.2\n- - python-version: 3.10\n- plone-version: 5.2\n - python-version: 3.9\n- plone-version: 5.2\n+ plone-version: 6.1\n steps:\n # git checkout\n - uses: actions/checkout@v2\n \n # python setup\n - name: Set up Python ${{ matrix.python-version }}\n- uses: actions/setup-python@v4\n+ uses: actions/setup-python@v5\n with:\n python-version: ${{ matrix.python-version }}\n cache: "pip"\n-\n- # python cache\n- - uses: actions/cache@v1\n- with:\n- path: ~/.cache/pip\n- key: ${{ runner.os }}-pip-${{ hashFiles(\'**/requirements.txt\') }}\n- restore-keys: |\n- ${{ runner.os }}-pip-\n+ cache-dependency-path: "**/requirements.txt"\n \n # python install\n- - run: pip install virtualenv\n- - run: pip install wheel\n - name: pip install\n run: pip install -r requirements-${{ matrix.plone-version }}.txt\n \ndiff --git a/.meta.toml b/.meta.toml\nindex 2ca393b..d870133 100644\n--- a/.meta.toml\n+++ b/.meta.toml\n@@ -14,4 +14,4 @@ jobs = [\n ]\n \n [pyproject]\n-dependencies_ignores = "[\'plone.app.redirector\']"\n+dependencies_ignores = "[\'plone.app.layout\', \'plone.app.redirector\', \'plone.base\', \'Products.CMFPlone\']"\ndiff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml\nindex d63a1c8..7be8a0b 100644\n--- a/.pre-commit-config.yaml\n+++ b/.pre-commit-config.yaml\n@@ -66,7 +66,7 @@ repos:\n hooks:\n - id: pyroma\n - repo: https://github.com/mgedmin/check-python-versions\n- rev: "0.22.0"\n+ rev: "0.22.1"\n hooks:\n - id: check-python-versions\n args: [\'--only\', \'setup.py,pyproject.toml\']\ndiff --git a/Makefile b/Makefile\nindex e1eb2a8..4a77f7b 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -32,29 +32,6 @@ bin/buildout: bin/pip\n bin/python bin/pip:\n \tpython$(version) -m venv . || virtualenv --python=python$(version) .\n \n-py2:\n-\tvirtualenv --python=python2 .\n-\tbin/pip install --upgrade pip\n-\tbin/pip install -r requirements.txt\n-\n-.PHONY: Build Plone 5.2 with Python 2\n-build-plone-5.2-py: py2 ## Build Plone 5.2 with Python 2\n-\tbin/pip install --upgrade pip\n-\tbin/pip install -r requirements.txt\n-\tbin/buildout -c plone-5.2.x.cfg\n-\n-.PHONY: Build Plone 5.2\n-build-plone-5.2: .installed.cfg ## Build Plone 5.2\n-\tbin/pip install --upgrade pip\n-\tbin/pip install -r requirements.txt\n-\tbin/buildout -c plone-5.2.x.cfg\n-\n-.PHONY: Build Plone 5.2 Performance\n-build-plone-5.2-performance: .installed.cfg ## Build Plone 5.2\n-\tbin/pip install --upgrade pip\n-\tbin/pip install -r requirements.txt\n-\tbin/buildout -c plone-5.2.x-performance.cfg\n-\n build-plone-6.0: ## Build Plone 6.0\n \tpython$(version) -m venv .\n \tbin/pip install --upgrade pip\ndiff --git a/README.rst b/README.rst\nindex f6923eb..021f77a 100644\n--- a/README.rst\n+++ b/README.rst\n@@ -180,7 +180,7 @@ Named services can be registered by providing a \'name\' attribute in the service\n = 3.2 / Zope >= 4.0a1 / Plone 5.2\n- return\n-\n- # Patch the forward mapping (code -> reason)\n- status_reasons.update(PERMANENT_REDIRECT)\n-\n- # Update the reverse mapping\n- status_codes = getattr(scope, "status_codes", {})\n- key, val = PERMANENT_REDIRECT.items()[0]\n-\n- status_codes["".join(val.split(" ")).lower()] = key\n- status_codes[val.lower()] = key\n- status_codes[key] = key\n- status_codes[str(key)] = key\ndiff --git a/src/plone/rest/patches.zcml b/src/plone/rest/patches.zcml\nindex a26791d..2b90ff8 100644\n--- a/src/plone/rest/patches.zcml\n+++ b/src/plone/rest/patches.zcml\n@@ -14,14 +14,4 @@\n preserveOriginal="true"\n />\n \n- \n-\n \ndiff --git a/src/plone/rest/testing.py b/src/plone/rest/testing.py\nindex bcd4eeb..95e4d12 100644\n--- a/src/plone/rest/testing.py\n+++ b/src/plone/rest/testing.py\n@@ -3,7 +3,7 @@\n from plone.app.testing import IntegrationTesting\n from plone.app.testing import PloneSandboxLayer\n from plone.rest.service import Service\n-from plone.testing import z2\n+from plone.testing import zope\n from zope.configuration import xmlconfig\n \n \n@@ -22,7 +22,8 @@ def setUpZope(self, app, configurationContext):\n bases=(PLONE_REST_FIXTURE,), name="PloneRestLayer:Integration"\n )\n PLONE_REST_FUNCTIONAL_TESTING = FunctionalTesting(\n- bases=(PLONE_REST_FIXTURE, z2.ZSERVER_FIXTURE), name="PloneRestLayer:Functional"\n+ bases=(PLONE_REST_FIXTURE, zope.WSGI_SERVER_FIXTURE),\n+ name="PloneRestLayer:Functional",\n )\n \n \ndiff --git a/src/plone/rest/testing.zcml b/src/plone/rest/testing.zcml\nindex 2033039..c3f0295 100644\n--- a/src/plone/rest/testing.zcml\n+++ b/src/plone/rest/testing.zcml\n@@ -54,42 +54,42 @@\n \n \n \n \n \n \n \n \n \n \n \n \ndiff --git a/src/plone/rest/tests/test_traversal.py b/src/plone/rest/tests/test_traversal.py\nindex 43ee632..a7be671 100644\n--- a/src/plone/rest/tests/test_traversal.py\n+++ b/src/plone/rest/tests/test_traversal.py\n@@ -1,9 +1,9 @@\n from base64 import b64encode\n-from plone.app.layout.navigation.interfaces import INavigationRoot\n from plone.app.testing import setRoles\n from plone.app.testing import SITE_OWNER_NAME\n from plone.app.testing import SITE_OWNER_PASSWORD\n from plone.app.testing import TEST_USER_ID\n+from plone.base.interfaces import INavigationRoot\n from plone.rest.service import Service\n from plone.rest.testing import PLONE_REST_INTEGRATION_TESTING\n from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster\ndiff --git a/tox.ini b/tox.ini\nindex c30d780..081d87a 100644\n--- a/tox.ini\n+++ b/tox.ini\n@@ -100,7 +100,7 @@ set_env =\n ##\n deps =\n zope.testrunner\n- -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ -c https://dist.plone.org/release/6.1-dev/constraints.txt\n \n ##\n # Specify additional deps in .meta.toml:\n@@ -143,7 +143,7 @@ set_env =\n deps =\n coverage\n zope.testrunner\n- -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ -c https://dist.plone.org/release/6.1-dev/constraints.txt\n \n commands =\n coverage run --branch --source plone.rest {envbindir}/zope-testrunner --quiet --all --test-path={toxinidir}/src -s plone.rest {posargs}\n@@ -160,7 +160,7 @@ deps =\n twine\n build\n towncrier\n- -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ -c https://dist.plone.org/release/6.1-dev/constraints.txt\n \n commands =\n # fake version to not have to install the package\n@@ -188,7 +188,7 @@ allowlist_externals =\n deps =\n pipdeptree\n pipforester\n- -c https://dist.plone.org/release/6.0-dev/constraints.txt\n+ -c https://dist.plone.org/release/6.1-dev/constraints.txt\n \n commands =\n # Generate the full dependency tree\n'