diff options
author | Adrian Holovaty <adrian@holovaty.com> | 2005-07-20 17:42:36 +0000 |
---|---|---|
committer | Adrian Holovaty <adrian@holovaty.com> | 2005-07-20 17:42:36 +0000 |
commit | ec31445c527a22a736cc769d35791f3fea9b477b (patch) | |
tree | f2e3e6955604cba5248ed54778513a7f86ddb7d5 /django/bin | |
parent | 1b8c4c455682e6fcc747ae2dfc0133862dd0d1a3 (diff) | |
download | django-ec31445c527a22a736cc769d35791f3fea9b477b.tar.gz |
Added '--settings' option to django-admin. This specifies which settings module to use, if you don't want to deal with setting the DJANGO_SETTINGS_MODULE environment variable. Refactored django-admin to use optparse. Updated the tutorials to use '--settings' instead of environment variables, which can be confusing.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@247 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/bin')
-rwxr-xr-x | django/bin/django-admin.py | 92 |
1 files changed, 60 insertions, 32 deletions
diff --git a/django/bin/django-admin.py b/django/bin/django-admin.py index 64bfe39882..abb2d13d9f 100755 --- a/django/bin/django-admin.py +++ b/django/bin/django-admin.py @@ -1,5 +1,6 @@ #!/usr/bin/env python from django.core import management +from optparse import OptionParser import os, sys ACTION_MAPPING = { @@ -19,56 +20,83 @@ ACTION_MAPPING = { 'install': management.install, } -def usage(): - sys.stderr.write("Usage: %s [action]\n" % sys.argv[0]) +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() - sys.stderr.write("Available actions:\n") for a in available_actions: func = ACTION_MAPPING[a] - sys.stderr.write(" %s %s-- %s\n" % (a, func.args, getattr(func, 'help_doc', func.__doc__))) + 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." % (msg, cmd)) sys.exit(1) -if __name__ == "__main__": +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 = sys.argv[1] + action = args[0] except IndexError: - usage() + print_error("An 'action' is required.") if not ACTION_MAPPING.has_key(action): - usage() + print_error("Your 'action' was invalid.") if action == 'init': ACTION_MAPPING[action]() - sys.exit(0) elif action in ('startapp', 'startproject'): try: - name = sys.argv[2] + name = args[1] except IndexError: - usage() + parser.print_usage_and_exit() ACTION_MAPPING[action](name, os.getcwd()) - sys.exit(0) elif action == 'runserver': - if len(sys.argv) < 3: + if len(args) < 2: port = '8000' else: - port = sys.argv[2] + port = args[1] ACTION_MAPPING[action](port) - elif action == 'dbcheck': - from django.core import meta - mod_list = meta.get_all_installed_modules() else: from django.core import meta - try: - mod_list = [meta.get_app(app_label) for app_label in sys.argv[2:]] - 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: - usage() - if action not in ('adminindex', 'dbcheck', 'install', 'sqlindexes'): - print "BEGIN;" - for mod in mod_list: - output = ACTION_MAPPING[action](mod) - if output: - print '\n'.join(output) - if action not in ('adminindex', 'dbcheck', 'install', 'sqlindexes'): - print "COMMIT;" + 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() |