File: runjob.py

package info (click to toggle)
python-django-extensions 4.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,812 kB
  • sloc: python: 18,601; javascript: 7,354; makefile: 108; xml: 17
file content (64 lines) | stat: -rw-r--r-- 2,074 bytes parent folder | download | duplicates (2)
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)