[Checkins] SVN: Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/ first cut at catalog adapter

Miles Waller miles at jamkit.com
Fri Mar 13 14:56:15 EDT 2009


Log message for revision 98041:
  first cut at catalog adapter

Changed:
  U   Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/CHANGES.txt
  U   Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/CatalogTool.py
  U   Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/configure.zcml
  U   Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/testing.py
  U   Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/tests/test_CatalogTool.py

-=-
Modified: Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/CHANGES.txt
===================================================================
--- Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/CHANGES.txt	2009-03-13 17:34:54 UTC (rev 98040)
+++ Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/CHANGES.txt	2009-03-13 18:56:15 UTC (rev 98041)
@@ -4,6 +4,10 @@
 2.2.0 (unreleased)
 ------------------
 
+- PortalCatalog: Changed to use a multi-adaptor to allow pluggable
+  IndexableObjectWrapper class.  The change will assist in integrating with
+  other indexing strategies from third-party packages.
+
 - Events: Changed 'handleContentishEvent' behavior for IObjectCopiedEvent.
   'WorkflowTool.notifyCreated' no longer resets the workflow state, so the
   the event subscriber clears the workflow history instead.

Modified: Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/CatalogTool.py
===================================================================
--- Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/CatalogTool.py	2009-03-13 17:34:54 UTC (rev 98040)
+++ Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/CatalogTool.py	2009-03-13 18:56:15 UTC (rev 98041)
@@ -43,9 +43,13 @@
 from Products.CMFCore.utils import getToolByName
 from Products.CMFCore.utils import UniqueObject
 
+from zope.component import getMultiAdapter
 
 class IndexableObjectSpecification(ObjectSpecificationDescriptor):
 
+    # This class makes the wrapper transparent, adapter lookup is
+    # carried out based on the interfaces of the wrapped object. 
+
     def __get__(self, inst, cls=None):
         if inst is None:
             return getObjectSpecification(cls)
@@ -60,8 +64,11 @@
     implements(IIndexableObjectWrapper)
     __providedBy__ = IndexableObjectSpecification()
 
-    def __init__(self, vars, ob):
-        self.__vars = vars
+    def __init__(self, ob, catalog):
+        # look up the workflow variables for the object
+        wftool = getToolByName(catalog, 'portal_workflow', None)
+        if wftool is not None:
+            self.__vars = wftool.getCatalogVariablesFor(ob)
         self.__ob = ob
 
     def __str__(self):
@@ -246,12 +253,7 @@
         # information just before cataloging.
         # XXX: this method violates the rules for tools/utilities:
         # it depends on a non-utility tool
-        wftool = getToolByName(self, 'portal_workflow', None)
-        if wftool is not None:
-            vars = wftool.getCatalogVariablesFor(obj)
-        else:
-            vars = {}
-        w = IndexableObjectWrapper(vars, obj)
+        w = getMultiAdapter((object, self), IIndexableObjectWrapper)
         ZCatalog.catalog_object(self, w, uid, idxs, update_metadata,
                                 pghandler)
 

Modified: Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/configure.zcml
===================================================================
--- Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/configure.zcml	2009-03-13 17:34:54 UTC (rev 98040)
+++ Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/configure.zcml	2009-03-13 18:56:15 UTC (rev 98041)
@@ -13,4 +13,6 @@
 
   <include file="tool.zcml"/>
 
+  <include file="implements.zcml"/>
+
 </configure>

Modified: Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/testing.py
===================================================================
--- Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/testing.py	2009-03-13 17:34:54 UTC (rev 98040)
+++ Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/testing.py	2009-03-13 18:56:15 UTC (rev 98041)
@@ -131,6 +131,7 @@
         zcml.load_config('traversing.zcml', Products.Five)
         zcml.load_config('event.zcml', Products.Five)
         zcml.load_config('event.zcml', Products.CMFCore)
+        zcml.load_config('implements.zcml', Products.CMFCore)
         setHooks()
 
     @classmethod

Modified: Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/tests/test_CatalogTool.py
===================================================================
--- Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/tests/test_CatalogTool.py	2009-03-13 17:34:54 UTC (rev 98040)
+++ Products.CMFCore/branches/miwa-catalog-adapter/Products/CMFCore/tests/test_CatalogTool.py	2009-03-13 18:56:15 UTC (rev 98041)
@@ -17,9 +17,27 @@
 
 import unittest
 
+from Acquisition import Implicit
+from zope.interface import implements
+from Products.CMFCore.interfaces import ICatalogTool
 from Products.CMFCore.tests.base.testcase import SecurityTest
 
+class FakeFolder(Implicit):
+    id = 'portal'
 
+class FakeCatalog(Implicit):
+    implements(ICatalogTool)
+    id = 'portal_catalog'
+
+class FakeWorkflowTool(Implicit):
+    id = 'portal_workflow'
+
+    def __init__(self, vars):
+        self._vars = vars
+
+    def getCatalogVariablesFor(self):
+        return self._vars
+
 class IndexableObjectWrapperTests(unittest.TestCase):
 
     def _getTargetClass(self):
@@ -27,11 +45,16 @@
 
         return IndexableObjectWrapper
 
-    def _makeOne(self, *args, **kw):
-        return self._getTargetClass()(*args, **kw)
+    def _makeOne(self, obj, vars):
+        self.root = FakeFolder()
+        self.root.portal_catalog = FakeFolder('portal_catalog')
+        self.root.portal_workflow = FakeWorkflowTool(vars)
+        catalog = self.root.portal_catalog
+        return self._getTargetClass()(obj, catalog)
 
     def _makeContent(self, *args, **kw):
         from Products.CMFCore.tests.base.dummy import DummyContent
+
         return DummyContent(*args, **kw)
 
     def test_interfaces(self):
@@ -75,7 +98,6 @@
         self.failUnless(IContentish.providedBy(w))
         self.failUnless(IIndexableObjectWrapper.providedBy(w))
 
-
 class CatalogToolTests(SecurityTest):
 
     def _getTargetClass(self):



More information about the Checkins mailing list