Commit 4423a4f61156b040f54e226a10d67e08b9e0f484

Authored by Lucas Kanashiro
Committed by Sergio Oliveira
1 parent 508468fc

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>
colab/signals/__init__.py
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +default_app_config = 'colab.signals.apps.SignalsConfig'
colab/signals/apps.py
@@ -4,3 +4,5 @@ from django.apps import AppConfig @@ -4,3 +4,5 @@ from django.apps import AppConfig
4 4
5 class SignalsConfig(AppConfig): 5 class SignalsConfig(AppConfig):
6 name = 'colab.signals' 6 name = 'colab.signals'
  7 + registered_signals = {}
  8 + signal_instances = {}
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!")  
colab/signals/tasks.py 0 → 100644
@@ -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):