Django

Code

Changeset 1553

Show
Ignore:
Timestamp:
12/05/05 23:17:52 (3 years ago)
Author:
adrian
Message:

Moved all logic from django-admin.py into django.core.management, into a new execute_from_command_line() function, so it can be called from other scripts. Also improved createproject to disallow 'django' and 'test' as project names.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/bin/django-admin.py

    r1526 r1553  
    11#!/usr/bin/env python 
    22from django.core import management 
    3 from optparse import OptionParser 
    4 import os, sys, textwrap 
    5  
    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 optparse 
    33     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.settings 
    66     if options.pythonpath: 
    67         sys.path.insert(0, options.pythonpath) 
    68  
    69     # Run the appropriate action. Unfortunately, optparse can't handle 
    70     # 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 content 
    79     # 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 translation 
    83         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 line 
    106         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 meta 
    132         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;" 
    1503 
    1514if __name__ == "__main__": 
    152     main() 
    153  
     5    management.execute_from_command_line() 
  • django/trunk/django/core/management.py

    r1518 r1553  
    33 
    44import django 
    5 import os, re, sys 
     5import os, re, sys, textwrap 
     6from optparse import OptionParser 
    67 
    78MODULE_TEMPLATE = '''    {%% if perms.%(app)s.%(addperm)s or perms.%(app)s.%(changeperm)s %%} 
     
    1819# which has been installed. 
    1920PROJECT_TEMPLATE_DIR = os.path.join(django.__path__[0], 'conf', '%s_template') 
     21 
     22INVALID_PROJECT_NAMES = ('django', 'test') 
    2023 
    2124def _get_packages_insert(app_label): 
     
    472475    "Creates a Django project for the given project_name in the given directory." 
    473476    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) 
    474480    _start_helper('project', project_name, directory) 
    475481    # Create a random SECRET_KEY hash, and put it in the main settings. 
     
    808814    db.db.commit() 
    809815createcachetable.args = "[tablename]" 
     816 
     817# Utilities for command-line script 
     818 
     819ACTION_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 
     841NO_SQL_TRANSACTION = ('adminindex', 'createcachetable', 'dbcheck', 'install', 'installperms', 'sqlindexes') 
     842 
     843class DjangoOptionParser(OptionParser): 
     844    def print_usage_and_exit(self): 
     845        self.print_help(sys.stderr) 
     846        sys.exit(1) 
     847 
     848def 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 
     863def print_error(msg, cmd): 
     864    sys.stderr.write('Error: %s\nRun "%s --help" for help.\n' % (msg, cmd)) 
     865    sys.exit(1) 
     866 
     867def 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;"