From 272de9eb6baad45abec029aae92c2b7d9478c841 Mon Sep 17 00:00:00 2001 From: David Cramer Date: Fri, 11 Jan 2013 14:12:22 -0800 Subject: Send post_delete signals immediately In a normal relational construct, if you're listening for an event that signals a child was deleted, you dont expect that the parent was deleted already. This change ensures that post_delete signals are fired immediately after objects are deleted in the graph. --- tests/modeltests/delete/tests.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'tests') diff --git a/tests/modeltests/delete/tests.py b/tests/modeltests/delete/tests.py index 20b815c33d..5d7b7a0b33 100644 --- a/tests/modeltests/delete/tests.py +++ b/tests/modeltests/delete/tests.py @@ -229,6 +229,18 @@ class DeletionTests(TestCase): models.signals.post_delete.disconnect(log_post_delete) models.signals.post_delete.disconnect(log_pre_delete) + def test_relational_post_delete_signals_happen_before_parent_object(self): + def log_post_delete(instance, **kwargs): + self.assertTrue(R.objects.filter(pk=instance.r_id)) + + models.signals.post_delete.connect(log_post_delete, sender=S) + + r = R.objects.create(pk=1) + S.objects.create(pk=1, r=r) + r.delete() + + models.signals.post_delete.disconnect(log_post_delete) + @skipUnlessDBFeature("can_defer_constraint_checks") def test_can_defer_constraint_checks(self): u = User.objects.create( -- cgit v1.3 From 6045efa029dcae58ec6aab20bdcb0dc325851048 Mon Sep 17 00:00:00 2001 From: David Cramer Date: Fri, 11 Jan 2013 14:58:36 -0800 Subject: Move signal disconnect into finally block --- tests/modeltests/delete/tests.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/modeltests/delete/tests.py b/tests/modeltests/delete/tests.py index 5d7b7a0b33..99981df018 100644 --- a/tests/modeltests/delete/tests.py +++ b/tests/modeltests/delete/tests.py @@ -233,13 +233,15 @@ class DeletionTests(TestCase): def log_post_delete(instance, **kwargs): self.assertTrue(R.objects.filter(pk=instance.r_id)) - models.signals.post_delete.connect(log_post_delete, sender=S) - r = R.objects.create(pk=1) S.objects.create(pk=1, r=r) - r.delete() - models.signals.post_delete.disconnect(log_post_delete) + models.signals.post_delete.connect(log_post_delete, sender=S) + + try: + r.delete() + finally: + models.signals.post_delete.disconnect(log_post_delete) @skipUnlessDBFeature("can_defer_constraint_checks") def test_can_defer_constraint_checks(self): -- cgit v1.3 From a7ed09d13d9532089bd2380edab1df5df96082a6 Mon Sep 17 00:00:00 2001 From: David Cramer Date: Mon, 14 Jan 2013 13:18:24 -0800 Subject: Improve test to ensure that post_delete was actually called --- tests/modeltests/delete/tests.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'tests') diff --git a/tests/modeltests/delete/tests.py b/tests/modeltests/delete/tests.py index 99981df018..0a3ddcfc2e 100644 --- a/tests/modeltests/delete/tests.py +++ b/tests/modeltests/delete/tests.py @@ -230,8 +230,12 @@ class DeletionTests(TestCase): models.signals.post_delete.disconnect(log_pre_delete) def test_relational_post_delete_signals_happen_before_parent_object(self): + deletions = [] + def log_post_delete(instance, **kwargs): self.assertTrue(R.objects.filter(pk=instance.r_id)) + self.assertEquals(type(instance), S) + deletions.append(instance.id) r = R.objects.create(pk=1) S.objects.create(pk=1, r=r) @@ -243,6 +247,9 @@ class DeletionTests(TestCase): finally: models.signals.post_delete.disconnect(log_post_delete) + self.assertEquals(len(deletions), 1) + self.assertEquals(deletions[0], 1) + @skipUnlessDBFeature("can_defer_constraint_checks") def test_can_defer_constraint_checks(self): u = User.objects.create( -- cgit v1.3