[Checkins] SVN: z3c.layout/trunk/src/z3c/layout/ Introduced IContentProviderFactory interface to add an extension point on which context to use when looking up content providers.

Malthe Borch mborch at gmail.com
Sun Aug 3 22:12:19 EDT 2008


Log message for revision 89337:
  Introduced IContentProviderFactory interface to add an extension point on which context to use when looking up content providers.

Changed:
  U   z3c.layout/trunk/src/z3c/layout/README.txt
  U   z3c.layout/trunk/src/z3c/layout/browser/layout.py
  U   z3c.layout/trunk/src/z3c/layout/interfaces.py

-=-
Modified: z3c.layout/trunk/src/z3c/layout/README.txt
===================================================================
--- z3c.layout/trunk/src/z3c/layout/README.txt	2008-08-04 01:45:07 UTC (rev 89336)
+++ z3c.layout/trunk/src/z3c/layout/README.txt	2008-08-04 02:12:18 UTC (rev 89337)
@@ -49,25 +49,34 @@
     >>> layout.regions.add(title)
     >>> layout.regions.add(content)
 
+Let's define a context class.
+    
+    >>> class MockContext(object):
+    ...     interface.implements(interface.Interface)
+
 We need to provide a general adapter that can provide content
-providers for regions that do not specify them directly.
+providers for regions that do not specify them directly. As an
+example, we'll define an adapter that simply tries to lookup a content
+provider with the same name as the region.
 
-    >>> from z3c.layout.interfaces import IRegion
-    >>> from zope.contentprovider.interfaces import IContentProvider
-    >>> from zope.publisher.interfaces.browser import IBrowserRequest
-    >>> from zope.publisher.interfaces.browser import IBrowserView
+    >>> from z3c.layout.interfaces import IContentProviderFactory
 
-As an example, we'll define an adapter that simply tries to lookup a
-content provider with the same name as the region.
-    
-    >>> @interface.implementer(IContentProvider)
-    ... @component.adapter(IRegion, IBrowserRequest, IBrowserView)
-    ... def getEponymousContentProvider(region, request, view):
-    ...     return component.getMultiAdapter(
-    ...        (region, request, view), IContentProvider, region.name)
+    >>> class EponymousContentProviderFactory(object):
+    ...     interface.implements(IContentProviderFactory)
+    ...
+    ...     def __init__(self, region):
+    ...         self.region = region
+    ...
+    ...     def __call__(self, context, request, view):
+    ...         name = self.region.name
+    ...         return component.getMultiAdapter(
+    ...            (view.context, request, view), IContentProvider, name)
 
-    >>> component.provideAdapter(getEponymousContentProvider)
+    >>> from z3c.layout.interfaces import IRegion
     
+    >>> component.provideAdapter(
+    ...     EponymousContentProviderFactory, (IRegion,))
+    
 Rendering
 ---------
 
@@ -92,21 +101,21 @@
     ...
     ...     def __repr__(self):
     ...         return "<MockContentProvider '%s'>" % self.__name__
+    
+    >>> from zope.publisher.interfaces.browser import IBrowserRequest
+    >>> from zope.publisher.interfaces.browser import IBrowserView
 
     >>> component.provideAdapter(
-    ...     MockContentProvider, (IRegion, IBrowserRequest, IBrowserView),
+    ...     MockContentProvider, (MockContext, IBrowserRequest, IBrowserView),
     ...     name="title")
 
     >>> component.provideAdapter(
-    ...     MockContentProvider, (IRegion, IBrowserRequest, IBrowserView),
+    ...     MockContentProvider, (MockContext, IBrowserRequest, IBrowserView),
     ...     name="content")
 
 Let's instantiate the layout browser-view. We must define a context
 and set up a request.
 
-    >>> class MockContext(object):
-    ...     interface.implements(interface.Interface)
-
     >>> from zope.publisher.browser import TestRequest
     
     >>> context = MockContext()

Modified: z3c.layout/trunk/src/z3c/layout/browser/layout.py
===================================================================
--- z3c.layout/trunk/src/z3c/layout/browser/layout.py	2008-08-04 01:45:07 UTC (rev 89336)
+++ z3c.layout/trunk/src/z3c/layout/browser/layout.py	2008-08-04 02:12:18 UTC (rev 89337)
@@ -30,9 +30,6 @@
 
         return lxml.html.tostring(tree, pretty_print=True).rstrip('\n')
 
-    def get_context(self, region):
-        return region
-    
     def _insert_provider(self, tree, region, provider):
         # render and wrap provided content
         html = provider.render() 
@@ -45,16 +42,16 @@
         """Lookup content provider for region."""
 
         name = region.provider
-        context = self.get_context(region)
 
+        factory = interfaces.IContentProviderFactory(region, None)
+        if factory is not None:
+            return factory(self.context, self.request, self)
+
         if name is not None:
-            provider = component.queryMultiAdapter(
-                (context, self.request, self), IContentProvider, name=name)
-        else:
-            provider = component.queryMultiAdapter(
-                (context, self.request, self), IContentProvider)
+            return component.queryMultiAdapter(
+                (self.context, self.request, self), IContentProvider, name=name)
 
-        return provider
+        return None
     
     @memoize
     def _get_region_provider_mapping(self):

Modified: z3c.layout/trunk/src/z3c/layout/interfaces.py
===================================================================
--- z3c.layout/trunk/src/z3c/layout/interfaces.py	2008-08-04 01:45:07 UTC (rev 89336)
+++ z3c.layout/trunk/src/z3c/layout/interfaces.py	2008-08-04 02:12:18 UTC (rev 89337)
@@ -44,3 +44,7 @@
     def parse():
         """Parse template using lxml's HTML parser class. Transforms
         are applied before the tree is returned."""
+
+class IContentProviderFactory(Interface):
+    def __call__(context, request, view):
+        """Return content provider."""



More information about the Checkins mailing list