Commit 9af56803 authored by Gary Wilson Jr's avatar Gary Wilson Jr
Browse files

Fixed #8245 -- Added a LOADING flag to autodiscover to prevent an admin.py...

Fixed #8245 -- Added a LOADING flag to autodiscover to prevent an admin.py module with errors from raising a spurious AlreadyRegistered exception in a subsequent call to autodiscover.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@9680 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent f0d44e44
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -2,12 +2,26 @@ 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

# A flag to tell us if autodiscover is running.  autodiscover will set this to
# True while running, and False when it finishes.
LOADING = False

def autodiscover():
    """
    Auto-discover INSTALLED_APPS admin.py modules and fail silently when
    not present. This forces an import on them to register any admin bits they
    may want.
    """
    # Bail out if autodiscover didn't finish loading from a previous call so
    # that we avoid running autodiscover again when the URLConf is loaded by
    # the exception handler to resolve the handler500 view.  This prevents an
    # admin.py module with errors from re-registering models and raising a
    # spurious AlreadyRegistered exception (see #8245).
    global LOADING
    if LOADING:
        return
    LOADING = True

    import imp
    from django.conf import settings

@@ -38,3 +52,5 @@ def autodiscover():
        # Step 3: import the app's admin file. If this has errors we want them
        # to bubble up.
        __import__("%s.admin" % app)
    # autodiscover was successful, reset loading flag.
    LOADING = False
+0 −0

Empty file added.

+7 −0
Original line number Diff line number Diff line
from django.contrib import admin

from models import Story


admin.site.register(Story)
raise Exception("Bad admin module")
+4 −0
Original line number Diff line number Diff line
from django.db import models

class Story(models.Model):
    title = models.CharField(max_length=10)
+23 −0
Original line number Diff line number Diff line
from unittest import TestCase

from django.contrib import admin


class Bug8245Test(TestCase):
    """
    Test for bug #8245 - don't raise an AlreadyRegistered exception when using
    autodiscover() and an admin.py module contains an error.
    """

    def test_bug_8245(self):
        # The first time autodiscover is called, we should get our real error.
        try:
            admin.autodiscover()
        except Exception, e:
            self.failUnlessEqual(str(e), "Bad admin module")
        else:
            self.fail(
                'autodiscover should have raised a "Bad admin module" error.')
        # Calling autodiscover again should bail out early and not raise an
        # AlreadyRegistered error.
        admin.autodiscover()