NewsBlur/utils/django_extensions/management/commands/runjob.py
2009-07-22 04:24:24 +00:00

59 lines
2.2 KiB
Python

from django.core.management.base import LabelCommand
from optparse import make_option
from django_extensions.management.jobs import get_job, print_jobs
class Command(LabelCommand):
option_list = LabelCommand.option_list + (
make_option('--list', '-l', action="store_true", dest="list_jobs",
help="List all jobs with their description"),
)
help = "Run a single maintenance job."
args = "[app_name] job_name"
label = ""
requires_model_validation = True
def runjob(self, app_name, job_name, options):
verbosity = int(options.get('verbosity', 1))
if verbosity>1:
print "Executing job: %s (app: %s)" % (job_name, app_name)
try:
job = get_job(app_name, job_name)
except KeyError, e:
if app_name:
print "Error: Job %s for applabel %s not found" % (app_name, job_name)
else:
print "Error: Job %s not found" % job_name
print "Use -l option to view all the available jobs"
return
try:
job().execute()
except Exception, e:
import traceback
print "ERROR OCCURED IN JOB: %s (APP: %s)" % (job_name, app_name)
print "START TRACEBACK:"
traceback.print_exc()
print "END TRACEBACK\n"
def handle(self, *args, **options):
app_name = None
job_name = None
if len(args)==1:
job_name = args[0]
elif len(args)==2:
app_name, job_name = args
if options.get('list_jobs'):
print_jobs(only_scheduled=False, show_when=True, show_appname=True)
else:
if not job_name:
print "Run a single maintenance job. Please specify the name of the job."
return
self.runjob(app_name, job_name, options)
# Backwards compatibility for Django r9110
if not [opt for opt in Command.option_list if opt.dest=='verbosity']:
Command.option_list += (
make_option('--verbosity', '-v', action="store", dest="verbosity",
default='1', type='choice', choices=['0', '1', '2'],
help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"),
)