Skip to content

Commit

Permalink
Handle objects that get moved after beeing added to a container
Browse files Browse the repository at this point in the history
  • Loading branch information
buchi committed Jun 26, 2018
1 parent 939b29a commit f112d1c
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
14 changes: 11 additions & 3 deletions src/plone/restapi/services/content/utils.py
Expand Up @@ -3,6 +3,8 @@
from Acquisition import aq_parent
from DateTime import DateTime
from plone.app.content.interfaces import INameFromTitle
from plone.app.uuid.utils import uuidToObject
from plone.uuid.interfaces import IUUID
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.utils import base_hasattr
from random import randint
Expand Down Expand Up @@ -76,9 +78,15 @@ def add(container, obj):
notifyContainerModified(container)
return obj
else:
rval = container._setObject(id_, obj)
new_id = isinstance(rval, basestring) and rval or id_
return container._getOb(new_id)
new_id = container._setObject(id_, obj)
# _setObject triggers ObjectAddedEvent which can end up triggering a
# content rule to move the item to a different container. In this case
# look up the object by UUID.
try:
return container._getOb(new_id)
except AttributeError:
uuid = IUUID(obj)
return uuidToObject(uuid)


def rename(obj):
Expand Down
19 changes: 19 additions & 0 deletions src/plone/restapi/tests/test_content_utils.py
Expand Up @@ -9,6 +9,10 @@
from plone.restapi.testing import PLONE_RESTAPI_DX_INTEGRATION_TESTING
from Products.CMFPlone.interfaces import ISelectableConstrainTypes
from zExceptions import Unauthorized
from zope.component import getGlobalSiteManager
from zope.event import notify
from zope.lifecycleevent import ObjectCreatedEvent
from zope.lifecycleevent.interfaces import IObjectAddedEvent

import unittest

Expand Down Expand Up @@ -110,11 +114,26 @@ def setUp(self):
'Folder', id='folder', title='My Folder'
)]
self.obj = create(self.folder, 'Document', 'my-document')
notify(ObjectCreatedEvent(self.obj))

def test_add_content_to_container(self):
obj = add(self.folder, self.obj)
self.assertEqual(aq_parent(obj), self.folder)

def test_add_content_to_container_and_move_on_added_event(self):
sm = getGlobalSiteManager()

def move_object(event):
self.portal.manage_pasteObjects(
cb_copy_data=self.folder.manage_cutObjects(
ids=['my-document']))
sm.registerHandler(move_object, (IObjectAddedEvent,))

obj = add(self.folder, self.obj)
self.assertEqual(aq_parent(obj), self.portal)

sm.unregisterHandler(move_object, (IObjectAddedEvent,))


class TestATAddContent(unittest.TestCase):

Expand Down

0 comments on commit f112d1c

Please sign in to comment.