registry.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. discovery.autodiscover()
  15. def register(self, task, task_name=None):
  16. is_class = False
  17. if hasattr(task, "run"):
  18. is_class = True
  19. task_name = task.name
  20. if task_name in self.data:
  21. raise self.AlreadyRegistered(
  22. "Task with name %s is already registered." % task_name)
  23. if is_class:
  24. self.data[task_name] = task() # instantiate Task class
  25. else:
  26. task.type = "regular"
  27. self.data[task_name] = task
  28. def unregister(self, task_name):
  29. if hasattr(task_name, "run"):
  30. task_name = task_name.name
  31. if task_name not in self.data:
  32. raise self.NotRegistered(
  33. "Task with name %s is not registered." % task_name)
  34. del self.data[task_name]
  35. def get_all(self):
  36. """Get all task types."""
  37. return self.data
  38. def filter_types(self, type):
  39. """Return all tasks of a specific type."""
  40. return dict([(task_name, task)
  41. for task_name, task in self.data.items()
  42. if task.type == type])
  43. def get_all_regular(self):
  44. """Get all regular task types."""
  45. return self.filter_types(type="regular")
  46. def get_all_periodic(self):
  47. """Get all periodic task types."""
  48. return self.filter_types(type="periodic")
  49. def get_task(self, task_name):
  50. """Get task by name."""
  51. return self.data[task_name]
  52. """This is the global task registry."""
  53. tasks = TaskRegistry()