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