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