summaryrefslogtreecommitdiff
path: root/django/bin
diff options
context:
space:
mode:
authorAdrian Holovaty <adrian@holovaty.com>2005-07-20 17:42:36 +0000
committerAdrian Holovaty <adrian@holovaty.com>2005-07-20 17:42:36 +0000
commitec31445c527a22a736cc769d35791f3fea9b477b (patch)
treef2e3e6955604cba5248ed54778513a7f86ddb7d5 /django/bin
parent1b8c4c455682e6fcc747ae2dfc0133862dd0d1a3 (diff)
downloaddjango-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-xdjango/bin/django-admin.py92
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()