Commit 2ff93e02 authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Fixed #21829 -- Added default AppConfigs.

Thanks Russell for the report, Marc for the initial patch, Carl for the
final review, and everyone who contributed to the design discussion.
parent 29ddae74
Loading
Loading
Loading
Loading
+42 −31
Original line number Diff line number Diff line
@@ -61,13 +61,12 @@ class AppConfig(object):
        Factory that creates an app config from an entry in INSTALLED_APPS.
        """
        try:
            # If import_module succeeds, entry is a path to an app module.
            # If import_module succeeds, entry is a path to an app module,
            # which may specify an app config class with default_app_config.
            # Otherwise, entry is a path to an app config class or an error.
            module = import_module(entry)

        except ImportError:
            # Avoid django.utils.module_loading.import_by_path because it
            # masks errors -- it reraises ImportError as ImproperlyConfigured.
            mod_path, _, cls_name = entry.rpartition('.')

            # Raise the original exception when entry cannot be a path to an
@@ -75,6 +74,21 @@ class AppConfig(object):
            if not mod_path:
                raise

        else:
            try:
                # If this works, the app module specifies an app config class.
                entry = module.default_app_config
            except AttributeError:
                # Otherwise, it simply uses the default app config class.
                return cls(entry, module)
            else:
                mod_path, _, cls_name = entry.rpartition('.')

        # If we're reaching this point, we must load the app config class
        # located at <mod_path>.<cls_name>.

        # Avoid django.utils.module_loading.import_by_path because it
        # masks errors -- it reraises ImportError as ImproperlyConfigured.
        mod = import_module(mod_path)
        try:
            cls = getattr(mod, cls_name)
@@ -105,9 +119,6 @@ class AppConfig(object):
        # Entry is a path to an app config class.
        return cls(app_name, app_module)

        else:
            # Entry is a path to an app module.
            return cls(entry, module)

    def get_model(self, model_name):
        """
+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ ALLOWED_HOSTS = []
# Application definition

INSTALLED_APPS = (
    'django.contrib.admin.apps.AdminConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
+2 −3
Original line number Diff line number Diff line
# ACTION_CHECKBOX_NAME is unused, but should stay since its import from here
# has been referenced in documentation.
from django.contrib.admin.checks import check_admin_app
from django.contrib.admin.decorators import register
from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
from django.contrib.admin.options import ModelAdmin, HORIZONTAL, VERTICAL
@@ -9,7 +8,6 @@ from django.contrib.admin.filters import (ListFilter, SimpleListFilter,
    FieldListFilter, BooleanFieldListFilter, RelatedFieldListFilter,
    ChoicesFieldListFilter, DateFieldListFilter, AllValuesFieldListFilter)
from django.contrib.admin.sites import AdminSite, site
from django.core import checks
from django.utils.module_loading import autodiscover_modules

__all__ = [
@@ -24,4 +22,5 @@ __all__ = [
def autodiscover():
    autodiscover_modules('admin', register_to=site)

checks.register('admin')(check_admin_app)

default_app_config = 'django.contrib.admin.apps.AdminConfig'
+13 −2
Original line number Diff line number Diff line
from django.apps import AppConfig

from django.core import checks
from django.contrib.admin.checks import check_admin_app
from django.utils.translation import ugettext_lazy as _


class AdminConfig(AppConfig):
class SimpleAdminConfig(AppConfig):
    """Simple AppConfig which does not do automatic discovery."""

    name = 'django.contrib.admin'
    verbose_name = _("administration")

    def ready(self):
        checks.register('admin')(check_admin_app)


class AdminConfig(SimpleAdminConfig):
    """The default AppConfig for admin which does autodiscovery."""

    def ready(self):
        super(AdminConfig, self).ready()
        self.module.autodiscover()
+1 −1
Original line number Diff line number Diff line
@@ -161,7 +161,7 @@ class AdminSite(object):
        installed, as well as the auth context processor.
        """
        if not apps.is_installed('django.contrib.admin'):
            raise ImproperlyConfigured("Put 'django.contrib.admin.apps.AdminConfig' in "
            raise ImproperlyConfigured("Put 'django.contrib.admin' in "
                "your INSTALLED_APPS setting in order to use the admin application.")
        if not apps.is_installed('django.contrib.contenttypes'):
            raise ImproperlyConfigured("Put 'django.contrib.contenttypes' in "
Loading