web/lib/django_extensions/management/commands/runjob.py
changeset 3 526ebd3988b0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/django_extensions/management/commands/runjob.py	Wed Jan 20 12:37:40 2010 +0100
@@ -0,0 +1,59 @@
+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"),
+    )