[Testbot] Plone 4.3 - Python 2.6 - Build # 2738 - Regression! - 1 failure(s)

jenkins at plone.org jenkins at plone.org
Mon Feb 23 10:04:36 UTC 2015


-------------------------------------------------------------------------------
Plone 4.3 - Python 2.6 - Build # 2738 - Failure!
-------------------------------------------------------------------------------

http://jenkins.plone.org/job/plone-4.3-python-2.6/2738/


-------------------------------------------------------------------------------
CHANGES
-------------------------------------------------------------------------------

Repository: Products.CMFPlone
Branch: refs/heads/4.3.x
Date: 2015-02-23T10:27:05+01:00
Author: Godefroid Chapelle (gotcha) <gotcha at bubblenet.be>
Commit: https://github.com/plone/Products.CMFPlone/commit/371cee9e15a996660924045fb061a185af837e42

fix for https://dev.plone.org/ticket/13603

second part: delete through menu actions delete

Files changed:
M Products/CMFPlone/skins/plone_scripts/object_delete.cpy

diff --git a/Products/CMFPlone/skins/plone_scripts/object_delete.cpy b/Products/CMFPlone/skins/plone_scripts/object_delete.cpy
index b5e4673..0399472 100644
--- a/Products/CMFPlone/skins/plone_scripts/object_delete.cpy
+++ b/Products/CMFPlone/skins/plone_scripts/object_delete.cpy
@@ -18,7 +18,9 @@ REQUEST = context.REQUEST
 if REQUEST.get('REQUEST_METHOD', 'GET').upper() == 'GET':
     raise Unauthorized('This method can not be accessed using a GET request')
 
-parent = context.aq_inner.aq_parent
+parent_path = '/'.join(REQUEST.physicalPathFromURL(REQUEST.URL2))
+parent = context.restrictedTraverse(parent_path)
+
 title = safe_unicode(context.title_or_id())
 
 try:
@@ -35,6 +37,15 @@ else:
     authenticator = context.restrictedTraverse('@@authenticator', None)
     if not authenticator.verify():
         raise Forbidden
+
+    id = context.getId()
+    item = parent.get(id, parent)
+    if item == parent:
+        message = _(u'${title} does not exist and cannot be deleted.',
+                    mapping={u'title': title})
+        context.plone_utils.addPortalMessage(message, type='error')
+        return state.set(status='failure')
+
     parent.manage_delObjects(context.getId())
     message = _(u'${title} has been deleted.',
                 mapping={u'title': title})


Repository: Products.CMFPlone
Branch: refs/heads/4.3.x
Date: 2015-02-23T10:27:54+01:00
Author: Godefroid Chapelle (gotcha) <gotcha at bubblenet.be>
Commit: https://github.com/plone/Products.CMFPlone/commit/80b687fa2b99da528f77688c0e7fb45a88f3701c

add tests for https://dev.plone.org/ticket/13603

through menu Actions delete

Files changed:
M Products/CMFPlone/tests/test_ploneutils.py
M docs/CHANGES.rst

diff --git a/Products/CMFPlone/tests/test_ploneutils.py b/Products/CMFPlone/tests/test_ploneutils.py
index 461c71b..a4cb95f 100644
--- a/Products/CMFPlone/tests/test_ploneutils.py
+++ b/Products/CMFPlone/tests/test_ploneutils.py
@@ -1,6 +1,9 @@
 import unittest
+import re
 
 from Products.CMFPlone.testing import PRODUCTS_CMFPLONE_INTEGRATION_TESTING
+from plone.app.testing import setRoles
+from plone.app.testing import TEST_USER_ID
 
 
 class TestPloneTool(unittest.TestCase):
@@ -26,19 +29,83 @@ def test_deleteObjectsByPaths_relative_path_raises(self):
             handle_errors=False
         )
 
-    def test_deleteObjectsByPaths_wrongly_acquired_object(self):
+    def test_delete_wrongly_acquired_object_through_deleteObjectsByPaths(self):
         '''
-        Do not delete wrongly acquired object.
+        Do not delete wrongly acquired object through folder_contents
         See https://dev.plone.org/ticket/13603
+
         '''
-        self.portal.invokeFactory('Folder', 'a_page')
+        # prepare content
+        self.portal.invokeFactory('Document', 'a_page')
         self.assertTrue('a_page' in self.portal.objectIds())
-        a_page_folder = self.portal['a_page']
-        a_page_folder.invokeFactory('Document', 'a_page')
-        self.assertTrue('a_page' in a_page_folder.objectIds())
-        a_page = a_page_folder['a_page']
-        path = a_page.absolute_url_path()
+        self.portal.invokeFactory('Folder', 'a_folder')
+        a_folder = self.portal['a_folder']
+        a_folder.invokeFactory('Document', 'a_page')
+        self.assertTrue('a_page' in a_folder.objectIds())
+        a_page_in_folder = a_folder['a_page']
+        path = a_page_in_folder.absolute_url_path()
+
+        # first request to delete
         self.plone_utils.deleteObjectsByPaths([path])
-        self.assertFalse('a_page' in a_page_folder.objectIds())
+        self.assertFalse('a_page' in a_folder.objectIds())
+        self.assertTrue('a_page' in self.portal.objectIds())
+
+        # second request to delete
         self.plone_utils.deleteObjectsByPaths([path])
+        self.assertTrue(
+            'a_page' in self.portal.objectIds(),
+            'acquired content should not be deleted.'
+        )
+
+    def _get_authenticator(self):
+        url = '/plone/login_password'
+        login = self.portal.restrictedTraverse(url)
+        res = login()
+        m = re.search('name="_authenticator" value="([^"]*)"', res)
+        if m:
+            return m.group(1)
+        return ''
+
+    def test_delete_wrongly_acquired_object_through_object_delete(self):
+        '''
+        Do not delete wrongly acquired object through Actions Delete.
+        See https://dev.plone.org/ticket/13603
+        '''
+        setRoles(self.portal, TEST_USER_ID, ['Member', 'Manager'])
+
+        # prepare content
+        self.portal.invokeFactory('Document', 'a_page')
         self.assertTrue('a_page' in self.portal.objectIds())
+        self.portal.invokeFactory('Folder', 'a_folder')
+        a_folder = self.portal['a_folder']
+        a_folder.invokeFactory('Document', 'a_page')
+        self.assertTrue('a_page' in a_folder.objectIds())
+        a_page_in_folder = a_folder['a_page']
+
+        # prepare fake request
+        physical_path = list(a_page_in_folder.getPhysicalPath())
+        physical_path.append('object_delete')
+        url = '/'.join(physical_path)
+        request = self.layer['request']
+        request.set('URL', url)
+        url2 = '/'.join(physical_path[:-2])
+        request.set('URL2', url2)
+        request.environ['REQUEST_METHOD'] = 'POST'
+        csrf_token = self._get_authenticator()
+        request.form.update({
+            '_authenticator': csrf_token,
+        })
+
+        # simulate call to object_delete
+        object_delete = self.portal.restrictedTraverse(url)
+        object_delete()
+        self.assertFalse('a_page' in a_folder.objectIds())
+        self.assertTrue('a_page' in self.portal.objectIds())
+
+        # simulate second call to object_delete
+        object_delete = self.portal.restrictedTraverse(url)
+        object_delete()
+        self.assertTrue(
+            'a_page' in self.portal.objectIds(),
+            'acquired content should not be deleted.'
+        )
diff --git a/docs/CHANGES.rst b/docs/CHANGES.rst
index 7cdc1fc..8ff990e 100644
--- a/docs/CHANGES.rst
+++ b/docs/CHANGES.rst
@@ -8,6 +8,11 @@ Changelog
 4.3.5 (unreleased)
 ------------------
 
+- Fix: If a user "deletes" the same item twice (ex.: having two different tabs 
+  open and not realising it's already been deleted) any higher level item with 
+  the same short name will be deleted without trace. 
+  [gotcha]
+
 - Extended ulocalized_time for target_language
   [agitator]
 




-------------------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CHANGES.log
Type: application/octet-stream
Size: 6875 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20150223/1eea94eb/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: build.log
Type: application/octet-stream
Size: 95204 bytes
Desc: not available
URL: <http://lists.plone.org/pipermail/plone-testbot/attachments/20150223/1eea94eb/attachment-0003.obj>


More information about the Testbot mailing list