def snailtracker_post_save_hook(sender, instance, **kwargs):
    """
    If connected to the Django model's post_save signal, this will fire
    and make a snapshot of the instance's current state (field values) then
    save a snailtrack (if it doesn't exist) and an action.
    """
    try:
        instance.post_save_snapshot = make_model_snapshot(instance)
        # prevent circular imports
        from django_snailtracker.tasks import offload_wrapper, celery_enabled
        if celery_enabled:
            offload_wrapper.delay(instance)
            logger.debug('%s model instanced saved. '
                    'Offloaded snailtracker task to Celery.' % instance)
        else:
            get_or_create_snailtrack(instance)
        instance.snailtracker_new = False
    except Exception, e:
        try:
            import traceback
#:TODO: this...
            send_mail(
                    'Snailtracker Error!',
                    traceback.format_exc(),
                    '*****@*****.**', ('*****@*****.**'))
            return
        except:
            return
def snailtracker_post_delete_hook(sender, instance, **kwargs):
    """
    If connected to the Django model's post_delete signal, this will
    fire and make save a snailtrack (if it doesn't exist) and a delete action.
    """
    try:
        # prevent circular imports
        from django_snailtracker.tasks import offload_wrapper, celery_enabled
        if celery_enabled:
            offload_wrapper.delay(instance, deleted=True)
        else:
            get_or_create_snailtrack(instance, deleted=True)
    except Exception, e:
        try:
            import traceback
            send_mail(
                    'Snailtracker Error!',
                    traceback.format_exc(),
                    '*****@*****.**',
                    ('*****@*****.**'))
            return
        except:
            return