Task now accepts a hook function, that will be called with the finished task as the argument.

This commit is contained in:
Ilan Steemers
2015-06-17 23:50:17 +02:00
parent 85f971ae40
commit 69837922b1
+20 -1
View File
@@ -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(