[Checkins] SVN: z3c.pt/trunk/ Simplified template class inheritance.
Malthe Borch
mborch at gmail.com
Mon Nov 17 16:41:33 EST 2008
Log message for revision 93057:
Simplified template class inheritance.
Changed:
U z3c.pt/trunk/CHANGES.txt
U z3c.pt/trunk/src/z3c/pt/pagetemplate.py
U z3c.pt/trunk/src/z3c/pt/texttemplate.py
-=-
Modified: z3c.pt/trunk/CHANGES.txt
===================================================================
--- z3c.pt/trunk/CHANGES.txt 2008-11-17 20:41:05 UTC (rev 93056)
+++ z3c.pt/trunk/CHANGES.txt 2008-11-17 21:41:33 UTC (rev 93057)
@@ -4,6 +4,8 @@
Head
~~~~
+- Simplified template class inheritance. [malthe]
+
- Added support for the question-mark operator in path-expressions. [malthe]
- Updated expressions to recent API changes. [malthe]
Modified: z3c.pt/trunk/src/z3c/pt/pagetemplate.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/pagetemplate.py 2008-11-17 20:41:05 UTC (rev 93056)
+++ z3c.pt/trunk/src/z3c/pt/pagetemplate.py 2008-11-17 21:41:33 UTC (rev 93057)
@@ -4,55 +4,42 @@
import chameleon.zpt.template
import chameleon.zpt.language
-class ZopePageTemplate(chameleon.zpt.template.PageTemplate):
- default_parser = chameleon.zpt.language.Parser(default_expression='path')
-
-class ZopePageTemplateFile(chameleon.zpt.template.PageTemplateFile):
- default_parser = chameleon.zpt.language.Parser(default_expression='path')
-
-class PageTemplate(property):
+class PageTemplate(chameleon.zpt.template.PageTemplate):
"""Template class suitable for standalone use or as a class
attribute (property). Keyword-arguments are passed into the
template as-is."""
- template_class = ZopePageTemplate
+ default_parser = chameleon.zpt.language.Parser(default_expression='path')
- def __init__(self, body, **kwargs):
- self.template = self.template_class(body, **kwargs)
- property.__init__(self, self.bind)
-
- def bind(self, obj, macro=None, global_scope=True):
+ def bind(self, ob, request=None, macro=None, global_scope=True):
def render(**kwargs):
- template = self.template
-
- parameters = dict(
- request=None,
- template=template,
- options=kwargs,
- nothing=None)
-
+ context = self._pt_get_context(ob, request, **kwargs)
+
if macro is None:
- return template.render(**parameters)
+ return self.render(**context)
else:
- return template.render_macro(
- macro, global_scope=global_scope, parameters=parameters)
-
- return render
+ return self.render_macro(
+ macro, global_scope=global_scope, parameters=context)
- @property
- def macros(self):
- return self.template.macros
+ return BoundPageTemplate(render, self)
- def __call__(self, **kwargs):
- template = self.bind(None)
- return template(**kwargs)
+ def __call__(self, _ob=None, **kwargs):
+ bound_pt = self.__get__(_ob)
+ return bound_pt(**kwargs)
-class PageTemplateFile(PageTemplate):
+ def _pt_get_context(self, instance, request, **kwargs):
+ return dict(
+ options=kwargs,
+ request=request,
+ template=self,
+ nothing=None)
+
+ __get__ = bind
+
+class PageTemplateFile(PageTemplate, chameleon.zpt.template.PageTemplateFile):
"""If ``filename`` is a relative path, the module path of the
class where the instance is used to get an absolute path."""
- template_class = ZopePageTemplateFile
-
def __init__(self, filename, path=None, content_type=None, **kwargs):
if path is not None:
filename = os.path.join(path, filename)
@@ -74,13 +61,26 @@
filename = path + os.sep + filename
- self.template = self.template_class(filename, **kwargs)
- property.__init__(self, self.bind)
+ chameleon.zpt.template.PageTemplateFile.__init__(
+ self, filename, **kwargs)
- @property
- def filename(self):
- return self.template.filename
-
+class BoundPageTemplate(object):
+ def __init__(self, render, pt):
+ object.__setattr__(self, 'im_func', render)
+ object.__setattr__(self, 'im_self', pt)
+
+ macros = property(lambda self: self.im_self.macros)
+ filename = property(lambda self: self.im_self.filename)
+
+ def __call__(self, *args, **kw):
+ return self.im_func(*args, **kw)
+
+ def __setattr__(self, name, v):
+ raise AttributeError("Can't set attribute", name)
+
+ def __repr__(self):
+ return "<%s %r>" % (type(self).__name__, self.filename)
+
class ViewPageTemplate(PageTemplate):
"""Template class suitable for use with a Zope browser view; the
variables ``view``, ``context`` and ``request`` variables are
@@ -88,31 +88,16 @@
keyword arguments are passed in through the ``options``
dictionary. Note that the default expression type for this class
is 'path' (standard Zope traversal)."""
-
- def bind(self, view, request=None, macro=None, global_scope=True):
- def render(**kwargs):
- template = self.template
-
- parameters = dict(
- view=view,
- context=view.context,
- request=request or view.request,
- template=template,
- options=kwargs,
- nothing=None)
- if macro is None:
- return template.render(**parameters)
- else:
- return template.render_macro(
- macro, global_scope=global_scope, parameters=parameters)
-
- return render
+ def _pt_get_context(self, view, request, **kwargs):
+ return dict(
+ view=view,
+ context=view.context,
+ request=request or view.request,
+ template=self,
+ options=kwargs,
+ nothing=None)
- def __call__(self, view, **kwargs):
- template = self.bind(view)
- return template(**kwargs)
-
class ViewPageTemplateFile(ViewPageTemplate, PageTemplateFile):
"""If ``filename`` is a relative path, the module path of the
class where the instance is used to get an absolute path."""
Modified: z3c.pt/trunk/src/z3c/pt/texttemplate.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/texttemplate.py 2008-11-17 20:41:05 UTC (rev 93056)
+++ z3c.pt/trunk/src/z3c/pt/texttemplate.py 2008-11-17 21:41:33 UTC (rev 93057)
@@ -1,17 +1,17 @@
import pagetemplate
-class TextTemplate(pagetemplate.ZopePageTemplate):
- __doc__ = pagetemplate.ZopePageTemplate.__doc__ # for Sphinx autodoc
+class TextTemplate(pagetemplate.PageTemplate):
+ __doc__ = pagetemplate.PageTemplate.__doc__ # for Sphinx autodoc
format = 'text'
-class TextTemplateFile(pagetemplate.ZopePageTemplateFile):
- __doc__ = pagetemplate.ZopePageTemplateFile.__doc__ # for Sphinx autodoc
+class TextTemplateFile(pagetemplate.PageTemplateFile):
+ __doc__ = pagetemplate.PageTemplateFile.__doc__ # for Sphinx autodoc
format = 'text'
class ViewTextTemplate(pagetemplate.ViewPageTemplate):
__doc__ = pagetemplate.ViewPageTemplate.__doc__ # for Sphinx autodoc
- template_class = TextTemplate
-
+ format = 'text'
+
class ViewTextTemplateFile(pagetemplate.ViewPageTemplateFile):
__doc__ = pagetemplate.ViewPageTemplateFile.__doc__ # for Sphinx autodoc
- template_class = TextTemplateFile
+ format = 'text'
More information about the Checkins
mailing list