[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