|
@@ -1,42 +1,13 @@
|
|
|
+"""
|
|
|
+
|
|
|
+Django Models.
|
|
|
+
|
|
|
+"""
|
|
|
from django.db import models
|
|
|
from celery.registry import tasks
|
|
|
from celery.managers import TaskManager, PeriodicTaskManager
|
|
|
from celery.fields import PickledObjectField
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
-from Queue import Queue
|
|
|
-
|
|
|
-
|
|
|
-class RetryQueue(object):
|
|
|
- queue = Queue()
|
|
|
-
|
|
|
- class Item(object):
|
|
|
-
|
|
|
- def __init__(self, task_name, task_id, args, kwargs):
|
|
|
- self.task_name = task_name
|
|
|
- self.task_id = task_id
|
|
|
- self.args = args
|
|
|
- self.kwargs = kwargs
|
|
|
- self.retry_count = 0
|
|
|
-
|
|
|
- def retry(self):
|
|
|
- self.task.requeue(self.task_id, self.args, self.kwargs)
|
|
|
- self.retry_count += 1
|
|
|
- self.last_retry_at = time.time()
|
|
|
- return self.retry_count
|
|
|
-
|
|
|
- @property
|
|
|
- def task(self):
|
|
|
- return tasks[self.task_name]
|
|
|
-
|
|
|
- def put(self, task_name, task_id, args, kwargs):
|
|
|
- self.queue.put(self.Item(task_name, task_id, args, kwargs))
|
|
|
-
|
|
|
- def get(self):
|
|
|
- if not self.queue.qsize():
|
|
|
- return None
|
|
|
- return self.queue.get()
|
|
|
-retry_queue = RetryQueue()
|
|
|
-
|
|
|
|
|
|
TASK_STATUS_PENDING = "PENDING"
|
|
|
TASK_STATUS_RETRY = "RETRY"
|
|
@@ -48,6 +19,7 @@ TASK_STATUSES_CHOICES = zip(TASK_STATUSES, TASK_STATUSES)
|
|
|
|
|
|
|
|
|
class TaskMeta(models.Model):
|
|
|
+ """Task result/status."""
|
|
|
task_id = models.CharField(_(u"task id"), max_length=255, unique=True)
|
|
|
status = models.CharField(_(u"task status"), max_length=50,
|
|
|
default=TASK_STATUS_PENDING, choices=TASK_STATUSES_CHOICES)
|
|
@@ -57,6 +29,7 @@ class TaskMeta(models.Model):
|
|
|
objects = TaskManager()
|
|
|
|
|
|
class Meta:
|
|
|
+ """Model meta-data."""
|
|
|
verbose_name = _(u"task meta")
|
|
|
verbose_name_plural = _(u"task meta")
|
|
|
|
|
@@ -65,6 +38,7 @@ class TaskMeta(models.Model):
|
|
|
|
|
|
|
|
|
class PeriodicTaskMeta(models.Model):
|
|
|
+ """Information about a Periodic Task."""
|
|
|
name = models.CharField(_(u"name"), max_length=255, unique=True)
|
|
|
last_run_at = models.DateTimeField(_(u"last time run"),
|
|
|
auto_now=True, blank=True)
|
|
@@ -74,6 +48,7 @@ class PeriodicTaskMeta(models.Model):
|
|
|
objects = PeriodicTaskManager()
|
|
|
|
|
|
class Meta:
|
|
|
+ """Model meta-data."""
|
|
|
verbose_name = _(u"periodic task")
|
|
|
verbose_name_plural = _(u"periodic tasks")
|
|
|
|
|
@@ -82,10 +57,12 @@ class PeriodicTaskMeta(models.Model):
|
|
|
self.name, self.last_run_at, self.total_run_count)
|
|
|
|
|
|
def delay(self, *args, **kwargs):
|
|
|
+ """Apply the periodic task immediately."""
|
|
|
self.task.delay()
|
|
|
self.total_run_count = self.total_run_count + 1
|
|
|
self.save()
|
|
|
|
|
|
@property
|
|
|
def task(self):
|
|
|
+ """The entry registered in the task registry for this task."""
|
|
|
return tasks[self.name]
|