Loading django/dispatch/dispatcher.py +3 −0 Original line number Diff line number Diff line Loading @@ -160,14 +160,17 @@ class Signal(object): else: lookup_key = (_make_id(receiver), _make_id(sender)) disconnected = False with self.lock: self._clear_dead_receivers() for index in range(len(self.receivers)): (r_key, _) = self.receivers[index] if r_key == lookup_key: disconnected = True del self.receivers[index] break self.sender_receivers_cache.clear() return disconnected def has_listeners(self, sender=None): return bool(self._live_receivers(sender)) Loading docs/topics/signals.txt +8 −3 Original line number Diff line number Diff line Loading @@ -278,7 +278,12 @@ Disconnecting signals .. method:: Signal.disconnect([receiver=None, sender=None, weak=True, dispatch_uid=None]) To disconnect a receiver from a signal, call :meth:`Signal.disconnect`. The arguments are as described in :meth:`.Signal.connect`. arguments are as described in :meth:`.Signal.connect`. The method returns ``True`` if a receiver was disconnected and ``False`` if not. The *receiver* argument indicates the registered receiver to disconnect. It may be ``None`` if ``dispatch_uid`` is used to identify the receiver. The ``receiver`` argument indicates the registered receiver to disconnect. It may be ``None`` if ``dispatch_uid`` is used to identify the receiver. .. versionchanged:: 1.8 The boolean return value was added. tests/dispatch/tests.py +10 −0 Original line number Diff line number Diff line Loading @@ -153,6 +153,16 @@ class DispatcherTests(unittest.TestCase): a_signal.disconnect(receiver_3) self.assertTestIsClean(a_signal) def test_values_returned_by_disconnection(self): receiver_1 = Callable() receiver_2 = Callable() a_signal.connect(receiver_1) receiver_1_disconnected = a_signal.disconnect(receiver_1) receiver_2_disconnected = a_signal.disconnect(receiver_2) self.assertTrue(receiver_1_disconnected) self.assertFalse(receiver_2_disconnected) self.assertTestIsClean(a_signal) def test_has_listeners(self): self.assertFalse(a_signal.has_listeners()) self.assertFalse(a_signal.has_listeners(sender=object())) Loading Loading
django/dispatch/dispatcher.py +3 −0 Original line number Diff line number Diff line Loading @@ -160,14 +160,17 @@ class Signal(object): else: lookup_key = (_make_id(receiver), _make_id(sender)) disconnected = False with self.lock: self._clear_dead_receivers() for index in range(len(self.receivers)): (r_key, _) = self.receivers[index] if r_key == lookup_key: disconnected = True del self.receivers[index] break self.sender_receivers_cache.clear() return disconnected def has_listeners(self, sender=None): return bool(self._live_receivers(sender)) Loading
docs/topics/signals.txt +8 −3 Original line number Diff line number Diff line Loading @@ -278,7 +278,12 @@ Disconnecting signals .. method:: Signal.disconnect([receiver=None, sender=None, weak=True, dispatch_uid=None]) To disconnect a receiver from a signal, call :meth:`Signal.disconnect`. The arguments are as described in :meth:`.Signal.connect`. arguments are as described in :meth:`.Signal.connect`. The method returns ``True`` if a receiver was disconnected and ``False`` if not. The *receiver* argument indicates the registered receiver to disconnect. It may be ``None`` if ``dispatch_uid`` is used to identify the receiver. The ``receiver`` argument indicates the registered receiver to disconnect. It may be ``None`` if ``dispatch_uid`` is used to identify the receiver. .. versionchanged:: 1.8 The boolean return value was added.
tests/dispatch/tests.py +10 −0 Original line number Diff line number Diff line Loading @@ -153,6 +153,16 @@ class DispatcherTests(unittest.TestCase): a_signal.disconnect(receiver_3) self.assertTestIsClean(a_signal) def test_values_returned_by_disconnection(self): receiver_1 = Callable() receiver_2 = Callable() a_signal.connect(receiver_1) receiver_1_disconnected = a_signal.disconnect(receiver_1) receiver_2_disconnected = a_signal.disconnect(receiver_2) self.assertTrue(receiver_1_disconnected) self.assertFalse(receiver_2_disconnected) self.assertTestIsClean(a_signal) def test_has_listeners(self): self.assertFalse(a_signal.has_listeners()) self.assertFalse(a_signal.has_listeners(sender=object())) Loading