diff --git a/django_q/models.py b/django_q/models.py index 4224255..dcf87ed 100644 --- a/django_q/models.py +++ b/django_q/models.py @@ -1,4 +1,9 @@ +import importlib +import logging + from django.db import models +from django.db.models.signals import post_save +from django.dispatch import receiver from picklefield import PickledObjectField @@ -14,7 +19,7 @@ class Task(models.Model): @staticmethod def get_result(name): - return Task.objects.filter(name=name).values_list('result', flat=True) + return Task.objects.get(name=name).result def time_taken(self): return (self.stopped - self.started).total_seconds() @@ -23,6 +28,20 @@ class Task(models.Model): app_label = 'django_q' +@receiver(post_save, sender=Task) +def call_hook(sender, instance, **kwargs): + if instance.kwargs.get('hook'): + module, func = instance.kwargs.get('hook').rsplit('.', 1) + try: + m = importlib.import_module(module) + f = getattr(m, func) + f(task=instance) + except Exception as e: + logger = logging.getLogger('django-q') + logger.error('return hook failed on {}'.format(instance.name)) + logger.exception(e) + + class SuccessManager(models.Manager): def get_queryset(self): return super(SuccessManager, self).get_queryset().filter(