Fixed #17667 -- Prevented app loading from skipping nonexistent apps after the first try

Thanks ea2100@ for the report and akaariai for the patch.
This commit is contained in:
Tim Graham 2013-08-05 13:34:35 -04:00
parent 75c87e2d38
commit 04489c7dbf
2 changed files with 27 additions and 5 deletions

View File

@ -105,9 +105,9 @@ class AppCache(object):
Loads the app with the provided fully qualified name, and returns the Loads the app with the provided fully qualified name, and returns the
model module. model module.
""" """
app_module = import_module(app_name)
self.handled.add(app_name) self.handled.add(app_name)
self.nesting_level += 1 self.nesting_level += 1
app_module = import_module(app_name)
try: try:
models = import_module('%s.%s' % (app_name, MODELS_MODULE_NAME)) models = import_module('%s.%s' % (app_name, MODELS_MODULE_NAME))
except ImportError: except ImportError:

View File

@ -7,7 +7,8 @@ import time
from unittest import TestCase from unittest import TestCase
from django.conf import Settings from django.conf import Settings
from django.db.models.loading import cache, load_app, get_model, get_models from django.db.models.loading import cache, load_app, get_model, get_models, AppCache
from django.test.utils import override_settings
from django.utils._os import upath from django.utils._os import upath
@ -61,12 +62,33 @@ class EggLoadingTest(TestCase):
egg_name = '%s/brokenapp.egg' % self.egg_dir egg_name = '%s/brokenapp.egg' % self.egg_dir
sys.path.append(egg_name) sys.path.append(egg_name)
self.assertRaises(ImportError, load_app, 'broken_app') self.assertRaises(ImportError, load_app, 'broken_app')
raised = None
try: try:
load_app('broken_app') load_app('broken_app')
except ImportError as e: except ImportError as e:
# Make sure the message is indicating the actual raised = e
# problem in the broken app.
self.assertTrue("modelz" in e.args[0]) # Make sure the message is indicating the actual
# problem in the broken app.
self.assertTrue(raised is not None)
self.assertTrue("modelz" in raised.args[0])
def test_missing_app(self):
"""
Test that repeated app loading doesn't succeed in case there is an
error. Refs #17667.
"""
# AppCache is a Borg, so we can instantiate one and change its
# loaded to False to force the following code to actually try to
# populate the cache.
a = AppCache()
a.loaded = False
try:
with override_settings(INSTALLED_APPS=('notexists',)):
self.assertRaises(ImportError, get_model, 'notexists', 'nomodel', seed_cache=True)
self.assertRaises(ImportError, get_model, 'notexists', 'nomodel', seed_cache=True)
finally:
a.loaded = True
class GetModelsTest(TestCase): class GetModelsTest(TestCase):