Skip to content

Instantly share code, notes, and snippets.

@pyetras
Created June 29, 2009 10:18
Show Gist options
  • Save pyetras/137560 to your computer and use it in GitHub Desktop.
Save pyetras/137560 to your computer and use it in GitHub Desktop.
from django.db.models.signals import *
class UserNotPresentError(Exception):
pass
class SignalNotSpecifiedError(Exception):
pass
class SignalReceiver(object):
user = None
signal = None
sender = None
action = None
extra = None
obj = None
def __init__(self):
self.pre = None
for k, v in self.__class__.__dict__.iteritems():
if isinstance(v, str):
self.__dict__[k] = v
if isinstance(self.signal, tuple):
self.signal[0].connect(self.precall, sender = self.sender)
self.signal[1].connect(self.call, sender = self.sender)
else:
self.signal.connect(self.call, sender = self.sender)
def call(self, sender, **kwargs):
if self.test(sender, **kwargs):
if 'instance' in kwargs:
if not self.obj:
self.obj = kwargs['instance']
if not self.user:
try:
self.user = kwargs['instance'].user
except AttributeError:
raise UserNotPresentError
elif not self.user:
raise UserNotPresentError
h = History(user = self.user, action = self.action, obj = self.obj, extra = self.extra)
h.save()
def test(self, sender):
return False
def __str__(self):
if '%' in self.message:
return self.message%self.__dict__
return self.message
class CommentCreatedReceiver(SignalReceiver):
signal = post_save
sender = Comment
action = 'articles_add_comment'
message = 'added an answer'
icon_name = 'add_comment'
def test(self, sender, **kwargs):
return kwargs['created']
def __str__(self):
if self.obj:
return 'answered (%(perm)s") to %(title)s (%(pperm)s)' %{"perm": self.obj.get_absolute_url(), "pperm": self.obj.obj.get_absolute_url(), "title": self.obj.obj}
else:
return super(CommentCreatedReceiver, self).__str__()
class AddressChangedReceiver(SignalReceiver):
signal = profile_pre_edit, profile_edited
sender = UserProfile
action = 'accounts_address_changed'
message = 'updated address'
icon_name = 'map_edit'
pre = None
def precall(self, sender, **kwargs):
self.pre = kwargs['instance'].address
self.extra = kwargs['instance'].location + ';' + kwargs['instance'].address
def test(self, sender, **kwargs):
if self.pre!=kwargs['instance'].address:
return True
return False
class Binder(object):
classlist = [ AddressChangedReceiver, CommentCreatedReceiver]
receivers = dict([(r.action, r()) for r in classlist])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment