[Checkins] SVN: Products.CMFCore/trunk/Products/CMFCore/ - refactored createMemberArea using a standard factory

Yvo Schubbe cvs-admin at zope.org
Fri Jul 26 14:11:22 CEST 2013


Log message for revision 130274:
  - refactored createMemberArea using a standard factory
    (this should not change any behavior)

Changed:
  U   Products.CMFCore/trunk/Products/CMFCore/MembershipTool.py
  U   Products.CMFCore/trunk/Products/CMFCore/content.zcml
  U   Products.CMFCore/trunk/Products/CMFCore/tests/test_MembershipTool.py

-=-
Modified: Products.CMFCore/trunk/Products/CMFCore/MembershipTool.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/MembershipTool.py	2013-07-25 14:53:01 UTC (rev 130273)
+++ Products.CMFCore/trunk/Products/CMFCore/MembershipTool.py	2013-07-26 12:11:21 UTC (rev 130274)
@@ -31,8 +31,10 @@
 from ZODB.POSException import ConflictError
 from zope.component import getUtility
 from zope.component import queryUtility
+from zope.component.interfaces import IFactory
 from zope.globalrequest import getRequest
-from zope.interface import implements
+from zope.interface import implementedBy
+from zope.interface import implementer
 from ZPublisher.BaseRequest import RequestContainer
 
 from Products.CMFCore.exceptions import AccessControl_Unauthorized
@@ -42,6 +44,7 @@
 from Products.CMFCore.interfaces import IMembershipTool
 from Products.CMFCore.interfaces import IRegistrationTool
 from Products.CMFCore.interfaces import ISiteRoot
+from Products.CMFCore.interfaces import ITypesTool
 from Products.CMFCore.permissions import AccessContentsInformation
 from Products.CMFCore.permissions import ChangeLocalRoles
 from Products.CMFCore.permissions import ListPortalMembers
@@ -49,14 +52,17 @@
 from Products.CMFCore.permissions import ManageUsers
 from Products.CMFCore.permissions import SetOwnPassword
 from Products.CMFCore.permissions import View
+from Products.CMFCore.PortalFolder import PortalFolder
 from Products.CMFCore.utils import _checkPermission
 from Products.CMFCore.utils import _dtmldir
+from Products.CMFCore.utils import Message as _
 from Products.CMFCore.utils import registerToolInterface
 from Products.CMFCore.utils import UniqueObject
 
 logger = logging.getLogger('CMFCore.MembershipTool')
 
 
+ at implementer(IMembershipTool)
 class MembershipTool(UniqueObject, Folder):
 
     """ This tool accesses member data through an acl_users object.
@@ -65,11 +71,10 @@
     different way.
     """
 
-    implements(IMembershipTool)
-
     id = 'portal_membership'
     meta_type = 'CMF Membership Tool'
     memberareaCreationFlag = 1
+    _MEMBERAREA_FACTORY_NAME = 'cmf.memberarea.bbb1'
 
     security = ClassSecurityInfo()
 
@@ -263,20 +268,22 @@
             member_id = member.getId()
         if hasattr(aq_base(members), member_id):
             return None
-        else:
-            f_title = "%s's Home" % member_id
-            members.manage_addPortalFolder(id=member_id, title=f_title)
-            f = getattr(members, member_id)
 
-            f.manage_permission(View,
-                                ['Owner', 'Manager', 'Reviewer'], 0)
-            f.manage_permission(AccessContentsInformation,
-                                ['Owner', 'Manager', 'Reviewer'], 0)
+        factory_name = self._MEMBERAREA_FACTORY_NAME
+        portal_type_name = 'Folder'
+        ttool = queryUtility(ITypesTool)
+        if ttool is not None:
+            portal_type = ttool.getTypeInfo('Member Area')
+            if portal_type is not None:
+                factory_name = portal_type.factory
+                portal_type_name = portal_type.getId()
 
-            # Grant Ownership and Owner role to Member
-            f.changeOwnership(member)
-            f.__ac_local_roles__ = None
-            f.manage_setLocalRoles(member_id, ['Owner'])
+        factory = getUtility(IFactory, factory_name)
+        obj = factory(id=member_id)
+        obj._setPortalTypeName(portal_type_name)
+        members._setObject(member_id, obj)
+        f = members._getOb(member_id)
+        f.changeOwnership(member)
         return f
 
     security.declarePublic('createMemberarea')
@@ -533,3 +540,30 @@
 
 InitializeClass(MembershipTool)
 registerToolInterface('portal_membership', IMembershipTool)
+
+
+ at implementer(IFactory)
+class _BBBMemberAreaFactory(object):
+
+    """Creates a member area.
+    """
+
+    title = _(u'Member Area')
+    description = _(u'Classic CMFCore home folder for portal members.')
+
+    def __call__(self, id, title=None, *args, **kw):
+        if title is None:
+            title = "{0}'s Home".format(id)
+        item = PortalFolder(id, title, *args, **kw)
+        item.manage_setLocalRoles(id, ['Owner'])
+
+        item.manage_permission(View,
+                               ['Owner', 'Manager', 'Reviewer'], 0)
+        item.manage_permission(AccessContentsInformation,
+                               ['Owner', 'Manager', 'Reviewer'], 0)
+        return item
+
+    def getInterfaces(self):
+        return implementedBy(PortalFolder)
+
+BBBMemberAreaFactory = _BBBMemberAreaFactory()

Modified: Products.CMFCore/trunk/Products/CMFCore/content.zcml
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/content.zcml	2013-07-25 14:53:01 UTC (rev 130273)
+++ Products.CMFCore/trunk/Products/CMFCore/content.zcml	2013-07-26 12:11:21 UTC (rev 130274)
@@ -18,6 +18,11 @@
       name="cmf.folder"
       />
 
+  <utility
+      component=".MembershipTool.BBBMemberAreaFactory"
+      name="cmf.memberarea.bbb1"
+      />
+
   <five:registerClass
       class=".CMFBTreeFolder.CMFBTreeFolder"
       meta_type="CMF BTree Folder"

Modified: Products.CMFCore/trunk/Products/CMFCore/tests/test_MembershipTool.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/tests/test_MembershipTool.py	2013-07-25 14:53:01 UTC (rev 130273)
+++ Products.CMFCore/trunk/Products/CMFCore/tests/test_MembershipTool.py	2013-07-26 12:11:21 UTC (rev 130274)
@@ -19,6 +19,7 @@
 from AccessControl.SecurityManagement import newSecurityManager
 from OFS.Folder import Folder
 from zope.component import getSiteManager
+from zope.component.interfaces import IFactory
 from zope.interface.verify import verifyClass
 from zope.testing.cleanup import cleanUp
 
@@ -164,9 +165,13 @@
         return site
 
     def setUp(self):
+        from Products.CMFCore.MembershipTool import BBBMemberAreaFactory
+
         SecurityTest.setUp(self)
         sm = getSiteManager()
         sm.registerUtility(DummyTool(), IWorkflowTool)
+        sm.registerUtility(BBBMemberAreaFactory, IFactory,
+                           'cmf.memberarea.bbb1')
 
     def tearDown(self):
         cleanUp()
@@ -211,7 +216,7 @@
 
     def test_createMemberAreaCMFBTreeFolder(self):
         # Test member area creation if the toplevel "Members" folder is
-        # a CMFBTreeFolder (http://www.zope.org/Collectors/CMF/441
+        # a CMFBTreeFolder (https://bugs.launchpad.net/zope-cmf/+bug/161668)
         site = self._makeSite()
         mtool = site.portal_membership
         members = site._setObject('Members', CMFBTreeFolder('Members'))



More information about the checkins mailing list