registry.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from celery import discovery
  2. from UserDict import UserDict
  3. class NotRegistered(Exception):
  4. """The task is not registered."""
  5. class AlreadyRegistered(Exception):
  6. """The task is already registered."""
  7. class TaskRegistry(UserDict):
  8. """Site registry for tasks."""
  9. AlreadyRegistered = AlreadyRegistered
  10. NotRegistered = NotRegistered
  11. def __init__(self):
  12. self.data = {}
  13. def autodiscover(self):
  14. """Autodiscovers tasks using :func:`celery.discovery.autodiscover`."""
  15. discovery.autodiscover()
  16. def register(self, task, task_name=None):
  17. """Register a task in the task registry.
  18. Task can either be a regular function, or a class inheriting
  19. from :class:`celery.task.Task`.
  20. :keyword task_name: Required if the task is a regular function.
  21. :raises AlreadyRegistered: if the task is already registered.
  22. """
  23. is_class = False
  24. if hasattr(task, "run"):
  25. is_class = True
  26. task_name = task.name
  27. if task_name in self.data:
  28. raise self.AlreadyRegistered(
  29. "Task with name %s is already registered." % task_name)
  30. if is_class:
  31. self.data[task_name] = task() # instantiate Task class
  32. else:
  33. task.type = "regular"
  34. self.data[task_name] = task
  35. def unregister(self, task_name):
  36. """Unregister task by name.
  37. :param task_name: name of the task to unregister.
  38. :raises NotRegistered: if the task has not been registered.
  39. """
  40. if hasattr(task_name, "run"):
  41. task_name = task_name.name
  42. if task_name not in self.data:
  43. raise self.NotRegistered(
  44. "Task with name %s is not registered." % task_name)
  45. del self.data[task_name]
  46. def get_all(self):
  47. """Get all task types."""
  48. return self.data
  49. def filter_types(self, type):
  50. """Return all tasks of a specific type."""
  51. return dict([(task_name, task)
  52. for task_name, task in self.data.items()
  53. if task.type == type])
  54. def get_all_regular(self):
  55. """Get all regular task types."""
  56. return self.filter_types(type="regular")
  57. def get_all_periodic(self):
  58. """Get all periodic task types."""
  59. return self.filter_types(type="periodic")
  60. def get_task(self, task_name):
  61. """Get task by name."""
  62. return self.data[task_name]
  63. """
  64. .. data:: tasks
  65. The global task registry.
  66. """
  67. tasks = TaskRegistry()