[Checkins] SVN: grokcore.view/trunk/ svn merge -r 121965:121982 svn+ssh://svn.zope.org/repos/main/grokcore.view/branches/jw-contentproviders .

Jan-Wijbrand Kolman janwijbrand at gmail.com
Tue Jun 28 03:54:32 EDT 2011


Log message for revision 122000:
  svn merge -r 121965:121982 svn+ssh://svn.zope.org/repos/main/grokcore.view/branches/jw-contentproviders .

Changed:
  U   grokcore.view/trunk/CHANGES.txt
  U   grokcore.view/trunk/setup.py
  U   grokcore.view/trunk/src/grokcore/view/__init__.py
  U   grokcore.view/trunk/src/grokcore/view/components.py
  U   grokcore.view/trunk/src/grokcore/view/configure.zcml
  U   grokcore.view/trunk/src/grokcore/view/ftesting.zcml
  A   grokcore.view/trunk/src/grokcore/view/ftests/contentprovider/
  U   grokcore.view/trunk/src/grokcore/view/ftests/test_functional.py
  U   grokcore.view/trunk/src/grokcore/view/interfaces.py
  A   grokcore.view/trunk/src/grokcore/view/meta/contentproviders.py
  U   grokcore.view/trunk/src/grokcore/view/meta/views.py
  U   grokcore.view/trunk/src/grokcore/view/meta-minimal.zcml
  A   grokcore.view/trunk/src/grokcore/view/tests/contentprovider/
  U   grokcore.view/trunk/src/grokcore/view/tests/test_all.py

-=-
Modified: grokcore.view/trunk/CHANGES.txt
===================================================================
--- grokcore.view/trunk/CHANGES.txt	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/CHANGES.txt	2011-06-28 07:54:31 UTC (rev 122000)
@@ -4,9 +4,8 @@
 2.6 (unreleased)
 ----------------
 
-- Nothing changed yet.
+- Add the ContentProvider component.
 
-
 2.5 (2011-04-04)
 ----------------
 

Modified: grokcore.view/trunk/setup.py
===================================================================
--- grokcore.view/trunk/setup.py	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/setup.py	2011-06-28 07:54:31 UTC (rev 122000)
@@ -11,12 +11,13 @@
     )
 
 install_requires = [
-    'setuptools',
     'grokcore.component >= 2.1',
     'grokcore.security >= 1.5',
     'martian >= 0.13',
+    'setuptools',
     'zope.browserresource >= 3.9.0',
     'zope.component',
+    'zope.contentprovider',
     'zope.interface',
     'zope.pagetemplate',
     'zope.ptresource >= 3.9.0',
@@ -26,18 +27,18 @@
     ]
 
 tests_require = [
+    'zope.app.appsetup',
+    'zope.app.publication',
     'zope.app.wsgi',
+    'zope.browserpage',
+    'zope.configuration',
     'zope.container',
+    'zope.login',
+    'zope.password',
+    'zope.principalregistry',
     'zope.securitypolicy',
     'zope.site',
     'zope.testing',
-    'zope.login',
-    'zope.configuration',
-    'zope.app.appsetup',
-    'zope.app.publication',
-    'zope.browserpage',
-    'zope.password',
-    'zope.principalregistry',
     ]
 
 publication_require = [
@@ -68,6 +69,8 @@
     zip_safe=False,
     install_requires=install_requires,
     tests_require=tests_require,
-    extras_require={'test': tests_require,
-                    'security_publication': publication_require},
+    extras_require={
+        'test': tests_require,
+        'security_publication': publication_require
+        },
 )

Modified: grokcore.view/trunk/src/grokcore/view/__init__.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/__init__.py	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/src/grokcore/view/__init__.py	2011-06-28 07:54:31 UTC (rev 122000)
@@ -19,7 +19,9 @@
 from zope.publisher.interfaces.browser import IBrowserRequest
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 
-from grokcore.view.components import View, ViewSupport
+from grokcore.view.components import ViewSupport
+from grokcore.view.components import View
+from grokcore.view.components import ContentProvider
 from grokcore.view.components import PageTemplate, PageTemplateFile
 from grokcore.view.interfaces import IGrokSecurityView
 from grokcore.view.components import DirectoryResource

Modified: grokcore.view/trunk/src/grokcore/view/components.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/components.py	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/src/grokcore/view/components.py	2011-06-28 07:54:31 UTC (rev 122000)
@@ -22,6 +22,7 @@
 from zope import interface
 from zope.browserresource import directory
 from zope.browserresource.interfaces import IResourceFactoryFactory
+from zope.contentprovider.provider import ContentProviderBase
 from zope.pagetemplate import pagetemplate, pagetemplatefile
 from zope.pagetemplate.engine import TrustedAppPT
 from zope.ptresource.ptresource import PageTemplateResourceFactory
@@ -229,7 +230,53 @@
     def _initFactory(self, factory):
         pass
 
+class ContentProvider(ContentProviderBase):
+    interface.implements(interfaces.IContentProvider)
 
+    template = None
+
+    def __init__(self, context, request, view):
+        super(ContentProvider, self).__init__(context, request, view)
+        self.context = context
+        self.request = request
+        self.view = view
+        self.__name__ = self.__view_name__
+        self.static = component.queryAdapter(
+            self.request,
+            interface.Interface,
+            name=self.module_info.package_dotted_name,
+            )
+
+    def default_namespace(self):
+        namespace = {}
+        namespace['context'] = self.context
+        namespace['provider'] = self
+        namespace['request'] = self.request
+        namespace['static'] = self.static
+        namespace['view'] = self.view
+        return namespace
+
+    def namespace(self):
+        return {}
+
+    def _render_template(self):
+        return self.template.render(self)
+
+    def render(self, **kwargs):
+        """A content provider can either be rendered by an associated
+        template, or it can implement this method to render itself from
+        Python.  This is useful if the view's output isn't XML/HTML but
+        something computed in Python (plain text, PDF, etc.)
+
+        render() can take arbitrary keyword parameters which will be
+        filled in from the request (in that case they *must* be
+        present in the request).
+        """
+        return self._render_template()
+
+    render.base_method = True
+
+
 class GrokTemplate(BaseTemplate):
     """A slightly more advanced page template
 

Modified: grokcore.view/trunk/src/grokcore/view/configure.zcml
===================================================================
--- grokcore.view/trunk/src/grokcore/view/configure.zcml	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/src/grokcore/view/configure.zcml	2011-06-28 07:54:31 UTC (rev 122000)
@@ -2,6 +2,7 @@
   xmlns="http://namespaces.zope.org/zope"
   xmlns:grok="http://namespaces.zope.org/grok">
 
+  <include package="zope.contentprovider" />
   <include package="zope.browserresource" />
 
   <!-- ZPT support -->

Modified: grokcore.view/trunk/src/grokcore/view/ftesting.zcml
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftesting.zcml	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/src/grokcore/view/ftesting.zcml	2011-06-28 07:54:31 UTC (rev 122000)
@@ -15,6 +15,7 @@
   <include package="grokcore.view" file="meta.zcml" />
 
   <include package="zope.security" />
+  <include package="zope.securitypolicy" />
   <include package="zope.principalregistry" />
   <include package="zope.login" />
   <include package="zope.password" />
@@ -23,10 +24,17 @@
   <include package="zope.publisher" />
   <include package="zope.traversing" />
   <include package="zope.traversing.browser" />
+  <include package="zope.annotation" />
   <include package="zope.app.appsetup" />
   <include package="zope.app.publication" />
 
   <include package="grokcore.view" />
+
+  <!-- We define our test permission here (don't have grok.Role) -->
+  <permission id="bone.gold" title="Gold Bone" />
+  <role id="grok.BoneOwner" title="Bone Owner" />
+  <grant role="grok.BoneOwner" permission="bone.gold" />
+
   <grok:grok package="grokcore.view.ftests" />
 
   <securityPolicy

Modified: grokcore.view/trunk/src/grokcore/view/ftests/test_functional.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftests/test_functional.py	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/src/grokcore/view/ftests/test_functional.py	2011-06-28 07:54:31 UTC (rev 122000)
@@ -44,6 +44,12 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    for name in ['view', 'staticdir', 'url', 'directoryresource']:
+    for name in [
+        'contentprovider',
+        'directoryresource',
+        'staticdir',
+        'url',
+        'view',
+        ]:
         suite.addTest(suiteFromPackage(name))
     return suite

Modified: grokcore.view/trunk/src/grokcore/view/interfaces.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/interfaces.py	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/src/grokcore/view/interfaces.py	2011-06-28 07:54:31 UTC (rev 122000)
@@ -15,14 +15,17 @@
 """
 from zope.interface import Interface, Attribute
 from zope.publisher.interfaces.browser import IBrowserPage, IBrowserView
+from zope.contentprovider.interfaces import IContentProvider
 
-
 class IBaseClasses(Interface):
     View = Attribute("Base class for browser views.")
-    DirectoryResource = Attribute("Base class to create new "
-                                  "directory resource.")
 
+    ContentProvider = Attribute("Base class for content providers.")
 
+    DirectoryResource = Attribute(
+        "Base class to create new directory resource.")
+
+
 class IDirectives(Interface):
 
     def layer(layer):
@@ -182,9 +185,11 @@
     def render(view):
         """Renders the template"""
 
+
 class TemplateLookupError(Exception):
     pass
 
+
 class ITemplateRegAPI(Interface):
     """Public API for the templatereg module.
     """
@@ -221,3 +226,20 @@
     `grok.Permission` and `grok.require` settings however, will be
     applied to such views.
     """
+
+
+class IContentProvider(IContentProvider):
+
+    context = Attribute(
+        'context', "Context object for the content provider.")
+
+    request = Attribute(
+        'request', "Request object for the content provider.")
+
+    view = Attribute(
+        'view', "View object for the content provider.")
+
+    static = Attribute(
+        'static',
+        "Directory resource containing the static files of the "
+        "content provider's package.")

Copied: grokcore.view/trunk/src/grokcore/view/meta/contentproviders.py (from rev 121982, grokcore.view/branches/jw-contentproviders/src/grokcore/view/meta/contentproviders.py)
===================================================================
--- grokcore.view/trunk/src/grokcore/view/meta/contentproviders.py	                        (rev 0)
+++ grokcore.view/trunk/src/grokcore/view/meta/contentproviders.py	2011-06-28 07:54:31 UTC (rev 122000)
@@ -0,0 +1,55 @@
+#############################################################################
+#
+# Copyright (c) 2006-2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Grokkers for the views code."""
+from zope import component
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+
+import martian
+
+import grokcore.security
+import grokcore.view
+from grokcore.view.interfaces import IContentProvider
+from grokcore.view.meta.views import default_view_name, TemplateGrokker
+
+
+class ContentProviderTemplateGrokker(TemplateGrokker):
+    martian.component(grokcore.view.ContentProvider)
+
+
+class ContentProviderGrokker(martian.ClassGrokker):
+    martian.component(grokcore.view.ContentProvider)
+    martian.directive(grokcore.component.context)
+    martian.directive(grokcore.view.layer, default=IDefaultBrowserLayer)
+    martian.directive(grokcore.view.view)
+    martian.directive(grokcore.component.name, get_default=default_view_name)
+
+    def grok(self, name, factory, module_info, **kw):
+        # Need to store the module info object on the view class so that it
+        # can look up the 'static' resource directory.
+        factory.module_info = module_info
+        return super(ContentProviderGrokker, self).grok(
+            name, factory, module_info, **kw)
+
+    def execute(self, factory, config, context, layer, view, name, **kw):
+        # This will be used to support __name__ on the viewlet manager
+        factory.__view_name__ = name
+
+        config.action(
+            discriminator=('contentprovider', context, layer, view, name),
+            callable=component.provideAdapter,
+            args=(factory, (context, layer, view), IContentProvider, name))
+        return True
+
+
+

Modified: grokcore.view/trunk/src/grokcore/view/meta/views.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/meta/views.py	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/src/grokcore/view/meta/views.py	2011-06-28 07:54:31 UTC (rev 122000)
@@ -40,7 +40,8 @@
     def grok(self, name, factory, module_info, **kw):
         # Need to store the module info to look for a template
         factory.module_info = module_info
-        return super(TemplateGrokker, self).grok(name, factory, module_info, **kw)
+        return super(TemplateGrokker, self).grok(
+            name, factory, module_info, **kw)
 
     def execute(self, factory, config, **kw):
         # Associate templates to a view or a component. We set the
@@ -63,7 +64,8 @@
     def associate_template(self, module_info, factory):
         component_name = martian.component.bind().get(self).__name__.lower()
         templatereg.associate_template(
-            module_info, factory, component_name, self.has_render, self.has_no_render)
+            module_info, factory, component_name,
+            self.has_render, self.has_no_render)
 
     def has_render(self, factory):
         render = getattr(factory, 'render', None)

Modified: grokcore.view/trunk/src/grokcore/view/meta-minimal.zcml
===================================================================
--- grokcore.view/trunk/src/grokcore/view/meta-minimal.zcml	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/src/grokcore/view/meta-minimal.zcml	2011-06-28 07:54:31 UTC (rev 122000)
@@ -16,6 +16,7 @@
 
   <!-- Only load view and template grokkers -->
   <grok:grok package=".meta.views" />
+  <grok:grok package=".meta.contentproviders" />
   <grok:grok package=".meta.templates" />
 
 </configure>

Modified: grokcore.view/trunk/src/grokcore/view/tests/test_all.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/test_all.py	2011-06-28 07:38:59 UTC (rev 121999)
+++ grokcore.view/trunk/src/grokcore/view/tests/test_all.py	2011-06-28 07:54:31 UTC (rev 122000)
@@ -44,7 +44,13 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    for name in ['view', 'skin', 'template', 'directoryresource']:
+    for name in [
+        'contentprovider',
+        'directoryresource',
+        'skin',
+        'template',
+        'view',
+        ]:
         suite.addTest(suiteFromPackage(name))
     suite.addTest(doctest.DocFileSuite(
         '../templatereg.txt',



More information about the checkins mailing list