summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Wilson Jr <gary.wilson@gmail.com>2008-12-23 18:25:24 +0000
committerGary Wilson Jr <gary.wilson@gmail.com>2008-12-23 18:25:24 +0000
commit9af56803f53a4e41bb826d4e293ef8650ad9f13a (patch)
tree8156c35362dc9ff13bcfe8c1f088105265ab8a24
parentf0d44e44bd4161d279ea9b6a9c99af79cf17b913 (diff)
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
-rw-r--r--django/contrib/admin/__init__.py18
-rw-r--r--tests/regressiontests/bug8245/__init__.py0
-rw-r--r--tests/regressiontests/bug8245/admin.py7
-rw-r--r--tests/regressiontests/bug8245/models.py4
-rw-r--r--tests/regressiontests/bug8245/tests.py23
5 files changed, 51 insertions, 1 deletions
diff --git a/django/contrib/admin/__init__.py b/django/contrib/admin/__init__.py
index 8396ffc6b3..bb856a1241 100644
--- a/django/contrib/admin/__init__.py
+++ b/django/contrib/admin/__init__.py
@@ -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
diff --git a/tests/regressiontests/bug8245/__init__.py b/tests/regressiontests/bug8245/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/regressiontests/bug8245/__init__.py
diff --git a/tests/regressiontests/bug8245/admin.py b/tests/regressiontests/bug8245/admin.py
new file mode 100644
index 0000000000..18122696b6
--- /dev/null
+++ b/tests/regressiontests/bug8245/admin.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+
+from models import Story
+
+
+admin.site.register(Story)
+raise Exception("Bad admin module")
diff --git a/tests/regressiontests/bug8245/models.py b/tests/regressiontests/bug8245/models.py
new file mode 100644
index 0000000000..5643955df3
--- /dev/null
+++ b/tests/regressiontests/bug8245/models.py
@@ -0,0 +1,4 @@
+from django.db import models
+
+class Story(models.Model):
+ title = models.CharField(max_length=10)
diff --git a/tests/regressiontests/bug8245/tests.py b/tests/regressiontests/bug8245/tests.py
new file mode 100644
index 0000000000..c1cc3b595c
--- /dev/null
+++ b/tests/regressiontests/bug8245/tests.py
@@ -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()