[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