[Checkins] SVN: five.pt/trunk/ Simplified template class inheritance.

Malthe Borch mborch at gmail.com
Mon Nov 17 19:44:50 EST 2008


Log message for revision 93068:
  Simplified template class inheritance.

Changed:
  U   five.pt/trunk/CHANGES.txt
  U   five.pt/trunk/src/five/pt/cmf.py
  U   five.pt/trunk/src/five/pt/pagetemplate.py
  U   five.pt/trunk/src/five/pt/zcml.txt

-=-
Modified: five.pt/trunk/CHANGES.txt
===================================================================
--- five.pt/trunk/CHANGES.txt	2008-11-18 00:43:16 UTC (rev 93067)
+++ five.pt/trunk/CHANGES.txt	2008-11-18 00:44:50 UTC (rev 93068)
@@ -4,6 +4,8 @@
 HEAD
 ----
 
+- Simplified template class inheritance. [malthe]
+
 - Added ``path`` and ``exists`` functions to skin template
   namespace. [malthe]
 

Modified: five.pt/trunk/src/five/pt/cmf.py
===================================================================
--- five.pt/trunk/src/five/pt/cmf.py	2008-11-18 00:43:16 UTC (rev 93067)
+++ five.pt/trunk/src/five/pt/cmf.py	2008-11-18 00:44:50 UTC (rev 93068)
@@ -12,55 +12,42 @@
 from AccessControl import ClassSecurityInfo
 from RestrictedPython import Utilities
 
-from pagetemplate import PageTemplateFile
-from pagetemplate import FiveTemplateFile
+from pagetemplate import BaseTemplateFile
 from pagetemplate import EContext
 
-_marker = object()
-
-class CMFTemplateFile(FiveTemplateFile):
-    @property
-    def utility_builtins(self):
-        builtins = dict(
-            econtext=EContext())
-        builtins.update(        
-            Utilities.utility_builtins)
-        return builtins
-
-class CMFPageTemplateFile(PageTemplateFile):
-    template_class = CMFTemplateFile
-    
-class FSPageTemplate(FSObject, Script):
+class FSPageTemplate(BaseTemplateFile, FSObject, Script):
     meta_type = 'Filesystem Page Template'
     
     security = ClassSecurityInfo()
     security.declareObjectProtected(permissions.View)
 
     _default_bindings = {'name_subpath': 'traverse_subpath'}
-    
-    template = None
-    
+
     def __init__(self, id, filepath, fullname=None, properties=None):
         FSObject.__init__(self, id, filepath, fullname, properties)
         self.ZBindings_edit(self._default_bindings)
 
         # instantiate page template
-        self.template = CMFPageTemplateFile(filepath)
+        BaseTemplateFile.__init__(self, filepath)
         
     def _readFile(self, reparse):
         # templates are lazy
         if reparse:
-            self.template.read()
+            self.read()
 
     def __call__(self, *args, **kwargs):
         kwargs['args'] = args
-        return self.template(self, **kwargs)
+        return BaseTemplateFile.__call__(self, self, **kwargs)
 
     @property
-    def macros(self):
-        return self.template.macros
-
-class FSControllerPageTemplate(FSControllerBase, FSPageTemplate, BaseCPT):
+    def utility_builtins(self):
+        builtins = dict(
+            econtext=EContext())
+        builtins.update(        
+            Utilities.utility_builtins)
+        return builtins
+    
+class FSControllerPageTemplate(FSPageTemplate, FSControllerBase, BaseCPT):
     def __init__(self, id, filepath, fullname=None, properties=None):
         FSPageTemplate.__init__(self, id, filepath, fullname, properties)  
         self.filepath = filepath

Modified: five.pt/trunk/src/five/pt/pagetemplate.py
===================================================================
--- five.pt/trunk/src/five/pt/pagetemplate.py	2008-11-18 00:43:16 UTC (rev 93067)
+++ five.pt/trunk/src/five/pt/pagetemplate.py	2008-11-18 00:44:50 UTC (rev 93068)
@@ -97,88 +97,70 @@
         self.vars[name] = value
 
     setGlobal = setLocal
-        
-class FiveTemplateFile(pagetemplate.PageTemplateFile.template_class):
+
+class BaseTemplateFile(pagetemplate.BaseTemplateFile):
+    """Zope 2-compatible page template class."""
+    
     utility_builtins = {}
 
-    def prepare_builtins(self, kwargs):
-        for key, value in self.utility_builtins.items():
-            kwargs.setdefault(key, value)
-
     def render_macro(self, macro, global_scope=False, parameters=None):
-        if parameters is None:
-            parameters = {}
-        self.prepare_builtins(parameters)
-        return super(FiveTemplateFile, self).render_macro(
-            macro, global_scope=global_scope, parameters=parameters)
+        context = self._pt_get_context(None, None)
 
-class PageTemplateFile(pagetemplate.PageTemplateFile):
-    template_class = FiveTemplateFile
-    
-    def bind(self, parent, macro=None, global_scope=True):
-        context = aq_parent(parent)
-        request = aq_get(parent, 'REQUEST')
-        root = get_physical_root(context)
+        if parameters is not None:
+            context.update(parameters)
+        
+        return super(BaseTemplateFile, self).render_macro(
+            macro, global_scope=global_scope, parameters=context)
 
-        template = self.template
-
-        def render(**kwargs):
-            parameters = dict(
+    def _pt_get_context(self, instance, request, **kwargs):
+        if instance is None:
+            namespace = {}
+        else:
+            context = aq_parent(instance)
+            namespace = dict(
                 context=context,
-                request=request,
-                template=parent,
+                request=request or aq_get(instance, 'REQUEST'),
+                template=self,
                 here=context,
                 container=context,
                 nothing=None,
                 path=evaluate_path,
                 exists=evaluate_exists,
-                root=root,
+                root=get_physical_root(context),
                 user=getSecurityManager().getUser(),
                 modules=SecureModuleImporter,
                 options=kwargs)
 
-            template.prepare_builtins(parameters)
-            
-            if macro is None:
-                return template.render(**parameters)
-            else:
-                return template.render_macro(
-                    macro, global_scope=global_scope, parameters=parameters)
-            
-        return render
+        for name, value in self.utility_builtins.items():
+            namespace.setdefault(name, value)
 
-    def __call__(self, parent, **kwargs):
-        template = self.bind(parent)
-        return template(**kwargs)
+        return namespace
 
 class ViewPageTemplate(pagetemplate.ViewPageTemplate):
-    def bind(self, view, request=None, macro=None, global_scope=True):
-        context = aq_inner(view.context)
-        request = view.request
-        root = get_physical_root(context)
-
-        def render(**kwargs):
-            parameters = dict(
-                view=view,
+    def _pt_get_context(self, view, request, **kwargs):
+        if view is None:
+            namespace = {}
+        else:
+            context = aq_inner(view.context)
+            request = request or view.request
+            namespace = dict(
                 context=context,
                 request=request,
+                view=view,
                 template=self,
                 here=context,
                 container=context,
                 nothing=None,
-                root=root,
+                path=evaluate_path,
+                exists=evaluate_exists,
+                root=get_physical_root(context),
+                user=getSecurityManager().getUser(),
                 modules=SecureModuleImporter,
                 views=ViewMapper(context, request),
                 options=kwargs)
 
-            if macro is None:
-                return self.template.render(**parameters)
-            else:
-                return self.template.render_macro(
-                    macro, global_scope=global_scope, parameters=parameters)
-            
-        return render
-
+        return namespace
+    
 class ViewPageTemplateFile(ViewPageTemplate, pagetemplate.ViewPageTemplateFile):
     """If ``filename`` is a relative path, the module path of the
     class where the instance is used to get an absolute path."""

Modified: five.pt/trunk/src/five/pt/zcml.txt
===================================================================
--- five.pt/trunk/src/five/pt/zcml.txt	2008-11-18 00:43:16 UTC (rev 93067)
+++ five.pt/trunk/src/five/pt/zcml.txt	2008-11-18 00:44:50 UTC (rev 93068)
@@ -25,7 +25,7 @@
   ...     interface.Interface, name="test1")
 
   >>> factory.index
-  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+  <five.pt.pagetemplate.BoundViewPageTemplateFile '.../test.pt'>
 
 We can base the view on an existing class.
   
@@ -43,7 +43,7 @@
   ...     interface.Interface, name="test2")
 
   >>> factory.index
-  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+  <five.pt.pagetemplate.BoundViewPageTemplateFile '.../test.pt'>
 
   >>> issubclass(factory, View)
   True
@@ -68,7 +68,7 @@
   ...     IViewletManager, name="test1")
 
   >>> factory.template
-  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+  <five.pt.pagetemplate.BoundViewPageTemplateFile '.../test.pt'>
 
 We can base the viewlet manager on an existing class.
 
@@ -88,7 +88,7 @@
   ...     IViewletManager, name="test2")
 
   >>> factory.template
-  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+  <five.pt.pagetemplate.BoundViewPageTemplateFile '.../test.pt'>
 
   >>> issubclass(factory, ViewletManager)
   True
@@ -109,7 +109,7 @@
   ...     interface.Interface, name="test1")
 
   >>> factory.index
-  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+  <five.pt.pagetemplate.BoundViewPageTemplateFile '.../test.pt'>
 
 We can base the viewlet on an existing class.
 
@@ -129,7 +129,7 @@
   ...     interface.Interface, name="test2")
 
   >>> factory.index
-  <five.pt.pagetemplate.ViewPageTemplateFile object at ...>
+  <five.pt.pagetemplate.BoundViewPageTemplateFile '.../test.pt'>
 
   >>> issubclass(factory, Viewlet)
   True



More information about the Checkins mailing list