Fixed #8033 -- Explained app registry error during translation setup

Thanks Tim Graham and Aymeric Augustin for the review.
This commit is contained in:
Claude Paroz 2014-06-21 15:00:35 +02:00
parent 21c496ea52
commit 9618d68b34
5 changed files with 20 additions and 7 deletions

View File

@ -4,7 +4,7 @@ import sys
import threading import threading
import warnings import warnings
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import AppRegistryNotReady, ImproperlyConfigured
from django.utils import lru_cache from django.utils import lru_cache
from django.utils.deprecation import RemovedInDjango19Warning from django.utils.deprecation import RemovedInDjango19Warning
from django.utils._os import upath from django.utils._os import upath
@ -116,7 +116,7 @@ class Apps(object):
Raises an exception if the registry isn't ready. Raises an exception if the registry isn't ready.
""" """
if not self.ready: if not self.ready:
raise RuntimeError("App registry isn't ready yet.") raise AppRegistryNotReady()
def get_app_configs(self): def get_app_configs(self):
""" """

View File

@ -12,6 +12,11 @@ class DjangoRuntimeWarning(RuntimeWarning):
pass pass
class AppRegistryNotReady(Exception):
"""The django.apps registry is not populated yet"""
pass
class ObjectDoesNotExist(Exception): class ObjectDoesNotExist(Exception):
"""The requested object does not exist""" """The requested object does not exist"""
silent_variable_failure = True silent_variable_failure = True

View File

@ -11,6 +11,7 @@ import warnings
from django.apps import apps from django.apps import apps
from django.conf import settings from django.conf import settings
from django.core.exceptions import AppRegistryNotReady
from django.dispatch import receiver from django.dispatch import receiver
from django.test.signals import setting_changed from django.test.signals import setting_changed
from django.utils.deprecation import RemovedInDjango19Warning from django.utils.deprecation import RemovedInDjango19Warning
@ -160,7 +161,14 @@ class DjangoTranslation(gettext_module.GNUTranslations):
def _add_installed_apps_translations(self): def _add_installed_apps_translations(self):
"""Merges translations from each installed app.""" """Merges translations from each installed app."""
for app_config in reversed(list(apps.get_app_configs())): try:
app_configs = reversed(list(apps.get_app_configs()))
except AppRegistryNotReady:
raise AppRegistryNotReady(
"The translation infrastructure cannot be initialized before the "
"apps registry is ready. Check that you don't make non-lazy "
"gettext calls at import time.")
for app_config in app_configs:
localedir = os.path.join(app_config.path, 'locale') localedir = os.path.join(app_config.path, 'locale')
translation = self._new_gnu_trans(localedir) translation = self._new_gnu_trans(localedir)
self.merge(translation) self.merge(translation)

View File

@ -382,9 +382,9 @@ Troubleshooting
Here are some common problems that you may encounter during initialization: Here are some common problems that you may encounter during initialization:
* ``RuntimeError: App registry isn't ready yet.`` This happens when importing * ``AppRegistryNotReady`` This happens when importing an application
an application configuration or a models module triggers code that depends configuration or a models module triggers code that depends on the app
on the app registry. registry.
For example, :func:`~django.utils.translation.ugettext()` uses the app For example, :func:`~django.utils.translation.ugettext()` uses the app
registry to look up translation catalogs in applications. To translate at registry to look up translation catalogs in applications. To translate at

View File

@ -934,7 +934,7 @@ script with::
>>> import django >>> import django
>>> django.setup() >>> django.setup()
Otherwise, you will hit ``RuntimeError: App registry isn't ready yet.`` Otherwise, you will hit an ``AppRegistryNotReady`` exception.
App registry consistency App registry consistency
^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^