From 55c31fbdefe3bc3c948599b66781e7a9a1dae2a2 Mon Sep 17 00:00:00 2001 From: Karen Tracey Date: Mon, 12 Apr 2010 12:39:18 +0000 Subject: [PATCH] Fixed #11696: Changed app loading code so that it does not swallow import errors that used to be (prior to r10088) raised. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12950 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/loading.py | 5 +++- .../admin_scripts/broken_app/__init__.py | 0 .../admin_scripts/broken_app/models.py | 1 + tests/regressiontests/admin_scripts/tests.py | 28 ++++++++++++++++++- 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 tests/regressiontests/admin_scripts/broken_app/__init__.py create mode 100644 tests/regressiontests/admin_scripts/broken_app/models.py diff --git a/django/db/models/loading.py b/django/db/models/loading.py index 3151b8a93f02d..06ddd7a4e4581 100644 --- a/django/db/models/loading.py +++ b/django/db/models/loading.py @@ -5,6 +5,7 @@ from django.utils.datastructures import SortedDict from django.utils.importlib import import_module +import imp import sys import os import threading @@ -71,8 +72,9 @@ def load_app(self, app_name, can_postpone=False): """ self.handled[app_name] = None self.nesting_level += 1 + app_module = import_module(app_name) try: - models = import_module('.models', app_name) + imp.find_module('models', app_module.__path__) except ImportError: self.nesting_level -= 1 if can_postpone: @@ -82,6 +84,7 @@ def load_app(self, app_name, can_postpone=False): # populate). self.postponed.append(app_name) return None + models = import_module('.models', app_name) self.nesting_level -= 1 if models not in self.app_store: self.app_store[models] = len(self.app_store) diff --git a/tests/regressiontests/admin_scripts/broken_app/__init__.py b/tests/regressiontests/admin_scripts/broken_app/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/tests/regressiontests/admin_scripts/broken_app/models.py b/tests/regressiontests/admin_scripts/broken_app/models.py new file mode 100644 index 0000000000000..f37f1efc112a0 --- /dev/null +++ b/tests/regressiontests/admin_scripts/broken_app/models.py @@ -0,0 +1 @@ +from django.db import modelz diff --git a/tests/regressiontests/admin_scripts/tests.py b/tests/regressiontests/admin_scripts/tests.py index 6a739f402974b..62a1b49637cd2 100644 --- a/tests/regressiontests/admin_scripts/tests.py +++ b/tests/regressiontests/admin_scripts/tests.py @@ -13,7 +13,7 @@ from django.conf import settings class AdminScriptTestCase(unittest.TestCase): - def write_settings(self, filename, apps=None, is_dir=False): + def write_settings(self, filename, apps=None, is_dir=False, sdict=None): test_dir = os.path.dirname(os.path.dirname(__file__)) if is_dir: settings_dir = os.path.join(test_dir,filename) @@ -39,6 +39,10 @@ def write_settings(self, filename, apps=None, is_dir=False): if apps: settings_file.write("INSTALLED_APPS = %s\n" % apps) + if sdict: + for k, v in sdict.items(): + settings_file.write("%s = %s\n" % (k, v)) + settings_file.close() def remove_settings(self, filename, is_dir=False): @@ -952,6 +956,28 @@ def test_custom_command_with_environment(self): self.assertNoOutput(out) self.assertOutput(err, "Unknown command: 'noargs_command'") + +class ManageValidateImportErrorsReported(AdminScriptTestCase): + def tearDown(self): + self.remove_settings('settings.py') + + def test_nonexistent_app(self): + "manage.py validate reports an error on a non-existent app in INSTALLED_APPS" + self.write_settings('settings.py', apps=['admin_scriptz.broken_app'], sdict={'USE_I18N': False}) + args = ['validate'] + out, err = self.run_manage(args) + self.assertNoOutput(out) + self.assertOutput(err, 'No module named admin_scriptz.broken_app') + + def test_broken_app(self): + "manage.py validate reports an ImportError if an app's models.py raises one on import" + self.write_settings('settings.py', apps=['admin_scripts.broken_app']) + args = ['validate'] + out, err = self.run_manage(args) + self.assertNoOutput(out) + self.assertOutput(err, 'ImportError') + + ########################################################################## # COMMAND PROCESSING TESTS # Check that user-space commands are correctly handled - in particular,