Source code for thorn.generic.signals
"""Dispatching by signal."""
from __future__ import absolute_import, unicode_literals
from six import iteritems as items
from celery.utils.imports import symbol_by_name
__all__ = ['signal_dispatcher']
[docs]class signal_dispatcher(object):
"""Signal dispatcher abstraction."""
signals = None
def __init__(self, fun, use_transitions=False, **kwargs):
self.fun = fun
self.use_transitions = use_transitions
self.signals = self.load_signals(self.setup_signals())
[docs] def setup_signals(self):
return {}
[docs] def load_signals(self, signals):
return {
symbol_by_name(sig): handler
for sig, handler in items(signals)
}
[docs] def should_dispatch(self, instance, **kwargs):
return True
def __call__(self, instance, **kwargs):
if self.should_dispatch(instance, **kwargs):
return self.fun(
instance, context=self.context(instance, **kwargs))
[docs] def connect(self, sender=None, weak=False, **kwargs):
[self._connect_signal(signal, handler, sender, weak, **kwargs)
for signal, handler in items(self.signals)]
def _connect_signal(self, signal, handler, sender, weak, **kwargs):
signal.connect(
handler,
sender=self.prepare_sender(sender),
weak=weak,
**kwargs)
[docs] def context(self, instance, **kwargs):
return {'instance': instance.pk}
[docs] def prepare_sender(self, sender):
return sender