[Checkins] SVN: Products.CMFCore/trunk/Products/CMFCore/ - PortalFolder: Ensure that pasting an object into a folder takes

Jens Vagelpohl jens at dataflake.org
Sun Nov 8 06:40:38 EST 2009


Log message for revision 105533:
  - PortalFolder: Ensure that pasting an object into a folder takes
    workflow instance creation conditions into account.
    (https://bugs.launchpad.net/zope-cmf/+bug/308947)
  

Changed:
  U   Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
  U   Products.CMFCore/trunk/Products/CMFCore/PortalFolder.py
  U   Products.CMFCore/trunk/Products/CMFCore/tests/test_PortalFolder.py

-=-
Modified: Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2009-11-08 11:26:18 UTC (rev 105532)
+++ Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2009-11-08 11:40:38 UTC (rev 105533)
@@ -4,6 +4,10 @@
 2.2.0 (unreleased)
 ------------------
 
+- PortalFolder: Ensure that pasting an object into a folder takes 
+  workflow instance creation conditions into account.
+  (https://bugs.launchpad.net/zope-cmf/+bug/308947)
+
 - Made calls to reindexObjectSecurity in the membership tool conditional
   after the CMFCatalogAware refactoring.
 

Modified: Products.CMFCore/trunk/Products/CMFCore/PortalFolder.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/PortalFolder.py	2009-11-08 11:26:18 UTC (rev 105532)
+++ Products.CMFCore/trunk/Products/CMFCore/PortalFolder.py	2009-11-08 11:40:38 UTC (rev 105533)
@@ -423,6 +423,12 @@
                     raise ValueError('Disallowed subobject type: %s'
                                         % type_name)
 
+                # Check for workflow guards
+                objType = pt.getTypeInfo(type_name)
+                if ( objType is not None and
+                     not objType._checkWorkflowAllowed(self) ):
+                    raise ValueError('Pasting not allowed in this workflow')
+
     security.setPermissionDefault(AddPortalContent, ('Owner','Manager'))
 
     security.declareProtected(AddPortalFolders, 'manage_addFolder')

Modified: Products.CMFCore/trunk/Products/CMFCore/tests/test_PortalFolder.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/tests/test_PortalFolder.py	2009-11-08 11:26:18 UTC (rev 105532)
+++ Products.CMFCore/trunk/Products/CMFCore/tests/test_PortalFolder.py	2009-11-08 11:40:38 UTC (rev 105533)
@@ -375,7 +375,46 @@
         # Now copy/paste should raise a ValueError
         cookie = sub1.manage_copyObjects( ids = ( 'dummy', ) )
         self.assertRaises( ValueError, sub2.manage_pasteObjects, cookie )
+        
+    def test_contentPasteFollowsWorkflowGuards(self):
+       #
+       # Copy/Paste should obey workflow guards
+       #
+       ttool = self.site._setObject( 'portal_types', TypesTool() )
+       fti = FTIDATA_DUMMY[0].copy()
+       ttool._setObject( 'Dummy Content', FTI(**fti) )
+       ttool._setObject( 'Folder', FTI(**fti) )
+       folder = self._makeOne('folder', 'Folder')
+       content = self._makeOne('content')
+       folder._setObject('content', content)
 
+       # Allow adding of Dummy Content
+       ttool.Folder.manage_changeProperties(filter_content_types=False)
+
+       # Copy/paste verification should work fine
+       folder._verifyObjectPaste( content )
+
+       # Add a workflow with a blocking guard
+       # Based on TypesTools tests
+       class DummyWorkflow:
+           
+           _allow = False
+
+           def allowCreate(self, container, type_id):
+               return self._allow
+       
+       class DummyWorkflowTool:
+
+           def __init__(self):
+               self._workflows = [DummyWorkflow()]
+
+           def getWorkflowsFor(self, type_id):
+               return self._workflows
+      
+       # Now copy/paste verification should raise a ValueError
+       self.site.portal_workflow = DummyWorkflowTool()
+       self.assertRaises( ValueError, folder._verifyObjectPaste, content )
+
     def test_setObjectRaisesBadRequest(self):
         #
         #   _setObject() should raise BadRequest on duplicate id



More information about the checkins mailing list