[Zope-Checkins] SVN: Products.Five/trunk/ Merge ajung-zpt-end-game
branch.
Philipp von Weitershausen
philikon at philikon.de
Mon May 29 05:47:25 EDT 2006
Log message for revision 68331:
Merge ajung-zpt-end-game branch.
Changed:
U Products.Five/trunk/CHANGES.txt
D Products.Five/trunk/browser/ProviderExpression.py
D Products.Five/trunk/browser/ReuseUtils.py
D Products.Five/trunk/browser/TrustedExpression.py
U Products.Five/trunk/browser/pagetemplatefile.py
U Products.Five/trunk/browser/tests/i18n.pt
A Products.Five/trunk/browser/tests/i18n.py
U Products.Five/trunk/browser/tests/pages.py
U Products.Five/trunk/browser/tests/pages.txt
U Products.Five/trunk/browser/tests/test_i18n.py
U Products.Five/trunk/browser/tests/test_pages.py
U Products.Five/trunk/formlib/formbase.py
U Products.Five/trunk/viewlet/directives.txt
-=-
Modified: Products.Five/trunk/CHANGES.txt
===================================================================
--- Products.Five/trunk/CHANGES.txt 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/CHANGES.txt 2006-05-29 09:47:23 UTC (rev 68331)
@@ -5,6 +5,13 @@
Five 1.5c (Unreleased)
======================
+Restructuring
+-------------
+
+* Zope 2.10+ uses the Zope 3 PageTemplate engine (incl. TAL and
+ TALES). A bunch of special and magic code in Five has become
+ obsolete with this, some other had to be readjusted.
+
Bugfixes
--------
Deleted: Products.Five/trunk/browser/ProviderExpression.py
===================================================================
--- Products.Five/trunk/browser/ProviderExpression.py 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/browser/ProviderExpression.py 2006-05-29 09:47:23 UTC (rev 68331)
@@ -1,62 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Provider tales expression registrations
-
-$Id: tales.py 39606 2005-10-25 02:59:26Z srichter $
-"""
-__docformat__ = 'restructuredtext'
-from Products.PageTemplates.Expressions import StringExpr
-from Products.PageTemplates.Expressions import getEngine
-from AccessControl.ZopeGuards import guarded_hasattr
-from AccessControl.ZopeSecurityPolicy import getRoles
-import Products.Five.security
-
-import zope.component
-import zope.schema
-import zope.interface
-from zope.contentprovider import interfaces
-from zope.contentprovider.tales import addTALNamespaceData
-
-_noroles = []
-
-class ProviderExpr(StringExpr):
- """A provider expression for Zope2 templates.
- """
-
- zope.interface.implements(interfaces.ITALESProviderExpression)
- def __call__(self, econtext):
- name = StringExpr.__call__(self, econtext)
- context = econtext.vars['context']
- request = econtext.vars['request']
- view = econtext.vars['view']
-
- # Try to look up the provider.
- provider = zope.component.queryMultiAdapter(
- (context, request, view), interfaces.IContentProvider, name)
-
- # Provide a useful error message, if the provider was not found.
- if provider is None:
- raise interfaces.ContentProviderLookupError(name)
-
- # Insert the data gotten from the context
- addTALNamespaceData(provider, econtext)
-
- # Stage 1: Do the state update.
- provider.update()
-
- # Stage 2: Render the HTML content.
- return provider.render()
-
-# Register Provider expression
-getEngine().registerType('provider', ProviderExpr)
Deleted: Products.Five/trunk/browser/ReuseUtils.py
===================================================================
--- Products.Five/trunk/browser/ReuseUtils.py 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/browser/ReuseUtils.py 2006-05-29 09:47:23 UTC (rev 68331)
@@ -1,32 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004, 2005 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Utils to be reused
-
-$Id$
-"""
-from new import function
-
-def rebindFunction(f,rebindDir=None,**rebinds):
- '''return *f* with some globals rebound.'''
- d= {}
- if rebindDir : d.update(rebindDir)
- if rebinds: d.update(rebinds)
- if not d: return f
- f= getattr(f,'im_func',f)
- fd= f.func_globals.copy()
- fd.update(d)
- nf= function(f.func_code,fd,f.func_name,f.func_defaults or ())
- nf.__doc__= f.__doc__
- if f.__dict__ is not None: nf.__dict__= f.__dict__.copy()
- return nf
Deleted: Products.Five/trunk/browser/TrustedExpression.py
===================================================================
--- Products.Five/trunk/browser/TrustedExpression.py 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/browser/TrustedExpression.py 2006-05-29 09:47:23 UTC (rev 68331)
@@ -1,141 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004, 2005 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Trusted expression
-
-$Id$
-"""
-from Products.PageTemplates.PythonExpr import PythonExpr
-from Products.PageTemplates.Expressions import \
- SubPathExpr, PathExpr, \
- StringExpr, \
- getEngine, installHandlers,\
- SecureModuleImporter
-
-from Products.Five.browser.ProviderExpression import ProviderExpr
-
-from ReuseUtils import rebindFunction
-
-ModuleImporter = SecureModuleImporter
-
-from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.interface import implements, Interface
-from zope.publisher.browser import setDefaultSkin
-from zope.traversing.namespace import nsParse, namespaceLookup
-from zope.component import queryMultiAdapter
-
-class FakeRequest(dict):
- implements(IBrowserRequest)
-
- def getURL(self):
- return "http://codespeak.net/z3/five"
-
-def trustedTraverse(ob, path, ignored,):
- if not path: return self
-
- get = getattr
- has = hasattr
- N = None
- M = rebindFunction # artifical marker
-
- if isinstance(path, str): path = path.split('/')
- else: path=list(path)
-
- REQUEST = get(ob, 'REQUEST', None)
- if REQUEST is None:
- REQUEST=FakeRequest()
- setDefaultSkin(REQUEST)
- REQUEST['TraversalRequestNameStack'] = path
- path.reverse()
- pop=path.pop
-
- if len(path) > 1 and not path[0]:
- # Remove trailing slash
- path.pop(0)
-
- if not path[-1]:
- # If the path starts with an empty string, go to the root first.
- pop()
- self=ob.getPhysicalRoot()
-
- object = ob
- while path:
- name=pop()
- __traceback_info__ = path, name
-
- if name == '..':
- o=getattr(object, 'aq_parent', M)
- if o is not M:
- object=o
- continue
-
- if name and name[:1] in '@+':
- # Process URI segment parameters.
- ns, nm = nsParse(name)
- if ns:
- try:
- o = namespaceLookup(ns, nm, object, REQUEST).__of__(object)
- except TraversalError:
- raise KeyError(name)
- object = o
- continue
-
- t=get(object, '__bobo_traverse__', M)
- if t is not M: o=t(REQUEST, name)
- else:
- o = get(object, name, M)
- if o is M:
- try: o = object[name]
- except (AttributeError, TypeError): # better exception
- o = queryMultiAdapter((object, REQUEST), Interface, name)
- if o is not None:
- o = o.__of__(object)
- else:
- raise AttributeError(name)
- object = o
-
- return object
-
-
-class SubPathExpr(SubPathExpr):
- _eval = rebindFunction(SubPathExpr._eval.im_func,
- restrictedTraverse=trustedTraverse,
- )
-
-class PathExpr(PathExpr):
- __init__ = rebindFunction(PathExpr.__init__.im_func,
- SubPathExpr=SubPathExpr,
- )
-
-class StringExpr(StringExpr):
- __init__ = rebindFunction(StringExpr.__init__.im_func,
- PathExpr=PathExpr,
- )
-
-
-installHandlers = rebindFunction(installHandlers,
- PathExpr=PathExpr,
- StringExpr=StringExpr,
- PythonExpr=PythonExpr,
- )
-
-def installHandlers2(engine):
- installHandlers(engine)
- engine.registerType('provider', ProviderExpr)
-
-_engine=None
-getEngine = rebindFunction(getEngine,
- _engine=_engine,
- installHandlers=installHandlers2
- )
-
Modified: Products.Five/trunk/browser/pagetemplatefile.py
===================================================================
--- Products.Five/trunk/browser/pagetemplatefile.py 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/browser/pagetemplatefile.py 2006-05-29 09:47:23 UTC (rev 68331)
@@ -19,14 +19,16 @@
from Globals import package_home
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from Products.PageTemplates.Expressions import SecureModuleImporter
+from Products.PageTemplates.Expressions import createTrustedZopeEngine
from zope.app.pagetemplate.viewpagetemplatefile import ViewMapper
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
-from Products.Five.browser.ReuseUtils import rebindFunction
-from Products.Five.browser.TrustedExpression import getEngine, ModuleImporter
+_engine = createTrustedZopeEngine()
+def getEngine():
+ return _engine
-
class ZopeTwoPageTemplateFile(PageTemplateFile):
"""A strange hybrid between Zope 2 and Zope 3 page template.
@@ -47,14 +49,8 @@
basepath, ext = os.path.splitext(self.filename)
self.__name__ = os.path.basename(basepath)
+ super(PageTemplateFile, self).__init__(self.filename, _prefix)
- # required for the ajung-zpt-final-integration branch
- try:
- PageTemplateFile.__init__(self, self.filename, _prefix)
- except:
- pass
-
-
def get_path_from_prefix(self, _prefix):
if isinstance(_prefix, str):
path = _prefix
@@ -64,12 +60,9 @@
path = package_home(_prefix)
return path
- _cook = rebindFunction(PageTemplateFile._cook,
- getEngine=getEngine)
+ def pt_getEngine(self):
+ return getEngine()
- pt_render = rebindFunction(PageTemplateFile.pt_render,
- getEngine=getEngine)
-
def pt_getContext(self):
try:
root = self.getPhysicalRoot()
@@ -92,7 +85,7 @@
'options': {},
'root': root,
'request': request,
- 'modules': ModuleImporter,
+ 'modules': SecureModuleImporter,
}
if view is not None:
c['view'] = view
Modified: Products.Five/trunk/browser/tests/i18n.pt
===================================================================
--- Products.Five/trunk/browser/tests/i18n.pt 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/browser/tests/i18n.pt 2006-05-29 09:47:23 UTC (rev 68331)
@@ -8,5 +8,7 @@
</table>
<table summary="Explicit summary" title="Explicit title" i18n:attributes="summary explicit-summary; title explicit-title" >
</table>
+<p tal:content="view/this_is_a_message">Text should be inserted here and translated automatically</p>
+<p tal:content="view/this_is_a_message" i18n:translate="">Text should be inserted here and translated</p>
</body>
</html>
Copied: Products.Five/trunk/browser/tests/i18n.py (from rev 68330, Products.Five/branches/ajung-zpt-end-game/browser/tests/i18n.py)
Modified: Products.Five/trunk/browser/tests/pages.py
===================================================================
--- Products.Five/trunk/browser/tests/pages.py 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/browser/tests/pages.py 2006-05-29 09:47:23 UTC (rev 68331)
@@ -22,35 +22,35 @@
def eagle(self):
"""Docstring"""
- return "The eagle has landed"
+ return u"The eagle has landed"
def mouse(self):
"""Docstring"""
- return "The mouse has been eaten by the eagle"
+ return u"The mouse has been eaten by the eagle"
class FancyView(BrowserView):
"""Fancy, fancy stuff"""
def view(self):
- return "Fancy, fancy"
+ return u"Fancy, fancy"
class CallView(BrowserView):
def __call__(self):
- return "I was __call__()'ed"
+ return u"I was __call__()'ed"
class CallableNoDocstring:
def __call__(self):
- return "No docstring"
+ return u"No docstring"
def function_no_docstring(self):
- return "No docstring"
+ return u"No docstring"
class NoDocstringView(BrowserView):
def method(self):
- return "No docstring"
+ return u"No docstring"
function = function_no_docstring
Modified: Products.Five/trunk/browser/tests/pages.txt
===================================================================
--- Products.Five/trunk/browser/tests/pages.txt 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/browser/tests/pages.txt 2006-05-29 09:47:23 UTC (rev 68331)
@@ -35,13 +35,13 @@
>>> isinstance(view, SimpleView)
True
>>> view()
- 'The eagle has landed'
+ u'The eagle has landed'
A browser page that is a Page Template.
>>> view = self.folder.unrestrictedTraverse('testoid/owl.html')
>>> view()
- '<p>2</p>\n'
+ u'<p>2</p>\n'
A browser page that is a PageTemplate plus a view class:
@@ -49,7 +49,7 @@
>>> isinstance(view, SimpleView)
True
>>> view()
- '<p>The falcon has taken flight</p>\n'
+ u'<p>The falcon has taken flight</p>\n'
Test pages that have been registered through the cumulative
<browser:pages> directive:
@@ -58,13 +58,13 @@
>>> isinstance(view, SimpleView)
True
>>> view()
- 'The eagle has landed'
+ u'The eagle has landed'
>>> view = self.folder.unrestrictedTraverse('testoid/mouse-page.txt')
>>> isinstance(view, SimpleView)
True
>>> view()
- 'The mouse has been eaten by the eagle'
+ u'The mouse has been eaten by the eagle'
Zope 2 objects always need a docstring in order to be published. Five
adds a docstring automatically if a view method doesn't have it, but
@@ -101,7 +101,7 @@
>>> view = self.folder.unrestrictedTraverse('testoid/seagull.html')
>>> view()
- '<html><head><title>bird macro</title></head><body>Color: gray</body></html>\n'
+ u'<html><head><title>bird macro</title></head><body>Color: gray</body></html>\n'
Test whether old-style direct traversal still works with a
five:traversable class:
@@ -301,7 +301,7 @@
... ''')
>>> view = self.folder.unrestrictedTraverse('testoid/overridden_view')
>>> view()
- 'The mouse has been eaten by the eagle'
+ u'The mouse has been eaten by the eagle'
Test traversal to resources from within ZPT pages:
Modified: Products.Five/trunk/browser/tests/test_i18n.py
===================================================================
--- Products.Five/trunk/browser/tests/test_i18n.py 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/browser/tests/test_i18n.py 2006-05-29 09:47:23 UTC (rev 68331)
@@ -34,6 +34,7 @@
... <configure package="Products.Five.browser.tests">
... <browser:page
... for="OFS.interfaces.IFolder"
+ ... class=".i18n.I18nView"
... template="i18n.pt"
... name="i18n.html"
... permission="zope2.View"
@@ -73,6 +74,8 @@
<table summary="Explizite Zusammenfassung"
title="Expliziter Titel">
</table>
+ <p>Dies ist eine Nachricht</p>
+ <p>Dies ist eine Nachricht</p>
</body>
</html>
...
Modified: Products.Five/trunk/browser/tests/test_pages.py
===================================================================
--- Products.Five/trunk/browser/tests/test_pages.py 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/browser/tests/test_pages.py 2006-05-29 09:47:23 UTC (rev 68331)
@@ -39,7 +39,7 @@
>>> isinstance(view, SimpleView)
True
>>> view()
- 'The eagle has landed'
+ u'The eagle has landed'
This sucks, but we know it
Modified: Products.Five/trunk/formlib/formbase.py
===================================================================
--- Products.Five/trunk/formlib/formbase.py 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/formlib/formbase.py 2006-05-29 09:47:23 UTC (rev 68331)
@@ -22,7 +22,8 @@
import zope.lifecycleevent
from zope import interface
from zope.formlib import interfaces, form, namedtemplate
-from zope.formlib.i18n import _
+from zope.i18nmessageid import MessageFactory
+_ = MessageFactory("zope")
from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
from Products.Five.browser.decode import processInputs, setPageEncoding
Modified: Products.Five/trunk/viewlet/directives.txt
===================================================================
--- Products.Five/trunk/viewlet/directives.txt 2006-05-29 07:08:39 UTC (rev 68330)
+++ Products.Five/trunk/viewlet/directives.txt 2006-05-29 09:47:23 UTC (rev 68331)
@@ -220,7 +220,7 @@
... (content, request, view, manager), interfaces.IViewlet,
... name='weather')
>>> viewlet.render().strip()
- '<div>sunny</div>'
+ u'<div>sunny</div>'
>>> viewlet.extra_string_attributes
u'can be specified'
@@ -253,7 +253,7 @@
... (content, request, view, manager), interfaces.IViewlet,
... name='weather2')
>>> viewlet().strip()
- '<div>sunny</div>'
+ u'<div>sunny</div>'
Okay, so the template-driven cases work. But just specifying a class should
also work:
More information about the Zope-Checkins
mailing list