Django

Code

Changeset 8282

Show
Ignore:
Timestamp:
08/10/08 03:42:49 (4 months ago)
Author:
russellm
Message:

Fixed #5943 -- Modified django-admin to behave like manage.py if settings are provided, either as --settings or DJANGO_SETTINGS_MODULE. Thanks to Joseph Kocherhans and Todd O'Bryan for their work on this ticket.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/core/management/base.py

    r7844 r8282  
    8383        # because django.utils.translation requires settings. 
    8484        if self.can_import_settings: 
    85             from django.utils import translation 
    86             translation.activate('en-us') 
    87  
     85            try: 
     86                from django.utils import translation 
     87                translation.activate('en-us') 
     88            except ImportError, e: 
     89                # If settings should be available, but aren't,  
     90                # raise the error and quit. 
     91                sys.stderr.write(self.style.ERROR(str('Error: %s\n' % e))) 
     92                sys.exit(1) 
    8893        try: 
    8994            if self.requires_model_validation: 
  • django/trunk/django/core/management/__init__.py

    r8228 r8282  
    6767                   {}, {}, ['Command']), 'Command')() 
    6868 
    69 def get_commands(load_user_commands=True, project_directory=None): 
     69def get_commands(): 
    7070    """ 
    7171    Returns a dictionary mapping command names to their callback applications. 
     
    7878    specified, user-defined commands will also be included, the 
    7979    startproject command will be disabled, and the startapp command 
    80     will be modified to use the directory in which that module appears. 
     80    will be modified to use the directory in which the settings module appears. 
    8181 
    8282    The dictionary is in the format {command_name: app_name}. Key-value 
     
    9595        _commands = dict([(name, 'django.core') for name in find_commands(__path__[0])]) 
    9696 
    97         if load_user_commands: 
    98             # Get commands from all installed apps. 
     97        # Find the installed apps 
     98        try: 
    9999            from django.conf import settings 
    100             for app_name in settings.INSTALLED_APPS: 
    101                 try: 
    102                     path = find_management_module(app_name) 
    103                     _commands.update(dict([(name, app_name) for name in find_commands(path)])) 
    104                 except ImportError: 
    105                     pass # No management module -- ignore this app. 
     100            apps = settings.INSTALLED_APPS 
     101        except (AttributeError, EnvironmentError, ImportError): 
     102            apps = [] 
     103 
     104        # Find the project directory 
     105        try: 
     106            from django.conf import settings 
     107            project_directory = setup_environ(__import__(settings.SETTINGS_MODULE)) 
     108        except (AttributeError, EnvironmentError, ImportError): 
     109            project_directory = None 
     110 
     111        # Find and load the management module for each installed app. 
     112        for app_name in apps: 
     113            try: 
     114                path = find_management_module(app_name) 
     115                _commands.update(dict([(name, app_name) 
     116                                       for name in find_commands(path)])) 
     117            except ImportError: 
     118                pass # No management module - ignore this app 
    106119 
    107120        if project_directory: 
     
    204217        self.argv = argv or sys.argv[:] 
    205218        self.prog_name = os.path.basename(self.argv[0]) 
    206         self.project_directory = None 
    207         self.user_commands = False 
    208219 
    209220    def main_help_text(self): 
     
    213224        usage = ['',"Type '%s help <subcommand>' for help on a specific subcommand." % self.prog_name,''] 
    214225        usage.append('Available subcommands:') 
    215         commands = get_commands(self.user_commands, self.project_directory).keys() 
     226        commands = get_commands().keys() 
    216227        commands.sort() 
    217228        for cmd in commands: 
     
    226237        """ 
    227238        try: 
    228             app_name = get_commands(self.user_commands, self.project_directory)[subcommand] 
     239            app_name = get_commands()[subcommand] 
    229240            if isinstance(app_name, BaseCommand): 
    230241                # If the command is already loaded, use it directly. 
     
    279290            self.fetch_command(subcommand).run_from_argv(self.argv) 
    280291 
    281 class ProjectManagementUtility(ManagementUtility): 
    282     """ 
    283     A ManagementUtility that is specific to a particular Django project. 
    284     As such, its commands are slightly different than those of its parent 
    285     class. 
    286  
    287     In practice, this class represents manage.py, whereas ManagementUtility 
    288     represents django-admin.py. 
    289     """ 
    290     def __init__(self, argv, project_directory): 
    291         super(ProjectManagementUtility, self).__init__(argv) 
    292         self.project_directory = project_directory 
    293         self.user_commands = True 
    294  
    295292def setup_environ(settings_mod): 
    296293    """ 
     
    314311    # Set DJANGO_SETTINGS_MODULE appropriately. 
    315312    os.environ['DJANGO_SETTINGS_MODULE'] = '%s.%s' % (project_name, settings_name) 
    316     return project_directory 
    317313 
    318314def execute_from_command_line(argv=None): 
     
    328324    project-specific django-admin.py utility. 
    329325    """ 
    330     project_directory = setup_environ(settings_mod) 
    331     utility = ProjectManagementUtility(argv, project_directory
     326    setup_environ(settings_mod) 
     327    utility = ManagementUtility(argv
    332328    utility.execute() 
  • django/trunk/tests/regressiontests/admin_scripts/tests.py

    r8238 r8282  
    224224 
    225225    def test_custom_command(self): 
    226         "default: django-admin can't execute user commands
     226        "default: django-admin can't execute user commands if it isn't provided settings
    227227        args = ['noargs_command'] 
    228228        out, err = self.run_django_admin(args) 
     
    231231 
    232232    def test_custom_command_with_settings(self): 
    233         "default: django-admin can't execute user commands, even if settings are provided as argument" 
     233        "default: django-admin can execute user commands if settings are provided as argument" 
    234234        args = ['noargs_command', '--settings=settings'] 
    235235        out, err = self.run_django_admin(args) 
    236         self.assertNoOutput(out
    237         self.assertOutput(err, "Unknown command: 'noargs_command'") 
     236        self.assertNoOutput(err
     237        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
    238238 
    239239    def test_custom_command_with_environment(self): 
    240         "default: django-admin can't execute user commands, even if settings are provided in environment" 
     240        "default: django-admin can execute user commands if settings are provided in environment" 
    241241        args = ['noargs_command'] 
    242242        out, err = self.run_django_admin(args,'settings') 
    243         self.assertNoOutput(out
    244         self.assertOutput(err, "Unknown command: 'noargs_command'") 
     243        self.assertNoOutput(err
     244        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
    245245 
    246246class DjangoAdminFullPathDefaultSettings(AdminScriptTestCase): 
     
    262262 
    263263    def test_builtin_with_settings(self): 
    264         "fulldefault: django-admin builtin commands fail if user app isn't on path
     264        "fulldefault: django-admin builtin commands succeed if a settings file is provided
    265265        args = ['sqlall','--settings=settings', 'admin_scripts'] 
    266266        out, err = self.run_django_admin(args) 
    267         self.assertNoOutput(out
    268         self.assertOutput(err, 'ImportError: No module named regressiontests') 
     267        self.assertNoOutput(err
     268        self.assertOutput(out, 'CREATE TABLE') 
    269269 
    270270    def test_builtin_with_environment(self): 
    271         "fulldefault: django-admin builtin commands fail if user app isn't on path
     271        "fulldefault: django-admin builtin commands succeed if the environment contains settings
    272272        args = ['sqlall','admin_scripts'] 
    273273        out, err = self.run_django_admin(args,'settings') 
    274         self.assertNoOutput(out
    275         self.assertOutput(err, 'ImportError: No module named regressiontests') 
     274        self.assertNoOutput(err
     275        self.assertOutput(out, 'CREATE TABLE') 
    276276 
    277277    def test_builtin_with_bad_settings(self): 
     
    290290 
    291291    def test_custom_command(self): 
    292         "fulldefault: django-admin can't execute user commands
     292        "fulldefault: django-admin can't execute user commands unless settings are provided
    293293        args = ['noargs_command'] 
    294294        out, err = self.run_django_admin(args) 
     
    297297 
    298298    def test_custom_command_with_settings(self): 
    299         "fulldefault: django-admin can't execute user commands, even if settings are provided as argument" 
     299        "fulldefault: django-admin can execute user commands if settings are provided as argument" 
    300300        args = ['noargs_command', '--settings=settings'] 
    301301        out, err = self.run_django_admin(args) 
    302         self.assertNoOutput(out
    303         self.assertOutput(err, "Unknown command: 'noargs_command'") 
     302        self.assertNoOutput(err
     303        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
    304304 
    305305    def test_custom_command_with_environment(self): 
    306         "fulldefault: django-admin can't execute user commands, even if settings are provided in environment" 
     306        "fulldefault: django-admin can execute user commands if settings are provided in environment" 
    307307        args = ['noargs_command'] 
    308308        out, err = self.run_django_admin(args,'settings') 
    309         self.assertNoOutput(out
    310         self.assertOutput(err, "Unknown command: 'noargs_command'") 
     309        self.assertNoOutput(err
     310        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
    311311 
    312312class DjangoAdminMinimalSettings(AdminScriptTestCase): 
     
    356356 
    357357    def test_custom_command(self): 
    358         "minimal: django-admin can't execute user commands
     358        "minimal: django-admin can't execute user commands unless settings are provided
    359359        args = ['noargs_command'] 
    360360        out, err = self.run_django_admin(args) 
     
    421421        self.assertOutput(err, "Could not import settings 'bad_settings'") 
    422422 
    423     def test_custom_command(self): 
    424         "alternate: django-admin can't execute user commands
     423    def test_custom_command(self):  
     424        "alternate: django-admin can't execute user commands unless settings are provided
    425425        args = ['noargs_command'] 
    426426        out, err = self.run_django_admin(args) 
     
    429429 
    430430    def test_custom_command_with_settings(self): 
    431         "alternate: django-admin can't execute user commands, even if settings are provided as argument" 
     431        "alternate: django-admin can execute user commands if settings are provided as argument" 
    432432        args = ['noargs_command', '--settings=alternate_settings'] 
    433433        out, err = self.run_django_admin(args) 
    434         self.assertNoOutput(out
    435         self.assertOutput(err, "Unknown command: 'noargs_command'") 
     434        self.assertNoOutput(err
     435        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
    436436 
    437437    def test_custom_command_with_environment(self): 
    438         "alternate: django-admin can't execute user commands, even if settings are provided in environment" 
     438        "alternate: django-admin can execute user commands if settings are provided in environment" 
    439439        args = ['noargs_command'] 
    440440        out, err = self.run_django_admin(args,'alternate_settings') 
    441         self.assertNoOutput(out
    442         self.assertOutput(err, "Unknown command: 'noargs_command'") 
     441        self.assertNoOutput(err
     442        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
    443443 
    444444 
     
    491491        self.assertOutput(err, "Could not import settings 'bad_settings'") 
    492492 
    493     def test_custom_command(self): 
    494         "alternate: django-admin can't execute user commands
     493    def test_custom_command(self):  
     494        "alternate: django-admin can't execute user commands unless settings are provided
    495495        args = ['noargs_command'] 
    496496        out, err = self.run_django_admin(args) 
     
    502502        args = ['noargs_command', '--settings=alternate_settings'] 
    503503        out, err = self.run_django_admin(args) 
    504         self.assertNoOutput(out
    505         self.assertOutput(err, "Unknown command: 'noargs_command'") 
     504        self.assertNoOutput(err
     505        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
    506506 
    507507    def test_custom_command_with_environment(self): 
     
    509509        args = ['noargs_command'] 
    510510        out, err = self.run_django_admin(args,'alternate_settings') 
    511         self.assertNoOutput(out
    512         self.assertOutput(err, "Unknown command: 'noargs_command'") 
     511        self.assertNoOutput(err
     512        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
    513513 
    514514##########################################################################