diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py index 76c3bd5657..f82c20c2f1 100644 --- a/django/contrib/admin/checks.py +++ b/django/contrib/admin/checks.py @@ -65,7 +65,6 @@ def check_dependencies(**kwargs): ('django.contrib.contenttypes', 401), ('django.contrib.auth', 405), ('django.contrib.messages', 406), - ('django.contrib.sessions', 407), ) for app_name, error_code in app_dependencies: if not apps.is_installed(app_name): @@ -118,6 +117,12 @@ def check_dependencies(**kwargs): "be in MIDDLEWARE in order to use the admin application.", id='admin.E409', )) + if not _contains_subclass('django.contrib.sessions.middleware.SessionMiddleware', settings.MIDDLEWARE): + errors.append(checks.Error( + "'django.contrib.sessions.middleware.SessionMiddleware' must " + "be in MIDDLEWARE in order to use the admin application.", + id='admin.E410', + )) return errors diff --git a/docs/ref/checks.txt b/docs/ref/checks.txt index 1f0601ab5d..973ccebe90 100644 --- a/docs/ref/checks.txt +++ b/docs/ref/checks.txt @@ -666,13 +666,13 @@ The following checks are performed on the default :setting:`INSTALLED_APPS` in order to use the admin application. * **admin.E406**: :mod:`django.contrib.messages` must be in :setting:`INSTALLED_APPS` in order to use the admin application. -* **admin.E407**: :mod:`django.contrib.sessions` must be in - :setting:`INSTALLED_APPS` in order to use the admin application. * **admin.E408**: :class:`django.contrib.auth.middleware.AuthenticationMiddleware` must be in :setting:`MIDDLEWARE` in order to use the admin application. * **admin.E409**: :class:`django.contrib.messages.middleware.MessageMiddleware` must be in :setting:`MIDDLEWARE` in order to use the admin application. +* **admin.E410**: :class:`django.contrib.sessions.middleware.SessionMiddleware` + must be in :setting:`MIDDLEWARE` in order to use the admin application. ``auth`` -------- diff --git a/docs/releases/2.2.1.txt b/docs/releases/2.2.1.txt index 0ca76bcbf8..b7b1f6112d 100644 --- a/docs/releases/2.2.1.txt +++ b/docs/releases/2.2.1.txt @@ -49,3 +49,9 @@ Bugfixes * Fixed a regression in Django 2.2 that caused an exception to be raised when a custom error handler could not be imported (:ticket:`30318`). + +* Relaxed the system check added in Django 2.2 for the admin app's dependencies + to reallow use of + :class:`~django.contrib.sessions.middleware.SessionMiddleware` subclasses, + rather than requiring :mod:`django.contrib.sessions` to be in + :setting:`INSTALLED_APPS` (:ticket:`30312`). diff --git a/tests/admin_checks/tests.py b/tests/admin_checks/tests.py index c7fe39b91e..1e267e03a3 100644 --- a/tests/admin_checks/tests.py +++ b/tests/admin_checks/tests.py @@ -5,6 +5,7 @@ from django.contrib.auth.backends import ModelBackend from django.contrib.auth.middleware import AuthenticationMiddleware from django.contrib.contenttypes.admin import GenericStackedInline from django.contrib.messages.middleware import MessageMiddleware +from django.contrib.sessions.middleware import SessionMiddleware from django.core import checks from django.test import SimpleTestCase, override_settings @@ -52,13 +53,16 @@ class ModelBackendSubclass(ModelBackend): pass +class SessionMiddlewareSubclass(SessionMiddleware): + pass + + @override_settings( SILENCED_SYSTEM_CHECKS=['fields.W342'], # ForeignKey(unique=True) INSTALLED_APPS=[ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', - 'django.contrib.sessions', 'django.contrib.messages', 'admin_checks', ], @@ -93,11 +97,6 @@ class SystemChecksTestCase(SimpleTestCase): "to use the admin application.", id='admin.E406', ), - checks.Error( - "'django.contrib.sessions' must be in INSTALLED_APPS in order " - "to use the admin application.", - id='admin.E407', - ) ] self.assertEqual(errors, expected) @@ -201,13 +200,19 @@ class SystemChecksTestCase(SimpleTestCase): "'django.contrib.messages.middleware.MessageMiddleware' " "must be in MIDDLEWARE in order to use the admin application.", id='admin.E409', - ) + ), + checks.Error( + "'django.contrib.sessions.middleware.SessionMiddleware' " + "must be in MIDDLEWARE in order to use the admin application.", + id='admin.E410', + ), ] self.assertEqual(errors, expected) @override_settings(MIDDLEWARE=[ 'admin_checks.tests.AuthenticationMiddlewareSubclass', 'admin_checks.tests.MessageMiddlewareSubclass', + 'admin_checks.tests.SessionMiddlewareSubclass', ]) def test_middleware_subclasses(self): self.assertEqual(admin.checks.check_dependencies(), []) @@ -216,6 +221,7 @@ class SystemChecksTestCase(SimpleTestCase): 'django.contrib.does.not.Exist', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', ]) def test_admin_check_ignores_import_error_in_middleware(self): self.assertEqual(admin.checks.check_dependencies(), []) diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py index 08d188e88a..d6ea84da7a 100644 --- a/tests/admin_scripts/tests.py +++ b/tests/admin_scripts/tests.py @@ -1103,13 +1103,13 @@ class ManageCheck(AdminScriptTestCase): 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.messages', - 'django.contrib.sessions', ], sdict={ 'DEBUG': True, 'MIDDLEWARE': [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', ], 'TEMPLATES': [ {