summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Kaplan-Moss <jacob@jacobian.org>2009-04-05 17:21:25 +0000
committerJacob Kaplan-Moss <jacob@jacobian.org>2009-04-05 17:21:25 +0000
commit35c30ee957156a0dc3e58b3eb2cd900d4fe965e5 (patch)
treec697daaae502af2e1f146f9cc593753689589cf3
parent50d3ebf72af0baedcc4c288dfd2d8a5a18bd6f5e (diff)
Fixed #9989: fixed a subtle edge case where removing signals could break. Thanks, ferringb. Backport of r10398 from trunk.
git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10399 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/dispatch/dispatcher.py7
-rw-r--r--tests/modeltests/signals/models.py11
2 files changed, 15 insertions, 3 deletions
diff --git a/django/dispatch/dispatcher.py b/django/dispatch/dispatcher.py
index 74fdd20b90..bb60fc906d 100644
--- a/django/dispatch/dispatcher.py
+++ b/django/dispatch/dispatcher.py
@@ -119,10 +119,11 @@ class Signal(object):
lookup_key = (dispatch_uid, _make_id(sender))
else:
lookup_key = (_make_id(receiver), _make_id(sender))
-
- for idx, (r_key, _) in enumerate(self.receivers):
+
+ for index in xrange(len(self.receivers)):
+ (r_key, _) = self.receivers[index]
if r_key == lookup_key:
- del self.receivers[idx]
+ del self.receivers[index]
def send(self, sender, **named):
"""Send signal from sender to all connected receivers.
diff --git a/tests/modeltests/signals/models.py b/tests/modeltests/signals/models.py
index 5e038f9516..06fd3a6fb3 100644
--- a/tests/modeltests/signals/models.py
+++ b/tests/modeltests/signals/models.py
@@ -96,4 +96,15 @@ instance.id is None: False
>>> models.signals.pre_delete.disconnect(pre_delete_test)
>>> models.signals.post_save.disconnect(post_save_test)
>>> models.signals.pre_save.disconnect(pre_save_test)
+
+# Make sure all the signals got removed properly (#9989)
+>>> models.signals.post_delete.receivers
+[]
+>>> models.signals.pre_delete.receivers
+[]
+>>> models.signals.post_save.receivers
+[]
+>>> models.signals.pre_save.receivers
+[]
+
"""}