[Checkins] SVN: five.pt/trunk/ Added support for ``PageTemplate`` and ``ZopePageTemplate`` classes. Also added test cases for the patches. Tested on 3.3 and 4.0.
Malthe Borch
mborch at gmail.com
Wed Sep 8 02:54:51 EDT 2010
Log message for revision 116217:
Added support for ``PageTemplate`` and ``ZopePageTemplate`` classes. Also added test cases for the patches. Tested on 3.3 and 4.0.
Changed:
U five.pt/trunk/CHANGES.txt
U five.pt/trunk/src/five/pt/pagetemplate.py
U five.pt/trunk/src/five/pt/patches.py
U five.pt/trunk/src/five/pt/tests/simple.pt
D five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py
A five.pt/trunk/src/five/pt/tests/test_viewpagetemplatefile.py
-=-
Modified: five.pt/trunk/CHANGES.txt
===================================================================
--- five.pt/trunk/CHANGES.txt 2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/CHANGES.txt 2010-09-08 06:54:50 UTC (rev 116217)
@@ -3,9 +3,9 @@
In next release...
-- ...
+- Added support for ``PageTemplate`` and
+ ``ZopePageTemplate``. [malthe]
-
1.2 - 2010-08-30
~~~~~~~~~~~~~~~~
Modified: five.pt/trunk/src/five/pt/pagetemplate.py
===================================================================
--- five.pt/trunk/src/five/pt/pagetemplate.py 2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/src/five/pt/pagetemplate.py 2010-09-08 06:54:50 UTC (rev 116217)
@@ -43,7 +43,7 @@
context = aq_parent(instance)
namespace = dict(
context=context,
- request=request or aq_get(instance, 'REQUEST'),
+ request=request or aq_get(instance, 'REQUEST', None),
template=self,
here=context,
container=context,
Modified: five.pt/trunk/src/five/pt/patches.py
===================================================================
--- five.pt/trunk/src/five/pt/patches.py 2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/src/five/pt/patches.py 2010-09-08 06:54:50 UTC (rev 116217)
@@ -12,10 +12,13 @@
ZopeViewPageTemplateFile
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from Products.PageTemplates.PageTemplateFile import PageTemplate
+from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile as \
FiveViewPageTemplateFile
from five.pt.pagetemplate import ViewPageTemplateFile
+from five.pt.pagetemplate import BaseTemplate
from five.pt.pagetemplate import BaseTemplateFile
from Acquisition import aq_base
@@ -23,6 +26,8 @@
from Acquisition.interfaces import IAcquirer
from Acquisition import ImplicitAcquisitionWrapper
+from ComputedAttribute import ComputedAttribute
+
try:
from Products.Five.browser.pagetemplatefile import BoundPageTemplate
except ImportError:
@@ -56,38 +61,61 @@
if instance is None:
return self
- template = getattr(self, '_template', _marker)
+ template = getattr(self, '_v_template', _marker)
if template is _marker:
- self._template = template = ViewPageTemplateFile(self.filename)
+ self._v_template = template = ViewPageTemplateFile(self.filename)
return BoundPageTemplate(template, instance)
def call_template(self, *args, **kw):
- template = getattr(self, '_template', _marker)
+ template = getattr(self, '_v_template', _marker)
+ if template is _marker or self._text != template.body:
+ self._v_template = template = BaseTemplate(self._text)
+
+ return template(self, *args, **kw)
+
+def call_template_and_wrap(self, *args, **kw):
+ template = getattr(self, '_v_template', _marker)
+ if template is _marker or self._text != template.body:
+ self._v_template = template = BaseTemplate(self._text)
+
+ if IAcquirer.providedBy(template):
+ template = template.__of__(aq_parent(self))
+ else:
+ template = ImplicitAcquisitionWrapper(template, aq_parent(self))
+
+ return template(self, *args, **kw)
+
+def call_template_file(self, *args, **kw):
+ template = getattr(self, '_v_template', _marker)
if template is _marker:
- self._template = template = BaseTemplateFile(self.filename)
+ self._v_template = template = BaseTemplateFile(self.filename)
if IAcquirer.providedBy(template):
- template = template.__of__(self)
+ template = template.__of__(aq_parent(self))
else:
template = ImplicitAcquisitionWrapper(template, aq_parent(self))
return template(self, *args, **kw)
def get_macros(self):
- template = getattr(self, '_template', _marker)
+ template = getattr(self, '_v_template', _marker)
if template is _marker:
- self._template = template = BaseTemplateFile(self.filename)
+ self._v_template = template = BaseTemplateFile(self.filename)
if IAcquirer.providedBy(template):
- return template.__of__(self).macros
+ return template.__of__(aq_parent(self)).macros
else:
return template.macros
FiveViewPageTemplateFile.__get__ = get_bound_template
ZopeViewPageTemplateFile.__get__ = get_bound_template
-PageTemplateFile.__call__ = call_template
+PageTemplate.__call__ = call_template
+PageTemplate.macros = ComputedAttribute(get_macros, 1)
+PageTemplateFile.__call__ = call_template_file
PageTemplateFile.macros = property(get_macros)
+ZopePageTemplate.__call__ = call_template_and_wrap
+ZopePageTemplate.macros = ComputedAttribute(get_macros, 1)
try:
from five.grok.components import ZopeTwoPageTemplate
Modified: five.pt/trunk/src/five/pt/tests/simple.pt
===================================================================
--- five.pt/trunk/src/five/pt/tests/simple.pt 2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/src/five/pt/tests/simple.pt 2010-09-08 06:54:50 UTC (rev 116217)
@@ -1,4 +1,6 @@
<div xmlns="http://www.w3.org/1999/xhtml"
- xmlns:tal="http://xml.zope.org/namespaces/tal">
- Hello World
+ xmlns:tal="http://xml.zope.org/namespaces/tal"
+ meta:interpolation="true"
+ tal:define="name string:world">
+ Hello ${name}!
</div>
Deleted: five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py
===================================================================
--- five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py 2010-09-07 21:49:08 UTC (rev 116216)
+++ five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py 2010-09-08 06:54:50 UTC (rev 116217)
@@ -1,62 +0,0 @@
-import unittest
-
-from Products.Five import BrowserView
-from Testing.ZopeTestCase import ZopeTestCase
-
-from five.pt.pagetemplate import ViewPageTemplateFile
-
-class SimpleView(BrowserView):
- index = ViewPageTemplateFile('simple.pt')
-
-class LocalsView(BrowserView):
- def available(self):
- return 'yes'
-
- def tagsoup(self):
- return '<foo></bar>'
-
- index = ViewPageTemplateFile('locals.pt')
-
-class OptionsView(BrowserView):
- index = ViewPageTemplateFile('options.pt')
-
-class TestPageTemplateFile(ZopeTestCase):
- def afterSetUp(self):
- from Products.Five import zcml
- import Products.Five
- import z3c.pt
- zcml.load_config("configure.zcml", Products.Five)
- zcml.load_config("configure.zcml", z3c.pt)
-
- def test_simple(self):
- view = SimpleView(self.folder, self.folder.REQUEST)
- result = view.index()
- self.failUnless('Hello World' in result)
-
- def test_locals(self):
- view = LocalsView(self.folder, self.folder.REQUEST)
- result = view.index()
- self.failUnless("view:yes" in result)
- #self.failUnless('Folder at test_folder_1_' in result)
- #self.failUnless('http://nohost' in result)
- self.failUnless('here==context:True' in result)
- self.failUnless('here==container:True' in result)
- self.failUnless("root:(\'\',)" in result)
- self.failUnless("nothing:None" in result)
- self.failUnless("modules:<foo>" in result)
-
- def test_options(self):
- view = OptionsView(self.folder, self.folder.REQUEST)
- options = dict(
- a=1,
- b=2,
- c='abc',
- )
- result = view.index(**options)
- self.failUnless("a : 1" in result)
- self.failUnless("c : abc" in result)
-
-
-def test_suite():
- import sys
- return unittest.findTestCases(sys.modules[__name__])
Copied: five.pt/trunk/src/five/pt/tests/test_viewpagetemplatefile.py (from rev 116209, five.pt/trunk/src/five/pt/tests/test_pagetemplatefile.py)
===================================================================
--- five.pt/trunk/src/five/pt/tests/test_viewpagetemplatefile.py (rev 0)
+++ five.pt/trunk/src/five/pt/tests/test_viewpagetemplatefile.py 2010-09-08 06:54:50 UTC (rev 116217)
@@ -0,0 +1,64 @@
+import unittest
+
+from Products.Five import BrowserView
+from Testing.ZopeTestCase import ZopeTestCase
+
+from five.pt.pagetemplate import ViewPageTemplateFile
+
+class SimpleView(BrowserView):
+ index = ViewPageTemplateFile('simple.pt')
+
+class LocalsView(BrowserView):
+ def available(self):
+ return 'yes'
+
+ def tagsoup(self):
+ return '<foo></bar>'
+
+ index = ViewPageTemplateFile('locals.pt')
+
+class OptionsView(BrowserView):
+ index = ViewPageTemplateFile('options.pt')
+
+class TestPageTemplateFile(ZopeTestCase):
+ def afterSetUp(self):
+ from Products.Five import zcml
+ import Products.Five
+ import z3c.pt
+ import five.pt
+ zcml.load_config("configure.zcml", Products.Five)
+ zcml.load_config("configure.zcml", five.pt)
+ zcml.load_config("configure.zcml", z3c.pt)
+
+ def test_simple(self):
+ view = SimpleView(self.folder, self.folder.REQUEST)
+ result = view.index()
+ self.failUnless('Hello world!' in result)
+
+ def test_locals(self):
+ view = LocalsView(self.folder, self.folder.REQUEST)
+ result = view.index()
+ self.failUnless("view:yes" in result)
+ #self.failUnless('Folder at test_folder_1_' in result)
+ #self.failUnless('http://nohost' in result)
+ self.failUnless('here==context:True' in result)
+ self.failUnless('here==container:True' in result)
+ self.failUnless("root:(\'\',)" in result)
+ self.failUnless("nothing:None" in result)
+ self.failUnless("modules:<foo>" in result)
+
+ def test_options(self):
+ view = OptionsView(self.folder, self.folder.REQUEST)
+ options = dict(
+ a=1,
+ b=2,
+ c='abc',
+ )
+ result = view.index(**options)
+ self.failUnless("a : 1" in result)
+ self.failUnless("c : abc" in result)
+
+
+def test_suite():
+ import sys
+ return unittest.findTestCases(sys.modules[__name__])
More information about the checkins
mailing list