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.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
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

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()