[Checkins] SVN: grok/trunk/src/grok/ Fix bug: grok.name only affects name of the view, not the name of the associated template.

Philipp von Weitershausen philikon at philikon.de
Sun Oct 15 13:51:42 EDT 2006


Log message for revision 70663:
  Fix bug: grok.name only affects name of the view, not the name of the associated template.
  Implement grok.template which lets you associate a different template with a view than
  the default.
  

Changed:
  U   grok/trunk/src/grok/__init__.py
  U   grok/trunk/src/grok/_grok.py
  U   grok/trunk/src/grok/tests/view/inline.py
  A   grok/trunk/src/grok/tests/view/template.py

-=-
Modified: grok/trunk/src/grok/__init__.py
===================================================================
--- grok/trunk/src/grok/__init__.py	2006-10-15 17:17:09 UTC (rev 70662)
+++ grok/trunk/src/grok/__init__.py	2006-10-15 17:51:41 UTC (rev 70663)
@@ -15,4 +15,5 @@
 """
 
 from zope.interface import implements
-from _grok import Model, Adapter, View, PageTemplate, grok, context, name
+from _grok import (Model, Adapter, View, PageTemplate,
+                   grok, context, name, template)

Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py	2006-10-15 17:17:09 UTC (rev 70662)
+++ grok/trunk/src/grok/_grok.py	2006-10-15 17:51:41 UTC (rev 70663)
@@ -100,23 +100,24 @@
 
     for factory in views:
         view_context = determine_context(factory, context)
-        name = factory.__name__.lower()
-        name = getattr(factory, '__grok_name__', name)
+        factory_name = factory.__name__.lower()
 
         # find inline templates
-        template = templates.get(name)
+        template_name = getattr(factory, '__grok_template__', factory_name)
+        template = templates.get(template_name)
         if template:
-            templates.markAssociated(name)
+            templates.markAssociated(template_name)
             factory.template = template
         else:
             if not getattr(factory, 'render', None):
                 raise GrokError("View %r has no associated template or "
                                 "'render' method." % factory)
 
+        view_name = getattr(factory, '__grok_name__', factory_name)
         component.provideAdapter(factory,
                                  adapts=(view_context, IDefaultBrowserLayer),
                                  provides=interface.Interface,
-                                 name=name)
+                                 name=view_name)
 
     for name, unassociated in templates.listUnassociatedTemplates():
         source = '<%s template in %s>' % (name, dotted_name)
@@ -218,9 +219,24 @@
     set_local('context', obj, "grok.context can only be called once per class "
               "or module.")
 
-def name(name):
-    if not_unicode_or_ascii(name):
-        raise GrokError("You can only pass unicode or ASCII to grok.name.")
-    if not caller_is_class():
-        raise GrokError("grok.name can only be used on class level.")
-    set_local('name', name, "grok.name can only be called once per class.")
+class ClassDirective(object):
+    """
+    Class-level directive that puts unicode/ASCII values into the
+    class's locals as __grok_<name>__.
+    """
+
+    def __init__(self, name):
+        self.name = name
+
+    def __call__(self, val):
+        if not_unicode_or_ascii(val):
+            raise GrokError("You can only pass unicode or ASCII to "
+                            "grok.%s." % self.name)
+        if not caller_is_class():
+            raise GrokError("grok.%s can only be used on class level."
+                            % self.name)
+        set_local(self.name, val, "grok.%s can only be called once per class."
+                  % self.name)
+
+name = ClassDirective('name')
+template = ClassDirective('template')

Modified: grok/trunk/src/grok/tests/view/inline.py
===================================================================
--- grok/trunk/src/grok/tests/view/inline.py	2006-10-15 17:17:09 UTC (rev 70662)
+++ grok/trunk/src/grok/tests/view/inline.py	2006-10-15 17:51:41 UTC (rev 70663)
@@ -33,6 +33,13 @@
   >>> print view()
   <html><body><h1>GROK CLUB MAMMOTH!</h1></body></html>
 
+Finding a template does not depend on the view name, but on the class
+name:
+
+  >>> view = component.getMultiAdapter((manfred, request), name='hunting')
+  >>> print view()
+  <html><body><h1>GROK HUNT MAMMOTH!</h1></body></html>
+
 """
 import grok
 
@@ -59,3 +66,11 @@
 club = grok.PageTemplate("""\
 <html><body><h1>GROK CLUB MAMMOTH!</h1></body></html>
 """)
+
+class Hunt(grok.View):
+    grok.name('hunting')
+
+hunt = grok.PageTemplate("""\
+<html><body><h1>GROK HUNT MAMMOTH!</h1></body></html>
+""")
+

Added: grok/trunk/src/grok/tests/view/template.py
===================================================================
--- grok/trunk/src/grok/tests/view/template.py	2006-10-15 17:17:09 UTC (rev 70662)
+++ grok/trunk/src/grok/tests/view/template.py	2006-10-15 17:51:41 UTC (rev 70663)
@@ -0,0 +1,27 @@
+"""
+
+  >>> grok.grok(__name__)
+
+View with an associated PageTemplate that is referred to using
+``grok.template``:
+
+  >>> manfred = Mammoth()
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope import component
+  >>> view = component.getMultiAdapter((manfred, request), name='painting')
+  >>> print view()
+  <html><body><h1>GROK PAINT MAMMOTH!</h1></body></html>
+
+"""
+import grok
+
+class Mammoth(grok.Model):
+    pass
+
+class Painting(grok.View):
+    grok.template('cavepainting')
+
+cavepainting = grok.PageTemplate("""\
+<html><body><h1>GROK PAINT MAMMOTH!</h1></body></html>
+""")


Property changes on: grok/trunk/src/grok/tests/view/template.py
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Checkins mailing list