Added check_apps_ready() to Apps.get_containing_app_config()

This commit is contained in:
Tim Graham 2015-02-08 13:38:09 -05:00
parent 540ca563de
commit 9033003d97
2 changed files with 14 additions and 4 deletions

View File

@ -227,9 +227,7 @@ class Apps(object):
Returns the app config for the inner application in case of nesting.
Returns None if the object isn't in any registered app config.
"""
# In Django 1.7 and 1.8, it's allowed to call this method at import
# time, even while the registry is being populated. In Django 1.9 and
# later, that should be forbidden with `self.check_apps_ready()`.
self.check_apps_ready()
candidates = []
for app_config in self.app_configs.values():
if object_name.startswith(app_config.name):

View File

@ -8,7 +8,7 @@ from unittest import skipUnless
from django.apps import AppConfig, apps
from django.apps.registry import Apps
from django.contrib.admin.models import LogEntry
from django.core.exceptions import ImproperlyConfigured
from django.core.exceptions import AppRegistryNotReady, ImproperlyConfigured
from django.db import models
from django.test import TestCase, override_settings
from django.test.utils import extend_sys_path
@ -247,6 +247,18 @@ class AppsTests(TestCase):
"Conflicting 'southponies' models in application 'apps':.*"):
type(str("SouthPonies"), (models.Model,), body)
def test_get_containing_app_config_apps_not_ready(self):
"""
apps.get_containing_app_config() should raise an exception if
apps.apps_ready isn't True.
"""
apps.apps_ready = False
try:
with self.assertRaisesMessage(AppRegistryNotReady, "Apps aren't loaded yet"):
apps.get_containing_app_config('foo')
finally:
apps.apps_ready = True
class Stub(object):
def __init__(self, **kwargs):