From: Laurence de Bruxelles Date: Sat, 10 Aug 2019 21:08:39 +0000 (+0100) Subject: Fix bug with when using Markup on ChainableUndefined X-Git-Tag: 2.11.0~56^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8afc7e57c94bca530c0094e3cdbdbd8b4a1a5541;p=thirdparty%2Fjinja.git Fix bug with when using Markup on ChainableUndefined Wrapping a ChainableUndefined object with Markup causes an UndefinedError because Markup thinks that ChainableUndefined has an attribute called __html__ and tries to call it. This commit fixes this by defining a method __html__ that calls ChainableUndefined.__str__. We also add a regression test. --- diff --git a/jinja2/runtime.py b/jinja2/runtime.py index b37465a9..ca391bc6 100644 --- a/jinja2/runtime.py +++ b/jinja2/runtime.py @@ -753,9 +753,9 @@ def make_logging_undefined(logger=None, base=None): # is not overwritten from Undefined in this class. # This would cause a recursion error in Python 2. class ChainableUndefined(Undefined): - """An undefined that is chainable, where both - __getattr__ and __getitem__ return itself rather than - raising an :exc:`UndefinedError`: + """An undefined that is chainable, where both ``__getattr__`` and + ``__getitem__`` return itself rather than raising an + :exc:`UndefinedError`. >>> foo = ChainableUndefined(name='foo') >>> str(foo.bar['baz']) @@ -765,10 +765,13 @@ class ChainableUndefined(Undefined): ... jinja2.exceptions.UndefinedError: 'foo' is undefined - .. versionadded:: 2.11 + .. versionadded:: 2.11.0 """ __slots__ = () + def __html__(self): + return self.__str__() + def __getattr__(self, _): return self diff --git a/tests/test_regression.py b/tests/test_regression.py index d540d2dd..7477db2f 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -543,3 +543,8 @@ class TestBug(object): {%- for value in values recursive %}1{% else %}0{% endfor -%} ''') assert tmpl.render(values=[]) == '0' + + def test_markup_and_chainable_undefined(self): + from jinja2 import Markup + from jinja2.runtime import ChainableUndefined + assert str(Markup(ChainableUndefined())) == ''