[Checkins] SVN: grok/trunk/src/grok/ support inline page templates

Philipp von Weitershausen philikon at philikon.de
Sun Oct 15 10:39:18 EDT 2006


Log message for revision 70652:
  support inline page templates
  

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

-=-
Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py	2006-10-15 14:19:37 UTC (rev 70651)
+++ grok/trunk/src/grok/_grok.py	2006-10-15 14:39:18 UTC (rev 70652)
@@ -22,6 +22,8 @@
 from zope.interface.interfaces import IInterface
 from zope.publisher.browser import BrowserPage
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.pagetemplate.pagetemplate import PageTemplate
+from zope.app.pagetemplate.engine import TrustedAppPT
 
 class Model(object):
     pass
@@ -34,23 +36,25 @@
 class View(BrowserPage):
 
     def __call__(self):
-        return self.render()
+        template = getattr(self, 'template', None)
+        if not template:
+            return self.render()
 
+        namespace = template.pt_getContext()
+        namespace['request'] = self.request
+        namespace['view'] = self
+        namespace['context'] = self.context
+        return template.pt_render(namespace)
+
     def render(self):
-        raise NotImplemented
+        raise NotImplementedError
 
+class GrokTemplate(TrustedAppPT, PageTemplate):
+    expand = 0
+
 class GrokError(Exception):
     pass
 
-def isclass(obj):
-    """We cannot use ``inspect.isclass`` because it will return True for interfaces"""
-    return type(obj) in (types.ClassType, type)
-
-def check_subclass(obj, class_):
-    if not isclass(obj):
-        return False
-    return issubclass(obj, class_)
-
 AMBIGUOUS_CONTEXT = object()
 def grok(dotted_name):
     # TODO for now we only grok modules
@@ -79,20 +83,41 @@
         context = module.__grok_context__
 
     for factory in adapters:
-        adapter_context = determineContext(factory, context)
+        adapter_context = determine_context(factory, context)
         name = getattr(factory, '__grok_name__', '')
         component.provideAdapter(factory, adapts=(adapter_context,), name=name)
 
     for factory in views:
-        view_context = determineContext(factory, context)
+        view_context = determine_context(factory, context)
         name = factory.__name__.lower()
         name = getattr(factory, '__grok_name__', name)
+
+        # find inline templates
+        template_name = name + '_pt'
+        template = getattr(module, template_name, None)
+        if template:
+            if not_unicode_or_ascii(template):
+                raise GrokError("Invalid inline template %s for %r.  Inline "
+                                "templates must be unicode or ASCII."
+                                % (template_name, factory))
+            factory.template = GrokTemplate()
+            factory.template.write(template)
+
         component.provideAdapter(factory,
                                  adapts=(view_context, IDefaultBrowserLayer),
                                  provides=interface.Interface,
                                  name=name)
 
-def determineContext(factory, module_context):
+def isclass(obj):
+    """We cannot use ``inspect.isclass`` because it will return True for interfaces"""
+    return type(obj) in (types.ClassType, type)
+
+def check_subclass(obj, class_):
+    if not isclass(obj):
+        return False
+    return issubclass(obj, class_)
+
+def determine_context(factory, module_context):
     context = getattr(factory, '__grok_context__', module_context)
     if context is None:
         raise GrokError("Cannot determine context for %r, please use "

Modified: grok/trunk/src/grok/tests/test_grok.py
===================================================================
--- grok/trunk/src/grok/tests/test_grok.py	2006-10-15 14:19:37 UTC (rev 70651)
+++ grok/trunk/src/grok/tests/test_grok.py	2006-10-15 14:39:18 UTC (rev 70652)
@@ -7,7 +7,8 @@
 
 def grokTestSuite(pkg):
     return doctest.DocTestSuite(pkg, tearDown=tearDown,
-                                optionflags=doctest.ELLIPSIS)
+                                optionflags=doctest.ELLIPSIS+
+                                doctest.NORMALIZE_WHITESPACE)
 
 def suiteFromPackage(name):
     files = resource_listdir(__name__, name)

Added: grok/trunk/src/grok/tests/view/inline.py
===================================================================
--- grok/trunk/src/grok/tests/view/inline.py	2006-10-15 14:19:37 UTC (rev 70651)
+++ grok/trunk/src/grok/tests/view/inline.py	2006-10-15 14:39:18 UTC (rev 70652)
@@ -0,0 +1,29 @@
+"""
+Templates can be specified in the same module as the view,
+using a variable named `viewname_pt`:
+
+  >>> grok.grok(__name__)
+  
+  >>> manfred = Mammoth()
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope import component
+  >>> view = component.getMultiAdapter((manfred, request), name='cavepainting')
+  >>> print view()
+  <html>
+  <body><h1>Mammoth Cave Painting</h1></body>
+  </html>
+"""
+import grok
+
+class Mammoth(grok.Model):
+    pass
+
+class CavePainting(grok.View):
+    pass
+
+cavepainting_pt = """\
+<html>
+<body><h1 tal:content="string:Mammoth Cave Painting"/></body>
+</html>
+"""


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



More information about the Checkins mailing list