diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 19b7728c..c0b75aaf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: - id: isort language_version: python3 - repo: https://github.com/pycqa/flake8 - rev: 3.7.7 + rev: 3.8.4 hooks: - id: flake8 language_version: python3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 17f68744..608bdccb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,17 @@ # Release History -## Unreleased +## 70.01 (2024-04-03) + +- Update `flake8` to version 3.8.4 for Python 3.8 compatibility +- Fix `global_vars` context processor when no default site is set + +Compare: ## 70.00 (2024-03-18) Wagtail 5.2 and Django 4.2 upgrade -Compare: +Compare: ## 69.14 (2024-02-05) diff --git a/bc/cases/tests/fixtures.py b/bc/cases/tests/fixtures.py index 5f0e709a..0f68a3a6 100644 --- a/bc/cases/tests/fixtures.py +++ b/bc/cases/tests/fixtures.py @@ -7,7 +7,7 @@ class ApteanRespondCaseFormPageFactory(factory.django.DjangoModelFactory): class Meta: model = "cases.ApteanRespondCaseFormPage" - title = factory.Sequence(lambda n: f"Aptean Respond Case Form Page") + title = factory.Sequence(lambda n: "Aptean Respond Case Form Page") listing_summary = "Aptean Respond Case Form Page" form = APTEAN_FORM_COMPLAINT completion_title = "foo" diff --git a/bc/forms/fixtures.py b/bc/forms/fixtures.py index a7aaa1c0..fcf3140b 100644 --- a/bc/forms/fixtures.py +++ b/bc/forms/fixtures.py @@ -13,7 +13,7 @@ class LookupPageFactory(factory.django.DjangoModelFactory): class Meta: model = "forms.LookupPage" - title = factory.Sequence(lambda n: f"Lookup Response Page") + title = factory.Sequence(lambda n: "Lookup Response Page") listing_summary = "Lookup Response Page" form_heading = "Look something up" input_label = "Submit this query" diff --git a/bc/recruitment/tests/fixtures.py b/bc/recruitment/tests/fixtures.py index 9ce7beba..9280a262 100644 --- a/bc/recruitment/tests/fixtures.py +++ b/bc/recruitment/tests/fixtures.py @@ -27,7 +27,7 @@ class RecruitmentHomePageFactory(factory.django.DjangoModelFactory): class Meta: model = "recruitment.RecruitmentHomePage" - title = factory.Sequence(lambda n: f"Recruitment HomePage") + title = factory.Sequence(lambda n: "Recruitment HomePage") listing_summary = "Recruitment HomePage" hero_image = factory.SubFactory("bc.images.tests.fixtures.ImageFactory") hero_title = "foo" diff --git a/bc/recruitment_api/management/commands/import_jobs.py b/bc/recruitment_api/management/commands/import_jobs.py index ced7d6cc..7bf1dc70 100644 --- a/bc/recruitment_api/management/commands/import_jobs.py +++ b/bc/recruitment_api/management/commands/import_jobs.py @@ -26,7 +26,7 @@ def handle(self, *args, **options): # We import jobs for each Recruitment Homepage, including draft ones # so it is possible to import jobs before going live. if not RecruitmentHomePage.objects.exists(): - msg = f"Please create a RecruitmentHomePage page before running the import." + msg = "Please create a RecruitmentHomePage page before running the import." self.stdout.write(self.style.ERROR(msg)) for homepage in RecruitmentHomePage.objects.all(): @@ -157,7 +157,7 @@ def handle(self, *args, **options): imported_before=import_timestamp, homepage=homepage ) except Exception as e: - msg = f"Error occurred while deleting jobs:\n" + str(e) + msg = "Error occurred while deleting jobs:\n" + str(e) errors.append(msg) self.stdout.write("No more results") diff --git a/bc/utils/context_processors.py b/bc/utils/context_processors.py index 3b04dbad..cca75fa6 100644 --- a/bc/utils/context_processors.py +++ b/bc/utils/context_processors.py @@ -1,3 +1,5 @@ +import logging + from django.conf import settings from wagtail.models import Site @@ -10,19 +12,27 @@ BASE_PAGE_TEMPLATE_RECRUITMENT, ) +logger = logging.getLogger(__name__) + def global_vars(request): - site = Site.find_for_request(request) - if is_subsite(site): - base_page_template = BASE_PAGE_TEMPLATE_FAMILY_INFORMATION - elif is_recruitment_site(site): - base_page_template = BASE_PAGE_TEMPLATE_RECRUITMENT + if site := Site.find_for_request(request): + if is_subsite(site): + base_page_template = BASE_PAGE_TEMPLATE_FAMILY_INFORMATION + elif is_recruitment_site(site): + base_page_template = BASE_PAGE_TEMPLATE_RECRUITMENT + else: + base_page_template = BASE_PAGE_TEMPLATE + + is_pensions_site = ( + base_page_template == BASE_PAGE_TEMPLATE_FAMILY_INFORMATION + ) and site.root_page.specific.is_pensions_site else: + logger.warning( + "No site found for request - has the default site been unset or deleted?" + ) base_page_template = BASE_PAGE_TEMPLATE - - is_pensions_site = ( - base_page_template == BASE_PAGE_TEMPLATE_FAMILY_INFORMATION - ) and site.root_page.specific.is_pensions_site + is_pensions_site = False return { "GOOGLE_TAG_MANAGER_ID": getattr(settings, "GOOGLE_TAG_MANAGER_ID", None), diff --git a/bc/utils/tests/test_models.py b/bc/utils/tests/test_models.py index be26185a..2aa0c82f 100644 --- a/bc/utils/tests/test_models.py +++ b/bc/utils/tests/test_models.py @@ -3,6 +3,7 @@ from django.urls import reverse from wagtail.models import Page, Site +from wagtail.test.utils import WagtailTestUtils from bc.home.tests.fixtures import HomePageFactory from bc.recruitment.tests.fixtures import RecruitmentHomePageFactory @@ -16,7 +17,7 @@ @override_settings(ALLOWED_HOSTS=[MAIN_HOSTNAME, RECRUITMENT_HOSTNAME]) -class BasePageTemplateTest(TestCase): +class BasePageTemplateTest(WagtailTestUtils, TestCase): def setUp(self): root_page = Page.objects.get(id=1) @@ -124,6 +125,48 @@ def test_recruitment_search_uses_recruitment_site(self): response.context["base_page_template"], BASE_PAGE_TEMPLATE_RECRUITMENT ) + @override_settings( + ALLOWED_HOSTS=[MAIN_HOSTNAME, RECRUITMENT_HOSTNAME, "oof.example.com"] + ) + def test_default_site_handling(self): + """ + Checks that the global_vars context processor handles requests without breaking, + regardless of whether a default site is set + """ + # We're testing the /admin/ page, so we need to log in first + self.user = self.login() + + # Test that no site is returned for requests with unknown server names, + # when no default site is set + default_site = Site.objects.get(is_default_site=True) + default_site.is_default_site = False + default_site.save() + request = RequestFactory().get("/admin/", SERVER_NAME="oof.example.com") + self.assertIsNone(Site.find_for_request(request)) + + # Test that fallback values are added by the context processor + # for requests with unknown server names, when no default site is set + response = self.client.get("/admin/", SERVER_NAME="oof.example.com") + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context["is_pensions_site"], False) + self.assertEqual(response.context["base_page_template"], BASE_PAGE_TEMPLATE) + + # Test that the default site is returned for requests with unknown server names, + # when one is set + self.recruitment_site.is_default_site = True + self.recruitment_site.save() + request = RequestFactory().get("/admin/", SERVER_NAME="oof.example.com") + self.assertEqual(Site.find_for_request(request), self.recruitment_site) + + # Test that site-specific values are added by the context processor + # for requests with unknown server names, when a default site is set + response = self.client.get("/admin/", SERVER_NAME="oof.example.com") + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context["is_pensions_site"], False) + self.assertEqual( + response.context["base_page_template"], BASE_PAGE_TEMPLATE_RECRUITMENT + ) + class NoSearchResultsTemplateTest(TestCase): def setUp(self): diff --git a/poetry.lock b/poetry.lock index 957c80c6..25d24a03 100644 --- a/poetry.lock +++ b/poetry.lock @@ -810,17 +810,6 @@ develop = ["black", "coverage", "jinja2", "mock", "pytest", "pytest-cov", "pyyam docs = ["sphinx (<1.7)", "sphinx-rtd-theme"] requests = ["requests (>=2.4.0,<3.0.0)"] -[[package]] -name = "entrypoints" -version = "0.3" -description = "Discover and load entry points from installed packages." -optional = false -python-versions = ">=2.7" -files = [ - {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, - {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, -] - [[package]] name = "et-xmlfile" version = "1.1.0" @@ -892,20 +881,19 @@ files = [ [[package]] name = "flake8" -version = "3.7.7" -description = "the modular source code checker: pep8, pyflakes and co" +version = "3.8.4" +description = "the modular source code checker: pep8 pyflakes and co" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ - {file = "flake8-3.7.7-py2.py3-none-any.whl", hash = "sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8"}, - {file = "flake8-3.7.7.tar.gz", hash = "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661"}, + {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, + {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, ] [package.dependencies] -entrypoints = ">=0.3.0,<0.4.0" mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.5.0,<2.6.0" -pyflakes = ">=2.1.0,<2.2.0" +pycodestyle = ">=2.6.0a1,<2.7.0" +pyflakes = ">=2.2.0,<2.3.0" [[package]] name = "freezegun" @@ -1709,24 +1697,24 @@ files = [ [[package]] name = "pycodestyle" -version = "2.5.0" +version = "2.6.0" description = "Python style guide checker" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pycodestyle-2.5.0-py2.py3-none-any.whl", hash = "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56"}, - {file = "pycodestyle-2.5.0.tar.gz", hash = "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"}, + {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, + {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, ] [[package]] name = "pyflakes" -version = "2.1.1" +version = "2.2.0" description = "passive checker of Python programs" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pyflakes-2.1.1-py2.py3-none-any.whl", hash = "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0"}, - {file = "pyflakes-2.1.1.tar.gz", hash = "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2"}, + {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, + {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, ] [[package]] @@ -2723,4 +2711,4 @@ gunicorn = ["gunicorn"] [metadata] lock-version = "2.0" python-versions = "~3.8" -content-hash = "348a7c667d542461331fb9bb11bf2d522baea4629179f04499f2de2e8145ff11" +content-hash = "b2093623976e14f59700dd079b4d0b905ad8d4592154e137925ef50e2bba14b6" diff --git a/pyproject.toml b/pyproject.toml index cca9692d..352ef07b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,7 +52,7 @@ pymdown-extensions = "9.3" # Linting black = "22.3.0" detect-secrets = "0.13.0" -flake8 = "3.7.7" +flake8 = "3.8.4" isort = "4.3.18" seed-isort-config = "1.9.0"