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
This commit is contained in:
Gary Wilson Jr 2008-12-23 18:25:24 +00:00
parent f0d44e44bd
commit 9af56803f5
5 changed files with 51 additions and 1 deletions

View File

@ -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.options import StackedInline, TabularInline
from django.contrib.admin.sites import AdminSite, site 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(): def autodiscover():
""" """
Auto-discover INSTALLED_APPS admin.py modules and fail silently when 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 not present. This forces an import on them to register any admin bits they
may want. 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 import imp
from django.conf import settings 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 # Step 3: import the app's admin file. If this has errors we want them
# to bubble up. # to bubble up.
__import__("%s.admin" % app) __import__("%s.admin" % app)
# autodiscover was successful, reset loading flag.
LOADING = False

View File

@ -0,0 +1,7 @@
from django.contrib import admin
from models import Story
admin.site.register(Story)
raise Exception("Bad admin module")

View File

@ -0,0 +1,4 @@
from django.db import models
class Story(models.Model):
title = models.CharField(max_length=10)

View File

@ -0,0 +1,23 @@
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()