Browse Source

Fixed #30312 -- Relaxed admin check from django.contrib.sessions to SessionMiddleware subclasses.

Aarni Koskela 6 years ago
parent
commit
efeceba589

+ 6 - 1
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
 
 

+ 2 - 2
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``
 --------

+ 6 - 0
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`).

+ 13 - 7
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(), [])

+ 1 - 1
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': [
                     {