Commit 96c9b14308e3e2d14be856c8bca4b4ba33eb8c10

Authored by Sergio Oliveira
1 parent c30d7a00

Fixed signals implementation

tests were breaking
colab/__init__.py
1 1 from __future__ import absolute_import
2 2  
  3 +from . import plugins
  4 +
3 5 # This will make sure the app is always imported when
4 6 # Django starts so that shared_task will use this app.
5 7 from .celery import app as celery_app # noqa
  8 +
... ...
colab/plugins/__init__.py
... ... @@ -0,0 +1,2 @@
  1 +
  2 +default_app_config = 'colab.plugins.apps.PluginAppConfig'
... ...
colab/plugins/apps.py 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +
  2 +from django.apps import AppConfig
  3 +
  4 +from .utils.signals import connect_signal, register_signal
  5 +
  6 +
  7 +class PluginAppConfig(AppConfig):
  8 + name = 'colab.plugins'
  9 +
  10 + def ready(self):
  11 + register_signal()
  12 + connect_signal()
... ...
colab/plugins/utils/apps.py
1   -import importlib
2   -import inspect
3 1  
4 2 from django.apps import AppConfig
5   -from colab.plugins.utils.signals import AbstractSignal
6 3  
7 4  
8 5 class ColabProxiedAppConfig(AppConfig):
9 6 colab_proxied_app = True
10 7  
11   - def __init__(self, app_name, app_module):
12   - super(ColabProxiedAppConfig, self).__init__(app_name, app_module)
13   - self._import_signals(app_name)
14   - self.signals.register_signal()
  8 + def register_signals(self):
  9 + pass
15 10  
16   - def _import_signals(self, app_name):
17   - self.module_path = app_name + '.signals'
18   - self.module = importlib.import_module(self.module_path)
19   -
20   - for module_item_name in dir(self.module):
21   - module_item = getattr(self.module, module_item_name)
22   - if not inspect.isclass(module_item):
23   - continue
24   - if issubclass(module_item, AbstractSignal):
25   - if module_item != AbstractSignal:
26   - self.signals = module_item()
27   - break
28   -
29   - def ready(self):
30   - self.signals.connect_signal()
  11 + def connect_signals(self):
  12 + pass
... ...
colab/plugins/utils/signals.py
1 1  
2   -from abc import abstractmethod
  2 +from django.apps import apps
3 3  
4 4  
5   -class AbstractSignal(object):
  5 +def _init_signals(method_name):
  6 + for app in apps.get_app_configs():
  7 + # Try to get the method with `method_name`.
  8 + # If it exists call it using `app` as the first parameter.
  9 + # This is required because methods take `self` as first
  10 + # parameter and as we are calling it as a function python
  11 + # won't send it explicitly.
  12 + # If the method doesn't exist we return a dummy function that
  13 + # won't do anything.
  14 + getattr(app, method_name, lambda x: None)(app)
6 15  
7   - @abstractmethod
8   - def register_signal(self):
9   - raise NotImplementedError
10 16  
11   - @abstractmethod
12   - def connect_signal(self):
13   - raise NotImplementedError
  17 +def register_signal():
  18 + _init_signals('register_signal')
  19 +
  20 +
  21 +def connect_signal():
  22 + _init_signals('connect_signal')
... ...