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:
parent
f0d44e44bd
commit
9af56803f5
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from models import Story
|
||||||
|
|
||||||
|
|
||||||
|
admin.site.register(Story)
|
||||||
|
raise Exception("Bad admin module")
|
|
@ -0,0 +1,4 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
class Story(models.Model):
|
||||||
|
title = models.CharField(max_length=10)
|
|
@ -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()
|
Loading…
Reference in New Issue