[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