From 6df26b64c0c2e5a00e87341198701d9165421e0e Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:49:42 +0200 Subject: [PATCH 01/45] Update version.py --- .../indicators/contentrules/version.py | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 300529d..48f9a0d 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -1,4 +1,7 @@ """Copy action for content rules.""" +from urllib.parse import urlparse +import transaction +from zope.lifecycleevent import modified from Acquisition import aq_base from OFS.event import ObjectClonedEvent from OFS.SimpleItem import SimpleItem @@ -10,6 +13,8 @@ from plone.app.vocabularies.catalog import CatalogSource from plone.contentrules.rule.interfaces import IExecutable from plone.contentrules.rule.interfaces import IRuleElementData +from plone.restapi.serializer.utils import uid_to_url +from plone.restapi.deserializer.utils import path2uid try: from plone.base.utils import pretty_title_or_id except ImportError: @@ -26,12 +31,24 @@ from zope.lifecycleevent import ObjectCopiedEvent +def getLink(path): + """ + Get link + """ + + URL = urlparse(path) + + if URL.netloc.startswith('localhost') and URL.scheme: + return path.replace(URL.scheme + "://" + URL.netloc, "") + return path + class ICopyAction(Interface): """Interface for the configurable aspects of a move action. This is also used to create add and edit forms, below. """ + target_folder = schema.Choice( title=_("Target folder"), description=_("As a path relative to the portal root."), @@ -75,14 +92,18 @@ def __init__(self, context, element, event): self.event = event def __call__(self): + + portal_url = getToolByName(self.context, "portal_url", None) if portal_url is None: return False obj = self.event.object + previous_obj_path = obj.absolute_url_path(); path = self.element.target_folder change_note = self.element.change_note + if len(path) > 1 and path[0] == "/": path = path[1:] target = portal_url.getPortalObject().unrestrictedTraverse( @@ -130,7 +151,23 @@ def __call__(self): pr = getToolByName(obj, 'portal_repository') pr.save(obj=obj, comment=change_note) - + + ###CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION + obj_blocks = obj.blocks + data_figure_blocks = []; + for block_id, block_data in obj_blocks.items(): + if block_data.get("@type") == "group" and "data" in block_data: + for inner_block_id, inner_block_data in block_data["data"]["blocks"].items(): + if inner_block_data.get("@type") == "dataFigure": + url = uid_to_url(inner_block_data['url']); + if previous_obj_path in url: + url = url.replace(previous_obj_path,previous_obj_path+'.1') + url = path2uid( + context=self.context, link=getLink(url)) + inner_block_data['url']= url; + + modified(obj) + transaction.commit() return True def error(self, obj, error): From 669f7db42972743ff002381c8f0f0332c3b7f1be Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:10:20 +0200 Subject: [PATCH 02/45] Update version.py --- .../indicators/contentrules/version.py | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 48f9a0d..9fd25e8 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -1,4 +1,5 @@ """Copy action for content rules.""" + from urllib.parse import urlparse import transaction from zope.lifecycleevent import modified @@ -15,6 +16,7 @@ from plone.contentrules.rule.interfaces import IRuleElementData from plone.restapi.serializer.utils import uid_to_url from plone.restapi.deserializer.utils import path2uid + try: from plone.base.utils import pretty_title_or_id except ImportError: @@ -33,22 +35,22 @@ def getLink(path): """ - Get link - """ + Get link + """ URL = urlparse(path) - if URL.netloc.startswith('localhost') and URL.scheme: + if URL.netloc.startswith("localhost") and URL.scheme: return path.replace(URL.scheme + "://" + URL.netloc, "") return path + class ICopyAction(Interface): """Interface for the configurable aspects of a move action. This is also used to create add and edit forms, below. """ - target_folder = schema.Choice( title=_("Target folder"), description=_("As a path relative to the portal root."), @@ -58,8 +60,7 @@ class ICopyAction(Interface): change_note = schema.TextLine( title=_("Change note"), - description=_( - "Optional change note to be used when creating new version."), + description=_("Optional change note to be used when creating new version."), required=False, ) @@ -75,10 +76,7 @@ class CopyAction(SimpleItem): @property def summary(self): """A summary of the element's configuration.""" - return _( - "Copy to folder ${folder}.", - mapping=dict(folder=self.target_folder) - ) + return _("Copy to folder ${folder}.", mapping=dict(folder=self.target_folder)) @adapter(Interface, ICopyAction, Interface) @@ -93,13 +91,12 @@ def __init__(self, context, element, event): def __call__(self): - portal_url = getToolByName(self.context, "portal_url", None) if portal_url is None: return False obj = self.event.object - previous_obj_path = obj.absolute_url_path(); + previous_obj_path = obj.absolute_url_path() path = self.element.target_folder change_note = self.element.change_note @@ -114,14 +111,13 @@ def __call__(self): if target is None: self.error( obj, - _("Target folder ${target} does not exist.", - mapping={"target": path}), + _("Target folder ${target} does not exist.", mapping={"target": path}), ) return False old_id = obj.getId() new_id = self.generate_id(target, old_id) - if not new_id.endswith('.1'): + if not new_id.endswith(".1"): # Version already exists, redirect to it - refs #279130 return True @@ -149,23 +145,26 @@ def __call__(self): notify(ObjectClonedEvent(obj)) - pr = getToolByName(obj, 'portal_repository') + pr = getToolByName(obj, "portal_repository") pr.save(obj=obj, comment=change_note) - + ###CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION obj_blocks = obj.blocks - data_figure_blocks = []; + data_figure_blocks = [] for block_id, block_data in obj_blocks.items(): if block_data.get("@type") == "group" and "data" in block_data: - for inner_block_id, inner_block_data in block_data["data"]["blocks"].items(): + for inner_block_id, inner_block_data in block_data["data"][ + "blocks" + ].items(): if inner_block_data.get("@type") == "dataFigure": - url = uid_to_url(inner_block_data['url']); + url = uid_to_url(inner_block_data["url"]) if previous_obj_path in url: - url = url.replace(previous_obj_path,previous_obj_path+'.1') - url = path2uid( - context=self.context, link=getLink(url)) - inner_block_data['url']= url; - + url = url.replace( + previous_obj_path, previous_obj_path + ".1" + ) + url = path2uid(context=self.context, link=getLink(url)) + inner_block_data["url"] = url + modified(obj) transaction.commit() return True @@ -184,8 +183,7 @@ def error(self, obj, error): def generate_id(self, target, old_id): """Generate a new id for the copied object.""" - taken = getattr(aq_base(target), "has_key", - lambda x: x in target.objectIds()) + taken = getattr(aq_base(target), "has_key", lambda x: x in target.objectIds()) if not taken(old_id): return old_id @@ -206,6 +204,7 @@ class CopyAddForm(ActionAddForm): class CopyAddFormView(ContentRuleFormWrapper): """A wrapper for the add form.""" + form = CopyAddForm @@ -223,4 +222,5 @@ class CopyEditForm(ActionEditForm): class CopyEditFormView(ContentRuleFormWrapper): """A wrapper for the edit form.""" + form = CopyEditForm From 14637021147b88daa437bd6def35d9c4191dbc9e Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:14:31 +0200 Subject: [PATCH 03/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 9fd25e8..b417c6a 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -60,7 +60,8 @@ class ICopyAction(Interface): change_note = schema.TextLine( title=_("Change note"), - description=_("Optional change note to be used when creating new version."), + description=_( + "Optional change note to be used when creating new version."), required=False, ) @@ -76,7 +77,10 @@ class CopyAction(SimpleItem): @property def summary(self): """A summary of the element's configuration.""" - return _("Copy to folder ${folder}.", mapping=dict(folder=self.target_folder)) + return _( + "Copy to folder ${folder}.", + mapping=dict(folder=self.target_folder) + ) @adapter(Interface, ICopyAction, Interface) From d8f7eab69701e50819c48c354d444edf05c52070 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:19:35 +0200 Subject: [PATCH 04/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index b417c6a..1a78bab 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -115,7 +115,8 @@ def __call__(self): if target is None: self.error( obj, - _("Target folder ${target} does not exist.", mapping={"target": path}), + _("Target folder ${target} does not exist.", + mapping={"target": path}), ) return False @@ -152,7 +153,7 @@ def __call__(self): pr = getToolByName(obj, "portal_repository") pr.save(obj=obj, comment=change_note) - ###CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION + #CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION obj_blocks = obj.blocks data_figure_blocks = [] for block_id, block_data in obj_blocks.items(): From 019ec1d2fd184ba3c1fa8651d57322ee9a00d8b7 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:22:23 +0200 Subject: [PATCH 05/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 1a78bab..0c307e1 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -153,7 +153,7 @@ def __call__(self): pr = getToolByName(obj, "portal_repository") pr.save(obj=obj, comment=change_note) - #CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION + # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION obj_blocks = obj.blocks data_figure_blocks = [] for block_id, block_data in obj_blocks.items(): @@ -167,7 +167,10 @@ def __call__(self): url = url.replace( previous_obj_path, previous_obj_path + ".1" ) - url = path2uid(context=self.context, link=getLink(url)) + url = path2uid( + context=self.context, + link=getLink(url) + ) inner_block_data["url"] = url modified(obj) From a6c72b6e056bc9ac9cc7850a72ddfc2c97e68a2c Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:24:50 +0200 Subject: [PATCH 06/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 0c307e1..ee7d94e 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -168,7 +168,7 @@ def __call__(self): previous_obj_path, previous_obj_path + ".1" ) url = path2uid( - context=self.context, + context=self.context, link=getLink(url) ) inner_block_data["url"] = url @@ -191,7 +191,11 @@ def error(self, obj, error): def generate_id(self, target, old_id): """Generate a new id for the copied object.""" - taken = getattr(aq_base(target), "has_key", lambda x: x in target.objectIds()) + taken = getattr( + aq_base(target), + "has_key", + lambda x: x in target.objectIds() + ) if not taken(old_id): return old_id From 9b54a98775c877b47abc9b4d6bd1b88216dc40d0 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:25:53 +0200 Subject: [PATCH 07/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index ee7d94e..d59a45b 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -192,8 +192,8 @@ def error(self, obj, error): def generate_id(self, target, old_id): """Generate a new id for the copied object.""" taken = getattr( - aq_base(target), - "has_key", + aq_base(target), + "has_key", lambda x: x in target.objectIds() ) From 432e22e73ede664afa965b08a82a9b5ab2a70ca9 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:29:45 +0200 Subject: [PATCH 08/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index d59a45b..705c0b8 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -2,7 +2,6 @@ from urllib.parse import urlparse import transaction -from zope.lifecycleevent import modified from Acquisition import aq_base from OFS.event import ObjectClonedEvent from OFS.SimpleItem import SimpleItem @@ -30,7 +29,7 @@ from zope.event import notify from zope.interface import implementer from zope.interface import Interface -from zope.lifecycleevent import ObjectCopiedEvent +from zope.lifecycleevent import ObjectCopiedEvent, modified def getLink(path): @@ -155,10 +154,9 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION obj_blocks = obj.blocks - data_figure_blocks = [] - for block_id, block_data in obj_blocks.items(): + for _, block_data in obj_blocks.items(): if block_data.get("@type") == "group" and "data" in block_data: - for inner_block_id, inner_block_data in block_data["data"][ + for _, inner_block_data in block_data["data"][ "blocks" ].items(): if inner_block_data.get("@type") == "dataFigure": From 95ce98676bf5558e5c47f0d14a7e6a221e31a231 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:35:10 +0200 Subject: [PATCH 09/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 705c0b8..86f7b7c 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -15,7 +15,6 @@ from plone.contentrules.rule.interfaces import IRuleElementData from plone.restapi.serializer.utils import uid_to_url from plone.restapi.deserializer.utils import path2uid - try: from plone.base.utils import pretty_title_or_id except ImportError: @@ -103,7 +102,6 @@ def __call__(self): path = self.element.target_folder change_note = self.element.change_note - if len(path) > 1 and path[0] == "/": path = path[1:] target = portal_url.getPortalObject().unrestrictedTraverse( @@ -121,7 +119,7 @@ def __call__(self): old_id = obj.getId() new_id = self.generate_id(target, old_id) - if not new_id.endswith(".1"): + if not new_id.endswith(''.1'): # Version already exists, redirect to it - refs #279130 return True @@ -149,7 +147,7 @@ def __call__(self): notify(ObjectClonedEvent(obj)) - pr = getToolByName(obj, "portal_repository") + pr = getToolByName(obj, 'portal_repository') pr.save(obj=obj, comment=change_note) # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION @@ -214,7 +212,6 @@ class CopyAddForm(ActionAddForm): class CopyAddFormView(ContentRuleFormWrapper): """A wrapper for the add form.""" - form = CopyAddForm From 42490ec738ede254a1897dbc5c047bc92d52496f Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:35:46 +0200 Subject: [PATCH 10/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 86f7b7c..68cc980 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -119,7 +119,7 @@ def __call__(self): old_id = obj.getId() new_id = self.generate_id(target, old_id) - if not new_id.endswith(''.1'): + if not new_id.endswith('.1'): # Version already exists, redirect to it - refs #279130 return True From 7e1fbb5d7629009971a997abf4a883fb535bee99 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:36:25 +0200 Subject: [PATCH 11/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 68cc980..53bc85c 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -30,7 +30,6 @@ from zope.interface import Interface from zope.lifecycleevent import ObjectCopiedEvent, modified - def getLink(path): """ Get link @@ -229,5 +228,4 @@ class CopyEditForm(ActionEditForm): class CopyEditFormView(ContentRuleFormWrapper): """A wrapper for the edit form.""" - form = CopyEditForm From 1bf5558a3a1d5dc6d58d9f302265175a2a2fb9be Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:37:38 +0200 Subject: [PATCH 12/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 1 + 1 file changed, 1 insertion(+) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 53bc85c..ec7672e 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -30,6 +30,7 @@ from zope.interface import Interface from zope.lifecycleevent import ObjectCopiedEvent, modified + def getLink(path): """ Get link From ad4fb610b2267075c2a1ce89bdb3d6c0fd3ba35e Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:42:25 +0200 Subject: [PATCH 13/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index ec7672e..89cc972 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -112,7 +112,7 @@ def __call__(self): if target is None: self.error( obj, - _("Target folder ${target} does not exist.", + _("Target folder ${target} does not exist.", mapping={"target": path}), ) return False From f825391df119fe3f8397749d2c95d9a96cc0399c Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:44:18 +0200 Subject: [PATCH 14/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 89cc972..ec7672e 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -112,7 +112,7 @@ def __call__(self): if target is None: self.error( obj, - _("Target folder ${target} does not exist.", + _("Target folder ${target} does not exist.", mapping={"target": path}), ) return False From 7c7a00ef8ad1b6783d6189f66039b4f8387abc8f Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:48:44 +0200 Subject: [PATCH 15/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index ec7672e..2cc8bcb 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -152,22 +152,6 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION obj_blocks = obj.blocks - for _, block_data in obj_blocks.items(): - if block_data.get("@type") == "group" and "data" in block_data: - for _, inner_block_data in block_data["data"][ - "blocks" - ].items(): - if inner_block_data.get("@type") == "dataFigure": - url = uid_to_url(inner_block_data["url"]) - if previous_obj_path in url: - url = url.replace( - previous_obj_path, previous_obj_path + ".1" - ) - url = path2uid( - context=self.context, - link=getLink(url) - ) - inner_block_data["url"] = url modified(obj) transaction.commit() From 4692bf03ee5486d24a084177b2cb29f2a274ac43 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:53:01 +0200 Subject: [PATCH 16/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 2cc8bcb..507d83b 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -152,6 +152,22 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION obj_blocks = obj.blocks + for block_data in obj_blocks.values(): + if block_data.get("@type") == "group" and "data" in block_data: + for inner_block_data in block_data["data"][ + "blocks" + ].values(): + if inner_block_data.get("@type") == "dataFigure": + url = uid_to_url(inner_block_data["url"]) + if previous_obj_path in url: + url = url.replace( + previous_obj_path, previous_obj_path + ".1" + ) + url = path2uid( + context=self.context, + link=getLink(url) + ) + inner_block_data["url"] = url modified(obj) transaction.commit() From 0e74225c3d3e7e3f1db27d61a92d3ed3db57a1da Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:51:24 +0200 Subject: [PATCH 17/45] Update version.py --- .../indicators/contentrules/version.py | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 507d83b..ec6ec81 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -1,11 +1,12 @@ """Copy action for content rules.""" - +import copy from urllib.parse import urlparse import transaction from Acquisition import aq_base from OFS.event import ObjectClonedEvent from OFS.SimpleItem import SimpleItem import OFS.subscribers +from plone.restapi.blocks import visit_blocks from plone.app.contentrules import PloneMessageFactory as _ from plone.app.contentrules.actions import ActionAddForm from plone.app.contentrules.actions import ActionEditForm @@ -151,15 +152,11 @@ def __call__(self): pr.save(obj=obj, comment=change_note) # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION - obj_blocks = obj.blocks - for block_data in obj_blocks.values(): - if block_data.get("@type") == "group" and "data" in block_data: - for inner_block_data in block_data["data"][ - "blocks" - ].values(): - if inner_block_data.get("@type") == "dataFigure": - url = uid_to_url(inner_block_data["url"]) - if previous_obj_path in url: + for block_data in visit_blocks(obj,obj.blocks): + if block_data.get("@type") == "dataFigure" and 'url' in block_data: + new_block = copy.deepcopy(block_data) + url = uid_to_url(block_data["url"]) + if previous_obj_path in url: url = url.replace( previous_obj_path, previous_obj_path + ".1" ) @@ -167,8 +164,9 @@ def __call__(self): context=self.context, link=getLink(url) ) - inner_block_data["url"] = url - + new_block["url"] = url + block_data.clear(); + block_data.update(new_block); modified(obj) transaction.commit() return True From 0722087605cc96524f24f32f3d4a30fb2445f9bc Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:53:37 +0200 Subject: [PATCH 18/45] Update version.py --- .../indicators/contentrules/version.py | 50 ++++++++----------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index ec6ec81..cf8fa4e 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -1,4 +1,5 @@ """Copy action for content rules.""" + import copy from urllib.parse import urlparse import transaction @@ -16,6 +17,7 @@ from plone.contentrules.rule.interfaces import IRuleElementData from plone.restapi.serializer.utils import uid_to_url from plone.restapi.deserializer.utils import path2uid + try: from plone.base.utils import pretty_title_or_id except ImportError: @@ -59,8 +61,7 @@ class ICopyAction(Interface): change_note = schema.TextLine( title=_("Change note"), - description=_( - "Optional change note to be used when creating new version."), + description=_("Optional change note to be used when creating new version."), required=False, ) @@ -76,10 +77,7 @@ class CopyAction(SimpleItem): @property def summary(self): """A summary of the element's configuration.""" - return _( - "Copy to folder ${folder}.", - mapping=dict(folder=self.target_folder) - ) + return _("Copy to folder ${folder}.", mapping=dict(folder=self.target_folder)) @adapter(Interface, ICopyAction, Interface) @@ -113,14 +111,13 @@ def __call__(self): if target is None: self.error( obj, - _("Target folder ${target} does not exist.", - mapping={"target": path}), + _("Target folder ${target} does not exist.", mapping={"target": path}), ) return False old_id = obj.getId() new_id = self.generate_id(target, old_id) - if not new_id.endswith('.1'): + if not new_id.endswith(".1"): # Version already exists, redirect to it - refs #279130 return True @@ -148,25 +145,20 @@ def __call__(self): notify(ObjectClonedEvent(obj)) - pr = getToolByName(obj, 'portal_repository') + pr = getToolByName(obj, "portal_repository") pr.save(obj=obj, comment=change_note) # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION - for block_data in visit_blocks(obj,obj.blocks): - if block_data.get("@type") == "dataFigure" and 'url' in block_data: - new_block = copy.deepcopy(block_data) - url = uid_to_url(block_data["url"]) - if previous_obj_path in url: - url = url.replace( - previous_obj_path, previous_obj_path + ".1" - ) - url = path2uid( - context=self.context, - link=getLink(url) - ) - new_block["url"] = url - block_data.clear(); - block_data.update(new_block); + for block_data in visit_blocks(obj, obj.blocks): + if block_data.get("@type") == "dataFigure" and "url" in block_data: + new_block = copy.deepcopy(block_data) + url = uid_to_url(block_data["url"]) + if previous_obj_path in url: + url = url.replace(previous_obj_path, previous_obj_path + ".1") + url = path2uid(context=self.context, link=getLink(url)) + new_block["url"] = url + block_data.clear() + block_data.update(new_block) modified(obj) transaction.commit() return True @@ -185,11 +177,7 @@ def error(self, obj, error): def generate_id(self, target, old_id): """Generate a new id for the copied object.""" - taken = getattr( - aq_base(target), - "has_key", - lambda x: x in target.objectIds() - ) + taken = getattr(aq_base(target), "has_key", lambda x: x in target.objectIds()) if not taken(old_id): return old_id @@ -210,6 +198,7 @@ class CopyAddForm(ActionAddForm): class CopyAddFormView(ContentRuleFormWrapper): """A wrapper for the add form.""" + form = CopyAddForm @@ -227,4 +216,5 @@ class CopyEditForm(ActionEditForm): class CopyEditFormView(ContentRuleFormWrapper): """A wrapper for the edit form.""" + form = CopyEditForm From 36a72ed9a81b8d5a1b18294e24a9c0c65a890715 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:57:06 +0200 Subject: [PATCH 19/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index cf8fa4e..1272491 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -61,7 +61,8 @@ class ICopyAction(Interface): change_note = schema.TextLine( title=_("Change note"), - description=_("Optional change note to be used when creating new version."), + description=_( + "Optional change note to be used when creating new version."), required=False, ) @@ -77,7 +78,10 @@ class CopyAction(SimpleItem): @property def summary(self): """A summary of the element's configuration.""" - return _("Copy to folder ${folder}.", mapping=dict(folder=self.target_folder)) + return _( + "Copy to folder ${folder}.", + mapping=dict(folder=self.target_folder) + ) @adapter(Interface, ICopyAction, Interface) @@ -111,7 +115,8 @@ def __call__(self): if target is None: self.error( obj, - _("Target folder ${target} does not exist.", mapping={"target": path}), + _("Target folder ${target} does not exist.", + mapping={"target": path}), ) return False From 3462bb36ae30e7d2097187a04ecaab514959d8da Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:59:26 +0200 Subject: [PATCH 20/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 1272491..fd761c2 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -159,7 +159,10 @@ def __call__(self): new_block = copy.deepcopy(block_data) url = uid_to_url(block_data["url"]) if previous_obj_path in url: - url = url.replace(previous_obj_path, previous_obj_path + ".1") + url = url.replace( + previous_obj_path, + previous_obj_path + ".1" + ) url = path2uid(context=self.context, link=getLink(url)) new_block["url"] = url block_data.clear() @@ -182,7 +185,8 @@ def error(self, obj, error): def generate_id(self, target, old_id): """Generate a new id for the copied object.""" - taken = getattr(aq_base(target), "has_key", lambda x: x in target.objectIds()) + taken = getattr(aq_base(target), "has_key", + lambda x: x in target.objectIds()) if not taken(old_id): return old_id From 5b2cda29268cd0ae5047246f9e7a03d1edc65abe Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:00:55 +0200 Subject: [PATCH 21/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index fd761c2..d47ce8e 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -160,7 +160,7 @@ def __call__(self): url = uid_to_url(block_data["url"]) if previous_obj_path in url: url = url.replace( - previous_obj_path, + previous_obj_path, previous_obj_path + ".1" ) url = path2uid(context=self.context, link=getLink(url)) From b4ceb32c491f087d0ff1690327e431c63beca622 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Wed, 14 May 2025 13:40:27 +0300 Subject: [PATCH 22/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index d47ce8e..fb38309 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -155,7 +155,7 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION for block_data in visit_blocks(obj, obj.blocks): - if block_data.get("@type") == "dataFigure" and "url" in block_data: + if block_data.get("@type") == "embed_content" and "url" in block_data: new_block = copy.deepcopy(block_data) url = uid_to_url(block_data["url"]) if previous_obj_path in url: From 2965e731938e7d50e9643b66cfc2a998169e1309 Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Wed, 14 May 2025 13:48:13 +0300 Subject: [PATCH 23/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index fb38309..51f9808 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -155,7 +155,8 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION for block_data in visit_blocks(obj, obj.blocks): - if block_data.get("@type") == "embed_content" and "url" in block_data: + if (block_data.get("@type") == "embed_content" + and "url" in block_data): new_block = copy.deepcopy(block_data) url = uid_to_url(block_data["url"]) if previous_obj_path in url: From 7592d5910b7d36ee70ab2cb91f00586cc6858ace Mon Sep 17 00:00:00 2001 From: dobri1408 <50819975+dobri1408@users.noreply.github.com> Date: Wed, 14 May 2025 13:51:22 +0300 Subject: [PATCH 24/45] Update version.py --- eea/dexterity/indicators/contentrules/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 51f9808..4c26ea4 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -155,8 +155,8 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION for block_data in visit_blocks(obj, obj.blocks): - if (block_data.get("@type") == "embed_content" - and "url" in block_data): + if (block_data.get("@type") == "embed_content" and + "url" in block_data): new_block = copy.deepcopy(block_data) url = uid_to_url(block_data["url"]) if previous_obj_path in url: From 9c150115089663722d01b15f15958792765a26ad Mon Sep 17 00:00:00 2001 From: Alin Voinea Date: Mon, 19 May 2025 12:26:26 +0300 Subject: [PATCH 25/45] chore: fix pep8 --- eea/dexterity/indicators/contentrules/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 4c26ea4..910d025 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -156,7 +156,7 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION for block_data in visit_blocks(obj, obj.blocks): if (block_data.get("@type") == "embed_content" and - "url" in block_data): + "url" in block_data): new_block = copy.deepcopy(block_data) url = uid_to_url(block_data["url"]) if previous_obj_path in url: From 0e77fa295aee58ba5613294b06eb14b6f1f54b5a Mon Sep 17 00:00:00 2001 From: Dobricean Ioan Dorian <50819975+dobri1408@users.noreply.github.com> Date: Mon, 19 May 2025 17:50:44 +0300 Subject: [PATCH 26/45] simplify --- eea/dexterity/indicators/contentrules/version.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index d47ce8e..200dbe4 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -154,9 +154,11 @@ def __call__(self): pr.save(obj=obj, comment=change_note) # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION + + for block_data in visit_blocks(obj, obj.blocks): - if block_data.get("@type") == "dataFigure" and "url" in block_data: - new_block = copy.deepcopy(block_data) + if (block_data.get("@type") == "embed_content" + and "url" in block_data): url = uid_to_url(block_data["url"]) if previous_obj_path in url: url = url.replace( @@ -164,11 +166,8 @@ def __call__(self): previous_obj_path + ".1" ) url = path2uid(context=self.context, link=getLink(url)) - new_block["url"] = url - block_data.clear() - block_data.update(new_block) + block_data["url"] = url modified(obj) - transaction.commit() return True def error(self, obj, error): From 6ada66544abd997d25ab6a20229b3b2fc6fb75ae Mon Sep 17 00:00:00 2001 From: Dobricean Ioan Dorian <50819975+dobri1408@users.noreply.github.com> Date: Mon, 19 May 2025 17:56:03 +0300 Subject: [PATCH 27/45] clean spaces --- eea/dexterity/indicators/contentrules/version.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 3f75405..0c7390f 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -154,17 +154,9 @@ def __call__(self): pr.save(obj=obj, comment=change_note) # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION - - for block_data in visit_blocks(obj, obj.blocks): -<<<<<<< HEAD if (block_data.get("@type") == "embed_content" and "url" in block_data): -======= - if (block_data.get("@type") == "embed_content" and - "url" in block_data): - new_block = copy.deepcopy(block_data) ->>>>>>> 9c150115089663722d01b15f15958792765a26ad url = uid_to_url(block_data["url"]) if previous_obj_path in url: url = url.replace( From 5c36461191d1f7fb49c3e87c8a8de7c25f51fd07 Mon Sep 17 00:00:00 2001 From: Dobricean Ioan Dorian <50819975+dobri1408@users.noreply.github.com> Date: Mon, 19 May 2025 17:58:13 +0300 Subject: [PATCH 28/45] clean spaces --- eea/dexterity/indicators/contentrules/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 0c7390f..700729d 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -155,8 +155,8 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION for block_data in visit_blocks(obj, obj.blocks): - if (block_data.get("@type") == "embed_content" - and "url" in block_data): + if (block_data.get("@type") == "embed_content" and + "url" in block_data): url = uid_to_url(block_data["url"]) if previous_obj_path in url: url = url.replace( From d574b88a450ca6356640b6115f1f3cce569b58e7 Mon Sep 17 00:00:00 2001 From: Dobricean Ioan Dorian <50819975+dobri1408@users.noreply.github.com> Date: Mon, 19 May 2025 18:00:21 +0300 Subject: [PATCH 29/45] fix pep8 --- eea/dexterity/indicators/contentrules/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 700729d..02ca48d 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -156,7 +156,7 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION for block_data in visit_blocks(obj, obj.blocks): if (block_data.get("@type") == "embed_content" and - "url" in block_data): + "url" in block_data): url = uid_to_url(block_data["url"]) if previous_obj_path in url: url = url.replace( From 5520424fad5f0de16110bb8971cf3990a2960652 Mon Sep 17 00:00:00 2001 From: Dobricean Ioan Dorian <50819975+dobri1408@users.noreply.github.com> Date: Mon, 19 May 2025 18:02:33 +0300 Subject: [PATCH 30/45] please fix pep8 --- eea/dexterity/indicators/contentrules/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 02ca48d..33efab0 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -156,7 +156,7 @@ def __call__(self): # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION for block_data in visit_blocks(obj, obj.blocks): if (block_data.get("@type") == "embed_content" and - "url" in block_data): + "url" in block_data): url = uid_to_url(block_data["url"]) if previous_obj_path in url: url = url.replace( From 6d9c59a69db2974eafb7d5a3a49a8de8b3c479c2 Mon Sep 17 00:00:00 2001 From: Dobricean Ioan Dorian <50819975+dobri1408@users.noreply.github.com> Date: Mon, 19 May 2025 18:03:58 +0300 Subject: [PATCH 31/45] please fix pep8 --- eea/dexterity/indicators/contentrules/version.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 33efab0..08e08dd 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -1,8 +1,6 @@ """Copy action for content rules.""" -import copy from urllib.parse import urlparse -import transaction from Acquisition import aq_base from OFS.event import ObjectClonedEvent from OFS.SimpleItem import SimpleItem From 982e3e33ddc4340b8a247a8fd8e21d02d79df6fb Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Tue, 20 May 2025 16:49:59 +0300 Subject: [PATCH 32/45] Add initial page to relatedItems --- eea/dexterity/indicators/contentrules/version.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 08e08dd..60c36ba 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -15,6 +15,9 @@ from plone.contentrules.rule.interfaces import IRuleElementData from plone.restapi.serializer.utils import uid_to_url from plone.restapi.deserializer.utils import path2uid +from zope.component import getUtility +from zope.intid.interfaces import IIntIds +from z3c.relationfield.relation import RelationValue try: from plone.base.utils import pretty_title_or_id @@ -143,14 +146,25 @@ def __call__(self): obj.wl_clearLocks() obj._postCopy(target, op=0) + try: + intids = getUtility(IIntIds) + relation = RelationValue(intids.getId(orig_obj)) + + obj.relatedItems = [relation] + + obj.reindexObject(idxs=["relatedItems"]) + except Exception as e: + self.error(obj, f"Failed to relate copied object to original: {e}") + import pdb; + pdb.set_trace() OFS.subscribers.compatibilityCall("manage_afterClone", obj, obj) notify(ObjectClonedEvent(obj)) pr = getToolByName(obj, "portal_repository") pr.save(obj=obj, comment=change_note) - + # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION for block_data in visit_blocks(obj, obj.blocks): if (block_data.get("@type") == "embed_content" and From 93ddf36a118139b9bc201b44a9b27bc5f15ae67d Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 21 May 2025 17:04:59 +0300 Subject: [PATCH 33/45] Fix shortname changes breaking drafts --- eea/dexterity/indicators/contentrules/actions.py | 9 ++++++--- eea/dexterity/indicators/contentrules/version.py | 6 +----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/actions.py b/eea/dexterity/indicators/contentrules/actions.py index d0d90ea..7b9ffb9 100644 --- a/eea/dexterity/indicators/contentrules/actions.py +++ b/eea/dexterity/indicators/contentrules/actions.py @@ -62,12 +62,15 @@ def __call__(self): elif oid.endswith(".1"): old_id = oid.replace(".1", "", 1) new_id = old_id + "-%d" % time() - if not (old_id and new_id): return True - try: - old_version = parent[old_id] + if old_id not in parent: + old_version = obj.relatedItems[0].to_object + obj.relatedItems = [] + obj.reindexObject(idxs=["relatedItems"]) + else: + old_version = parent[old_id] api.content.transition( obj=old_version, transition="markForDeletion", diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 60c36ba..dc67ee0 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -149,15 +149,11 @@ def __call__(self): try: intids = getUtility(IIntIds) relation = RelationValue(intids.getId(orig_obj)) - obj.relatedItems = [relation] - obj.reindexObject(idxs=["relatedItems"]) - except Exception as e: self.error(obj, f"Failed to relate copied object to original: {e}") - import pdb; - pdb.set_trace() + OFS.subscribers.compatibilityCall("manage_afterClone", obj, obj) notify(ObjectClonedEvent(obj)) From b88b408b9e916a141aaa243672aa419e019d21f2 Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 21 May 2025 17:10:20 +0300 Subject: [PATCH 34/45] linting --- eea/dexterity/indicators/contentrules/version.py | 1 - 1 file changed, 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index dc67ee0..baa7990 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -160,7 +160,6 @@ def __call__(self): pr = getToolByName(obj, "portal_repository") pr.save(obj=obj, comment=change_note) - # CHANGE URL OF FIGURES TO THE NEW DRAFT VERSION for block_data in visit_blocks(obj, obj.blocks): if (block_data.get("@type") == "embed_content" and From 288f8b21530fabf9650c48fc180220bf1264126a Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 21 May 2025 17:17:30 +0300 Subject: [PATCH 35/45] linting --- eea/dexterity/indicators/contentrules/version.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index baa7990..0eb961d 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -15,9 +15,6 @@ from plone.contentrules.rule.interfaces import IRuleElementData from plone.restapi.serializer.utils import uid_to_url from plone.restapi.deserializer.utils import path2uid -from zope.component import getUtility -from zope.intid.interfaces import IIntIds -from z3c.relationfield.relation import RelationValue try: from plone.base.utils import pretty_title_or_id @@ -28,12 +25,12 @@ from Products.statusmessages.interfaces import IStatusMessage from ZODB.POSException import ConflictError from zope import schema -from zope.component import adapter +from zope.component import adapter, getUtility from zope.event import notify -from zope.interface import implementer -from zope.interface import Interface +from zope.interface import implementer, Interface from zope.lifecycleevent import ObjectCopiedEvent, modified - +from zope.intid.interfaces import IIntIds +from z3c.relationfield.relation import RelationValue def getLink(path): """ @@ -46,7 +43,6 @@ def getLink(path): return path.replace(URL.scheme + "://" + URL.netloc, "") return path - class ICopyAction(Interface): """Interface for the configurable aspects of a move action. From de9731681ff7c2045446547bcfd117bbf047467e Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 21 May 2025 17:19:52 +0300 Subject: [PATCH 36/45] lLinting --- eea/dexterity/indicators/contentrules/version.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 0eb961d..e504ab9 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -32,6 +32,7 @@ from zope.intid.interfaces import IIntIds from z3c.relationfield.relation import RelationValue + def getLink(path): """ Get link @@ -43,6 +44,7 @@ def getLink(path): return path.replace(URL.scheme + "://" + URL.netloc, "") return path + class ICopyAction(Interface): """Interface for the configurable aspects of a move action. From fc3fd1b1a8207ea2c56980f1df4038b16e2c8593 Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 21 May 2025 17:22:53 +0300 Subject: [PATCH 37/45] Linter --- eea/dexterity/indicators/contentrules/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index e504ab9..cfc7743 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -150,7 +150,7 @@ def __call__(self): obj.relatedItems = [relation] obj.reindexObject(idxs=["relatedItems"]) except Exception as e: - self.error(obj, f"Failed to relate copied object to original: {e}") + self.error(obj, str(e)) OFS.subscribers.compatibilityCall("manage_afterClone", obj, obj) From 160b093d66f69d784c908beaf76d74ce8cc1ee1f Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Tue, 27 May 2025 16:40:56 +0300 Subject: [PATCH 38/45] Stop using relatedItems and create new field, fix creating multiple drafts --- .../indicators/contentrules/actions.py | 14 +++++++--- .../indicators/contentrules/version.py | 26 ++++++++++++++++--- eea/dexterity/indicators/interfaces.py | 20 ++++++++++++++ 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/actions.py b/eea/dexterity/indicators/contentrules/actions.py index 7b9ffb9..9735393 100644 --- a/eea/dexterity/indicators/contentrules/actions.py +++ b/eea/dexterity/indicators/contentrules/actions.py @@ -65,10 +65,16 @@ def __call__(self): if not (old_id and new_id): return True try: - if old_id not in parent: - old_version = obj.relatedItems[0].to_object - obj.relatedItems = [] - obj.reindexObject(idxs=["relatedItems"]) + if ( + old_id not in parent + and hasattr(obj, 'original_parent') + and obj.original_parent + and hasattr(obj.original_parent[0], 'to_object') + and obj.original_parent[0].to_object + ): + old_version = obj.original_parent[0].to_object + obj.original_parent = [] + obj.reindexObject(idxs=["original_parent"]) else: old_version = parent[old_id] api.content.transition( diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index cfc7743..45cb896 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -15,6 +15,7 @@ from plone.contentrules.rule.interfaces import IRuleElementData from plone.restapi.serializer.utils import uid_to_url from plone.restapi.deserializer.utils import path2uid +from plone import api try: from plone.base.utils import pretty_title_or_id @@ -44,6 +45,25 @@ def getLink(path): return path.replace(URL.scheme + "://" + URL.netloc, "") return path +def draftExistsFor(originalObj): + catalog = api.portal.get_tool("portal_catalog") + intids = getUtility(IIntIds) + orig_id = intids.getId(originalObj) + + results = catalog.searchResults(portal_type="ims_indicator") + for brain in results: + obj = brain.getObject() + if obj == originalObj: + continue + + val = getattr(obj, "original_parent", None) + if not val: + continue + + if any(rel.to_id == orig_id for rel in val if rel): + return True + + return False class ICopyAction(Interface): """Interface for the configurable aspects of a move action. @@ -121,7 +141,7 @@ def __call__(self): old_id = obj.getId() new_id = self.generate_id(target, old_id) - if not new_id.endswith(".1"): + if not new_id.endswith(".1") or draftExistsFor(obj): # Version already exists, redirect to it - refs #279130 return True @@ -147,8 +167,8 @@ def __call__(self): try: intids = getUtility(IIntIds) relation = RelationValue(intids.getId(orig_obj)) - obj.relatedItems = [relation] - obj.reindexObject(idxs=["relatedItems"]) + obj.original_parent = [relation] + obj.reindexObject(idxs=["original_parent"]) except Exception as e: self.error(obj, str(e)) diff --git a/eea/dexterity/indicators/interfaces.py b/eea/dexterity/indicators/interfaces.py index 2feb049..16a015c 100644 --- a/eea/dexterity/indicators/interfaces.py +++ b/eea/dexterity/indicators/interfaces.py @@ -7,6 +7,7 @@ from plone.schema import JSONField, Tuple, Choice from plone.supermodel import model from plone.autoform import directives +from plone.app.z3cform.widget import RelatedItemsFieldWidget try: from plone.app.z3cform.widgets.select import SelectFieldWidget except ImportError: @@ -15,6 +16,7 @@ from zope.publisher.interfaces.browser import IDefaultBrowserLayer from zope.schema import Int +from z3c.relationfield.schema import RelationList, RelationChoice class IEeaDexterityIndicatorsLayer(IDefaultBrowserLayer): """Marker interface that defines a browser layer.""" @@ -42,6 +44,7 @@ class IIndicatorMetadata(model.Schema): "topics", "temporal_coverage", "geo_coverage", + "original_parent" ], ) @@ -76,6 +79,23 @@ class IIndicatorMetadata(model.Schema): default={"readOnly": True, "geolocation": []}, ) + original_parent = RelationList( + title=_("Original parent"), + value_type=RelationChoice( + title="Related", vocabulary="plone.app.vocabularies.Catalog" + ), + required=False, + missing_value=[], + + ) + + directives.widget( + "original_parent", + RelatedItemsFieldWidget, + pattern_options={ + "mode": "view", + }, + ) # # Supporting information # From 06d69edb02fc0f0323a014707d58d27b17b52239 Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Tue, 27 May 2025 16:44:53 +0300 Subject: [PATCH 39/45] Linter --- eea/dexterity/indicators/contentrules/actions.py | 10 +++++----- eea/dexterity/indicators/contentrules/version.py | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/actions.py b/eea/dexterity/indicators/contentrules/actions.py index 9735393..ac0944b 100644 --- a/eea/dexterity/indicators/contentrules/actions.py +++ b/eea/dexterity/indicators/contentrules/actions.py @@ -66,11 +66,11 @@ def __call__(self): return True try: if ( - old_id not in parent - and hasattr(obj, 'original_parent') - and obj.original_parent - and hasattr(obj.original_parent[0], 'to_object') - and obj.original_parent[0].to_object + old_id not in parent and + hasattr(obj, 'original_parent') and + obj.original_parent and + hasattr(obj.original_parent[0], 'to_object') and + obj.original_parent[0].to_object ): old_version = obj.original_parent[0].to_object obj.original_parent = [] diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 45cb896..3026aaa 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -46,6 +46,9 @@ def getLink(path): return path def draftExistsFor(originalObj): + """ + Check if an indicator has a draft aleardy created + """ catalog = api.portal.get_tool("portal_catalog") intids = getUtility(IIntIds) orig_id = intids.getId(originalObj) From 285f359eca571c3273b4dcc56d104584cfa23914 Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Tue, 27 May 2025 16:54:07 +0300 Subject: [PATCH 40/45] linting --- eea/dexterity/indicators/contentrules/version.py | 2 ++ eea/dexterity/indicators/interfaces.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 3026aaa..68431f5 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -45,6 +45,7 @@ def getLink(path): return path.replace(URL.scheme + "://" + URL.netloc, "") return path + def draftExistsFor(originalObj): """ Check if an indicator has a draft aleardy created @@ -68,6 +69,7 @@ def draftExistsFor(originalObj): return False + class ICopyAction(Interface): """Interface for the configurable aspects of a move action. diff --git a/eea/dexterity/indicators/interfaces.py b/eea/dexterity/indicators/interfaces.py index 16a015c..0f9c9c0 100644 --- a/eea/dexterity/indicators/interfaces.py +++ b/eea/dexterity/indicators/interfaces.py @@ -12,11 +12,11 @@ from plone.app.z3cform.widgets.select import SelectFieldWidget except ImportError: from z3c.form.browser.select import SelectFieldWidget +from z3c.relationfield.schema import RelationList, RelationChoice from zope.interface import provider, Interface from zope.publisher.interfaces.browser import IDefaultBrowserLayer from zope.schema import Int -from z3c.relationfield.schema import RelationList, RelationChoice class IEeaDexterityIndicatorsLayer(IDefaultBrowserLayer): """Marker interface that defines a browser layer.""" From 53cbd1f135bc1459ed528d3c7435623a1a3b23bf Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 28 May 2025 17:01:33 +0300 Subject: [PATCH 41/45] Make field a simple uid --- .../indicators/contentrules/actions.py | 12 ++++---- .../indicators/contentrules/version.py | 29 +++++++------------ eea/dexterity/indicators/interfaces.py | 20 ++++--------- 3 files changed, 21 insertions(+), 40 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/actions.py b/eea/dexterity/indicators/contentrules/actions.py index ac0944b..2dd3a56 100644 --- a/eea/dexterity/indicators/contentrules/actions.py +++ b/eea/dexterity/indicators/contentrules/actions.py @@ -17,6 +17,7 @@ from plone.app.contentrules.browser.formhelper import ( NullAddForm, ) +from plone.app.uuid.utils import uuidToObject from plone.contentrules.rule.interfaces import IExecutable, IRuleElementData from zope import schema from zope.component import adapter @@ -67,14 +68,11 @@ def __call__(self): try: if ( old_id not in parent and - hasattr(obj, 'original_parent') and - obj.original_parent and - hasattr(obj.original_parent[0], 'to_object') and - obj.original_parent[0].to_object + hasattr(obj, 'copied_from') and + obj.copied_from ): - old_version = obj.original_parent[0].to_object - obj.original_parent = [] - obj.reindexObject(idxs=["original_parent"]) + old_version = uuidToObject(obj.copied_from) + obj.copied_from = "" else: old_version = parent[old_id] api.content.transition( diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 68431f5..a816cab 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -48,25 +48,21 @@ def getLink(path): def draftExistsFor(originalObj): """ - Check if an indicator has a draft aleardy created + Check if an indicator has a draft already created. """ catalog = api.portal.get_tool("portal_catalog") - intids = getUtility(IIntIds) - orig_id = intids.getId(originalObj) - results = catalog.searchResults(portal_type="ims_indicator") - for brain in results: - obj = brain.getObject() - if obj == originalObj: - continue - - val = getattr(obj, "original_parent", None) - if not val: - continue + origUid = originalObj.UID() + import pdb + pdb.set_trace() + results = catalog.searchResults( + portal_type="ims_indicator", + copied_from=origUid, + ) - if any(rel.to_id == orig_id for rel in val if rel): + for brain in results: + if brain.UID != origUid and brain.getObject().copied_from == origUid: return True - return False @@ -170,10 +166,7 @@ def __call__(self): obj._postCopy(target, op=0) try: - intids = getUtility(IIntIds) - relation = RelationValue(intids.getId(orig_obj)) - obj.original_parent = [relation] - obj.reindexObject(idxs=["original_parent"]) + obj.copied_from = orig_obj.UID() except Exception as e: self.error(obj, str(e)) diff --git a/eea/dexterity/indicators/interfaces.py b/eea/dexterity/indicators/interfaces.py index 0f9c9c0..e40aa51 100644 --- a/eea/dexterity/indicators/interfaces.py +++ b/eea/dexterity/indicators/interfaces.py @@ -16,6 +16,7 @@ from zope.interface import provider, Interface from zope.publisher.interfaces.browser import IDefaultBrowserLayer from zope.schema import Int +from zope import schema class IEeaDexterityIndicatorsLayer(IDefaultBrowserLayer): @@ -44,7 +45,7 @@ class IIndicatorMetadata(model.Schema): "topics", "temporal_coverage", "geo_coverage", - "original_parent" + "copied_from" ], ) @@ -79,23 +80,12 @@ class IIndicatorMetadata(model.Schema): default={"readOnly": True, "geolocation": []}, ) - original_parent = RelationList( - title=_("Original parent"), - value_type=RelationChoice( - title="Related", vocabulary="plone.app.vocabularies.Catalog" - ), + copied_from = schema.TextLine( + title=_("Original Parent UID"), required=False, - missing_value=[], - ) - directives.widget( - "original_parent", - RelatedItemsFieldWidget, - pattern_options={ - "mode": "view", - }, - ) + directives.omitted("copied_from") # # Supporting information # From cd645be8b5b1ac6df0c9f19b18b0c16f7e9bec68 Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 28 May 2025 17:04:20 +0300 Subject: [PATCH 42/45] Linting --- eea/dexterity/indicators/contentrules/version.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index a816cab..525af54 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -26,12 +26,9 @@ from Products.statusmessages.interfaces import IStatusMessage from ZODB.POSException import ConflictError from zope import schema -from zope.component import adapter, getUtility from zope.event import notify from zope.interface import implementer, Interface from zope.lifecycleevent import ObjectCopiedEvent, modified -from zope.intid.interfaces import IIntIds -from z3c.relationfield.relation import RelationValue def getLink(path): @@ -53,8 +50,6 @@ def draftExistsFor(originalObj): catalog = api.portal.get_tool("portal_catalog") origUid = originalObj.UID() - import pdb - pdb.set_trace() results = catalog.searchResults( portal_type="ims_indicator", copied_from=origUid, From 06302fc686f46016fcea7e149006bd4e7acb2377 Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 28 May 2025 17:11:40 +0300 Subject: [PATCH 43/45] Linter --- eea/dexterity/indicators/contentrules/version.py | 1 + 1 file changed, 1 insertion(+) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index 525af54..c55c279 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -26,6 +26,7 @@ from Products.statusmessages.interfaces import IStatusMessage from ZODB.POSException import ConflictError from zope import schema +from zope.component import adapter from zope.event import notify from zope.interface import implementer, Interface from zope.lifecycleevent import ObjectCopiedEvent, modified From 561009c7e252460ef7e9092407e3c62ee26bc997 Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 28 May 2025 17:21:57 +0300 Subject: [PATCH 44/45] Linter --- eea/dexterity/indicators/interfaces.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/eea/dexterity/indicators/interfaces.py b/eea/dexterity/indicators/interfaces.py index e40aa51..2f9cb9f 100644 --- a/eea/dexterity/indicators/interfaces.py +++ b/eea/dexterity/indicators/interfaces.py @@ -7,12 +7,10 @@ from plone.schema import JSONField, Tuple, Choice from plone.supermodel import model from plone.autoform import directives -from plone.app.z3cform.widget import RelatedItemsFieldWidget try: from plone.app.z3cform.widgets.select import SelectFieldWidget except ImportError: from z3c.form.browser.select import SelectFieldWidget -from z3c.relationfield.schema import RelationList, RelationChoice from zope.interface import provider, Interface from zope.publisher.interfaces.browser import IDefaultBrowserLayer from zope.schema import Int From a46626e22600ea4cf498fdd169900b9dd0f2f815 Mon Sep 17 00:00:00 2001 From: narcis2005 Date: Wed, 28 May 2025 20:00:35 +0300 Subject: [PATCH 45/45] Check if attribute exists --- eea/dexterity/indicators/contentrules/version.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/eea/dexterity/indicators/contentrules/version.py b/eea/dexterity/indicators/contentrules/version.py index c55c279..a9b487b 100644 --- a/eea/dexterity/indicators/contentrules/version.py +++ b/eea/dexterity/indicators/contentrules/version.py @@ -57,8 +57,10 @@ def draftExistsFor(originalObj): ) for brain in results: - if brain.UID != origUid and brain.getObject().copied_from == origUid: - return True + if hasattr(brain, 'UID') and brain.UID != origUid: + obj = brain.getObject() + if hasattr(obj, 'copied_from') and obj.copied_from == origUid: + return True return False