Django

Code

Changeset 8227

Show
Ignore:
Timestamp:
08/08/08 07:27:40 (4 months ago)
Author:
russellm
Message:

Fixed #5825 -- Modified the custom command loader to allow for explicit specification of the project name, even if the project directory isn't in the python path. This brings custom command loading into alignment with application loading. Thanks to jdetaeye@frepple.com for the original report, and to abozanich for the patch.

Files:

Legend:

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

    r7888 r8227  
    3838    parts.append('management') 
    3939    parts.reverse() 
     40    part = parts.pop() 
    4041    path = None 
     42     
     43    # When using manage.py, the project module is added to the path, 
     44    # loaded, then removed from the path. This means that  
     45    # testproject.testapp.models can be loaded in future, even if 
     46    # testproject isn't in the path. When looking for the management 
     47    # module, we need look for the case where the project name is part 
     48    # of the app_name but the project directory itself isn't on the path. 
     49    try: 
     50        f, path, descr = find_module(part,path)  
     51    except ImportError,e: 
     52        if os.path.basename(os.getcwd()) != part: 
     53            raise e 
     54         
    4155    while parts: 
    4256        part = parts.pop() 
  • django/trunk/tests/regressiontests/admin_scripts/tests.py

    r8161 r8227  
    232232        self.assertOutput(err, "Unknown command: 'noargs_command'") 
    233233 
     234class DjangoAdminFullPathDefaultSettings(AdminScriptTestCase): 
     235    """A series of tests for django-admin.py when using a settings.py file that 
     236    contains the test application specified using a full path. 
     237    """ 
     238    def setUp(self): 
     239        self.write_settings('settings.py', ['django.contrib.auth', 'django.contrib.contenttypes', 'regressiontests.admin_scripts']) 
     240 
     241    def tearDown(self): 
     242        self.remove_settings('settings.py') 
     243 
     244    def test_builtin_command(self): 
     245        "fulldefault: django-admin builtin commands fail with an import error when no settings provided" 
     246        args = ['sqlall','admin_scripts'] 
     247        out, err = self.run_django_admin(args) 
     248        self.assertNoOutput(out) 
     249        self.assertOutput(err, 'environment variable DJANGO_SETTINGS_MODULE is undefined') 
     250 
     251    def test_builtin_with_settings(self): 
     252        "fulldefault: django-admin builtin commands fail if user app isn't on path" 
     253        args = ['sqlall','--settings=settings', 'admin_scripts'] 
     254        out, err = self.run_django_admin(args) 
     255        self.assertNoOutput(out) 
     256        self.assertOutput(err, 'ImportError: No module named regressiontests') 
     257 
     258    def test_builtin_with_environment(self): 
     259        "fulldefault: django-admin builtin commands fail if user app isn't on path" 
     260        args = ['sqlall','admin_scripts'] 
     261        out, err = self.run_django_admin(args,'settings') 
     262        self.assertNoOutput(out) 
     263        self.assertOutput(err, 'ImportError: No module named regressiontests') 
     264 
     265    def test_builtin_with_bad_settings(self): 
     266        "fulldefault: django-admin builtin commands fail if settings file (from argument) doesn't exist" 
     267        args = ['sqlall','--settings=bad_settings', 'admin_scripts'] 
     268        out, err = self.run_django_admin(args) 
     269        self.assertNoOutput(out) 
     270        self.assertOutput(err, "Could not import settings 'bad_settings'") 
     271 
     272    def test_builtin_with_bad_environment(self): 
     273        "fulldefault: django-admin builtin commands fail if settings file (from environment) doesn't exist" 
     274        args = ['sqlall','admin_scripts'] 
     275        out, err = self.run_django_admin(args,'bad_settings') 
     276        self.assertNoOutput(out) 
     277        self.assertOutput(err, "Could not import settings 'bad_settings'") 
     278 
     279    def test_custom_command(self): 
     280        "fulldefault: django-admin can't execute user commands" 
     281        args = ['noargs_command'] 
     282        out, err = self.run_django_admin(args) 
     283        self.assertNoOutput(out) 
     284        self.assertOutput(err, "Unknown command: 'noargs_command'") 
     285 
     286    def test_custom_command_with_settings(self): 
     287        "fulldefault: django-admin can't execute user commands, even if settings are provided as argument" 
     288        args = ['noargs_command', '--settings=settings'] 
     289        out, err = self.run_django_admin(args) 
     290        self.assertNoOutput(out) 
     291        self.assertOutput(err, "Unknown command: 'noargs_command'") 
     292 
     293    def test_custom_command_with_environment(self): 
     294        "fulldefault: django-admin can't execute user commands, even if settings are provided in environment" 
     295        args = ['noargs_command'] 
     296        out, err = self.run_django_admin(args,'settings') 
     297        self.assertNoOutput(out) 
     298        self.assertOutput(err, "Unknown command: 'noargs_command'") 
     299 
    234300class DjangoAdminMinimalSettings(AdminScriptTestCase): 
    235301    """A series of tests for django-admin.py when using a settings.py file that 
     
    531597        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
    532598 
     599 
     600class ManageFullPathDefaultSettings(AdminScriptTestCase): 
     601    """A series of tests for manage.py when using a settings.py file that 
     602    contains the test application specified using a full path. 
     603    """ 
     604    def setUp(self): 
     605        self.write_settings('settings.py', ['django.contrib.auth', 'django.contrib.contenttypes', 'regressiontests.admin_scripts']) 
     606 
     607    def tearDown(self): 
     608        self.remove_settings('settings.py') 
     609 
     610    def test_builtin_command(self): 
     611        "fulldefault: manage.py builtin commands succeed when default settings are appropriate" 
     612        args = ['sqlall','admin_scripts'] 
     613        out, err = self.run_manage(args) 
     614        self.assertNoOutput(err) 
     615        self.assertOutput(out, 'CREATE TABLE') 
     616 
     617    def test_builtin_with_settings(self): 
     618        "fulldefault: manage.py builtin commands succeed if settings are provided as argument" 
     619        args = ['sqlall','--settings=settings', 'admin_scripts'] 
     620        out, err = self.run_manage(args) 
     621        self.assertNoOutput(err) 
     622        self.assertOutput(out, 'CREATE TABLE') 
     623 
     624    def test_builtin_with_environment(self): 
     625        "fulldefault: manage.py builtin commands succeed if settings are provided in the environment" 
     626        args = ['sqlall','admin_scripts'] 
     627        out, err = self.run_manage(args,'settings') 
     628        self.assertNoOutput(err) 
     629        self.assertOutput(out, 'CREATE TABLE') 
     630 
     631    def test_builtin_with_bad_settings(self): 
     632        "fulldefault: manage.py builtin commands succeed if settings file (from argument) doesn't exist" 
     633        args = ['sqlall','--settings=bad_settings', 'admin_scripts'] 
     634        out, err = self.run_manage(args) 
     635        self.assertNoOutput(out) 
     636        self.assertOutput(err, "Could not import settings 'bad_settings'") 
     637 
     638    def test_builtin_with_bad_environment(self): 
     639        "fulldefault: manage.py builtin commands fail if settings file (from environment) doesn't exist" 
     640        args = ['sqlall','admin_scripts'] 
     641        out, err = self.run_manage(args,'bad_settings') 
     642        self.assertNoOutput(err) 
     643        self.assertOutput(out, 'CREATE TABLE') 
     644 
     645    def test_custom_command(self): 
     646        "fulldefault: manage.py can execute user commands when default settings are appropriate" 
     647        args = ['noargs_command'] 
     648        out, err = self.run_manage(args) 
     649        self.assertNoOutput(err) 
     650        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
     651 
     652    def test_custom_command_with_settings(self): 
     653        "fulldefault: manage.py can execute user commands when settings are provided as argument" 
     654        args = ['noargs_command', '--settings=settings'] 
     655        out, err = self.run_manage(args) 
     656        self.assertNoOutput(err) 
     657        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
     658 
     659    def test_custom_command_with_environment(self): 
     660        "fulldefault: manage.py can execute user commands when settings are provided in environment" 
     661        args = ['noargs_command'] 
     662        out, err = self.run_manage(args,'settings') 
     663        self.assertNoOutput(err) 
     664        self.assertOutput(out, "EXECUTE:NoArgsCommand") 
     665 
    533666class ManageMinimalSettings(AdminScriptTestCase): 
    534667    """A series of tests for manage.py when using a settings.py file that