summaryrefslogtreecommitdiff
path: root/django/bin/django-admin.py
blob: 17c28b81fdc637d331637573f321c9e497e563af (plain)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env python
from django.core import management
from optparse import OptionParser
import os, sys

ACTION_MAPPING = {
    'adminindex': management.get_admin_index,
    'createsuperuser': management.createsuperuser,
#     'dbcheck': management.database_check,
    'init': management.init,
    'inspectdb': management.inspectdb,
    'install': management.install,
    'runserver': management.runserver,
    'sql': management.get_sql_create,
    'sqlall': management.get_sql_all,
    'sqlclear': management.get_sql_delete,
    'sqlindexes': management.get_sql_indexes,
    'sqlinitialdata': management.get_sql_initial_data,
    'sqlreset': management.get_sql_reset,
    'sqlsequencereset': management.get_sql_sequence_reset,
    'startapp': management.startapp,
    'startproject': management.startproject,
    'validate': management.validate,
}

NO_SQL_TRANSACTION = ('adminindex', 'dbcheck', 'install', 'sqlindexes')

def get_usage():
    """
    Returns a usage string. Doesn't do the options stuff, because optparse
    takes care of that.
    """
    usage = ["usage: %prog action [options]\nactions:"]
    available_actions = ACTION_MAPPING.keys()
    available_actions.sort()
    for a in available_actions:
        func = ACTION_MAPPING[a]
        usage.append("  %s %s -- %s" % (a, func.args, getattr(func, 'help_doc', func.__doc__)))
    return '\n'.join(usage)

class DjangoOptionParser(OptionParser):
    def print_usage_and_exit(self):
        self.print_help(sys.stderr)
        sys.exit(1)

def print_error(msg, cmd):
    sys.stderr.write('Error: %s\nRun "%s --help" for help.\n' % (msg, cmd))
    sys.exit(1)

def main():
    # Parse the command-line arguments. optparse handles the dirty work.
    parser = DjangoOptionParser(get_usage())
    parser.add_option('--settings',
        help='Python path to settings module, e.g. "myproject.settings.main". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.')
    options, args = parser.parse_args()

    # Take care of options.
    if options.settings:
        os.environ['DJANGO_SETTINGS_MODULE'] = options.settings

    # Run the appropriate action. Unfortunately, optparse can't handle
    # positional arguments, so this has to parse/validate them.
    try:
        action = args[0]
    except IndexError:
        print_error("An action is required.", sys.argv[0])
    if not ACTION_MAPPING.has_key(action):
        print_error("Your action, %r, was invalid." % action, sys.argv[0])
    if action in ('createsuperuser', 'init', 'validate'):
        ACTION_MAPPING[action]()
    elif action == 'inspectdb':
        try:
            param = args[1]
        except IndexError:
            parser.print_usage_and_exit()
        try:
            for line in ACTION_MAPPING[action](param):
                print line
        except NotImplementedError:
            sys.stderr.write("Error: %r isn't supported for the currently selected database backend.\n" % action)
            sys.exit(1)
    elif action in ('startapp', 'startproject'):
        try:
            name = args[1]
        except IndexError:
            parser.print_usage_and_exit()
        ACTION_MAPPING[action](name, os.getcwd())
    elif action == 'runserver':
        if len(args) < 2:
            addr = ''
            port = '8000'
        else:
            try:
                addr, port = args[1].split(':')
            except ValueError:
                addr, port = '', args[1]
        ACTION_MAPPING[action](addr, port)
    else:
        from django.core import meta
        if action == 'dbcheck':
            mod_list = meta.get_all_installed_modules()
        else:
            try:
                mod_list = [meta.get_app(app_label) for app_label in args[1:]]
            except ImportError, e:
                sys.stderr.write("Error: %s. Are you sure your INSTALLED_APPS setting is correct?\n" % e)
                sys.exit(1)
            if not mod_list:
                parser.print_usage_and_exit()
        if action not in NO_SQL_TRANSACTION:
            print "BEGIN;"
        for mod in mod_list:
            output = ACTION_MAPPING[action](mod)
            if output:
                print '\n'.join(output)
        if action not in NO_SQL_TRANSACTION:
            print "COMMIT;"

if __name__ == "__main__":
    main()