Changeset 1553
- Timestamp:
- 12/05/05 23:17:52 (3 years ago)
- Files:
-
- django/trunk/django/bin/django-admin.py (modified) (1 diff)
- django/trunk/django/core/management.py (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/bin/django-admin.py
r1526 r1553 1 1 #!/usr/bin/env python 2 2 from django.core import management 3 from optparse import OptionParser4 import os, sys, textwrap5 6 ACTION_MAPPING = {7 'adminindex': management.get_admin_index,8 'createsuperuser': management.createsuperuser,9 'createcachetable' : management.createcachetable,10 # 'dbcheck': management.database_check,11 'init': management.init,12 'inspectdb': management.inspectdb,13 'install': management.install,14 'installperms': management.installperms,15 'runserver': management.runserver,16 'sql': management.get_sql_create,17 'sqlall': management.get_sql_all,18 'sqlclear': management.get_sql_delete,19 'sqlindexes': management.get_sql_indexes,20 'sqlinitialdata': management.get_sql_initial_data,21 'sqlreset': management.get_sql_reset,22 'sqlsequencereset': management.get_sql_sequence_reset,23 'startapp': management.startapp,24 'startproject': management.startproject,25 'validate': management.validate,26 }27 28 NO_SQL_TRANSACTION = ('adminindex', 'createcachetable', 'dbcheck', 'install', 'installperms', 'sqlindexes')29 30 def get_usage():31 """32 Returns a usage string. Doesn't do the options stuff, because optparse33 takes care of that.34 """35 usage = ["usage: %prog action [options]\nactions:"]36 available_actions = ACTION_MAPPING.keys()37 available_actions.sort()38 for a in available_actions:39 func = ACTION_MAPPING[a]40 usage.append(" %s %s" % (a, func.args))41 usage.extend(textwrap.wrap(getattr(func, 'help_doc', func.__doc__), initial_indent=' ', subsequent_indent=' '))42 usage.append("")43 return '\n'.join(usage[:-1]) # Cut off last list element, an empty space.44 45 class DjangoOptionParser(OptionParser):46 def print_usage_and_exit(self):47 self.print_help(sys.stderr)48 sys.exit(1)49 50 def print_error(msg, cmd):51 sys.stderr.write('Error: %s\nRun "%s --help" for help.\n' % (msg, cmd))52 sys.exit(1)53 54 def main():55 # Parse the command-line arguments. optparse handles the dirty work.56 parser = DjangoOptionParser(get_usage())57 parser.add_option('--settings',58 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.')59 parser.add_option('--pythonpath',60 help='Lets you manually add a directory the Python path, e.g. "/home/djangoprojects/myproject".')61 options, args = parser.parse_args()62 63 # Take care of options.64 if options.settings:65 os.environ['DJANGO_SETTINGS_MODULE'] = options.settings66 if options.pythonpath:67 sys.path.insert(0, options.pythonpath)68 69 # Run the appropriate action. Unfortunately, optparse can't handle70 # positional arguments, so this has to parse/validate them.71 try:72 action = args[0]73 except IndexError:74 parser.print_usage_and_exit()75 if not ACTION_MAPPING.has_key(action):76 print_error("Your action, %r, was invalid." % action, sys.argv[0])77 78 # switch to english, because django-admin creates database content79 # like permissions, and those shouldn't contain any translations.80 # But only do this if we should have a working settings file.81 if action not in ('startproject', 'startapp'):82 from django.utils import translation83 translation.activate('en-us')84 85 if action == 'createsuperuser':86 try:87 username, email, password = args[1], args[2], args[3]88 except IndexError:89 if len(args) == 1: # We got no arguments, just the action.90 ACTION_MAPPING[action]()91 else:92 sys.stderr.write("Error: %r requires arguments of 'username email password' or no argument at all.\n")93 sys.exit(1)94 else:95 ACTION_MAPPING[action](username, email, password)96 elif action in ('init', 'validate'):97 ACTION_MAPPING[action]()98 elif action == 'inspectdb':99 try:100 param = args[1]101 except IndexError:102 parser.print_usage_and_exit()103 try:104 for line in ACTION_MAPPING[action](param):105 print line106 except NotImplementedError:107 sys.stderr.write("Error: %r isn't supported for the currently selected database backend.\n" % action)108 sys.exit(1)109 elif action == 'createcachetable':110 try:111 ACTION_MAPPING[action](args[1])112 except IndexError:113 parser.print_usage_and_exit()114 elif action in ('startapp', 'startproject'):115 try:116 name = args[1]117 except IndexError:118 parser.print_usage_and_exit()119 ACTION_MAPPING[action](name, os.getcwd())120 elif action == 'runserver':121 if len(args) < 2:122 addr = ''123 port = '8000'124 else:125 try:126 addr, port = args[1].split(':')127 except ValueError:128 addr, port = '', args[1]129 ACTION_MAPPING[action](addr, port)130 else:131 from django.core import meta132 if action == 'dbcheck':133 mod_list = meta.get_all_installed_modules()134 else:135 try:136 mod_list = [meta.get_app(app_label) for app_label in args[1:]]137 except ImportError, e:138 sys.stderr.write("Error: %s. Are you sure your INSTALLED_APPS setting is correct?\n" % e)139 sys.exit(1)140 if not mod_list:141 parser.print_usage_and_exit()142 if action not in NO_SQL_TRANSACTION:143 print "BEGIN;"144 for mod in mod_list:145 output = ACTION_MAPPING[action](mod)146 if output:147 print '\n'.join(output)148 if action not in NO_SQL_TRANSACTION:149 print "COMMIT;"150 3 151 4 if __name__ == "__main__": 152 main() 153 5 management.execute_from_command_line() django/trunk/django/core/management.py
r1518 r1553 3 3 4 4 import django 5 import os, re, sys 5 import os, re, sys, textwrap 6 from optparse import OptionParser 6 7 7 8 MODULE_TEMPLATE = ''' {%% if perms.%(app)s.%(addperm)s or perms.%(app)s.%(changeperm)s %%} … … 18 19 # which has been installed. 19 20 PROJECT_TEMPLATE_DIR = os.path.join(django.__path__[0], 'conf', '%s_template') 21 22 INVALID_PROJECT_NAMES = ('django', 'test') 20 23 21 24 def _get_packages_insert(app_label): … … 472 475 "Creates a Django project for the given project_name in the given directory." 473 476 from random import choice 477 if project_name in INVALID_PROJECT_NAMES: 478 sys.stderr.write("Error: %r isn't a valid project name. Please try another.\n" % project_name) 479 sys.exit(1) 474 480 _start_helper('project', project_name, directory) 475 481 # Create a random SECRET_KEY hash, and put it in the main settings. … … 808 814 db.db.commit() 809 815 createcachetable.args = "[tablename]" 816 817 # Utilities for command-line script 818 819 ACTION_MAPPING = { 820 'adminindex': get_admin_index, 821 'createsuperuser': createsuperuser, 822 'createcachetable' : createcachetable, 823 # 'dbcheck': database_check, 824 'init': init, 825 'inspectdb': inspectdb, 826 'install': install, 827 'installperms': installperms, 828 'runserver': runserver, 829 'sql': get_sql_create, 830 'sqlall': get_sql_all, 831 'sqlclear': get_sql_delete, 832 'sqlindexes': get_sql_indexes, 833 'sqlinitialdata': get_sql_initial_data, 834 'sqlreset': get_sql_reset, 835 'sqlsequencereset': get_sql_sequence_reset, 836 'startapp': startapp, 837 'startproject': startproject, 838 'validate': validate, 839 } 840 841 NO_SQL_TRANSACTION = ('adminindex', 'createcachetable', 'dbcheck', 'install', 'installperms', 'sqlindexes') 842 843 class DjangoOptionParser(OptionParser): 844 def print_usage_and_exit(self): 845 self.print_help(sys.stderr) 846 sys.exit(1) 847 848 def get_usage(): 849 """ 850 Returns a usage string. Doesn't do the options stuff, because optparse 851 takes care of that. 852 """ 853 usage = ["usage: %prog action [options]\nactions:"] 854 available_actions = ACTION_MAPPING.keys() 855 available_actions.sort() 856 for a in available_actions: 857 func = ACTION_MAPPING[a] 858 usage.append(" %s %s" % (a, func.args)) 859 usage.extend(textwrap.wrap(getattr(func, 'help_doc', func.__doc__), initial_indent=' ', subsequent_indent=' ')) 860 usage.append("") 861 return '\n'.join(usage[:-1]) # Cut off last list element, an empty space. 862 863 def print_error(msg, cmd): 864 sys.stderr.write('Error: %s\nRun "%s --help" for help.\n' % (msg, cmd)) 865 sys.exit(1) 866 867 def execute_from_command_line(): 868 # Parse the command-line arguments. optparse handles the dirty work. 869 parser = DjangoOptionParser(get_usage()) 870 parser.add_option('--settings', 871 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.') 872 parser.add_option('--pythonpath', 873 help='Lets you manually add a directory the Python path, e.g. "/home/djangoprojects/myproject".') 874 options, args = parser.parse_args() 875 876 # Take care of options. 877 if options.settings: 878 os.environ['DJANGO_SETTINGS_MODULE'] = options.settings 879 if options.pythonpath: 880 sys.path.insert(0, options.pythonpath) 881 882 # Run the appropriate action. Unfortunately, optparse can't handle 883 # positional arguments, so this has to parse/validate them. 884 try: 885 action = args[0] 886 except IndexError: 887 parser.print_usage_and_exit() 888 if not ACTION_MAPPING.has_key(action): 889 print_error("Your action, %r, was invalid." % action, sys.argv[0]) 890 891 # switch to english, because django-admin creates database content 892 # like permissions, and those shouldn't contain any translations. 893 # But only do this if we should have a working settings file. 894 if action not in ('startproject', 'startapp'): 895 from django.utils import translation 896 translation.activate('en-us') 897 898 if action == 'createsuperuser': 899 try: 900 username, email, password = args[1], args[2], args[3] 901 except IndexError: 902 if len(args) == 1: # We got no arguments, just the action. 903 ACTION_MAPPING[action]() 904 else: 905 sys.stderr.write("Error: %r requires arguments of 'username email password' or no argument at all.\n") 906 sys.exit(1) 907 else: 908 ACTION_MAPPING[action](username, email, password) 909 elif action in ('init', 'validate'): 910 ACTION_MAPPING[action]() 911 elif action == 'inspectdb': 912 try: 913 param = args[1] 914 except IndexError: 915 parser.print_usage_and_exit() 916 try: 917 for line in ACTION_MAPPING[action](param): 918 print line 919 except NotImplementedError: 920 sys.stderr.write("Error: %r isn't supported for the currently selected database backend.\n" % action) 921 sys.exit(1) 922 elif action == 'createcachetable': 923 try: 924 ACTION_MAPPING[action](args[1]) 925 except IndexError: 926 parser.print_usage_and_exit() 927 elif action in ('startapp', 'startproject'): 928 try: 929 name = args[1] 930 except IndexError: 931 parser.print_usage_and_exit() 932 ACTION_MAPPING[action](name, os.getcwd()) 933 elif action == 'runserver': 934 if len(args) < 2: 935 addr = '' 936 port = '8000' 937 else: 938 try: 939 addr, port = args[1].split(':') 940 except ValueError: 941 addr, port = '', args[1] 942 ACTION_MAPPING[action](addr, port) 943 else: 944 from django.core import meta 945 if action == 'dbcheck': 946 mod_list = meta.get_all_installed_modules() 947 else: 948 try: 949 mod_list = [meta.get_app(app_label) for app_label in args[1:]] 950 except ImportError, e: 951 sys.stderr.write("Error: %s. Are you sure your INSTALLED_APPS setting is correct?\n" % e) 952 sys.exit(1) 953 if not mod_list: 954 parser.print_usage_and_exit() 955 if action not in NO_SQL_TRANSACTION: 956 print "BEGIN;" 957 for mod in mod_list: 958 output = ACTION_MAPPING[action](mod) 959 if output: 960 print '\n'.join(output) 961 if action not in NO_SQL_TRANSACTION: 962 print "COMMIT;"
