From 8de3a5393f2172cb46eef7b3a38ab801b344d8e6 Mon Sep 17 00:00:00 2001 From: Maurits van Rees Date: Thu, 30 Nov 2023 20:23:07 +0100 Subject: [PATCH 01/14] Preparing release 2.0.7 [ci skip] --- CHANGES.rst | 9 +++++++++ news/520.documentation | 1 - setup.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) delete mode 100644 news/520.documentation diff --git a/CHANGES.rst b/CHANGES.rst index dd1b19fc..77d5318a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,6 +8,15 @@ Changelog .. towncrier release notes start +2.0.7 (2023-11-30) +------------------ + +Documentation: + + +- Use the preferred `git switch -c` command. See https://www.infoq.com/news/2019/08/git-2-23-switch-restore/. @stevepiercy (#520) + + 2.0.6 (2023-11-03) ------------------ diff --git a/news/520.documentation b/news/520.documentation deleted file mode 100644 index 5a5d8ca6..00000000 --- a/news/520.documentation +++ /dev/null @@ -1 +0,0 @@ -Use the preferred `git switch -c` command. See https://www.infoq.com/news/2019/08/git-2-23-switch-restore/. @stevepiercy diff --git a/setup.py b/setup.py index 9a797213..3fcbc59f 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ def read(*rnames): read("README.md") + "\n\n" + read("CHANGES.rst") + "\n\n" + read("LICENSE") ) -version = "2.0.7.dev0" +version = "2.0.7" setup( name="plone.api", From 59a577ef8e7072880538eebc51e3af7d3eaf611a Mon Sep 17 00:00:00 2001 From: Maurits van Rees Date: Thu, 30 Nov 2023 20:23:48 +0100 Subject: [PATCH 02/14] Back to development: 2.0.8 [ci skip] --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3fcbc59f..5fdd6f56 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ def read(*rnames): read("README.md") + "\n\n" + read("CHANGES.rst") + "\n\n" + read("LICENSE") ) -version = "2.0.7" +version = "2.0.8.dev0" setup( name="plone.api", From ba7327f412440c23bcbe5c6dc56eea4e581ad225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Tue, 5 Dec 2023 11:51:36 -0300 Subject: [PATCH 03/14] Fix 'api.portal.translate' usage with country-specific language codes (Fixes #524) --- news/524.bugfix | 1 + src/plone/api/portal.py | 4 +++- src/plone/api/tests/test_portal.py | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 news/524.bugfix diff --git a/news/524.bugfix b/news/524.bugfix new file mode 100644 index 00000000..4e116b33 --- /dev/null +++ b/news/524.bugfix @@ -0,0 +1 @@ +Fix `api.portal.translate` usage with country-specific language codes [@ericof] diff --git a/src/plone/api/portal.py b/src/plone/api/portal.py index adef18d9..31c32632 100644 --- a/src/plone/api/portal.py +++ b/src/plone/api/portal.py @@ -19,7 +19,7 @@ from zope.interface.interfaces import IInterface import datetime as dtime - +import re logger = getLogger("plone.api.portal") @@ -419,6 +419,8 @@ def translate(msgid, domain="plone", lang=None): :Example: :ref:`portal-translate-example` """ translation_service = get_tool("translation_service") + if lang and re.match(r"\D{2}-\D{2}", lang): + lang = f"{lang[:2]}_{lang[-2:].upper()}" query = { "msgid": msgid, "domain": domain, diff --git a/src/plone/api/tests/test_portal.py b/src/plone/api/tests/test_portal.py index 83f19886..a467ba1a 100644 --- a/src/plone/api/tests/test_portal.py +++ b/src/plone/api/tests/test_portal.py @@ -886,3 +886,20 @@ def test_translate(self): ), "Avril", ) + + def test_translate_with_country_codes(self): + """Test translation.""" + self.assertEqual( + portal.translate( + "Page", + lang="pt-br", + ), + "Página", + ) + self.assertEqual( + portal.translate( + "Page", + lang="pt_BR", + ), + "Página", + ) From 3feed99ed1599ac64d3bf1212de2a6befe21af5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Andrei?= Date: Tue, 5 Dec 2023 12:41:43 -0300 Subject: [PATCH 04/14] Fix isort --- src/plone/api/portal.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plone/api/portal.py b/src/plone/api/portal.py index 31c32632..1aec4997 100644 --- a/src/plone/api/portal.py +++ b/src/plone/api/portal.py @@ -21,6 +21,7 @@ import datetime as dtime import re + logger = getLogger("plone.api.portal") try: From 4fd1abb863c9e0b2896b942cef44aa6a67534a89 Mon Sep 17 00:00:00 2001 From: Maurits van Rees Date: Thu, 14 Dec 2023 11:06:45 +0100 Subject: [PATCH 05/14] Preparing release 2.0.8 [ci skip] --- CHANGES.rst | 9 +++++++++ news/524.bugfix | 1 - setup.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) delete mode 100644 news/524.bugfix diff --git a/CHANGES.rst b/CHANGES.rst index 77d5318a..655528d1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,6 +8,15 @@ Changelog .. towncrier release notes start +2.0.8 (2023-12-14) +------------------ + +Bug fixes: + + +- Fix `api.portal.translate` usage with country-specific language codes [@ericof] (#524) + + 2.0.7 (2023-11-30) ------------------ diff --git a/news/524.bugfix b/news/524.bugfix deleted file mode 100644 index 4e116b33..00000000 --- a/news/524.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix `api.portal.translate` usage with country-specific language codes [@ericof] diff --git a/setup.py b/setup.py index 5fdd6f56..81d481fd 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ def read(*rnames): read("README.md") + "\n\n" + read("CHANGES.rst") + "\n\n" + read("LICENSE") ) -version = "2.0.8.dev0" +version = "2.0.8" setup( name="plone.api", From 4a4c1c2a7c6d015ae34d2aa18cc5c09269bce565 Mon Sep 17 00:00:00 2001 From: Maurits van Rees Date: Thu, 14 Dec 2023 11:07:03 +0100 Subject: [PATCH 06/14] Back to development: 2.0.9 [ci skip] --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 81d481fd..bd4feb2d 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ def read(*rnames): read("README.md") + "\n\n" + read("CHANGES.rst") + "\n\n" + read("LICENSE") ) -version = "2.0.8" +version = "2.0.9.dev0" setup( name="plone.api", From 4b3ef606eef691497160a7df7966f99749baf058 Mon Sep 17 00:00:00 2001 From: Samriddhi Singh Date: Mon, 29 Jan 2024 23:26:21 +0530 Subject: [PATCH 07/14] Edited api.content.get_view for increased efficiency to get views --- news/479.internal | 1 + src/plone/api/content.py | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 news/479.internal diff --git a/news/479.internal b/news/479.internal new file mode 100644 index 00000000..e5dc5d52 --- /dev/null +++ b/news/479.internal @@ -0,0 +1 @@ +Improved efficiency of view retrieval by deferring availability checks to error handling. @samriddhi99 \ No newline at end of file diff --git a/src/plone/api/content.py b/src/plone/api/content.py index f85790ee..b0b7784d 100644 --- a/src/plone/api/content.py +++ b/src/plone/api/content.py @@ -532,16 +532,21 @@ def get_view(name=None, context=None, request=None): # and get their names. available_view_names = [view[0] for view in available_views] - # Raise an error if the requested view is not available. - if name not in available_view_names: - raise InvalidParameterError( - "Cannot find a view with name '{name}'.\n" - "Available views are:\n" - "{views}".format( - name=name, - views="\n".join(sorted(available_view_names)), - ), - ) + + try: + return getMultiAdapter((context, request), name=name) + except Exception: + # Check if the requested view is available. + if name not in available_view_names: + # Raise an error if the requested view is not available. + raise InvalidParameterError( + "Cannot find a view with name '{name}'.\n" + "Available views are:\n" + "{views}".format( + name=name, + views="\n".join(sorted(available_view_names)), + ), + ) return getMultiAdapter((context, request), name=name) From f89a207f53fab2981a91182394bcae188865e19d Mon Sep 17 00:00:00 2001 From: Samriddhi Singh Date: Thu, 1 Feb 2024 18:41:52 +0530 Subject: [PATCH 08/14] Changes as per https://github.com/plone/plone.api/pull/528#discussion_r1473611142 have been made --- src/plone/api/content.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/plone/api/content.py b/src/plone/api/content.py index b0b7784d..48117f48 100644 --- a/src/plone/api/content.py +++ b/src/plone/api/content.py @@ -523,20 +523,19 @@ def get_view(name=None, context=None, request=None): # available, because the __init__ of said view will contain # errors in client code. - # Get all available views... - sm = getSiteManager() - available_views = sm.adapters.lookupAll( - required=(providedBy(context), providedBy(request)), - provided=Interface, - ) - # and get their names. - available_view_names = [view[0] for view in available_views] - - try: - return getMultiAdapter((context, request), name=name) - except Exception: - # Check if the requested view is available. + adapter = getMultiAdapter((context, request), name=name) + except Exception: + + #Getting all available views + sm = getSiteManager() + available_views = sm.adapters.lookupAll( + required=(providedBy(context), providedBy(request)), + provided=Interface, + ) + + # Check if the requested view is available by getting the names of all available views + available_view_names = [view[0] for view in available_views] if name not in available_view_names: # Raise an error if the requested view is not available. raise InvalidParameterError( @@ -547,8 +546,7 @@ def get_view(name=None, context=None, request=None): views="\n".join(sorted(available_view_names)), ), ) - return getMultiAdapter((context, request), name=name) - + return adapter @required_parameters("obj") def get_uuid(obj=None): From d2715ada9710e76431f35a0ffd99383772797b1d Mon Sep 17 00:00:00 2001 From: Samriddhi Singh Date: Mon, 5 Feb 2024 16:56:47 +0530 Subject: [PATCH 09/14] Error handling if component not found in function get_view --- src/plone/api/content.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plone/api/content.py b/src/plone/api/content.py index 48117f48..98c33ab9 100644 --- a/src/plone/api/content.py +++ b/src/plone/api/content.py @@ -13,11 +13,13 @@ from Products.CMFCore.WorkflowCore import WorkflowException from zope.component import getMultiAdapter from zope.component import getSiteManager +from zope.component import ComponentLookupError from zope.container.interfaces import INameChooser from zope.globalrequest import getRequest from zope.interface import Interface from zope.interface import providedBy + import random import transaction @@ -525,8 +527,7 @@ def get_view(name=None, context=None, request=None): try: adapter = getMultiAdapter((context, request), name=name) - except Exception: - + except ComponentLookupError: #Getting all available views sm = getSiteManager() available_views = sm.adapters.lookupAll( From 913b2cd07b1ce095772198d2b1864d203ed713bf Mon Sep 17 00:00:00 2001 From: Samriddhi Singh Date: Mon, 5 Feb 2024 17:10:06 +0530 Subject: [PATCH 10/14] Minor changes to get_view --- src/plone/api/content.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plone/api/content.py b/src/plone/api/content.py index 98c33ab9..f6ed2cdd 100644 --- a/src/plone/api/content.py +++ b/src/plone/api/content.py @@ -526,7 +526,7 @@ def get_view(name=None, context=None, request=None): # errors in client code. try: - adapter = getMultiAdapter((context, request), name=name) + return getMultiAdapter((context, request), name=name) except ComponentLookupError: #Getting all available views sm = getSiteManager() @@ -547,7 +547,6 @@ def get_view(name=None, context=None, request=None): views="\n".join(sorted(available_view_names)), ), ) - return adapter @required_parameters("obj") def get_uuid(obj=None): From 2e8015520b908e3a54d566edb20b55bec40610e1 Mon Sep 17 00:00:00 2001 From: David Glick Date: Wed, 7 Feb 2024 21:17:07 -0800 Subject: [PATCH 11/14] Update src/plone/api/content.py Co-authored-by: Alessandro Pisa --- src/plone/api/content.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plone/api/content.py b/src/plone/api/content.py index f6ed2cdd..bd5d03d1 100644 --- a/src/plone/api/content.py +++ b/src/plone/api/content.py @@ -535,7 +535,8 @@ def get_view(name=None, context=None, request=None): provided=Interface, ) - # Check if the requested view is available by getting the names of all available views + # Check if the requested view is available + # by getting the names of all available views available_view_names = [view[0] for view in available_views] if name not in available_view_names: # Raise an error if the requested view is not available. From 4b91ad80f4d96a92b374f7c3e12de7ae65fa5628 Mon Sep 17 00:00:00 2001 From: David Glick Date: Wed, 7 Feb 2024 21:32:28 -0800 Subject: [PATCH 12/14] Fix lint checks and docs build --- requirements-docs.txt | 18 +++++++++++++++++- src/plone/api/content.py | 10 +++++----- src/plone/api/relation.py | 1 + src/plone/api/tests/test_content.py | 1 + 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/requirements-docs.txt b/requirements-docs.txt index 9923bd9f..8038479c 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -1,4 +1,20 @@ +docutils<0.17,>=0.15 # sphinx-book-theme 0.2.0 has requirement docutils<0.17,>=0.15 Sphinx<5,>=3 # sphinx-book-theme 0.3.3 has requirement sphinx<5,>=3 -sphinx-book-theme<=0.3.99 +lesscpy +linkify-it-py myst-parser sphinx-autobuild +pydata-sphinx-theme<=0.8.99 +sphinx-book-theme==0.3.3 +sphinx-copybutton +sphinx-sitemap +sphinx-togglebutton +sphinxcontrib-spelling +sphinxext-opengraph +sphinxcontrib-applehelp==1.0.4 # https://github.com/plone/documentation/issues/1604 +sphinxcontrib-devhelp==1.0.2 # https://github.com/plone/documentation/issues/1604 +sphinxcontrib-htmlhelp==2.0.1 # https://github.com/plone/documentation/issues/1604 +sphinxcontrib-qthelp==1.0.3 # https://github.com/plone/documentation/issues/1604 +sphinxcontrib-serializinghtml==1.1.5 # https://github.com/plone/documentation/issues/1604 +sphinxcontrib-video +vale==2.30.0 diff --git a/src/plone/api/content.py b/src/plone/api/content.py index bd5d03d1..90f43776 100644 --- a/src/plone/api/content.py +++ b/src/plone/api/content.py @@ -11,15 +11,14 @@ from plone.uuid.interfaces import IUUID from Products.CMFCore.DynamicType import DynamicType from Products.CMFCore.WorkflowCore import WorkflowException +from zope.component import ComponentLookupError from zope.component import getMultiAdapter from zope.component import getSiteManager -from zope.component import ComponentLookupError from zope.container.interfaces import INameChooser from zope.globalrequest import getRequest from zope.interface import Interface from zope.interface import providedBy - import random import transaction @@ -527,14 +526,14 @@ def get_view(name=None, context=None, request=None): try: return getMultiAdapter((context, request), name=name) - except ComponentLookupError: - #Getting all available views + except ComponentLookupError: + # Getting all available views sm = getSiteManager() available_views = sm.adapters.lookupAll( required=(providedBy(context), providedBy(request)), provided=Interface, ) - + # Check if the requested view is available # by getting the names of all available views available_view_names = [view[0] for view in available_views] @@ -549,6 +548,7 @@ def get_view(name=None, context=None, request=None): ), ) + @required_parameters("obj") def get_uuid(obj=None): """Get the object's Universally Unique IDentifier (UUID). diff --git a/src/plone/api/relation.py b/src/plone/api/relation.py index 60df78ef..5540d4ca 100644 --- a/src/plone/api/relation.py +++ b/src/plone/api/relation.py @@ -2,6 +2,7 @@ Heavily inspired by collective.relationhelpers. """ + from AccessControl.SecurityManagement import getSecurityManager from collections import defaultdict from plone.api.exc import InvalidParameterError diff --git a/src/plone/api/tests/test_content.py b/src/plone/api/tests/test_content.py index 7123667c..08ab2141 100644 --- a/src/plone/api/tests/test_content.py +++ b/src/plone/api/tests/test_content.py @@ -1,4 +1,5 @@ """Tests for plone.api.content.""" + from Acquisition import aq_base from OFS.CopySupport import CopyError from OFS.event import ObjectWillBeMovedEvent From 0432fad9e7a7c051ee4618d7b607632b62609cc4 Mon Sep 17 00:00:00 2001 From: Maurits van Rees Date: Mon, 12 Feb 2024 16:13:57 +0100 Subject: [PATCH 13/14] Preparing release 2.0.9 [ci skip] --- CHANGES.rst | 9 +++++++++ news/479.internal | 1 - setup.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) delete mode 100644 news/479.internal diff --git a/CHANGES.rst b/CHANGES.rst index 655528d1..f2737aac 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,6 +8,15 @@ Changelog .. towncrier release notes start +2.0.9 (2024-02-12) +------------------ + +Internal: + + +- Improved efficiency of view retrieval by deferring availability checks to error handling. @samriddhi99 (#479) + + 2.0.8 (2023-12-14) ------------------ diff --git a/news/479.internal b/news/479.internal deleted file mode 100644 index e5dc5d52..00000000 --- a/news/479.internal +++ /dev/null @@ -1 +0,0 @@ -Improved efficiency of view retrieval by deferring availability checks to error handling. @samriddhi99 \ No newline at end of file diff --git a/setup.py b/setup.py index bd4feb2d..ce850ea8 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ def read(*rnames): read("README.md") + "\n\n" + read("CHANGES.rst") + "\n\n" + read("LICENSE") ) -version = "2.0.9.dev0" +version = "2.0.9" setup( name="plone.api", From 44c900695a79e21d1bd1c452b9dadb385823a04d Mon Sep 17 00:00:00 2001 From: Maurits van Rees Date: Mon, 12 Feb 2024 16:14:16 +0100 Subject: [PATCH 14/14] Back to development: 2.0.10 [ci skip] --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ce850ea8..73f00ba3 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ def read(*rnames): read("README.md") + "\n\n" + read("CHANGES.rst") + "\n\n" + read("LICENSE") ) -version = "2.0.9" +version = "2.0.10.dev0" setup( name="plone.api",