web/lib/django_extensions/management/commands/runjobs.py
changeset 3 526ebd3988b0
equal deleted inserted replaced
1:ebaad720f88b 3:526ebd3988b0
       
     1 from django.core.management.base import LabelCommand
       
     2 from optparse import make_option
       
     3 from django_extensions.management.jobs import get_jobs, print_jobs
       
     4 
       
     5 class Command(LabelCommand):
       
     6     option_list = LabelCommand.option_list + (
       
     7         make_option('--list', '-l', action="store_true", dest="list_jobs",
       
     8             help="List all jobs with their description"),
       
     9     )
       
    10     help = "Runs scheduled maintenance jobs."
       
    11     args = "[hourly daily weekly monthly]"
       
    12     label = ""
       
    13 
       
    14     requires_model_validation = True
       
    15 
       
    16     def usage_msg(self):
       
    17         print "Run scheduled jobs. Please specify 'hourly', 'daily', 'weekly' or 'monthly'"
       
    18 
       
    19     def runjobs(self, when, options):
       
    20         verbosity = int(options.get('verbosity', 1))
       
    21         jobs = get_jobs(when, only_scheduled=True)
       
    22         list = jobs.keys()
       
    23         list.sort()
       
    24         for app_name, job_name in list:
       
    25             job = jobs[(app_name, job_name)]
       
    26             if verbosity>1:
       
    27                 print "Executing %s job: %s (app: %s)" % (when, job_name, app_name)
       
    28             try:
       
    29                 job().execute()
       
    30             except Exception, e:
       
    31                 import traceback
       
    32                 print "ERROR OCCURED IN %s JOB: %s (APP: %s)" % (when.upper(), job_name, app_name)
       
    33                 print "START TRACEBACK:"
       
    34                 traceback.print_exc()
       
    35                 print "END TRACEBACK\n"
       
    36 
       
    37     def runjobs_by_signals(self, when, options):
       
    38         """ Run jobs from the signals """
       
    39         # Thanks for Ian Holsman for the idea and code
       
    40         from django_extensions.management import signals
       
    41         from django.db import models
       
    42         from django.conf import settings
       
    43 
       
    44         verbosity = int(options.get('verbosity', 1))
       
    45         for app_name in settings.INSTALLED_APPS:
       
    46             try:
       
    47                 __import__(app_name + '.management', '', '', [''])
       
    48             except ImportError:
       
    49                 pass
       
    50 
       
    51         for app in models.get_apps():
       
    52             if verbosity>1:
       
    53                 app_name = '.'.join(app.__name__.rsplit('.')[:-1])
       
    54                 print "Sending %s job signal for: %s" % (when, app_name)
       
    55             if when == 'hourly':
       
    56                 signals.run_hourly_jobs.send(sender=app, app=app)
       
    57             elif when == 'daily':
       
    58                 signals.run_daily_jobs.send(sender=app, app=app)
       
    59             elif when == 'weekly':
       
    60                 signals.run_weekly_jobs.send(sender=app, app=app)
       
    61             elif when == 'monthly':
       
    62                 signals.run_monthly_jobs.send(sender=app, app=app)
       
    63 
       
    64     def handle(self, *args, **options):
       
    65         when = None
       
    66         if len(args)>1:
       
    67             self.usage_msg()
       
    68             return
       
    69         elif len(args)==1:
       
    70             if not args[0] in ['hourly', 'daily', 'weekly', 'monthly']:
       
    71                 self.usage_msg()
       
    72                 return
       
    73             else:
       
    74                 when = args[0]
       
    75         if options.get('list_jobs'):
       
    76             print_jobs(when, only_scheduled=True, show_when=True, show_appname=True)
       
    77         else:
       
    78             if not when:
       
    79                 self.usage_msg()
       
    80                 return
       
    81             self.runjobs(when, options)
       
    82             self.runjobs_by_signals(when, options)
       
    83 
       
    84 # Backwards compatibility for Django r9110
       
    85 if not [opt for opt in Command.option_list if opt.dest=='verbosity']:
       
    86     Command.option_list += (
       
    87         make_option('--verbosity', '-v', action="store", dest="verbosity",
       
    88             default='1', type='choice', choices=['0', '1', '2'],
       
    89             help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"),
       
    90     )