[Zope-CMF] Re: Conflict between PortalFolder and CMFBTreeFolder

Christian Heimes christian at cheimes.de
Mon Jun 20 13:15:32 EDT 2005


yuppie wrote:
> PortalFolder is not just a base class, it's *the* folder class used in 
> CMFDefault. Subclasses can mix in OrderSupport, but that has no effect 
> on PortalFolder instances.

Oh you are right. I had in mind that all content types are declared in 
CMFDefault. In this case I have to retract my proposal.

> That's not fair. You are free to ignore CMF development for years, but 
> you can't make other people pay for that. Upgrading from 1.5.x to the 
> latest 1.5 version has to work without *any* trouble.

I'm sorry but I'm a little bit nervous. I have to get Plone 2.1 up and 
running on CMF 1.5 until saturday or Plone 2.1 will stay on CMF 1.4.

> manage_renameObject is the only method that overrides Folder behavior. 
> Defunct IOrderedContainer methods should not be a big problem. After all 
> we are still in Zope 2 land with tons of inherited useless methods.
> 
> 
> I'm open for any proposal that adds a *new* base class for CMF folders.

I have another idea. The patch is attached to this mail. In short terms 
I have renamed PortalFolder to PortalFolderBase subclassed of Folder and 
created a new PortalFolder class subclassed from OrderedFolder. 
PortalFolderBase contains nearly all code from PortalFolder. This way it 
is easy to subclass from PortalFolderBase w/o ordered support.

class PortalFolderBase(DynamicType, CMFCatalogAware, Folder):

class PortalFolder(PortalFolderBase, OrderedFolder):
     manage_renameObject = OrderedFolder.manage_renameObject.im_func
     tpValues = OrderedFolder.tpValues.im_func


All tests are running fine.

Christian
-------------- next part --------------
Index: CMFCore/PortalFolder.py
===================================================================
RCS file: /cvs-repository/Products/CMFCore/PortalFolder.py,v
retrieving revision 1.71.2.8
diff -u -r1.71.2.8 PortalFolder.py
--- CMFCore/PortalFolder.py	14 Jun 2005 16:39:33 -0000	1.71.2.8
+++ CMFCore/PortalFolder.py	20 Jun 2005 17:10:54 -0000
@@ -26,6 +26,7 @@
 from Globals import DTMLFile
 from Globals import InitializeClass
 from OFS.OrderedFolder import OrderedFolder
+from OFS.Folder import Folder
 
 from CMFCatalogAware import CMFCatalogAware
 from DynamicType import DynamicType
@@ -96,22 +97,19 @@
 )
 
 
-class PortalFolder(DynamicType, CMFCatalogAware, OrderedFolder):
+class PortalFolderBase(DynamicType, CMFCatalogAware, Folder):
+    """Base class for portal folder
     """
-        Implements portal content management, but not UI details.
-    """
-    meta_type = 'Portal Folder'
-    portal_type = 'Folder'
+    meta_type = 'Portal Folder Base'
 
-    __implements__ = (IFolderish, DynamicType.__implements__,
-                      OrderedFolder.__implements__)
+    __implements__ = (IFolderish, DynamicType.__implements__, Folder.__implements__)
 
     security = ClassSecurityInfo()
 
     description = ''
-
-    manage_options = ( OrderedFolder.manage_options +
-                       CMFCatalogAware.manage_options )
+    
+    manage_options = ( Folder.manage_options +
+                       CMFCatalogAware.manage_options )  
 
     def __init__( self, id, title='' ):
         self.id = id
@@ -165,15 +163,6 @@
                           typ.isConstructionAllowed( container )
                      , result )
 
-    security.declareProtected(AddPortalFolders, 'manage_addPortalFolder')
-    def manage_addPortalFolder(self, id, title='', REQUEST=None):
-        """Add a new PortalFolder object with id *id*.
-        """
-        ob = PortalFolder(id, title)
-        self._setObject(id, ob)
-        if REQUEST is not None:
-            return self.folder_contents( # XXX: ick!
-                self, REQUEST, portal_status_message="Folder added")
 
     def _morphSpec(self, spec):
         '''
@@ -433,7 +422,7 @@
         self.manage_addFolder( id=id, title='' )
 
     def _checkId(self, id, allow_dup=0):
-        PortalFolder.inheritedAttribute('_checkId')(self, id, allow_dup)
+        PortalFolderBase.inheritedAttribute('_checkId')(self, id, allow_dup)
 
         if allow_dup:
             return
@@ -533,7 +522,7 @@
 
         # Call OFS' _verifyObjectPaste if necessary
         if not securityChecksDone:
-            PortalFolder.inheritedAttribute(
+            PortalFolderBase.inheritedAttribute(
                 '_verifyObjectPaste')(self, object, validate_src)
 
         # Finally, check allowed content types
@@ -551,7 +540,6 @@
                                         % type_name)
 
     security.setPermissionDefault(AddPortalContent, ('Owner','Manager'))
-    security.setPermissionDefault(AddPortalFolders, ('Owner','Manager'))
 
     security.declareProtected(AddPortalFolders, 'manage_addFolder')
     def manage_addFolder( self
@@ -581,6 +569,37 @@
 
         if REQUEST is not None:
             return self.manage_main(self, REQUEST, update_menu=1)
+
+InitializeClass(PortalFolderBase)
+
+
+class PortalFolder(PortalFolderBase, OrderedFolder):
+    """
+        Implements portal content management, but not UI details.
+    """
+    meta_type = 'Portal Folder'
+    portal_type = 'Folder'
+
+    __implements__ = (PortalFolderBase.__implements__,
+                      OrderedFolder.__implements__)
+
+    security = ClassSecurityInfo()
+
+    manage_options = ( OrderedFolder.manage_options +
+                       CMFCatalogAware.manage_options )
+
+    security.declareProtected(AddPortalFolders, 'manage_addPortalFolder')
+    def manage_addPortalFolder(self, id, title='', REQUEST=None):
+        """Add a new PortalFolder object with id *id*.
+        """
+        ob = PortalFolder(id, title)
+        self._setObject(id, ob)
+        if REQUEST is not None:
+            return self.folder_contents( # XXX: ick!
+                self, REQUEST, portal_status_message="Folder added")
+                
+    manage_renameObject = OrderedFolder.manage_renameObject.im_func
+    tpValues = OrderedFolder.tpValues.im_func
 
 InitializeClass(PortalFolder)
 


More information about the Zope-CMF mailing list