[zope2-tracker] [Bug 1004588] [NEW] A valid PageTemplate fails rendering with AttributeError in zope.tal.talgenerator

void 1004588 at bugs.launchpad.net
Fri May 25 17:07:32 UTC 2012


Public bug reported:

This template fails on Zope 2.13.13 (which uses zope.tal-3.5.2 at this
moment):

<html>
  <head>
    <title tal:content="template/title">The title</title>
  </head>
  <body>
    <div tal:attributes="attr0 string: value0" tal:replace="structure string: WTF?" />
  </body>
</html>

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/data/lib/python2.7/site-packages/Zope2-2.13.13-py2.7.egg/Shared/DC/Scripts/Bindings.py", line 322, in __call__
    return self._bindAndExec(args, kw, None)
  File "/data/lib/python2.7/site-packages/Zope2-2.13.13-py2.7.egg/Shared/DC/Scripts/Bindings.py", line 359, in _bindAndExec
    return self._exec(bound_data, args, kw)
  File "/data/lib/python2.7/site-packages/Zope2-2.13.13-py2.7.egg/Products/PageTemplates/ZopePageTemplate.py", line 334, in _exec
    result = self.pt_render(extra_context=bound_names)
  File "/data/lib/python2.7/site-packages/Zope2-2.13.13-py2.7.egg/Products/PageTemplates/ZopePageTemplate.py", line 431, in pt_render
    result = PageTemplate.pt_render(self, source, extra_context)
  File "/data/lib/python2.7/site-packages/Zope2-2.13.13-py2.7.egg/Products/PageTemplates/PageTemplate.py", line 79, in pt_render
    showtal=showtal)
  File "/data/lib/python2.7/site-packages/zope.pagetemplate-3.5.2-py2.7.egg/zope/pagetemplate/pagetemplate.py", line 113, in pt_render
    strictinsert=0, sourceAnnotations=sourceAnnotations)()
  File "/data/lib/python2.7/site-packages/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py", line 271, in __call__
    self.interpret(self.program)
  File "/data/lib/python2.7/site-packages/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py", line 343, in interpret
    handlers[opcode](self, args)
  File "/data/lib/python2.7/site-packages/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py", line 531, in do_optTag_tal
    self.no_tag(stuff[-2], stuff[-1])
  File "/data/lib/python2.7/site-packages/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py", line 513, in no_tag
    self.interpret(program)
  File "/data/lib/python2.7/site-packages/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py", line 343, in interpret
    handlers[opcode](self, args)
  File "/data/lib/python2.7/site-packages/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py", line 757, in do_insertStructure_tal
    self.insertHTMLStructure(text, repldict)
  File "/data/lib/python2.7/site-packages/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py", line 781, in insertHTMLStructure
    gen = AltTALGenerator(repldict, self.engine, 0)
  File "/data/lib/python2.7/site-packages/zope.tal-3.5.2-py2.7.egg/zope/tal/talinterpreter.py", line 65, in __init__
    TALGenerator.__init__(self, expressionCompiler, xml)
  File "/data/lib/python2.7/site-packages/zope.tal-3.5.2-py2.7.egg/zope/tal/talgenerator.py", line 41, in __init__
    self.CompilerError = expressionCompiler.getCompilerError()
AttributeError: 'ZopeContext' object has no attribute 'getCompilerError'

TALGenerator.__init__() expects to have in its expressionCompiler
parameter an zope.tal.interfaces.ITALExpressionCompiler instance that
has getCompilerError() method.

Instead of that zope.pagetemplate.pagetemplate.PageTemplate.pt_render()
passes down along the chain an instance of
Products.PageTemplates.Expressions.ZopeContext class, which implements
ITALExpressionEngine. From
zope.pagetemplate-3.5.2-py2.7.egg/zope/pagetemplate/pagetemplate.py:110

        context = self.pt_getEngineContext(namespace)
        TALInterpreter(self._v_program, self._v_macros,
                       context, output, tal=not source, showtal=showtal,
                       strictinsert=0, sourceAnnotations=sourceAnnotations)()

pdb.pm():

(Pdb) from zope.tal.interfaces import ITALExpressionCompiler, ITALExpressionEngine
(Pdb) expressionCompiler
<Products.PageTemplates.Expressions.ZopeContext object at 0xaea0b62c>
(Pdb) ITALExpressionCompiler.implementedBy(expressionCompiler.__class__)
False
(Pdb) ITALExpressionEngine.implementedBy(expressionCompiler.__class__)
True
(Pdb) expressionCompiler._engine
<Products.PageTemplates.Expressions.ZopeEngine object at 0xb702e54c>
(Pdb) ITALExpressionCompiler.implementedBy(expressionCompiler._engine.__class__) 
True
(Pdb) expressionCompiler._engine.getCompilerError()
<class 'zope.tales.tales.CompilerError'>

Without this /very useful/ combination of "tal:attribuites",
"tal:replace" and "structure" interpretation goes into another branch of
zope.tal.interpreter.do_insertStructure_tal(), that doesn't use
TALGenerator and hence doesn't fail. I thank our bright developers for
revealing this.

Regards,
Evgeny

** Affects: zope2
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Zope 2
Developers, which is subscribed to Zope 2.
https://bugs.launchpad.net/bugs/1004588

Title:
  A valid PageTemplate fails rendering with AttributeError in
  zope.tal.talgenerator

To manage notifications about this bug go to:
https://bugs.launchpad.net/zope2/+bug/1004588/+subscriptions


More information about the zope2-tracker mailing list