Source code for thorn.django.signals
"""Django signal dispatchers."""
from __future__ import absolute_import, unicode_literals
from operator import attrgetter
from django.core.exceptions import ObjectDoesNotExist
from thorn.generic.signals import signal_dispatcher
from .utils import serialize_model
__all__ = [
'dispatch_on_create',
'dispatch_on_change',
'dispatch_on_delete',
'dispatch_on_m2m_add',
'dispatch_on_m2m_remove',
'dispatch_on_m2m_clear',
]
[docs]class dispatch_on_create(signal_dispatcher):
[docs] def setup_signals(self):
return {'django.db.models.signals.post_save': self}
[docs] def should_dispatch(self, instance, raw=False, created=False, **kwargs):
return not raw and created
[docs]class dispatch_on_change(signal_dispatcher):
[docs] def setup_signals(self):
return {
'django.db.models.signals.pre_save': self.on_pre_save,
'django.db.models.signals.post_save': self,
}
[docs] def on_pre_save(self, instance, sender, raw=False, **kwargs):
if self.use_transitions and not raw and instance.pk:
try:
instance._previous_version = sender.objects.get(pk=instance.pk)
except ObjectDoesNotExist:
pass
[docs] def should_dispatch(self, instance, created=False, raw=False, **kwargs):
return not raw and not created
[docs]class dispatch_on_delete(signal_dispatcher):
[docs] def setup_signals(self):
return {'django.db.models.signals.post_delete': self}
class dispatch_on_m2m_change(signal_dispatcher):
def __init__(self, fun, related_field, **kwargs):
super(dispatch_on_m2m_change, self).__init__(fun, **kwargs)
self.related_field = related_field
self.actions = self.setup_actions()
def setup_actions(self):
return {}
def setup_signals(self):
return {'django.db.models.signals.m2m_changed': self.on_m2m_change}
def prepare_sender(self, sender):
return attrgetter(self.related_field)(sender).through
def context(self, instance, model, pk_set, **kwargs):
return {
'instance': instance.pk,
'model': serialize_model(model),
'pk_set': list(sorted(pk_set or [])),
}
def on_m2m_change(self, sender, action, instance, model, **kwargs):
try:
handler = self.actions[action]
except KeyError:
pass
else:
handler(instance, sender=sender, model=model, **kwargs)
[docs]class dispatch_on_m2m_add(dispatch_on_m2m_change):
[docs] def setup_actions(self):
return {'post_add': self}
[docs]class dispatch_on_m2m_remove(dispatch_on_m2m_change):
[docs] def setup_actions(self):
return {'post_remove': self}
[docs]class dispatch_on_m2m_clear(dispatch_on_m2m_change):
[docs] def setup_actions(self):
return {'post_clear': self}