Commit 4423a4f61156b040f54e226a10d67e08b9e0f484
Committed by
Sergio Oliveira
1 parent
508468fc
Exists in
master
and in
30 other branches
Overwrite reduce parameter of Signal
In order to send a Signal instance to a celery task, it was necessary to overwrite the reduce parameter of Signal, allowing it to be pickled and sent normally to a celery task. Signed-off-by: Lucas Moura <lucas.moura128@gmail.com> Signed-off-by: Gustavo Jaruga <darksshades@gmail.com>
Showing
5 changed files
with
47 additions
and
37 deletions
Show diff stats
colab/signals/__init__.py
| ... | ... | @@ -0,0 +1 @@ |
| 1 | +default_app_config = 'colab.signals.apps.SignalsConfig' | ... | ... |
colab/signals/apps.py
colab/signals/signals.py
| ... | ... | @@ -1,32 +0,0 @@ |
| 1 | -from django.dispatch import Signal | |
| 2 | -from colab.signals.celery import app | |
| 3 | - | |
| 4 | -registered_signals = {} | |
| 5 | -signal_instances = {} | |
| 6 | - | |
| 7 | - | |
| 8 | -def register_signal(plugin_name, list_signals): | |
| 9 | - for signal in list_signals: | |
| 10 | - if signal in registered_signals: | |
| 11 | - if not plugin_name in registered_signals[signal]: | |
| 12 | - registered_signals[signal].append(plugin_name) | |
| 13 | - else: | |
| 14 | - registered_signals[signal] = [] | |
| 15 | - registered_signals[signal].append(plugin_name) | |
| 16 | - signal_instances[signal] = Signal() | |
| 17 | - | |
| 18 | - | |
| 19 | -def connect_signal(signal_name, sender, handling_method): | |
| 20 | - if signal_name in signal_instances: | |
| 21 | - signal_instances[signal_name].connect(handling_method, | |
| 22 | - sender=sender) | |
| 23 | - else: | |
| 24 | - raise Exception("Signal does not exist!") | |
| 25 | - | |
| 26 | - | |
| 27 | -@app.task(bind=True) | |
| 28 | -def send(self, signal_name, sender, **kwargs): | |
| 29 | - if signal_name in signal_instances: | |
| 30 | - signal_instances[signal_name].send(sender=sender) | |
| 31 | - else: | |
| 32 | - raise Exception("Signal does not exist!") |
| ... | ... | @@ -0,0 +1,38 @@ |
| 1 | +from django.dispatch import Signal | |
| 2 | +from colab.signals.celery import app | |
| 3 | + | |
| 4 | + | |
| 5 | +registered_signals = {} | |
| 6 | +signal_instances = {} | |
| 7 | + | |
| 8 | + | |
| 9 | +# Fix celery serialization for signal | |
| 10 | +def reducer(self): | |
| 11 | + return (Signal, (self.providing_args,)) | |
| 12 | +Signal.__reduce__ = reducer | |
| 13 | + | |
| 14 | + | |
| 15 | +def register_signal(plugin_name, list_signals): | |
| 16 | + for signal in list_signals: | |
| 17 | + if signal in registered_signals: | |
| 18 | + if not plugin_name in registered_signals[signal]: | |
| 19 | + registered_signals[signal].append(plugin_name) | |
| 20 | + else: | |
| 21 | + registered_signals[signal] = [] | |
| 22 | + registered_signals[signal].append(plugin_name) | |
| 23 | + signal_instances[signal] = Signal() | |
| 24 | + | |
| 25 | + | |
| 26 | +def connect_signal(signal_name, sender, handling_method): | |
| 27 | + if signal_name in signal_instances: | |
| 28 | + signal_instances[signal_name].connect(handling_method.delay, | |
| 29 | + sender=sender) | |
| 30 | + else: | |
| 31 | + raise Exception("Signal does not exist!") | |
| 32 | + | |
| 33 | + | |
| 34 | +def send(signal_name, sender, **kwargs): | |
| 35 | + if signal_name in signal_instances: | |
| 36 | + signal_instances[signal_name].send(sender=sender) | |
| 37 | + else: | |
| 38 | + raise Exception("Signal does not exist!") | ... | ... |
colab/signals/tests/test_signals.py
| ... | ... | @@ -4,13 +4,16 @@ Objective: Test parameters, and behavior. |
| 4 | 4 | """ |
| 5 | 5 | |
| 6 | 6 | from django.test import TestCase |
| 7 | -from colab.signals.signals import * | |
| 7 | +from django.apps import apps | |
| 8 | +import django | |
| 9 | +from colab.signals.tasks import * | |
| 8 | 10 | from mock import patch |
| 9 | 11 | |
| 10 | 12 | |
| 11 | 13 | class SignalsTest(TestCase): |
| 12 | 14 | |
| 13 | 15 | def setUp(self): |
| 16 | + django.setup() | |
| 14 | 17 | self.list_signal = ['a', 'b', 'c'] |
| 15 | 18 | self.plugin_name = 'test_signal' |
| 16 | 19 | |
| ... | ... | @@ -21,8 +24,7 @@ class SignalsTest(TestCase): |
| 21 | 24 | signal_name ='a' |
| 22 | 25 | signal_list = ['test_signal'] |
| 23 | 26 | self.assertEqual(len(registered_signals[signal_name]), 1) |
| 24 | - self.assertEqual(registered_signals[signal_name], | |
| 25 | - signal_list) | |
| 27 | + self.assertEqual(registered_signals[signal_name], signal_list) | |
| 26 | 28 | |
| 27 | 29 | |
| 28 | 30 | def test_register_signal_already_registered(self): |
| ... | ... | @@ -34,8 +36,7 @@ class SignalsTest(TestCase): |
| 34 | 36 | |
| 35 | 37 | register_signal(self.plugin_name, self.list_signal) |
| 36 | 38 | self.assertEqual(len(registered_signals[signal_name]), 1) |
| 37 | - self.assertEqual(registered_signals[signal_name], | |
| 38 | - signal_list) | |
| 39 | + self.assertEqual(registered_signals[signal_name], signal_list) | |
| 39 | 40 | |
| 40 | 41 | |
| 41 | 42 | def test_connect_non_registered_signal(self): | ... | ... |