Refs #34712 -- Added system check for staticfiles storage in STORAGES setting.

Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Co-authored-by: Natalia Bidart <124304+nessita@users.noreply.github.com>
This commit is contained in:
Bruno Alla 2023-07-17 13:41:33 +01:00 committed by Mariusz Felisiak
parent 74b5074174
commit 4c4536f744
4 changed files with 69 additions and 4 deletions

View File

@ -1,5 +1,5 @@
from django.apps import AppConfig
from django.contrib.staticfiles.checks import check_finders
from django.contrib.staticfiles.checks import check_finders, check_storages
from django.core import checks
from django.utils.translation import gettext_lazy as _
@ -11,3 +11,4 @@ class StaticFilesConfig(AppConfig):
def ready(self):
checks.register(check_finders, checks.Tags.staticfiles)
checks.register(check_storages, checks.Tags.staticfiles)

View File

@ -1,4 +1,11 @@
from django.conf import STATICFILES_STORAGE_ALIAS, settings
from django.contrib.staticfiles.finders import get_finders
from django.core.checks import Error
E005 = Error(
f"The STORAGES setting must define a '{STATICFILES_STORAGE_ALIAS}' storage.",
id="staticfiles.E005",
)
def check_finders(app_configs=None, **kwargs):
@ -12,3 +19,11 @@ def check_finders(app_configs=None, **kwargs):
else:
errors.extend(finder_errors)
return errors
def check_storages(app_configs=None, **kwargs):
"""Ensure staticfiles is defined in STORAGES setting."""
errors = []
if STATICFILES_STORAGE_ALIAS not in settings.STORAGES:
errors.append(E005)
return errors

View File

@ -911,3 +911,5 @@ configured:
:setting:`STATICFILES_DIRS` setting must not end with a slash.
* **staticfiles.W004**: The directory ``<directory>`` in the
:setting:`STATICFILES_DIRS` does not exist.
* **staticfiles.E005**: The :setting:`STORAGES` setting must define a
``staticfiles`` storage.

View File

@ -1,11 +1,11 @@
from pathlib import Path
from unittest import mock
from django.conf import settings
from django.contrib.staticfiles.checks import check_finders
from django.conf import DEFAULT_STORAGE_ALIAS, STATICFILES_STORAGE_ALIAS, settings
from django.contrib.staticfiles.checks import E005, check_finders, check_storages
from django.contrib.staticfiles.finders import BaseFinder, get_finder
from django.core.checks import Error, Warning
from django.test import override_settings
from django.test import SimpleTestCase, override_settings
from .cases import CollectionTestCase
from .settings import TEST_ROOT
@ -132,3 +132,50 @@ class FindersCheckTests(CollectionTestCase):
# Nonexistent directories are skipped.
finder = get_finder("django.contrib.staticfiles.finders.FileSystemFinder")
self.assertEqual(list(finder.list(None)), [])
class StoragesCheckTests(SimpleTestCase):
@override_settings(STORAGES={})
def test_error_empty_storages(self):
# DEFAULT_STORAGE_ALIAS and STATICFILES_STORAGE_ALIAS need to be
# popped from STORAGES since UserSettingsHolder has code to maintain
# backward compatibility until 5.1 is out.
settings.STORAGES.clear() # RemovedInDjango51Warning
assert settings.STORAGES == {} # RemovedInDjango51Warning
errors = check_storages(None)
self.assertEqual(errors, [E005])
@override_settings(
STORAGES={
DEFAULT_STORAGE_ALIAS: {
"BACKEND": "django.core.files.storage.FileSystemStorage",
},
"example": {
"BACKEND": "ignore.me",
},
}
)
def test_error_missing_staticfiles(self):
# Check out the previous comment about UserSettingsHolder compat code.
settings.STORAGES.pop(STATICFILES_STORAGE_ALIAS) # RemovedInDjango51Warning
assert (
STATICFILES_STORAGE_ALIAS not in settings.STORAGES
) # RemovedInDjango51Warning
errors = check_storages(None)
self.assertEqual(errors, [E005])
@override_settings(
STORAGES={
STATICFILES_STORAGE_ALIAS: {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
},
}
)
def test_staticfiles_no_errors(self):
# Check out the previous comment about UserSettingsHolder compat code.
settings.STORAGES.pop(DEFAULT_STORAGE_ALIAS) # RemovedInDjango51Warning
assert (
DEFAULT_STORAGE_ALIAS not in settings.STORAGES
) # RemovedInDjango51Warning
errors = check_storages(None)
self.assertEqual(errors, [])