registry.py 2.7 KB

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