models.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. """
  2. Django Models.
  3. """
  4. import django
  5. from django.db import models
  6. from celery.registry import tasks
  7. from celery.managers import TaskManager, TaskSetManager, PeriodicTaskManager
  8. from celery.fields import PickledObjectField
  9. from celery import conf
  10. from django.utils.translation import ugettext_lazy as _
  11. from datetime import datetime
  12. TASK_STATUS_PENDING = "PENDING"
  13. TASK_STATUS_RETRY = "RETRY"
  14. TASK_STATUS_FAILURE = "FAILURE"
  15. TASK_STATUS_DONE = "DONE"
  16. TASK_STATUSES = (TASK_STATUS_PENDING, TASK_STATUS_RETRY,
  17. TASK_STATUS_FAILURE, TASK_STATUS_DONE)
  18. TASK_STATUSES_CHOICES = zip(TASK_STATUSES, TASK_STATUSES)
  19. class TaskMeta(models.Model):
  20. """Task result/status."""
  21. task_id = models.CharField(_(u"task id"), max_length=255, unique=True)
  22. status = models.CharField(_(u"task status"), max_length=50,
  23. default=TASK_STATUS_PENDING, choices=TASK_STATUSES_CHOICES)
  24. result = PickledObjectField()
  25. date_done = models.DateTimeField(_(u"done at"), auto_now=True)
  26. traceback = models.TextField(_(u"traceback"), blank=True, null=True)
  27. objects = TaskManager()
  28. class Meta:
  29. """Model meta-data."""
  30. verbose_name = _(u"task meta")
  31. verbose_name_plural = _(u"task meta")
  32. def __unicode__(self):
  33. return u"<Task: %s done:%s>" % (self.task_id, self.status)
  34. class TaskSetMeta(models.Model):
  35. """TaskSet result"""
  36. taskset_id = models.CharField(_(u"task id"), max_length=255, unique=True)
  37. result = PickledObjectField()
  38. date_done = models.DateTimeField(_(u"done at"), auto_now=True)
  39. objects = TaskSetManager()
  40. class Meta:
  41. """Model meta-data."""
  42. verbose_name = _(u"taskset meta")
  43. verbose_name_plural = _(u"taskset meta")
  44. def __unicode__(self):
  45. return u"<TaskSet: %s>" % (self.taskset_id)
  46. class PeriodicTaskMeta(models.Model):
  47. """Information about a Periodic Task."""
  48. name = models.CharField(_(u"name"), max_length=255, unique=True)
  49. last_run_at = models.DateTimeField(_(u"last time run"),
  50. blank=True,
  51. default=datetime.fromtimestamp(0))
  52. total_run_count = models.PositiveIntegerField(_(u"total run count"),
  53. default=0)
  54. objects = PeriodicTaskManager()
  55. class Meta:
  56. """Model meta-data."""
  57. verbose_name = _(u"periodic task")
  58. verbose_name_plural = _(u"periodic tasks")
  59. def __unicode__(self):
  60. return u"<PeriodicTask: %s [last-run:%s, total-run:%d]>" % (
  61. self.name, self.last_run_at, self.total_run_count)
  62. def delay(self, *args, **kwargs):
  63. """Apply the periodic task immediately."""
  64. self.task.delay()
  65. self.total_run_count = self.total_run_count + 1
  66. self.save()
  67. @property
  68. def task(self):
  69. """The entry registered in the task registry for this task."""
  70. return tasks[self.name]
  71. if (django.VERSION[0], django.VERSION[1]) >= (1, 1):
  72. # keep models away from syncdb/reset if database backend is not being used.
  73. if conf.CELERY_BACKEND != 'database':
  74. TaskMeta._meta.managed = False
  75. if conf.CELERY_PERIODIC_STATUS_BACKEND != 'database':
  76. PeriodicTaskMeta._meta.managed = False