[Zope-Checkins] SVN: Zope/branches/philikon-aq/lib/python/Products/ It turns out we'll still have to wrap content providers because there might

Philipp von Weitershausen philikon at philikon.de
Sat Sep 1 16:16:02 EDT 2007


Log message for revision 79429:
  It turns out we'll still have to wrap content providers because there might
  be legacy implementations out there needing it.  Therefore we need to keep
  our own ProviderExpression implementation.
  
  Added legacy tests for content providers and viewlets
  

Changed:
  U   Zope/branches/philikon-aq/lib/python/Products/Five/browser/providerexpression.py
  U   Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.py
  U   Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.zcml
  U   Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy_ftest.txt
  A   Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacymanager.pt
  A   Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacyprovider.pt
  U   Zope/branches/philikon-aq/lib/python/Products/PageTemplates/Expressions.py

-=-
Modified: Zope/branches/philikon-aq/lib/python/Products/Five/browser/providerexpression.py
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/Five/browser/providerexpression.py	2007-09-01 17:37:52 UTC (rev 79428)
+++ Zope/branches/philikon-aq/lib/python/Products/Five/browser/providerexpression.py	2007-09-01 20:16:02 UTC (rev 79429)
@@ -12,11 +12,52 @@
 #
 ##############################################################################
 """Provider expression.
-
-This module solely exists for backwards-compatibility.  Please import
-TALESProviderExpression from zope.contentprovider.tales.
 """
+import zope.event
+import zope.interface
+import zope.component
 
-# BBB
-from zope.contentprovider.tales import TALESProviderExpression \
-     as Z2ProviderExpression
+from zope.tales import expressions
+from zope.contentprovider import interfaces, tales
+from zope.location.interfaces import ILocation
+
+from Acquisition.interfaces import IAcquirer
+
+class Z2ProviderExpression(expressions.StringExpr):
+    zope.interface.implements(interfaces.ITALESProviderExpression)
+
+    # This is mostly a copy of
+    # zope.contentprovider.tales.TALESProviderExpression's __call__
+    # method.
+    def __call__(self, econtext):
+        name = super(Z2ProviderExpression, self).__call__(econtext)
+        context = econtext.vars['context']
+        request = econtext.vars['request']
+        view = econtext.vars['view']
+
+        # Try to look up the provider.
+        provider = zope.component.queryMultiAdapter(
+            (context, request, view), interfaces.IContentProvider, name)
+
+        # Provide a useful error message, if the provider was not found.
+        if provider is None:
+            raise interfaces.ContentProviderLookupError(name)
+
+        # add the __name__ attribute if it implements ILocation
+        if ILocation.providedBy(provider):
+            provider.__name__ = name
+
+        # ATTN: This is where we are different from
+        # TALESProviderExpression: We support Acquisition wrapping.
+        if IAcquirer.providedBy(provider):
+            provider = provider.__of__(context)
+
+        # Insert the data gotten from the context
+        tales.addTALNamespaceData(provider, econtext)
+
+        # Stage 1: Do the state update.
+        zope.event.notify(interfaces.BeforeUpdateEvent(provider, request))
+        provider.update()
+
+        # Stage 2: Render the HTML content.
+        return provider.render()

Modified: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.py
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.py	2007-09-01 17:37:52 UTC (rev 79428)
+++ Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.py	2007-09-01 20:16:02 UTC (rev 79429)
@@ -18,6 +18,8 @@
 better) still work.
 """
 import Acquisition
+from zope.interface import implements
+from zope.contentprovider.interfaces import IContentProvider
 from Products.Five import BrowserView
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
 
@@ -54,3 +56,52 @@
 class ImplicitWithTemplate(Acquisition.Implicit):
 
     template = ViewPageTemplateFile('falcon.pt')
+
+
+class ExplicitContentProvider(Acquisition.Explicit):
+    implements(IContentProvider)
+
+    def __init__(self, context, request, view):
+        self.context = context
+        self.request = request
+        self.view = view
+        # Normally, a content provider should set __parent__ to view
+        # or context.  This one doesn't do this on purpose to ensure
+        # it works without.
+
+    def update(self):
+        # Make sure that the content provider is acquisition wrapped.
+        assert self.aq_parent == self.context
+        assert self.aq_base == self
+
+    def render(self):
+        return 'Content provider inheriting from Explicit'
+
+class ExplicitViewlet(Acquisition.Explicit):
+
+    def __init__(self, context, request, view, manager):
+        self.context = context
+        self.request = request
+
+    def update(self):
+        pass
+
+    def render(self):
+        return 'Viewlet inheriting from Explicit'
+
+class BrowserViewViewlet(BrowserView):
+
+    def __init__(self, context, request, view, manager):
+        # This is the tricky bit.  super(...).__init__ wouldn't
+        # necessarily have to resolve to BrowserView.__init__ because
+        # <browser:viewlet /> generates classes on the fly with a
+        # mix-in base class...
+        super(BrowserViewViewlet, self).__init__(context, request)
+        self.view = view
+        self.manager = manager
+
+    def update(self):
+        pass
+
+    def render(self):
+        return 'BrowserView viewlet'

Modified: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.zcml
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.zcml	2007-09-01 17:37:52 UTC (rev 79428)
+++ Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy.zcml	2007-09-01 20:16:02 UTC (rev 79429)
@@ -63,5 +63,46 @@
       permission="zope.Public"
       />
 
+  <!-- Content providers and viewlets -->
 
+  <adapter
+      for="* * *"
+      provides="zope.contentprovider.interfaces.IContentProvider"
+      factory=".aqlegacy.ExplicitContentProvider"
+      name="aqlegacyprovider"
+      />
+
+  <browser:page
+      for="*"
+      name="aqlegacyprovider"
+      template="legacyprovider.pt"
+      permission="zope.Public"
+      />
+
+  <browser:viewletManager
+      name="aqlegacymanager"
+      permission="zope.Public"
+      />
+
+  <browser:viewlet
+      for="*"
+      class=".aqlegacy.ExplicitViewlet"
+      name="explicit"
+      permission="zope.Public"
+      />
+
+  <browser:viewlet
+      for="*"
+      class=".aqlegacy.BrowserViewViewlet"
+      name="browserview"
+      permission="zope.Public"
+      />
+
+  <browser:page
+      for="*"
+      name="aqlegacymanager"
+      template="legacymanager.pt"
+      permission="zope.Public"
+      />
+
 </configure>
\ No newline at end of file

Modified: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy_ftest.txt
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy_ftest.txt	2007-09-01 17:37:52 UTC (rev 79428)
+++ Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/aqlegacy_ftest.txt	2007-09-01 20:16:02 UTC (rev 79429)
@@ -119,6 +119,19 @@
   <p>The falcon has taken flight</p>
 
 
+Testing legacy content providers and viewlets
+=============================================
+
+  >>> browser.open('http://localhost/test_folder_1_/aqlegacyprovider')
+  >>> print browser.contents
+  <p>Content provider inheriting from Explicit</p>
+
+  >>> browser.open('http://localhost/test_folder_1_/aqlegacymanager')
+  >>> print browser.contents
+  <p>BrowserView viewlet
+  Viewlet inheriting from Explicit</p>
+
+
 Clean up
 --------
 

Added: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacymanager.pt
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacymanager.pt	                        (rev 0)
+++ Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacymanager.pt	2007-09-01 20:16:02 UTC (rev 79429)
@@ -0,0 +1 @@
+<p tal:content="provider:aqlegacymanager" />


Property changes on: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacymanager.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacyprovider.pt
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacyprovider.pt	                        (rev 0)
+++ Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacyprovider.pt	2007-09-01 20:16:02 UTC (rev 79429)
@@ -0,0 +1 @@
+<p tal:content="provider:aqlegacyprovider" />


Property changes on: Zope/branches/philikon-aq/lib/python/Products/Five/browser/tests/legacyprovider.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: Zope/branches/philikon-aq/lib/python/Products/PageTemplates/Expressions.py
===================================================================
--- Zope/branches/philikon-aq/lib/python/Products/PageTemplates/Expressions.py	2007-09-01 17:37:52 UTC (rev 79428)
+++ Zope/branches/philikon-aq/lib/python/Products/PageTemplates/Expressions.py	2007-09-01 20:16:02 UTC (rev 79429)
@@ -30,7 +30,6 @@
 from zope.traversing.interfaces import ITraversable
 from zope.traversing.adapters import traversePathElement
 from zope.proxy import removeAllProxies
-from zope.contentprovider.tales import TALESProviderExpression
 import zope.app.pagetemplate.engine
 
 import OFS.interfaces
@@ -38,6 +37,7 @@
 from Acquisition import aq_base
 from zExceptions import NotFound, Unauthorized
 
+from Products.Five.browser.providerexpression import Z2ProviderExpression
 from Products.PageTemplates import ZRPythonExpr
 from Products.PageTemplates.DeferExpr import LazyExpr
 from Products.PageTemplates.GlobalTranslationService import getGlobalTranslationService
@@ -345,7 +345,7 @@
     e.registerType('not', NotExpr)
     e.registerType('defer', DeferExpr)
     e.registerType('lazy', LazyExpr)
-    e.registerType('provider', TALESProviderExpression)
+    e.registerType('provider', Z2ProviderExpression)
     e.registerBaseName('modules', SecureModuleImporter)
     return e
 



More information about the Zope-Checkins mailing list