[Checkins] SVN: Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/ adapterise the memberdata tool to allow customisation of the memberdata class

Miles Waller miles at jamkit.com
Mon Mar 23 06:28:21 EDT 2009


Log message for revision 98307:
  adapterise the memberdata tool to allow customisation of the memberdata class

Changed:
  U   Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/CHANGES.txt
  U   Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/MemberDataTool.py
  U   Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/content.zcml
  U   Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/tests/test_MemberDataTool.py

-=-
Modified: Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/CHANGES.txt
===================================================================
--- Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/CHANGES.txt	2009-03-23 10:19:37 UTC (rev 98306)
+++ Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/CHANGES.txt	2009-03-23 10:28:21 UTC (rev 98307)
@@ -4,7 +4,11 @@
 2.2.0 (unreleased)
 ------------------
 
-- PortalCatalog: Changed to use a multi-adaptor to allow a pluggable
+- MemberDataTool: Register an adapter for creation of MemberData.  This 
+  will allow other applications to provide custom MemberData without needing 
+  to provide their own implementation of the tool itself.
+
+- CatalogTool: Changed to use a multi-adaptor to allow a pluggable
   IndexableObjectWrapper class.  Objects that implement IIndexableObject
   are not wrapped.  The change will assist in integrating with
   other indexing strategies from third-party packages.

Modified: Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/MemberDataTool.py
===================================================================
--- Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/MemberDataTool.py	2009-03-23 10:19:37 UTC (rev 98306)
+++ Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/MemberDataTool.py	2009-03-23 10:28:21 UTC (rev 98307)
@@ -23,6 +23,8 @@
 from OFS.PropertyManager import PropertyManager
 from OFS.SimpleItem import SimpleItem
 from zope.interface import implements
+from zope.component.factory import Factory
+from zope.component import queryUtility
 from ZPublisher.Converters import type_converters
 
 from Products.CMFCore.exceptions import BadRequest
@@ -194,7 +196,8 @@
         members = self._members
         if not id in members:
             base = aq_base(self)
-            members[id] = MemberData(base, id)
+            factory = queryUtility(IMemberData, default=MemberData)
+            members[id] = factory(base, id)
         # Return a wrapper with self as containment and
         # the user as context.
         return members[id].__of__(self).__of__(u)
@@ -405,3 +408,4 @@
     # deprecated for use with CMF applications.
 
 InitializeClass(MemberData)
+MemberDataFactory = Factory(MemberData)

Modified: Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/content.zcml
===================================================================
--- Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/content.zcml	2009-03-23 10:19:37 UTC (rev 98306)
+++ Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/content.zcml	2009-03-23 10:28:21 UTC (rev 98307)
@@ -36,4 +36,9 @@
       provides=".interfaces.IIndexableObject"
       factory=".CatalogTool.IndexableObjectWrapper" />
 
+  <!-- factory for MemberData objects -->
+  <utility
+      component=".MemberDataTool.MemberDataFactory"
+      />
+
 </configure>

Modified: Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/tests/test_MemberDataTool.py
===================================================================
--- Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/tests/test_MemberDataTool.py	2009-03-23 10:19:37 UTC (rev 98306)
+++ Products.CMFCore/branches/miwa-adapterise-memberdata/Products/CMFCore/tests/test_MemberDataTool.py	2009-03-23 10:28:21 UTC (rev 98307)
@@ -60,11 +60,19 @@
     def getDomains(self):
         return self.domains
 
+    def getId(self):
+        return self.name
 
+
 class DummyMemberDataTool(Acquisition.Implicit):
     pass
 
+class DummyMemberData(Acquisition.Implicit):
 
+    def __init__(self, tool, id):
+        self.id = id
+        self.tool = tool
+
 class MemberDataToolTests(unittest.TestCase):
 
     def _makeOne(self, *args, **kw):
@@ -120,7 +128,57 @@
         self.assertEqual(info_dict['member_count'], 0)
         self.assertEqual(info_dict['orphan_count'], 0)
 
+    def test_wrapUser(self):
+        # test using the factory to create memberdata
+        from Products.CMFCore.interfaces import IMemberData
+        from Acquisition import aq_parent, aq_inner
+        from zope.component import getSiteManager
+      
+        pm = self._makeOne()
+        u = DummyUser('username','password',[],[] )
 
+        def memberfactory(tool, id):
+            return DummyMemberData(tool, id)
+
+        sm = getSiteManager()
+        sm.registerUtility(memberfactory, IMemberData)
+
+        result = pm.wrapUser(u)
+
+        # check we got the right vars and output class
+        self.assertEqual(result.tool, pm)
+        self.assertEqual(result.id, 'username')
+        self._assert(isinstance(result, DummyMemberData)
+        # check acquisition context is made right
+        self.assertEqual(aq_parent(aq_inner(result)), pm)
+        self.assertEqual(aq_parent(result), u)
+
+    def test_wrapUser2(self):
+        from Products.CMFCore.interfaces import IMemberData
+        from Products.CMFCore.MemberDataTool import MemberData
+        from Acquisition import aq_parent, aq_inner
+
+        pm = self._makeOne()
+        u = DummyUser('username','password',[],[] )
+        result = pm.wrapUser(u)
+
+        # check we got the default class
+        self._assert(isInstance(result, MemberData))
+        # check acquisition context is made right
+        self.assertEqual(aq_parent(aq_inner(result)), pm)
+        self.assertEqual(aq_parent(result), u)
+
+
+class MemberDataFactoryTests(unittest.TestCase):
+
+    def test_interfaces(self):
+        from Products.CMFCore.MemberDataTool import MemberDataFactory
+        from Products.CMFCore.interfaces import IMemberData
+        from zope.component import IFactory
+
+        verifyClass(IFactory, MemberDataFactory)
+        verifyClass(IMemberData, MemberDataFactory)
+
 class MemberDataTests(unittest.TestCase):
 
     def _makeOne(self, *args, **kw):



More information about the Checkins mailing list