mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
Fixed #27654 -- Propagated alters_data attribute to callables overridden in subclasses.
Thanks Shai Berger and Adam Johnson for reviews and the implementation idea.
This commit is contained in:
committed by
Mariusz Felisiak
parent
5a7f3213ae
commit
e20c9eb60a
@@ -1,5 +1,6 @@
|
||||
from unittest import TestCase
|
||||
|
||||
from django.db.models.utils import AltersData
|
||||
from django.template import Context, Engine
|
||||
|
||||
|
||||
@@ -63,6 +64,68 @@ class CallableVariablesTests(TestCase):
|
||||
# template rendering.
|
||||
self.assertEqual(my_doodad.num_calls, 0)
|
||||
|
||||
def test_alters_data_propagation(self):
|
||||
class GrandParentLeft(AltersData):
|
||||
def my_method(self):
|
||||
return 42
|
||||
|
||||
my_method.alters_data = True
|
||||
|
||||
class ParentLeft(GrandParentLeft):
|
||||
def change_alters_data_method(self):
|
||||
return 63
|
||||
|
||||
change_alters_data_method.alters_data = True
|
||||
|
||||
def sub_non_callable_method(self):
|
||||
return 64
|
||||
|
||||
sub_non_callable_method.alters_data = True
|
||||
|
||||
class ParentRight(AltersData):
|
||||
def other_method(self):
|
||||
return 52
|
||||
|
||||
other_method.alters_data = True
|
||||
|
||||
class Child(ParentLeft, ParentRight):
|
||||
def my_method(self):
|
||||
return 101
|
||||
|
||||
def other_method(self):
|
||||
return 102
|
||||
|
||||
def change_alters_data_method(self):
|
||||
return 103
|
||||
|
||||
change_alters_data_method.alters_data = False
|
||||
|
||||
sub_non_callable_method = 104
|
||||
|
||||
class GrandChild(Child):
|
||||
pass
|
||||
|
||||
child = Child()
|
||||
self.assertIs(child.my_method.alters_data, True)
|
||||
self.assertIs(child.other_method.alters_data, True)
|
||||
self.assertIs(child.change_alters_data_method.alters_data, False)
|
||||
|
||||
grand_child = GrandChild()
|
||||
self.assertIs(grand_child.my_method.alters_data, True)
|
||||
self.assertIs(grand_child.other_method.alters_data, True)
|
||||
self.assertIs(grand_child.change_alters_data_method.alters_data, False)
|
||||
|
||||
c = Context({"element": grand_child})
|
||||
|
||||
t = self.engine.from_string("{{ element.my_method }}")
|
||||
self.assertEqual(t.render(c), "")
|
||||
t = self.engine.from_string("{{ element.other_method }}")
|
||||
self.assertEqual(t.render(c), "")
|
||||
t = self.engine.from_string("{{ element.change_alters_data_method }}")
|
||||
self.assertEqual(t.render(c), "103")
|
||||
t = self.engine.from_string("{{ element.sub_non_callable_method }}")
|
||||
self.assertEqual(t.render(c), "104")
|
||||
|
||||
def test_do_not_call(self):
|
||||
class Doodad:
|
||||
do_not_call_in_templates = True
|
||||
|
||||
Reference in New Issue
Block a user