[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