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 @@ | @@ -0,0 +1 @@ | ||
1 | +default_app_config = 'colab.signals.apps.SignalsConfig' |
colab/signals/apps.py
colab/signals/signals.py
@@ -1,32 +0,0 @@ | @@ -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 @@ | @@ -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,13 +4,16 @@ Objective: Test parameters, and behavior. | ||
4 | """ | 4 | """ |
5 | 5 | ||
6 | from django.test import TestCase | 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 | from mock import patch | 10 | from mock import patch |
9 | 11 | ||
10 | 12 | ||
11 | class SignalsTest(TestCase): | 13 | class SignalsTest(TestCase): |
12 | 14 | ||
13 | def setUp(self): | 15 | def setUp(self): |
16 | + django.setup() | ||
14 | self.list_signal = ['a', 'b', 'c'] | 17 | self.list_signal = ['a', 'b', 'c'] |
15 | self.plugin_name = 'test_signal' | 18 | self.plugin_name = 'test_signal' |
16 | 19 | ||
@@ -21,8 +24,7 @@ class SignalsTest(TestCase): | @@ -21,8 +24,7 @@ class SignalsTest(TestCase): | ||
21 | signal_name ='a' | 24 | signal_name ='a' |
22 | signal_list = ['test_signal'] | 25 | signal_list = ['test_signal'] |
23 | self.assertEqual(len(registered_signals[signal_name]), 1) | 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 | def test_register_signal_already_registered(self): | 30 | def test_register_signal_already_registered(self): |
@@ -34,8 +36,7 @@ class SignalsTest(TestCase): | @@ -34,8 +36,7 @@ class SignalsTest(TestCase): | ||
34 | 36 | ||
35 | register_signal(self.plugin_name, self.list_signal) | 37 | register_signal(self.plugin_name, self.list_signal) |
36 | self.assertEqual(len(registered_signals[signal_name]), 1) | 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 | def test_connect_non_registered_signal(self): | 42 | def test_connect_non_registered_signal(self): |