from django.db.models.signals import pre_delete, post_delete, post_save, pre_save

def connect_hooks(model):
    post_delete.connect(post_delete_hook, sender=model)
    pre_delete.connect(pre_delete_hook, sender=model)
    pre_save.connect(pre_save_hook, sender=model)
    post_save.connect(post_save_hook, sender=model)

def pre_save_hook(sender, **kwargs):
    if kwargs['instance'].id == None:
        call(sender, 'before_create', kwargs['instance'])
    else:
        call(sender, 'before_update', kwargs['instance'])
    call(sender, 'before_save', kwargs['instance'])
    
def post_save_hook(sender, **kwargs):
    if kwargs['created']:
        call(sender, 'after_create', kwargs['instance'])
    else:
        call(sender, 'after_update', kwargs['instance'])
    call(sender, 'after_save', kwargs['instance'])
    
def pre_delete_hook(sender, **kwargs):
    call(sender, 'before_delete', kwargs['instance'])
    
def post_delete_hook(sender, **kwargs):
    call(sender, 'after_delete', kwargs['instance'])
    
def call(sender, method, instance):
    func = getattr(sender, method, None)
    if callable(func):
        func(instance)