From ca5d54cb8914df5f2e586b5e8700009247d065c6 Mon Sep 17 00:00:00 2001 From: SebCorbin Date: Mon, 3 Jun 2024 16:59:31 +0200 Subject: [PATCH] Fix check when using FORMAT_MODULE_PATH (#12006) Fixes #12005 --- CHANGELOG.txt | 1 + docs/releases/6.2.md | 1 + wagtail/admin/checks.py | 48 ++++++++----------- wagtail/admin/tests/formats/en/__init__.py | 0 wagtail/admin/tests/formats/en/formats.py | 1 + wagtail/admin/tests/test_checks.py | 56 ++++++++++++++++++++-- 6 files changed, 75 insertions(+), 32 deletions(-) create mode 100644 wagtail/admin/tests/formats/en/__init__.py create mode 100644 wagtail/admin/tests/formats/en/formats.py diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 22a6b6db22..c2573e511f 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -49,6 +49,7 @@ Changelog * Fix: Fix dynamic image serve view with certain backends (Sébastien Corbin) * Fix: Show not allowed extension in error message (Sahil Jangra) * Fix: Fix focal point chooser when localization enabled (Sébastien Corbin) + * Fix: Ensure that system checks for `WAGTAIL_DATE_FORMAT`, `WAGTAIL_DATETIME_FORMAT` and `WAGTAIL_TIME_FORMAT` take `FORMAT_MODULE_PATH` into account (Sébastien Corbin) * Docs: Remove duplicate section on frontend caching proxies from performance page (Jake Howard) * Docs: Document `restriction_type` field on PageViewRestriction (Shlomo Markowitz) * Docs: Document Wagtail's bug bounty policy (Jake Howard) diff --git a/docs/releases/6.2.md b/docs/releases/6.2.md index 9c24dc8da4..36c38226d0 100644 --- a/docs/releases/6.2.md +++ b/docs/releases/6.2.md @@ -79,6 +79,7 @@ This feature was implemented by Matt Westcott and Sage Abdullah. * Fix dynamic image serve view with certain backends (Sébastien Corbin) * Show not allowed extension in error message (Sahil Jangra) * Fix focal point chooser when localization enabled (Sébastien Corbin) + * Ensure that system checks for `WAGTAIL_DATE_FORMAT`, `WAGTAIL_DATETIME_FORMAT` and `WAGTAIL_TIME_FORMAT` take `FORMAT_MODULE_PATH` into account (Sébastien Corbin) ### Documentation diff --git a/wagtail/admin/checks.py b/wagtail/admin/checks.py index 66bbd17809..5e8afc0ea5 100644 --- a/wagtail/admin/checks.py +++ b/wagtail/admin/checks.py @@ -246,43 +246,33 @@ def datetime_format_check(app_configs, **kwargs): """ from django.conf import settings - from django.utils import formats, translation + from django.utils import formats errors = [] if not getattr(settings, "USE_L10N", False): return errors - formats.FORMAT_SETTINGS = formats.FORMAT_SETTINGS.union( - [ - "WAGTAIL_DATE_FORMAT", - "WAGTAIL_DATETIME_FORMAT", - "WAGTAIL_TIME_FORMAT", - ] - ) - for code, label in settings.LANGUAGES: - with translation.override(code): - for wagtail_format, django_formats in [ - ("WAGTAIL_DATE_FORMAT", "DATE_INPUT_FORMATS"), - ("WAGTAIL_DATETIME_FORMAT", "DATETIME_INPUT_FORMATS"), - ("WAGTAIL_TIME_FORMAT", "TIME_INPUT_FORMATS"), - ]: - wagtail_format_value = getattr(settings, wagtail_format, None) - django_formats_value = getattr(settings, django_formats, None) + for wagtail_setting, django_setting in [ + ("WAGTAIL_DATE_FORMAT", "DATE_INPUT_FORMATS"), + ("WAGTAIL_DATETIME_FORMAT", "DATETIME_INPUT_FORMATS"), + ("WAGTAIL_TIME_FORMAT", "TIME_INPUT_FORMATS"), + ]: + wagtail_format_value = getattr(settings, wagtail_setting, None) + if wagtail_format_value is None: + # Skip the iteration if wagtail_format is not present + continue - if wagtail_format_value is None: - # Skip the iteration if wagtail_format is not present - continue - - input_format = formats.get_format_lazy(wagtail_format_value) - input_formats = formats.get_format_lazy(django_formats_value) - if str(input_format) not in str(input_formats): - errors.append( - Error( - "Configuration error", - hint=f"{wagtail_format} {input_format} must be in {django_formats} for language {label} ({code}).", - ) + input_formats = formats.get_format(django_setting, lang=code) + if wagtail_format_value not in input_formats: + errors.append( + Error( + "Configuration error", + hint=f"'{wagtail_format_value}' must be in {django_setting} for language {label} ({code}).", + obj=wagtail_setting, + id="wagtailadmin.E003", ) + ) return errors diff --git a/wagtail/admin/tests/formats/en/__init__.py b/wagtail/admin/tests/formats/en/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/wagtail/admin/tests/formats/en/formats.py b/wagtail/admin/tests/formats/en/formats.py new file mode 100644 index 0000000000..f2b9418c54 --- /dev/null +++ b/wagtail/admin/tests/formats/en/formats.py @@ -0,0 +1 @@ +DATETIME_INPUT_FORMATS = ["%d.%m.%Y. %H:%M"] diff --git a/wagtail/admin/tests/test_checks.py b/wagtail/admin/tests/test_checks.py index 0bec59790c..7f4fcc84d3 100644 --- a/wagtail/admin/tests/test_checks.py +++ b/wagtail/admin/tests/test_checks.py @@ -1,5 +1,6 @@ from django.core.checks import Error from django.test import TestCase, override_settings +from django.utils.formats import reset_format_cache from wagtail.admin.checks import datetime_format_check from wagtail.test.utils import WagtailTestUtils @@ -8,6 +9,9 @@ from wagtail.test.utils import WagtailTestUtils class TestDateTimeChecks(WagtailTestUtils, TestCase): fixtures = ["test.json"] + def setUp(self): + reset_format_cache() + def test_datetime_format(self): with override_settings( WAGTAIL_CONTENT_LANGUAGES=[ @@ -41,7 +45,9 @@ class TestDateTimeChecks(WagtailTestUtils, TestCase): expected_errors = [ Error( "Configuration error", - hint="WAGTAIL_DATE_FORMAT %d.%m.%Y. must be in DATE_INPUT_FORMATS for language English (en).", + hint="'%d.%m.%Y.' must be in DATE_INPUT_FORMATS for language English (en).", + obj="WAGTAIL_DATE_FORMAT", + id="wagtailadmin.E003", ) ] self.assertEqual(errors, expected_errors) @@ -82,11 +88,55 @@ class TestDateTimeChecks(WagtailTestUtils, TestCase): expected_errors = [ Error( "Configuration error", - hint="WAGTAIL_DATETIME_FORMAT %d.%m.%Y. %H:%M must be in DATETIME_INPUT_FORMATS for language English (en).", + hint="'%d.%m.%Y. %H:%M' must be in DATETIME_INPUT_FORMATS for language English (en).", + obj="WAGTAIL_DATETIME_FORMAT", + id="wagtailadmin.E003", ), Error( "Configuration error", - hint="WAGTAIL_TIME_FORMAT %I:%M %p must be in TIME_INPUT_FORMATS for language English (en).", + hint="'%I:%M %p' must be in TIME_INPUT_FORMATS for language English (en).", + obj="WAGTAIL_TIME_FORMAT", + id="wagtailadmin.E003", + ), + ] + self.assertEqual(errors, expected_errors) + + def test_datetime_format_with_overriden_format(self): + with override_settings( + WAGTAIL_CONTENT_LANGUAGES=[ + ("en", "English"), + ], + LANGUAGES=[ + ("en", "English"), + ], + WAGTAIL_DATETIME_FORMAT="%d.%m.%Y. %H:%M", + FORMAT_MODULE_PATH=["wagtail.admin.tests.formats"], + USE_L10N=True, + ): + errors = datetime_format_check(None) + + self.assertEqual(errors, []) + + def test_datetime_format_with_incorrect_overriden_format(self): + with override_settings( + WAGTAIL_CONTENT_LANGUAGES=[ + ("en", "English"), + ], + LANGUAGES=[ + ("en", "English"), + ], + WAGTAIL_DATETIME_FORMAT="%m.%d.%Y. %H:%M", + FORMAT_MODULE_PATH=["wagtail.admin.tests.formats"], + USE_L10N=True, + ): + errors = datetime_format_check(None) + + expected_errors = [ + Error( + "Configuration error", + hint="'%m.%d.%Y. %H:%M' must be in DATETIME_INPUT_FORMATS for language English (en).", + obj="WAGTAIL_DATETIME_FORMAT", + id="wagtailadmin.E003", ), ] self.assertEqual(errors, expected_errors)