Commit 0dd05c9e authored by Anubhav Joshi's avatar Anubhav Joshi Committed by Tim Graham
Browse files

Fixed #16383 -- Raised the AttributeError raised in property of an object when used in a template.

Thanks maraujop for the report and Hiroki and Tim Graham for review.
parent 9d9f0acd
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -773,7 +773,10 @@ class Variable(object):
                        if isinstance(current, BaseContext) and getattr(type(current), bit):
                            raise AttributeError
                        current = getattr(current, bit)
                    except (TypeError, AttributeError):
                    except (TypeError, AttributeError) as e:
                        # Reraise an AttributeError raised by a @property
                        if isinstance(e, AttributeError) and not isinstance(current, BaseContext) and bit in dir(current):
                            raise
                        try:  # list-index lookup
                            current = current[int(bit)]
                        except (IndexError,  # list index out of range
+9 −2
Original line number Diff line number Diff line
@@ -110,13 +110,17 @@ class SomeClass:
            raise SomeOtherException
        raise KeyError

    @property
    def silent_fail_attribute(self):
        raise SomeException
    silent_fail_attribute = property(silent_fail_attribute)

    @property
    def noisy_fail_attribute(self):
        raise SomeOtherException
    noisy_fail_attribute = property(noisy_fail_attribute)

    @property
    def attribute_error_attribute(self):
        raise AttributeError


class OtherClass:
@@ -820,6 +824,9 @@ class TemplateTests(TestCase):
            'filter-syntax23': (r'1{{ var.noisy_fail_key }}2', {"var": SomeClass()}, (SomeOtherException, SomeOtherException)),
            'filter-syntax24': (r'1{{ var.noisy_fail_attribute }}2', {"var": SomeClass()}, (SomeOtherException, SomeOtherException)),

            # #16383 - A @property that raises AttributeError should not fail loudly.
            'filter-syntax25': ('{{ var.attribute_error_attribute }}', {"var": SomeClass()}, (AttributeError)),

            ### COMMENT SYNTAX ########################################################
            'comment-syntax01': ("{# this is hidden #}hello", {}, "hello"),
            'comment-syntax02': ("{# this is hidden #}hello{# foo #}", {}, "hello"),