discovery.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import imp
  2. from django.conf import settings
  3. from django.core import exceptions
  4. def autodiscover():
  5. """Include tasks for all applications in settings.INSTALLED_APPS."""
  6. return filter(None, [tasks_for_app(app)
  7. for app in settings.INSTALLED_APPS])
  8. def tasks_for_app(app):
  9. """Given an application name, imports any tasks.py file for that app."""
  10. def found_tasks_module_handler(app_path, app_basename):
  11. return __import__("%s.tasks" % app)
  12. return find_related_module(app, "tasks", found_tasks_module_handler)
  13. def find_related_module(app, related_name, handler):
  14. """Given an application name and a module name, tries to find that
  15. module in the application, and running handler' if it finds it.
  16. """
  17. # See django.contrib.admin.autodiscover for an explanation of this code.
  18. try:
  19. app_basename = app.split('.')[-1]
  20. app_path = __import__(app, {}, {}, app_basename).__path__
  21. except AttributeError:
  22. return None
  23. try:
  24. imp.find_module(related_name, app_path)
  25. except ImportError:
  26. return None
  27. return handler(app_path, app_basename)