[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