From 08c52e818eb84ab17611c40dc46cae27ebcce048 Mon Sep 17 00:00:00 2001 From: EEA Jenkins <2368628+eea-jenkins@users.noreply.github.com> Date: Fri, 18 Oct 2024 12:36:03 +0300 Subject: [PATCH 01/11] Back to devel --- docs/HISTORY.txt | 3 +++ eea/volto/policy/version.txt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 025a46b..44a01b1 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -1,6 +1,9 @@ Changelog ========= +5.6-dev0 - (unreleased) +--------------------------- + 5.5 - (2024-10-18) --------------------------- * Change: Fix broken brain error at the upgrade svg step - refs #276995 diff --git a/eea/volto/policy/version.txt b/eea/volto/policy/version.txt index 9ad974f..939109e 100644 --- a/eea/volto/policy/version.txt +++ b/eea/volto/policy/version.txt @@ -1 +1 @@ -5.5 +5.6-dev0 From 59ed748a85c3520a4d759680e89e1eb500227d99 Mon Sep 17 00:00:00 2001 From: David Ichim Date: Wed, 30 Oct 2024 20:11:25 +0200 Subject: [PATCH 02/11] customized breacrumbs_view and @breacrumbs endpoint to add portal_type info to each item - We can use this info to make conditions about viewing the breadcrumb item depending on the portal type --- eea/volto/policy/browser/breadcrumbs.py | 59 +++++++++++++++++++ eea/volto/policy/browser/configure.zcml | 9 +++ .../restapi/services/breadcrumbs/__init__.py | 1 + .../services/breadcrumbs/configure.zcml | 13 ++++ .../restapi/services/breadcrumbs/get.py | 43 ++++++++++++++ .../policy/restapi/services/configure.zcml | 1 + 6 files changed, 126 insertions(+) create mode 100644 eea/volto/policy/browser/breadcrumbs.py create mode 100644 eea/volto/policy/restapi/services/breadcrumbs/__init__.py create mode 100644 eea/volto/policy/restapi/services/breadcrumbs/configure.zcml create mode 100644 eea/volto/policy/restapi/services/breadcrumbs/get.py diff --git a/eea/volto/policy/browser/breadcrumbs.py b/eea/volto/policy/browser/breadcrumbs.py new file mode 100644 index 0000000..68d7bbe --- /dev/null +++ b/eea/volto/policy/browser/breadcrumbs.py @@ -0,0 +1,59 @@ +""" Breadcrumbs """ +# -*- coding: utf-8 -*- +from Acquisition import aq_base +from Acquisition import aq_inner +from plone.app.layout.navigation.interfaces import INavigationRoot +from plone.app.layout.navigation.root import getNavigationRoot +from Products.CMFPlone import utils +from Products.CMFPlone.browser.interfaces import INavigationBreadcrumbs +from Products.CMFPlone.browser.navigation import get_view_url +from Products.CMFPlone.defaultpage import check_default_page_via_view +from Products.CMFPlone.interfaces import IHideFromBreadcrumbs +from Products.Five import BrowserView +from zope.component import getMultiAdapter +from zope.interface import implementer + + +@implementer(INavigationBreadcrumbs) +class PhysicalNavigationBreadcrumbs(BrowserView): + """ EEA Physical Navigation Breadcrumbs """ + + def breadcrumbs(self): + """ breadcrumbs """ + context = aq_inner(self.context) + request = self.request + container = utils.parent(context) + name, item_url = get_view_url(context) + # EEA add portal_type info to breadcrumbs + last_crumb = { + "absolute_url": item_url, + "Title": utils.pretty_title_or_id(context, context), + "portal_type": context.portal_type, + "nav_title": getattr(aq_base(context), "nav_title", ""), + } + + if container is None: + return (last_crumb,) + + # Replicate Products.CMFPlone.browser.navigaton.RootPhysicalNavigationBreadcrumbs.breadcrumbs() + # cause it is not registered during tests + if INavigationRoot.providedBy(context): + return () + + view = getMultiAdapter((container, request), name="breadcrumbs_view") + base = tuple(view.breadcrumbs()) + + # Some things want to be hidden from the breadcrumbs + if IHideFromBreadcrumbs.providedBy(context): + return base + + rootPath = getNavigationRoot(context) + itemPath = "/".join(context.getPhysicalPath()) + + # don't show default pages in breadcrumbs or pages above the navigation + # root + if not check_default_page_via_view( + context, request + ) and not rootPath.startswith(itemPath): + base += (last_crumb,) + return base diff --git a/eea/volto/policy/browser/configure.zcml b/eea/volto/policy/browser/configure.zcml index f98073e..388deed 100644 --- a/eea/volto/policy/browser/configure.zcml +++ b/eea/volto/policy/browser/configure.zcml @@ -27,4 +27,13 @@ permission="cmf.ManagePortal" /> + + diff --git a/eea/volto/policy/restapi/services/breadcrumbs/__init__.py b/eea/volto/policy/restapi/services/breadcrumbs/__init__.py new file mode 100644 index 0000000..55fce9f --- /dev/null +++ b/eea/volto/policy/restapi/services/breadcrumbs/__init__.py @@ -0,0 +1 @@ +""" Breadcrumbs """ diff --git a/eea/volto/policy/restapi/services/breadcrumbs/configure.zcml b/eea/volto/policy/restapi/services/breadcrumbs/configure.zcml new file mode 100644 index 0000000..4e37599 --- /dev/null +++ b/eea/volto/policy/restapi/services/breadcrumbs/configure.zcml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/eea/volto/policy/restapi/services/breadcrumbs/get.py b/eea/volto/policy/restapi/services/breadcrumbs/get.py new file mode 100644 index 0000000..317d960 --- /dev/null +++ b/eea/volto/policy/restapi/services/breadcrumbs/get.py @@ -0,0 +1,43 @@ +""" Breadcrumbs """ +from plone.restapi.services.breadcrumbs.get import Breadcrumbs +from zope.component import getMultiAdapter +from zope.interface import implementer +from plone.restapi.interfaces import IExpandableElement, IPloneRestapiLayer +from zope.interface import Interface +from zope.component import adapter + + +@implementer(IExpandableElement) +@adapter(Interface, IPloneRestapiLayer) +class EEABreadcrumbs(Breadcrumbs): + """ EEA Breadcrumbs """ + + def __call__(self, expand=False): + """ """ + result = {"breadcrumbs": { + "@id": f"{self.context.absolute_url()}/@breadcrumbs"}} + if not expand: + return result + + portal_state = getMultiAdapter( + (self.context, self.request), name="plone_portal_state" + ) + breadcrumbs_view = getMultiAdapter( + (self.context, self.request), name="breadcrumbs_view" + ) + items = [] + # EEA add portal_type info to breadcrumbs + for crumb in breadcrumbs_view.breadcrumbs(): + item = { + "title": crumb["Title"], + "portal_type": crumb['portal_type'], + "@id": crumb["absolute_url"], + } + if crumb.get("nav_title", False): + item.update({"title": crumb["nav_title"]}) + + items.append(item) + + result["breadcrumbs"]["items"] = items + result["breadcrumbs"]["root"] = portal_state.navigation_root().absolute_url() + return result diff --git a/eea/volto/policy/restapi/services/configure.zcml b/eea/volto/policy/restapi/services/configure.zcml index b5e2ec6..adb58fe 100644 --- a/eea/volto/policy/restapi/services/configure.zcml +++ b/eea/volto/policy/restapi/services/configure.zcml @@ -3,4 +3,5 @@ xmlns:zcml="http://namespaces.zope.org/zcml" > + From 393862b61adad219b94e1f81e2102cb406174b8f Mon Sep 17 00:00:00 2001 From: David Ichim Date: Wed, 6 Nov 2024 12:37:45 +0200 Subject: [PATCH 03/11] Use eea_breadcrumbs_view instead of breadcrumbs_view in order to get portal_type info. When trying in demo breadcrumb_view from plone.volto was read instead of our override --- eea/volto/policy/browser/breadcrumbs.py | 2 +- eea/volto/policy/browser/configure.zcml | 2 +- eea/volto/policy/restapi/services/breadcrumbs/get.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eea/volto/policy/browser/breadcrumbs.py b/eea/volto/policy/browser/breadcrumbs.py index 68d7bbe..1c8e311 100644 --- a/eea/volto/policy/browser/breadcrumbs.py +++ b/eea/volto/policy/browser/breadcrumbs.py @@ -40,7 +40,7 @@ def breadcrumbs(self): if INavigationRoot.providedBy(context): return () - view = getMultiAdapter((container, request), name="breadcrumbs_view") + view = getMultiAdapter((container, request), name="eea_breadcrumbs_view") base = tuple(view.breadcrumbs()) # Some things want to be hidden from the breadcrumbs diff --git a/eea/volto/policy/browser/configure.zcml b/eea/volto/policy/browser/configure.zcml index 388deed..56ca705 100644 --- a/eea/volto/policy/browser/configure.zcml +++ b/eea/volto/policy/browser/configure.zcml @@ -28,7 +28,7 @@ /> Date: Wed, 6 Nov 2024 13:55:02 +0200 Subject: [PATCH 04/11] Lint fixes --- eea/volto/policy/browser/breadcrumbs.py | 13 ++++++++----- .../policy/restapi/services/breadcrumbs/get.py | 14 ++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/eea/volto/policy/browser/breadcrumbs.py b/eea/volto/policy/browser/breadcrumbs.py index 1c8e311..3056551 100644 --- a/eea/volto/policy/browser/breadcrumbs.py +++ b/eea/volto/policy/browser/breadcrumbs.py @@ -1,4 +1,5 @@ -""" Breadcrumbs """ +"""Breadcrumbs""" + # -*- coding: utf-8 -*- from Acquisition import aq_base from Acquisition import aq_inner @@ -16,10 +17,10 @@ @implementer(INavigationBreadcrumbs) class PhysicalNavigationBreadcrumbs(BrowserView): - """ EEA Physical Navigation Breadcrumbs """ + """EEA Physical Navigation Breadcrumbs""" def breadcrumbs(self): - """ breadcrumbs """ + """breadcrumbs""" context = aq_inner(self.context) request = self.request container = utils.parent(context) @@ -35,12 +36,14 @@ def breadcrumbs(self): if container is None: return (last_crumb,) - # Replicate Products.CMFPlone.browser.navigaton.RootPhysicalNavigationBreadcrumbs.breadcrumbs() + # Replicate Products.CMFPlone.browser.navigation. + # RootPhysicalNavigationBreadcrumbs.breadcrumbs() # cause it is not registered during tests if INavigationRoot.providedBy(context): return () - view = getMultiAdapter((container, request), name="eea_breadcrumbs_view") + view = getMultiAdapter((container, request), + name="eea_breadcrumbs_view") base = tuple(view.breadcrumbs()) # Some things want to be hidden from the breadcrumbs diff --git a/eea/volto/policy/restapi/services/breadcrumbs/get.py b/eea/volto/policy/restapi/services/breadcrumbs/get.py index 251ef67..268e694 100644 --- a/eea/volto/policy/restapi/services/breadcrumbs/get.py +++ b/eea/volto/policy/restapi/services/breadcrumbs/get.py @@ -1,16 +1,17 @@ -""" Breadcrumbs """ -from plone.restapi.services.breadcrumbs.get import Breadcrumbs +"""Breadcrumbs""" + from zope.component import getMultiAdapter +from zope.component import adapter from zope.interface import implementer -from plone.restapi.interfaces import IExpandableElement, IPloneRestapiLayer from zope.interface import Interface -from zope.component import adapter +from plone.restapi.interfaces import IExpandableElement, IPloneRestapiLayer +from plone.restapi.services.breadcrumbs.get import Breadcrumbs @implementer(IExpandableElement) @adapter(Interface, IPloneRestapiLayer) class EEABreadcrumbs(Breadcrumbs): - """ EEA Breadcrumbs """ + """EEA Breadcrumbs""" def __call__(self, expand=False): """ """ @@ -39,5 +40,6 @@ def __call__(self, expand=False): items.append(item) result["breadcrumbs"]["items"] = items - result["breadcrumbs"]["root"] = portal_state.navigation_root().absolute_url() + result["breadcrumbs"]["root"] = portal_state.navigation_root()\ + .absolute_url() return result From d98362fda5d7fc408649f5a4667f34ab77c4560c Mon Sep 17 00:00:00 2001 From: David Ichim Date: Wed, 6 Nov 2024 13:58:34 +0200 Subject: [PATCH 05/11] unused variable lint warning for code copied from plone --- eea/volto/policy/browser/breadcrumbs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/volto/policy/browser/breadcrumbs.py b/eea/volto/policy/browser/breadcrumbs.py index 3056551..28b77e6 100644 --- a/eea/volto/policy/browser/breadcrumbs.py +++ b/eea/volto/policy/browser/breadcrumbs.py @@ -24,7 +24,7 @@ def breadcrumbs(self): context = aq_inner(self.context) request = self.request container = utils.parent(context) - name, item_url = get_view_url(context) + _name, item_url = get_view_url(context) # EEA add portal_type info to breadcrumbs last_crumb = { "absolute_url": item_url, From 76755c18b21d87243c6fe58b4659e1e0f82f1f68 Mon Sep 17 00:00:00 2001 From: David Ichim Date: Wed, 6 Nov 2024 15:10:37 +0200 Subject: [PATCH 06/11] Added actions endpoint customization in order to allow actions to pass new props to the actions endpoint as configuration options --- .../restapi/services/actions/__init__.py | 1 + .../restapi/services/actions/configure.zcml | 13 +++++ .../policy/restapi/services/actions/get.py | 53 +++++++++++++++++++ .../policy/restapi/services/configure.zcml | 1 + 4 files changed, 68 insertions(+) create mode 100644 eea/volto/policy/restapi/services/actions/__init__.py create mode 100644 eea/volto/policy/restapi/services/actions/configure.zcml create mode 100644 eea/volto/policy/restapi/services/actions/get.py diff --git a/eea/volto/policy/restapi/services/actions/__init__.py b/eea/volto/policy/restapi/services/actions/__init__.py new file mode 100644 index 0000000..ad4b2dc --- /dev/null +++ b/eea/volto/policy/restapi/services/actions/__init__.py @@ -0,0 +1 @@ +""" EEA Actions overrides """ diff --git a/eea/volto/policy/restapi/services/actions/configure.zcml b/eea/volto/policy/restapi/services/actions/configure.zcml new file mode 100644 index 0000000..9518899 --- /dev/null +++ b/eea/volto/policy/restapi/services/actions/configure.zcml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/eea/volto/policy/restapi/services/actions/get.py b/eea/volto/policy/restapi/services/actions/get.py new file mode 100644 index 0000000..c97d8c3 --- /dev/null +++ b/eea/volto/policy/restapi/services/actions/get.py @@ -0,0 +1,53 @@ +"""Breadcrumbs""" + +from zope.component import getMultiAdapter +from zope.component import adapter +from zope.i18n import translate +from zope.interface import implementer +from zope.interface import Interface +from plone.restapi.interfaces import IExpandableElement, IPloneRestapiLayer +from plone.restapi.services.actions.get import Actions + + +@implementer(IExpandableElement) +@adapter(Interface, IPloneRestapiLayer) +class EEAActions(Actions): + """EEA Actions""" + + def __call__(self, expand=False): + """ """ + result = {"actions": {"@id": f"{self.context.absolute_url()}/@actions"}} + if not expand: + return result + + context_state = getMultiAdapter( + (self.context, self.request), name="plone_context_state" + ) + + categories = self.request.form.get("categories", self.all_categories) + filtered_action_props = { + "category", + "link_target", + "available", + "visible", + "allowed", + "modal", + } + data = {} + for category in categories: + category_action_data = [] + actions = context_state.actions(category=category) + for action in actions: + # EEA allow actions props to be served by the endpoint except + # for the ones listed in filtered_action_props + action_data = { + key: translate(value, context=self.request) + if key == "title" + else value + for key, value in action.items() + if key not in filtered_action_props + } + + category_action_data.append(action_data) + data[category] = category_action_data + return {"actions": data} diff --git a/eea/volto/policy/restapi/services/configure.zcml b/eea/volto/policy/restapi/services/configure.zcml index adb58fe..22b3396 100644 --- a/eea/volto/policy/restapi/services/configure.zcml +++ b/eea/volto/policy/restapi/services/configure.zcml @@ -4,4 +4,5 @@ > + From e020246fd6210e5c2c5879be2720636b4a987d0e Mon Sep 17 00:00:00 2001 From: David Ichim Date: Wed, 6 Nov 2024 15:15:24 +0200 Subject: [PATCH 07/11] Added history entry --- docs/HISTORY.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index 44a01b1..d2d8213 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -3,6 +3,12 @@ Changelog 5.6-dev0 - (unreleased) --------------------------- +* Feature: customized actions endpoint to allow passing of props to the + actions endpoint + [ichim-david - refs #271001] +* Feature: customized breadcrumbs endpoint to add portal_type info to the + items served by the breadcrumbs endpoint + [ichim-david - refs #271001] 5.5 - (2024-10-18) --------------------------- From 739650f0d1a27e22fbc6c7ce2326311203b0ca59 Mon Sep 17 00:00:00 2001 From: David Ichim Date: Wed, 6 Nov 2024 15:20:04 +0200 Subject: [PATCH 08/11] Lint fix, pep8 needs to go away --- eea/volto/policy/restapi/services/actions/get.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eea/volto/policy/restapi/services/actions/get.py b/eea/volto/policy/restapi/services/actions/get.py index c97d8c3..a8076c6 100644 --- a/eea/volto/policy/restapi/services/actions/get.py +++ b/eea/volto/policy/restapi/services/actions/get.py @@ -16,7 +16,8 @@ class EEAActions(Actions): def __call__(self, expand=False): """ """ - result = {"actions": {"@id": f"{self.context.absolute_url()}/@actions"}} + result = {"actions": {"@id": + f"{self.context.absolute_url()}/@actions"}} if not expand: return result From c2ab3d324782e516b313a82b5bcca01943a9c994 Mon Sep 17 00:00:00 2001 From: David Ichim Date: Wed, 6 Nov 2024 15:55:07 +0200 Subject: [PATCH 09/11] Removed print statement --- eea/volto/policy/restapi/services/contextnavigation/get.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/volto/policy/restapi/services/contextnavigation/get.py b/eea/volto/policy/restapi/services/contextnavigation/get.py index 3daa848..9f68835 100644 --- a/eea/volto/policy/restapi/services/contextnavigation/get.py +++ b/eea/volto/policy/restapi/services/contextnavigation/get.py @@ -243,6 +243,7 @@ def recurse(self, children, level, bottomLevel): @adapter(Interface, IPloneRestapiLayer) class EEAContextNavigation: """Custom context navigation""" + def __init__(self, context, request): self.context = context self.request = request @@ -255,7 +256,6 @@ def __call__(self, expand=False, prefix="expand.contextnavigation."): } if not expand: return result - print("REQUEST FORM", self.request.form) data = eea_extract_data( IEEANavigationPortlet, self.request.form, From cf889b0741df6d3a09068528532c79467267f15a Mon Sep 17 00:00:00 2001 From: EEA Jenkins Date: Mon, 11 Nov 2024 22:04:55 +0200 Subject: [PATCH 10/11] Updated version to 5.6 --- eea/volto/policy/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/volto/policy/version.txt b/eea/volto/policy/version.txt index 939109e..2df33d7 100644 --- a/eea/volto/policy/version.txt +++ b/eea/volto/policy/version.txt @@ -1 +1 @@ -5.6-dev0 +5.6 From bfcd121bc1417a8b89784f4f1192afb308a48f1f Mon Sep 17 00:00:00 2001 From: EEA Jenkins Date: Mon, 11 Nov 2024 22:04:57 +0200 Subject: [PATCH 11/11] Updated changelog - removed develop information --- docs/HISTORY.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/HISTORY.txt b/docs/HISTORY.txt index d2d8213..c2f465d 100644 --- a/docs/HISTORY.txt +++ b/docs/HISTORY.txt @@ -1,7 +1,7 @@ Changelog ========= -5.6-dev0 - (unreleased) +5.6 - (2024-11-11) --------------------------- * Feature: customized actions endpoint to allow passing of props to the actions endpoint