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): | ... | ... |