runjob.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # -*- coding: utf-8 -*-
  2. import logging
  3. from django.core.management.base import BaseCommand
  4. from django_extensions.management.jobs import get_job, print_jobs
  5. from django_extensions.management.utils import setup_logger, signalcommand
  6. logger = logging.getLogger(__name__)
  7. class Command(BaseCommand):
  8. help = "Run a single maintenance job."
  9. missing_args_message = "test"
  10. def add_arguments(self, parser):
  11. super().add_arguments(parser)
  12. parser.add_argument('app_name', nargs='?')
  13. parser.add_argument('job_name', nargs='?')
  14. parser.add_argument(
  15. '--list', '-l', action="store_true", dest="list_jobs",
  16. default=False, help="List all jobs with their description"
  17. )
  18. def runjob(self, app_name, job_name, options):
  19. verbosity = options["verbosity"]
  20. if verbosity > 1:
  21. logger.info("Executing job: %s (app: %s)", job_name, app_name)
  22. try:
  23. job = get_job(app_name, job_name)
  24. except KeyError:
  25. if app_name:
  26. logger.error("Error: Job %s for applabel %s not found", job_name, app_name)
  27. else:
  28. logger.error("Error: Job %s not found", job_name)
  29. logger.info("Use -l option to view all the available jobs")
  30. return
  31. try:
  32. job().execute()
  33. except Exception:
  34. logger.exception("ERROR OCCURED IN JOB: %s (APP: %s)", job_name, app_name)
  35. @signalcommand
  36. def handle(self, *args, **options):
  37. app_name = options['app_name']
  38. job_name = options['job_name']
  39. # hack since we are using job_name nargs='?' for -l to work
  40. if app_name and not job_name:
  41. job_name = app_name
  42. app_name = None
  43. setup_logger(logger, self.stdout)
  44. if options['list_jobs']:
  45. print_jobs(only_scheduled=False, show_when=True, show_appname=True)
  46. else:
  47. self.runjob(app_name, job_name, options)