Skip to content

Commit

Permalink
Replaced container cloned event by moved event to handle rename, copy…
Browse files Browse the repository at this point in the history
…/paste and cut/paste of a container in the path
  • Loading branch information
sgeulette committed Feb 16, 2024
1 parent 2b3b10d commit 725f3e9
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 9 deletions.
4 changes: 2 additions & 2 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ Changelog
0.65 (unreleased)
-----------------

- Nothing changed yet.

- Replaced container cloned event by moved event to handle rename, copy/paste and cut/paste of a container in the path.
[sgeulette]

0.64 (2024-02-08)
-----------------
Expand Down
1 change: 1 addition & 0 deletions buildout.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ zc.lockfile = 2.0
plone.formwidget.namedfile = 2.0.5
pep517 = 0.8.2
eea.facetednavigation = 14.7
backports.functools-lru-cache = 1.5
# Required by:
# z3c.unconfigure = 1.1
zope.configuration = 3.8.1
Expand Down
8 changes: 4 additions & 4 deletions src/collective/iconifiedcategory/content/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,14 @@

<subscriber
for="plone.dexterity.interfaces.IDexterityContent
OFS.interfaces.IObjectClonedEvent"
handler=".events.categorized_content_container_cloned"
zope.lifecycleevent.interfaces.IObjectMovedEvent"
handler=".events.categorized_content_container_moved"
/>

<subscriber
for="Products.Archetypes.interfaces.base.IBaseObject
OFS.interfaces.IObjectClonedEvent"
handler=".events.categorized_content_container_cloned"
zope.lifecycleevent.interfaces.IObjectMovedEvent"
handler=".events.categorized_content_container_moved"
/>

<subscriber
Expand Down
15 changes: 13 additions & 2 deletions src/collective/iconifiedcategory/content/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from zExceptions import Redirect
from zope.component import getAdapter
from zope.event import notify
from zope.lifecycleevent import IObjectRemovedEvent


def categorized_content_created(obj, event):
Expand Down Expand Up @@ -166,10 +167,20 @@ def categorized_content_removed(event):
utils.remove_categorized_element(obj.aq_parent, obj)


def categorized_content_container_cloned(container, event):
def categorized_content_container_moved(container, event):
"""Update all categorized_elements when a parent object is renamed or pasted"""
if IObjectRemovedEvent.providedBy(event):
return
if container.REQUEST.get('defer_update_categorized_elements', False):
return
utils.update_all_categorized_elements(container)
pc = api.portal.get_tool('portal_catalog')
brains = pc.unrestrictedSearchResults(
path={'query': '/'.join(container.getPhysicalPath())},
object_provides='collective.iconifiedcategory.behaviors.iconifiedcategorization.IIconifiedCategorizationMarker'
)
parents = {b._unrestrictedGetObject().aq_parent for b in brains}
for parent in parents:
utils.update_all_categorized_elements(container)


def category_before_remove(obj, event):
Expand Down
24 changes: 23 additions & 1 deletion src/collective/iconifiedcategory/tests/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def test_categorized_elements_correct_after_copy_paste_categorized_content(self)
self.assertTrue(img_obj_UID in self.portal.categorized_elements)
self.assertTrue(new_file_UID in self.portal.categorized_elements)

def test_categorized_elements_correct_after_copy_paste_categorized_content_container(self):
def test_categorized_elements_correct_after_moving_categorized_content_container(self):
container = api.content.create(
id='folder',
type='Folder',
Expand Down Expand Up @@ -92,12 +92,17 @@ def test_categorized_elements_correct_after_copy_paste_categorized_content_conta
self.assertEquals(len(container.categorized_elements), 2)
self.assertTrue(file_obj1_UID in container.categorized_elements)
self.assertTrue(file_obj2_UID in container.categorized_elements)
# check original categorized_elements
self.assertListEqual([dic['relative_url'] for dic in container.categorized_elements.values()],
['folder/file1', 'folder/file2'])

# copy/paste the container
copied_data = self.portal.manage_copyObjects(ids=[container.getId()])
infos = self.portal.manage_pasteObjects(copied_data)
new_container = self.portal[infos[0]['new_id']]
self.assertEquals(len(new_container.categorized_elements), 2)
self.assertListEqual([dic['relative_url'] for dic in new_container.categorized_elements.values()],
['copy_of_folder/file1', 'copy_of_folder/file2'])
# old no more referenced
self.assertTrue(file_obj1_UID not in new_container.categorized_elements)
self.assertTrue(file_obj2_UID not in new_container.categorized_elements)
Expand All @@ -106,6 +111,23 @@ def test_categorized_elements_correct_after_copy_paste_categorized_content_conta
copied_file2 = new_container['file2']
self.assertTrue(copied_file1.UID() in new_container.categorized_elements)
self.assertTrue(copied_file2.UID() in new_container.categorized_elements)
# rename the container
api.content.rename(obj=new_container, new_id='new_folder')
self.assertEquals(len(new_container.categorized_elements), 2)
self.assertListEqual([dic['relative_url'] for dic in new_container.categorized_elements.values()],
['new_folder/file1', 'new_folder/file2'])
# cut/paste the container
copied_data = self.portal.manage_cutObjects(ids=[new_container.getId()])
infos = container.manage_pasteObjects(copied_data)
new_container = container[infos[0]['new_id']]
self.assertEquals(len(container.categorized_elements), 2)
self.assertListEqual([dic['relative_url'] for dic in new_container.categorized_elements.values()],
['folder/new_folder/file1', 'folder/new_folder/file2'])
# rename the top level container, check the deepest
api.content.rename(obj=container, new_id='top_folder')
self.assertEquals(len(new_container.categorized_elements), 2)
self.assertListEqual([dic['relative_url'] for dic in new_container.categorized_elements.values()],
['top_folder/new_folder/file1', 'top_folder/new_folder/file2'])

def test_defer_categorized_content_created_event(self):
"""Test that when defering management of the entire
Expand Down

0 comments on commit 725f3e9

Please sign in to comment.