models.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. """
  2. Django Models.
  3. """
  4. from django.db import models
  5. from celery.registry import tasks
  6. from celery.managers import TaskManager, PeriodicTaskManager
  7. from celery.fields import PickledObjectField
  8. from django.utils.translation import ugettext_lazy as _
  9. from datetime import datetime
  10. TASK_STATUS_PENDING = "PENDING"
  11. TASK_STATUS_RETRY = "RETRY"
  12. TASK_STATUS_FAILURE = "FAILURE"
  13. TASK_STATUS_DONE = "DONE"
  14. TASK_STATUSES = (TASK_STATUS_PENDING, TASK_STATUS_RETRY,
  15. TASK_STATUS_FAILURE, TASK_STATUS_DONE)
  16. TASK_STATUSES_CHOICES = zip(TASK_STATUSES, TASK_STATUSES)
  17. class TaskMeta(models.Model):
  18. """Task result/status."""
  19. task_id = models.CharField(_(u"task id"), max_length=255, unique=True)
  20. status = models.CharField(_(u"task status"), max_length=50,
  21. default=TASK_STATUS_PENDING, choices=TASK_STATUSES_CHOICES)
  22. result = PickledObjectField()
  23. date_done = models.DateTimeField(_(u"done at"), auto_now=True)
  24. objects = TaskManager()
  25. class Meta:
  26. """Model meta-data."""
  27. verbose_name = _(u"task meta")
  28. verbose_name_plural = _(u"task meta")
  29. def __unicode__(self):
  30. return u"<Task: %s done:%s>" % (self.task_id, self.status)
  31. class PeriodicTaskMeta(models.Model):
  32. """Information about a Periodic Task."""
  33. name = models.CharField(_(u"name"), max_length=255, unique=True)
  34. last_run_at = models.DateTimeField(_(u"last time run"),
  35. blank=True,
  36. default=datetime.fromtimestamp(0))
  37. total_run_count = models.PositiveIntegerField(_(u"total run count"),
  38. default=0)
  39. objects = PeriodicTaskManager()
  40. class Meta:
  41. """Model meta-data."""
  42. verbose_name = _(u"periodic task")
  43. verbose_name_plural = _(u"periodic tasks")
  44. def __unicode__(self):
  45. return u"<PeriodicTask: %s [last-run:%s, total-run:%d]>" % (
  46. self.name, self.last_run_at, self.total_run_count)
  47. def delay(self, *args, **kwargs):
  48. """Apply the periodic task immediately."""
  49. self.task.delay()
  50. self.total_run_count = self.total_run_count + 1
  51. self.save()
  52. @property
  53. def task(self):
  54. """The entry registered in the task registry for this task."""
  55. return tasks[self.name]