|
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 ) |