Commit c485e236 authored by Jacob Kaplan-Moss's avatar Jacob Kaplan-Moss
Browse files

Fixed #8193: all dynamic imports in Django are now done correctly. I know this...

Fixed #8193: all dynamic imports in Django are now done correctly. I know this because Brett Cannon borrowed the time machine and brought Python 2.7's '`importlib` back for inclusion in Django. Thanks for the patch-from-the-future, Brett!

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10088 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent ee2f04d7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ answer newbie questions, and generally made Django that much better:
    Chris Cahoon <chris.cahoon@gmail.com>
    Juan Manuel Caicedo <juan.manuel.caicedo@gmail.com>
    Trevor Caira <trevor@caira.com>
    Brett Cannon <brett@python.org>
    Ricardo Javier Cárdenes Medina <ricardo.cardenes@gmail.com>
    Jeremy Carbaugh <jcarbaugh@gmail.com>
    carljm <carl@dirtcircle.com>
+4 −2
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ import time # Needed for Windows

from django.conf import global_settings
from django.utils.functional import LazyObject
from django.utils import importlib

ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"

@@ -69,7 +70,7 @@ class Settings(object):
        self.SETTINGS_MODULE = settings_module

        try:
            mod = __import__(self.SETTINGS_MODULE, {}, {}, [''])
            mod = importlib.import_module(self.SETTINGS_MODULE)
        except ImportError, e:
            raise ImportError, "Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e)

@@ -89,7 +90,8 @@ class Settings(object):
        new_installed_apps = []
        for app in self.INSTALLED_APPS:
            if app.endswith('.*'):
                appdir = os.path.dirname(__import__(app[:-2], {}, {}, ['']).__file__)
                app_mod = importlib.import_module(app[:-2])
                appdir = os.path.dirname(app_mod.__file__)
                app_subdirs = os.listdir(appdir)
                app_subdirs.sort()
                name_pattern = re.compile(r'[a-zA-Z]\w*')
+3 −2
Original line number Diff line number Diff line
from django.contrib.admin.options import ModelAdmin, HORIZONTAL, VERTICAL
from django.contrib.admin.options import StackedInline, TabularInline
from django.contrib.admin.sites import AdminSite, site
from django.utils.importlib import import_module

# A flag to tell us if autodiscover is running.  autodiscover will set this to
# True while running, and False when it finishes.
@@ -36,7 +37,7 @@ def autodiscover():
        # fails silently -- apps that do weird things with __path__ might
        # need to roll their own admin registration.
        try:
            app_path = __import__(app, {}, {}, [app.split('.')[-1]]).__path__
            app_path = import_module(app).__path__
        except AttributeError:
            continue

@@ -51,6 +52,6 @@ def autodiscover():

        # Step 3: import the app's admin file. If this has errors we want them
        # to bubble up.
        __import__("%s.admin" % app)
        import_module("%s.admin" % app)
    # autodiscover was successful, reset loading flag.
    LOADING = False
+2 −1
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ from django.template import loader
from django.shortcuts import render_to_response
from django.contrib.sites.models import Site
from django.conf import settings
from django.utils.importlib import import_module
from django.utils.translation import ugettext_lazy as _


@@ -15,7 +16,7 @@ def template_validator(request):
    # get a dict of {site_id : settings_module} for the validator
    settings_modules = {}
    for mod in settings.ADMIN_FOR:
        settings_module = __import__(mod, {}, {}, [''])
        settings_module = import_module(mod)
        settings_modules[settings_module.SITE_ID] = settings_module
    site_list = Site.objects.in_bulk(settings_modules.keys()).values()
    if request.POST:
+5 −4
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ from django.http import Http404
from django.core import urlresolvers
from django.contrib.admindocs import utils
from django.contrib.sites.models import Site
from django.utils.importlib import import_module
from django.utils.translation import ugettext as _
from django.utils.safestring import mark_safe
import inspect, os, re
@@ -114,13 +115,13 @@ def view_index(request):
        return missing_docutils_page(request)

    if settings.ADMIN_FOR:
        settings_modules = [__import__(m, {}, {}, ['']) for m in settings.ADMIN_FOR]
        settings_modules = [import_module(m) for m in settings.ADMIN_FOR]
    else:
        settings_modules = [settings]

    views = []
    for settings_mod in settings_modules:
        urlconf = __import__(settings_mod.ROOT_URLCONF, {}, {}, [''])
        urlconf = import_module(settings_mod.ROOT_URLCONF)
        view_functions = extract_views_from_urlpatterns(urlconf.urlpatterns)
        if Site._meta.installed:
            site_obj = Site.objects.get(pk=settings_mod.SITE_ID)
@@ -146,7 +147,7 @@ def view_detail(request, view):

    mod, func = urlresolvers.get_mod_func(view)
    try:
        view_func = getattr(__import__(mod, {}, {}, ['']), func)
        view_func = getattr(import_module(mod), func)
    except (ImportError, AttributeError):
        raise Http404
    title, body, metadata = utils.parse_docstring(view_func.__doc__)
@@ -257,7 +258,7 @@ model_detail = staff_member_required(model_detail)
def template_detail(request, template):
    templates = []
    for site_settings_module in settings.ADMIN_FOR:
        settings_mod = __import__(site_settings_module, {}, {}, [''])
        settings_mod = import_module(site_settings_module)
        if Site._meta.installed:
            site_obj = Site.objects.get(pk=settings_mod.SITE_ID)
        else:
Loading