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

This commit is contained in:
Aarni Koskela 2019-04-04 13:02:47 +03:00 committed by Mariusz Felisiak
parent 85676979a4
commit efeceba589
No known key found for this signature in database
GPG Key ID: 2EF56372BA48CD1B
5 changed files with 28 additions and 11 deletions

View File

@ -65,7 +65,6 @@ def check_dependencies(**kwargs):
('django.contrib.contenttypes', 401), ('django.contrib.contenttypes', 401),
('django.contrib.auth', 405), ('django.contrib.auth', 405),
('django.contrib.messages', 406), ('django.contrib.messages', 406),
('django.contrib.sessions', 407),
) )
for app_name, error_code in app_dependencies: for app_name, error_code in app_dependencies:
if not apps.is_installed(app_name): 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.", "be in MIDDLEWARE in order to use the admin application.",
id='admin.E409', 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 return errors

View File

@ -666,13 +666,13 @@ The following checks are performed on the default
:setting:`INSTALLED_APPS` in order to use the admin application. :setting:`INSTALLED_APPS` in order to use the admin application.
* **admin.E406**: :mod:`django.contrib.messages` must be in * **admin.E406**: :mod:`django.contrib.messages` must be in
:setting:`INSTALLED_APPS` in order to use the admin application. :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**: * **admin.E408**:
:class:`django.contrib.auth.middleware.AuthenticationMiddleware` must be in :class:`django.contrib.auth.middleware.AuthenticationMiddleware` must be in
:setting:`MIDDLEWARE` in order to use the admin application. :setting:`MIDDLEWARE` in order to use the admin application.
* **admin.E409**: :class:`django.contrib.messages.middleware.MessageMiddleware` * **admin.E409**: :class:`django.contrib.messages.middleware.MessageMiddleware`
must be in :setting:`MIDDLEWARE` in order to use the admin application. 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`` ``auth``
-------- --------

View File

@ -49,3 +49,9 @@ Bugfixes
* Fixed a regression in Django 2.2 that caused an exception to be raised when * 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`). 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`).

View File

@ -5,6 +5,7 @@ from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.middleware import AuthenticationMiddleware from django.contrib.auth.middleware import AuthenticationMiddleware
from django.contrib.contenttypes.admin import GenericStackedInline from django.contrib.contenttypes.admin import GenericStackedInline
from django.contrib.messages.middleware import MessageMiddleware from django.contrib.messages.middleware import MessageMiddleware
from django.contrib.sessions.middleware import SessionMiddleware
from django.core import checks from django.core import checks
from django.test import SimpleTestCase, override_settings from django.test import SimpleTestCase, override_settings
@ -52,13 +53,16 @@ class ModelBackendSubclass(ModelBackend):
pass pass
class SessionMiddlewareSubclass(SessionMiddleware):
pass
@override_settings( @override_settings(
SILENCED_SYSTEM_CHECKS=['fields.W342'], # ForeignKey(unique=True) SILENCED_SYSTEM_CHECKS=['fields.W342'], # ForeignKey(unique=True)
INSTALLED_APPS=[ INSTALLED_APPS=[
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
'django.contrib.contenttypes', 'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages', 'django.contrib.messages',
'admin_checks', 'admin_checks',
], ],
@ -93,11 +97,6 @@ class SystemChecksTestCase(SimpleTestCase):
"to use the admin application.", "to use the admin application.",
id='admin.E406', 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) self.assertEqual(errors, expected)
@ -201,13 +200,19 @@ class SystemChecksTestCase(SimpleTestCase):
"'django.contrib.messages.middleware.MessageMiddleware' " "'django.contrib.messages.middleware.MessageMiddleware' "
"must be in MIDDLEWARE in order to use the admin application.", "must be in MIDDLEWARE in order to use the admin application.",
id='admin.E409', 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) self.assertEqual(errors, expected)
@override_settings(MIDDLEWARE=[ @override_settings(MIDDLEWARE=[
'admin_checks.tests.AuthenticationMiddlewareSubclass', 'admin_checks.tests.AuthenticationMiddlewareSubclass',
'admin_checks.tests.MessageMiddlewareSubclass', 'admin_checks.tests.MessageMiddlewareSubclass',
'admin_checks.tests.SessionMiddlewareSubclass',
]) ])
def test_middleware_subclasses(self): def test_middleware_subclasses(self):
self.assertEqual(admin.checks.check_dependencies(), []) self.assertEqual(admin.checks.check_dependencies(), [])
@ -216,6 +221,7 @@ class SystemChecksTestCase(SimpleTestCase):
'django.contrib.does.not.Exist', 'django.contrib.does.not.Exist',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
]) ])
def test_admin_check_ignores_import_error_in_middleware(self): def test_admin_check_ignores_import_error_in_middleware(self):
self.assertEqual(admin.checks.check_dependencies(), []) self.assertEqual(admin.checks.check_dependencies(), [])

View File

@ -1103,13 +1103,13 @@ class ManageCheck(AdminScriptTestCase):
'django.contrib.auth', 'django.contrib.auth',
'django.contrib.contenttypes', 'django.contrib.contenttypes',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.sessions',
], ],
sdict={ sdict={
'DEBUG': True, 'DEBUG': True,
'MIDDLEWARE': [ 'MIDDLEWARE': [
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
], ],
'TEMPLATES': [ 'TEMPLATES': [
{ {