Commit 6d8c1462 authored by Mosson, Andrew's avatar Mosson, Andrew Committed by Tim Graham
Browse files

[1.7x.] Fixed #23497 -- Made admin system checks run for custom AdminSites.

Backport of b7219c7b from master
parent a3895194
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -11,12 +11,9 @@ from django.forms.models import BaseModelForm, _get_foreign_key, BaseModelFormSe


def check_admin_app(**kwargs):
    from django.contrib.admin.sites import site
    from django.contrib.admin.sites import system_check_errors

    return list(chain.from_iterable(
        model_admin.check(model, **kwargs)
        for model, model_admin in site._registry.items()
    ))
    return system_check_errors


class BaseModelAdminChecks(object):
+3 −1
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@ from django.utils.translation import ugettext_lazy, ugettext as _
from django.views.decorators.cache import never_cache
from django.conf import settings

system_check_errors = []


class AlreadyRegistered(Exception):
    pass
@@ -96,7 +98,7 @@ class AdminSite(object):
                    admin_class = type("%sAdmin" % model.__name__, (admin_class,), options)

                if admin_class is not ModelAdmin and settings.DEBUG:
                    admin_class.check(model)
                    system_check_errors.extend(admin_class.check(model))

                # Instantiate the admin class to save in the registry
                self._registry[model] = admin_class(model, self)
+2 −0
Original line number Diff line number Diff line
@@ -149,3 +149,5 @@ Bugfixes

* Restored the ``pre_migrate`` signal if all apps have migrations
  (:ticket:`23975`).

* Made admin system checks run for custom ``AdminSite``\s (:ticket:`23497`).
+24 −6
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ from django.contrib import admin
from django.contrib.contenttypes.admin import GenericStackedInline
from django.core import checks
from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase
from django.test import override_settings, TestCase

from .models import Song, Book, Album, TwoAlbumFKAndAnE, City, State, Influence

@@ -34,14 +34,16 @@ class ValidFormFieldsets(admin.ModelAdmin):
    )


class SystemChecksTestCase(TestCase):

    def test_checks_are_performed(self):
class MyAdmin(admin.ModelAdmin):
    @classmethod
            def check(self, model, **kwargs):
    def check(cls, model, **kwargs):
        return ['error!']


class SystemChecksTestCase(TestCase):

    @override_settings(DEBUG=True)
    def test_checks_are_performed(self):
        admin.site.register(Song, MyAdmin)
        try:
            errors = checks.run_checks()
@@ -49,6 +51,22 @@ class SystemChecksTestCase(TestCase):
            self.assertEqual(errors, expected)
        finally:
            admin.site.unregister(Song)
            admin.sites.system_check_errors = []

    @override_settings(DEBUG=True)
    def test_custom_adminsite(self):
        class CustomAdminSite(admin.AdminSite):
            pass

        custom_site = CustomAdminSite()
        custom_site.register(Song, MyAdmin)
        try:
            errors = checks.run_checks()
            expected = ['error!']
            self.assertEqual(errors, expected)
        finally:
            custom_site.unregister(Song)
            admin.sites.system_check_errors = []

    def test_readonly_and_editable(self):
        class SongAdmin(admin.ModelAdmin):