[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