[Checkins] SVN: grok/branches/snowsprint-viewlets2/src/grok/ Make
the template behavior for viewlet the same as for views.
Martijn Faassen
faassen at infrae.com
Thu Jan 24 11:21:28 EST 2008
Log message for revision 83171:
Make the template behavior for viewlet the same as for views.
Changed:
U grok/branches/snowsprint-viewlets2/src/grok/components.py
U grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_security.py
A grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template.py
A grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template_templates/
A grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template_templates/fredviewlet.pt
U grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template_templates/index.pt
U grok/branches/snowsprint-viewlets2/src/grok/meta.py
U grok/branches/snowsprint-viewlets2/src/grok/templatereg.py
U grok/branches/snowsprint-viewlets2/src/grok/tests/test_grok.py
A grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/
A grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/__init__.py
A grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/viewlet_render_and_template.py
A grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/viewlet_render_and_template_templates/
A grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/viewlet_render_and_template_templates/viewlet.pt
-=-
Modified: grok/branches/snowsprint-viewlets2/src/grok/components.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/components.py 2008-01-24 15:59:31 UTC (rev 83170)
+++ grok/branches/snowsprint-viewlets2/src/grok/components.py 2008-01-24 16:21:28 UTC (rev 83171)
@@ -679,6 +679,8 @@
def __init__(self, context, request, view, manager):
super(Viewlet, self).__init__(context, request, view, manager)
+ # would be nice to move this to the ViewletGrokker but
+ # new objects don't have __name__ of their class
self.__name__ = util.class_annotation(self.__class__,
'grok.name',
self.__class__.__name__.lower())
@@ -688,36 +690,16 @@
name=self.module_info.package_dotted_name
)
-
@property
def response(self):
return self.request.response
-
def render(self):
- mapply(self.update, (), self.request)
- if self.request.response.getStatus() in (302, 303):
- # A redirect was triggered somewhere in update(). Don't
- # continue rendering the template or doing anything else.
- return
+ return self.template.render(self)
- template = getattr(self, 'template', None)
- if template is not None:
- return self._render_template()
+ def namespace(self):
+ return {}
- def _render_template(self):
- namespace = self.template.pt_getContext()
- namespace['request'] = self.request
- namespace['view'] = self
- namespace['context'] = self.context
- # XXX need to check whether we really want to put None here if missing
- namespace['static'] = self.static
- return self.template.pt_render(namespace)
-
- def __getitem__(self, key):
- # XXX give nice error message if template is None
- return self.template.macros[key]
-
def url(self, obj=None, name=None):
# if the first argument is a string, that's the name. There should
# be no second argument
@@ -737,8 +719,5 @@
obj = self.context
return util.url(self.request, obj, name)
- def redirect(self, url):
- return self.request.response.redirect(url)
-
def update(self):
pass
Modified: grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_security.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_security.py 2008-01-24 15:59:31 UTC (rev 83170)
+++ grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_security.py 2008-01-24 16:21:28 UTC (rev 83171)
@@ -191,3 +191,7 @@
grok.context(Interface)
grok.name('viewletwithname')
grok.viewletmanager(NamedViewletManager)
+
+ def render(self):
+ return "NamedViewlet"
+
Added: grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template.py (rev 0)
+++ grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template.py 2008-01-24 16:21:28 UTC (rev 83171)
@@ -0,0 +1,32 @@
+"""
+We check whether viewlets automatically associate with templates in the
+templates directory (viewlet_template_templates).
+
+Set up the model object to view::
+
+ >>> root = getRootFolder()
+ >>> root['cave'] = Cave()
+
+Viewing the cave object should result in the viewlet being displayed::
+
+ >>> from zope.testbrowser.testing import Browser
+ >>> browser = Browser()
+ >>> browser.handleErrors = False
+ >>> browser.open("http://localhost/cave")
+ >>> print browser.contents
+ <p>Hi, this is the fred viewlet speaking</p>
+
+"""
+import grok
+
+class CavemenViewletManager(grok.ViewletManager):
+ grok.name('manage.cavemen')
+
+class FredViewlet(grok.Viewlet):
+ grok.viewletmanager(CavemenViewletManager)
+
+class Cave(grok.Model):
+ pass
+
+class Index(grok.View):
+ pass
Copied: grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template_templates (from rev 83163, grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_interface_templates)
Added: grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template_templates/fredviewlet.pt
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template_templates/fredviewlet.pt (rev 0)
+++ grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template_templates/fredviewlet.pt 2008-01-24 16:21:28 UTC (rev 83171)
@@ -0,0 +1 @@
+<p>Hi, this is the fred viewlet speaking</p>
Modified: grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template_templates/index.pt
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_interface_templates/index.pt 2008-01-24 13:06:13 UTC (rev 83163)
+++ grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_template_templates/index.pt 2008-01-24 16:21:28 UTC (rev 83171)
@@ -1 +1 @@
-<tal:block content="provider:manage.cavemen" />
+<tal:block content="structure provider:manage.cavemen" />
Modified: grok/branches/snowsprint-viewlets2/src/grok/meta.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/meta.py 2008-01-24 15:59:31 UTC (rev 83170)
+++ grok/branches/snowsprint-viewlets2/src/grok/meta.py 2008-01-24 16:21:28 UTC (rev 83171)
@@ -247,7 +247,7 @@
if templates is not None:
config.action(
discriminator=None,
- callable=templates.checkTemplates,
+ callable=templates.checkTemplatesView,
args=(module_info, factory)
)
@@ -913,7 +913,7 @@
if templates is not None:
config.action(
discriminator=None,
- callable=templates.checkTemplates,
+ callable=templates.checkTemplatesViewlet,
args=(module_info, factory))
view = determine_class_directive('grok.view', factory,
Modified: grok/branches/snowsprint-viewlets2/src/grok/templatereg.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/templatereg.py 2008-01-24 15:59:31 UTC (rev 83170)
+++ grok/branches/snowsprint-viewlets2/src/grok/templatereg.py 2008-01-24 16:21:28 UTC (rev 83171)
@@ -81,7 +81,8 @@
module_info.dotted_name, ', '.join(unassociated)))
warnings.warn(msg, UserWarning, 2)
- def checkTemplates(self, module_info, factory):
+ def _checkTemplates(self, module_info, factory, component_name,
+ has_render, has_no_render):
factory_name = factory.__name__.lower()
template_name = util.class_annotation(factory, 'grok.template',
factory_name)
@@ -90,30 +91,48 @@
# grok.template is being used
if self.get(factory_name):
- raise GrokError("Multiple possible templates for view %r. It "
+ raise GrokError("Multiple possible templates for %s %r. It "
"uses grok.template('%s'), but there is also "
"a template called '%s'."
- % (factory, template_name, factory_name),
- factory)
+ % (component_name, factory, template_name,
+ factory_name), factory)
template = self.get(template_name)
- if template:
- if (getattr(factory, 'render', None) and not
- util.check_subclass(factory, grok.components.GrokForm)):
+ if template is not None:
+ if has_render(factory):
# we do not accept render and template both for a view
# (unless it's a form, they happen to have render.
raise GrokError(
- "Multiple possible ways to render view %r. "
+ "Multiple possible ways to render %s %r. "
"It has both a 'render' method as well as "
- "an associated template." % factory, factory)
+ "an associated template." %
+ (component_name, factory), factory)
self.markAssociated(template_name)
factory.template = template
template._initFactory(factory)
else:
- if not getattr(factory, 'render', None):
+ if has_no_render(factory):
# we do not accept a view without any way to render it
- raise GrokError("View %r has no associated template or "
- "'render' method." % factory, factory)
+ raise GrokError("%s %r has no associated template or "
+ "'render' method." %
+ (component_name.title(), factory), factory)
+ def checkTemplatesView(self, module_info, factory):
+ def has_render(factory):
+ return (getattr(factory, 'render', None) and
+ not util.check_subclass(factory, grok.components.GrokForm))
+ def has_no_render(factory):
+ return not getattr(factory, 'render', None)
+ self._checkTemplates(module_info, factory, 'view',
+ has_render, has_no_render)
+
+ def checkTemplatesViewlet(self, module_info, factory):
+ def has_render(factory):
+ return factory.render != grok.components.Viewlet.render
+ def has_no_render(factory):
+ return not has_render(factory)
+ self._checkTemplates(module_info, factory, 'viewlet',
+ has_render, has_no_render)
+
class PageTemplateFileFactory(grok.GlobalUtility):
grok.implements(grok.interfaces.ITemplateFileFactory)
Modified: grok/branches/snowsprint-viewlets2/src/grok/tests/test_grok.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/tests/test_grok.py 2008-01-24 15:59:31 UTC (rev 83170)
+++ grok/branches/snowsprint-viewlets2/src/grok/tests/test_grok.py 2008-01-24 16:21:28 UTC (rev 83171)
@@ -45,7 +45,8 @@
for name in ['adapter', 'error', 'view', 'event', 'security', 'catalog',
'zcml', 'static', 'utility', 'xmlrpc', 'json', 'container',
'traversal', 'form', 'grokker', 'directive', 'util',
- 'baseclass', 'annotation', 'application', 'template', 'order']:
+ 'baseclass', 'annotation', 'application', 'template', 'order',
+ 'viewlet']:
suite.addTest(suiteFromPackage(name))
return suite
Added: grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/__init__.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/__init__.py (rev 0)
+++ grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/__init__.py 2008-01-24 16:21:28 UTC (rev 83171)
@@ -0,0 +1 @@
+# package
Added: grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/viewlet_render_and_template.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/viewlet_render_and_template.py (rev 0)
+++ grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/viewlet_render_and_template.py 2008-01-24 16:21:28 UTC (rev 83171)
@@ -0,0 +1,27 @@
+"""
+We viewlet is not allowed to define its own render method and have a template
+associated with it at the same time.
+
+ >>> grok.testing.grok(__name__)
+ Traceback (most recent call last):
+ ...
+ ConfigurationExecutionError: martian.error.GrokError: Multiple possible ways to render viewlet <class 'grok.tests.viewlet.viewlet_render_and_template.Viewlet'>. It has both a 'render' method as well as an associated template.
+ in:
+
+"""
+
+import grok
+from zope.interface import Interface
+
+class ViewletManager(grok.ViewletManager):
+ grok.name('foo')
+ grok.context(Interface)
+
+class Viewlet(grok.Viewlet):
+ grok.viewletmanager(ViewletManager)
+ grok.context(Interface)
+
+ def render(self):
+ return "Render method but also a template!"
+
+
Added: grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/viewlet_render_and_template_templates/viewlet.pt
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/viewlet_render_and_template_templates/viewlet.pt (rev 0)
+++ grok/branches/snowsprint-viewlets2/src/grok/tests/viewlet/viewlet_render_and_template_templates/viewlet.pt 2008-01-24 16:21:28 UTC (rev 83171)
@@ -0,0 +1 @@
+<p>There is also a render method!</p>
More information about the Checkins
mailing list