From 179602c23ba5812c426f9951135d2958e74408ee Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 10:37:00 +0100 Subject: [PATCH 01/19] fix: updated order of responses to match the order of questions --- .../questions/presenters/response_set_presenter.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lung_cancer_screening/questions/presenters/response_set_presenter.py b/lung_cancer_screening/questions/presenters/response_set_presenter.py index 83ee2b12..5b638c9f 100644 --- a/lung_cancer_screening/questions/presenters/response_set_presenter.py +++ b/lung_cancer_screening/questions/presenters/response_set_presenter.py @@ -196,16 +196,16 @@ def about_you_responses_items(self): self.weight, "questions:weight", ), - self._check_your_answer_item( - "Sex at birth", - self.sex_at_birth, - "questions:sex_at_birth", - ), self._check_your_answer_item( "Gender identity", self.gender, "questions:gender", ), + self._check_your_answer_item( + "Sex at birth", + self.sex_at_birth, + "questions:sex_at_birth", + ), self._check_your_answer_item( "Ethnic background", self.ethnicity, From 6659c65d660c828e5cf21d15c3e23d7cca9ca96f Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 10:37:52 +0100 Subject: [PATCH 02/19] fix: updated backlinks for height and weight --- .../questions/jinja2/height.jinja | 11 ----------- .../questions/jinja2/weight.jinja | 11 ----------- .../questions/tests/unit/views/test_height.py | 18 ++++++++++++++++++ .../questions/tests/unit/views/test_weight.py | 19 +++++++++++++++++++ .../questions/views/height.py | 9 +++++++-- .../questions/views/weight.py | 8 ++++++-- 6 files changed, 50 insertions(+), 26 deletions(-) diff --git a/lung_cancer_screening/questions/jinja2/height.jinja b/lung_cancer_screening/questions/jinja2/height.jinja index 6862abed..10b8581a 100644 --- a/lung_cancer_screening/questions/jinja2/height.jinja +++ b/lung_cancer_screening/questions/jinja2/height.jinja @@ -10,17 +10,6 @@ 'metric': 'centimetres' } %} -{% block beforeContent %} - -{% endblock beforeContent %} - {% block page_content %}
diff --git a/lung_cancer_screening/questions/jinja2/weight.jinja b/lung_cancer_screening/questions/jinja2/weight.jinja index 79da19b0..3a372ac6 100644 --- a/lung_cancer_screening/questions/jinja2/weight.jinja +++ b/lung_cancer_screening/questions/jinja2/weight.jinja @@ -10,17 +10,6 @@ 'metric': 'kilograms' } %} -{% block beforeContent %} - -{% endblock beforeContent %} - {% block page_content %}
diff --git a/lung_cancer_screening/questions/tests/unit/views/test_height.py b/lung_cancer_screening/questions/tests/unit/views/test_height.py index 713f1ae1..b0abeb77 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_height.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_height.py @@ -174,3 +174,21 @@ def test_responds_with_422_if_the_response_fails_to_create(self): ) self.assertEqual(response.status_code, 422) + + def test_back_link_url_is_check_your_answers_if_changing_responses(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:height"), {"change": "True"} + ) + + self.assertContains(response, reverse("questions:responses")) + + def test_back_link_url_is_check_need_appointment_if_not_changing_responses(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:height") + ) + + self.assertContains(response, reverse("questions:check_need_appointment")) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_weight.py b/lung_cancer_screening/questions/tests/unit/views/test_weight.py index 74aba1f9..c66f8b17 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_weight.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_weight.py @@ -174,3 +174,22 @@ def test_responds_with_422_if_the_response_fails_to_create(self): ) self.assertEqual(response.status_code, 422) + + def test_back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:weight"), + {"change": "True"} + ) + + self.assertContains(response, reverse("questions:responses")) + + def test_back_link_url_is_height_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:weight") + ) + + self.assertContains(response, reverse("questions:height")) diff --git a/lung_cancer_screening/questions/views/height.py b/lung_cancer_screening/questions/views/height.py index 5b76aaa8..1a19627c 100644 --- a/lung_cancer_screening/questions/views/height.py +++ b/lung_cancer_screening/questions/views/height.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -17,7 +17,7 @@ class HeightView(LoginRequiredMixin, EnsureResponseSet, EnsureEligibleMixin, Que template_name = "height.jinja" model = HeightResponse success_url = reverse_lazy("questions:weight") - back_link_url = reverse_lazy("questions:check_need_appointment") + def get_form_class(self): unit = self.get_unit() @@ -38,3 +38,8 @@ def get_unit(self): if response.imperial and unit != "metric": unit = "imperial" return unit + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:check_need_appointment") diff --git a/lung_cancer_screening/questions/views/weight.py b/lung_cancer_screening/questions/views/weight.py index b24fd5ca..4749b1f0 100644 --- a/lung_cancer_screening/questions/views/weight.py +++ b/lung_cancer_screening/questions/views/weight.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -17,7 +17,6 @@ class WeightView(LoginRequiredMixin, EnsureResponseSet, EnsureEligibleMixin, Que template_name = "weight.jinja" model = WeightResponse success_url = reverse_lazy("questions:gender") - back_link_url = reverse_lazy("questions:height") def get_form_class(self): unit = self.get_unit() @@ -38,3 +37,8 @@ def get_unit(self): if response.imperial and unit != "metric": unit = "imperial" return unit + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:height") From 58029456011baf7a7f389db42b71dc24927902e6 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 10:38:35 +0100 Subject: [PATCH 03/19] fix: updated backlink for date of birth --- .../tests/unit/views/test_date_of_birth.py | 13 +++++++++++++ .../questions/views/date_of_birth.py | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_date_of_birth.py b/lung_cancer_screening/questions/tests/unit/views/test_date_of_birth.py index a636ace8..8ef1d43b 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_date_of_birth.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_date_of_birth.py @@ -81,6 +81,19 @@ def test_responds_successfully(self): self.assertEqual(response.status_code, 200) + def test_get_back_link_url_points_to_responses_if_change_query_param_is_true(self): + response = self.client.get( + reverse("questions:date_of_birth") + "?change=True" + ) + + self.assertContains(response, reverse("questions:responses")) + + def test_get_back_link_url_points_to_have_you_ever_smoked_if_change_query_param_is_not_true(self): + response = self.client.get( + reverse("questions:date_of_birth") + ) + + self.assertContains(response, reverse("questions:have_you_ever_smoked")) @tag("DateOfBirth") class TestPostDateOfBirth(TestCase): diff --git a/lung_cancer_screening/questions/views/date_of_birth.py b/lung_cancer_screening/questions/views/date_of_birth.py index 5059c74f..1f16e1b4 100644 --- a/lung_cancer_screening/questions/views/date_of_birth.py +++ b/lung_cancer_screening/questions/views/date_of_birth.py @@ -33,3 +33,8 @@ def get_success_url(self): return super().get_success_url() else: return reverse("questions:age_range_exit") + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:have_you_ever_smoked") From cd04aba31e9ba59b8ff5c467141f3fc243785536 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 10:40:13 +0100 Subject: [PATCH 04/19] fix: updated question base to take change value from GET and POST --- .../questions/views/question_base_view.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lung_cancer_screening/questions/views/question_base_view.py b/lung_cancer_screening/questions/views/question_base_view.py index 1ffe5e16..d97ea49a 100644 --- a/lung_cancer_screening/questions/views/question_base_view.py +++ b/lung_cancer_screening/questions/views/question_base_view.py @@ -6,11 +6,11 @@ class QuestionBaseView(UpdateView): page_title = "Check if you need a lung scan – NHS" - def should_redirect_to_responses(self, request): - return bool(request.POST.get("change")) + def is_changing_responses(self): + return bool(self.request.GET.get("change")) or bool(self.request.POST.get("change")) def get_change_query_params(self): - if not self.should_redirect_to_responses(self.request): + if not self.is_changing_responses(): return {} return {"change": "True"} @@ -25,7 +25,7 @@ def get_context_data(self, **kwargs): return context def get_success_url(self): - if self.should_redirect_to_responses(self.request): + if self.is_changing_responses(): return reverse("questions:responses") else: return super().get_success_url() From 3fc13d88e7c693ec4126bcf2063e49b30f693ca9 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 10:42:14 +0100 Subject: [PATCH 05/19] fix: updated backlinks for smoking history --- .../unit/views/test_have_you_ever_smoked.py | 24 +++++++++++++++++++ .../tests/unit/views/test_smoking_current.py | 12 ++++++++++ .../unit/views/test_types_tobacco_smoking.py | 24 +++++++++++++++++++ .../questions/views/have_you_ever_smoked.py | 6 ++++- .../questions/views/smoking_current.py | 5 +++- .../questions/views/types_tobacco_smoking.py | 10 +++++++- 6 files changed, 78 insertions(+), 3 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_have_you_ever_smoked.py b/lung_cancer_screening/questions/tests/unit/views/test_have_you_ever_smoked.py index 96a8286b..87a1cfb0 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_have_you_ever_smoked.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_have_you_ever_smoked.py @@ -46,6 +46,30 @@ def test_get_responds_successfully(self): self.assertEqual(response.status_code, 200) + def test_get_back_link_url_points_to_responses_if_change_query_param_is_true(self): + TermsOfUseResponseFactory.create( + response_set=ResponseSetFactory.create(user=self.user), + value=True + ) + + response = self.client.get( + reverse("questions:have_you_ever_smoked") + "?change=True" + ) + + self.assertContains(response, reverse("questions:responses")) + + def test_get_back_link_url_points_to_agree_terms_of_use_if_change_query_param_is_not_true(self): + TermsOfUseResponseFactory.create( + response_set=ResponseSetFactory.create(user=self.user), + value=True + ) + + response = self.client.get( + reverse("questions:have_you_ever_smoked") + ) + + self.assertContains(response, reverse("questions:agree_terms_of_use")) + @tag("HaveYouEverSmoked") class TestPostHaveYouEverSmoked(TestCase): diff --git a/lung_cancer_screening/questions/tests/unit/views/test_smoking_current.py b/lung_cancer_screening/questions/tests/unit/views/test_smoking_current.py index bbac0332..83d4cc0b 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_smoking_current.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_smoking_current.py @@ -122,6 +122,18 @@ def test_has_a_back_link_to_the_previous_tobacco_type_when_on_a_later_type_with_ }) ) + def test_has_a_back_link_to_responses_when_on_current_smoking_change_responses(self): + response = self.client.get( + reverse("questions:smoking_current", kwargs = { + "tobacco_type": self.tobacco_smoking_history.url_type() + }, query={"change": "True"}) + ) + + self.assertEqual( + response.context_data["back_link_url"], + reverse("questions:responses") + ) + @tag("SmokingCurrent") class TestPostSmokingCurrent(TestCase): def setUp(self): diff --git a/lung_cancer_screening/questions/tests/unit/views/test_types_tobacco_smoking.py b/lung_cancer_screening/questions/tests/unit/views/test_types_tobacco_smoking.py index 1031a5d0..005f0472 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_types_tobacco_smoking.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_types_tobacco_smoking.py @@ -59,6 +59,30 @@ def test_get_responds_successfully(self): self.assertEqual(response.status_code, 200) + def test_get_back_link_url_returns_responses_url_if_changing_responses(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:types_tobacco_smoking") + "?change=True" + ) + + self.assertEqual( + response.context_data["back_link_url"], + reverse("questions:responses") + ) + + def test_get_back_link_url_returns_periods_when_you_stopped_smoking_url_if_not_changing_responses(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:types_tobacco_smoking") + ) + + self.assertEqual( + response.context_data["back_link_url"], + reverse("questions:periods_when_you_stopped_smoking") + ) + @tag("TypesTobaccoSmoking") class TestPostTypesTobaccoSmoking(TestCase): diff --git a/lung_cancer_screening/questions/views/have_you_ever_smoked.py b/lung_cancer_screening/questions/views/have_you_ever_smoked.py index be4b9274..42de12d8 100644 --- a/lung_cancer_screening/questions/views/have_you_ever_smoked.py +++ b/lung_cancer_screening/questions/views/have_you_ever_smoked.py @@ -17,10 +17,14 @@ class HaveYouEverSmokedView(LoginRequiredMixin, EnsureResponseSet, EnsureAccepte form_class = HaveYouEverSmokedForm model = HaveYouEverSmokedResponse success_url = reverse_lazy("questions:date_of_birth") - back_link_url = reverse_lazy("questions:agree_terms_of_use") def get_success_url(self): if self.object.is_eligible(): return super().get_success_url() else: return reverse("questions:non_smoker_exit") + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:agree_terms_of_use") diff --git a/lung_cancer_screening/questions/views/smoking_current.py b/lung_cancer_screening/questions/views/smoking_current.py index 40dc0699..1a6bb225 100644 --- a/lung_cancer_screening/questions/views/smoking_current.py +++ b/lung_cancer_screening/questions/views/smoking_current.py @@ -30,6 +30,9 @@ def get_success_url(self): def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + if self.previous_smoking_history(): if self.previous_smoking_history().is_normal(): return reverse( @@ -47,7 +50,7 @@ def get_back_link_url(self): query=self.get_change_query_params(), ) - return reverse("questions:types_tobacco_smoking") + return reverse("questions:types_tobacco_smoking", query=self.get_change_query_params()) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) diff --git a/lung_cancer_screening/questions/views/types_tobacco_smoking.py b/lung_cancer_screening/questions/views/types_tobacco_smoking.py index 2fe7c9ae..60f718bc 100644 --- a/lung_cancer_screening/questions/views/types_tobacco_smoking.py +++ b/lung_cancer_screening/questions/views/types_tobacco_smoking.py @@ -20,7 +20,7 @@ def get_form_kwargs(self): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context["back_link_url"] = reverse("questions:periods_when_you_stopped_smoking") + context["back_link_url"] = self.get_back_link_url() return context def form_valid(self, form): @@ -40,3 +40,11 @@ def get_success_url(self): "tobacco_type": next_tobacco_smoking_history.url_type() }, ) + + def is_changing_responses(self): + return bool(self.request.GET.get("change")) or bool(self.request.POST.get("change")) + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:periods_when_you_stopped_smoking") From 78c79aba75f3dd437d2114bf4f36c35a274aa128 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 11:02:45 +0100 Subject: [PATCH 06/19] fix: removed unused backlink --- lung_cancer_screening/questions/views/date_of_birth.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lung_cancer_screening/questions/views/date_of_birth.py b/lung_cancer_screening/questions/views/date_of_birth.py index 1f16e1b4..30a081de 100644 --- a/lung_cancer_screening/questions/views/date_of_birth.py +++ b/lung_cancer_screening/questions/views/date_of_birth.py @@ -25,7 +25,6 @@ class DateOfBirthView(LoginRequiredMixin, EnsureResponseSet, EnsureAcceptedTerms form_class = DateOfBirthForm model = DateOfBirthResponse success_url = reverse_lazy("questions:check_need_appointment") - back_link_url = reverse_lazy("questions:have_you_ever_smoked") page_title: str = "What is your date of birth? – Check if you need a lung scan – NHS" def get_success_url(self): From 9ed8c016a7d045e72eac7efa270c7c68a6ceeeb9 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 12:12:00 +0100 Subject: [PATCH 07/19] fix: updated function name --- .../questions/views/smoked_total_years.py | 2 +- .../questions/views/smoking_change.py | 23 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lung_cancer_screening/questions/views/smoked_total_years.py b/lung_cancer_screening/questions/views/smoked_total_years.py index 33e39233..47e5395d 100644 --- a/lung_cancer_screening/questions/views/smoked_total_years.py +++ b/lung_cancer_screening/questions/views/smoked_total_years.py @@ -66,7 +66,7 @@ def get_success_url(self): query=self.get_change_query_params(), ) - if self.next_unanswered_history(): + if self.next_unanswered_history() and not self.is_changing_responses(): return reverse( "questions:smoking_current", kwargs={ diff --git a/lung_cancer_screening/questions/views/smoking_change.py b/lung_cancer_screening/questions/views/smoking_change.py index cdb9f3f4..006cecb3 100644 --- a/lung_cancer_screening/questions/views/smoking_change.py +++ b/lung_cancer_screening/questions/views/smoking_change.py @@ -59,13 +59,16 @@ def form_valid(self, form): def get_success_url(self): if self.next_smoking_history(): if self.next_smoking_history().is_normal(): - return reverse( - "questions:smoking_current", - kwargs={ - "tobacco_type": self.next_smoking_history().url_type(), - }, - query=self.get_change_query_params(), - ) + if self.is_changing_responses(): + return reverse("questions:responses") + else: + return reverse( + "questions:smoking_current", + kwargs={ + "tobacco_type": self.next_smoking_history().url_type(), + }, + query=self.get_change_query_params(), + ) else: return reverse( "questions:smoking_frequency", @@ -79,12 +82,12 @@ def get_success_url(self): return reverse("questions:responses") - def should_redirect_to_responses(self, request): - return bool(request.POST.get("change")) + def is_changing_responses(self): + return bool(self.request.POST.get("change")) def get_change_query_params(self): - if not self.should_redirect_to_responses(self.request): + if not self.is_changing_responses(): return {} return {"change": "True"} From 2d50da1629d446803c6ad244aebdccb8e640a489 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 12:40:31 +0100 Subject: [PATCH 08/19] fix: updated backlink for gender page --- .../questions/tests/unit/views/test_gender.py | 15 +++++++++++++++ lung_cancer_screening/questions/views/gender.py | 8 ++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_gender.py b/lung_cancer_screening/questions/tests/unit/views/test_gender.py index 335bd2de..1eb4b3d0 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_gender.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_gender.py @@ -130,6 +130,21 @@ def test_redirects_to_responses_if_change_query_param_is_true(self): self.assertRedirects(response, reverse("questions:responses")) + def test_back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:gender", query={"change": "True"}) + ) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_is_weight_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get(reverse("questions:gender")) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:weight")) + def test_responds_with_422_if_the_response_fails_to_create(self): ResponseSetFactory.create(user=self.user, eligible=True) diff --git a/lung_cancer_screening/questions/views/gender.py b/lung_cancer_screening/questions/views/gender.py index 78105128..969a534d 100644 --- a/lung_cancer_screening/questions/views/gender.py +++ b/lung_cancer_screening/questions/views/gender.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -13,5 +13,9 @@ class GenderView(LoginRequiredMixin, EnsureResponseSet, EnsureEligibleMixin, Que form_class = GenderForm model = GenderResponse success_url = reverse_lazy("questions:sex_at_birth") - back_link_url = reverse_lazy("questions:weight") page_title: str = "Your gender identity – Check if you need a lung scan – NHS" + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:weight") From 7af7566acf8f1cfe07e05ce30a908fdb7f0abf1a Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 12:43:33 +0100 Subject: [PATCH 09/19] fix: moved tests to correct class --- .../questions/tests/unit/views/test_gender.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_gender.py b/lung_cancer_screening/questions/tests/unit/views/test_gender.py index 1eb4b3d0..0974cf49 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_gender.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_gender.py @@ -52,6 +52,21 @@ def test_responds_successfully(self): self.assertEqual(response.status_code, 200) + def test_back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:gender", query={"change": "True"}) + ) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_is_weight_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get(reverse("questions:gender")) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:weight")) + @tag("Gender") class TestPostGender(TestCase): @@ -130,21 +145,6 @@ def test_redirects_to_responses_if_change_query_param_is_true(self): self.assertRedirects(response, reverse("questions:responses")) - def test_back_link_url_is_responses_if_change_query_param_is_true(self): - ResponseSetFactory.create(user=self.user, eligible=True) - - response = self.client.get( - reverse("questions:gender", query={"change": "True"}) - ) - self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) - - def test_back_link_url_is_weight_if_change_query_param_is_not_true(self): - ResponseSetFactory.create(user=self.user, eligible=True) - - response = self.client.get(reverse("questions:gender")) - - self.assertEqual(response.context_data["back_link_url"], reverse("questions:weight")) - def test_responds_with_422_if_the_response_fails_to_create(self): ResponseSetFactory.create(user=self.user, eligible=True) From 6b5051b475bccd813671b0ef548c6863f722fc28 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 12:47:01 +0100 Subject: [PATCH 10/19] fix: updated backlinks for age started smoking --- .../views/test_age_when_started_smoking.py | 18 ++++++++++++++++++ .../views/age_when_started_smoking.py | 8 ++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_age_when_started_smoking.py b/lung_cancer_screening/questions/tests/unit/views/test_age_when_started_smoking.py index 38a609d2..726c1202 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_age_when_started_smoking.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_age_when_started_smoking.py @@ -43,6 +43,24 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) + def test_back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:age_when_started_smoking", query={"change": "True"}) + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_is_relatives_age_when_diagnosed_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:age_when_started_smoking") + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:relatives_age_when_diagnosed")) + def test_responds_successfully(self): ResponseSetFactory.create(user=self.user, eligible=True) diff --git a/lung_cancer_screening/questions/views/age_when_started_smoking.py b/lung_cancer_screening/questions/views/age_when_started_smoking.py index f75444bf..980e8c32 100644 --- a/lung_cancer_screening/questions/views/age_when_started_smoking.py +++ b/lung_cancer_screening/questions/views/age_when_started_smoking.py @@ -12,14 +12,18 @@ class AgeWhenStartedSmokingView(LoginRequiredMixin, EnsureResponseSet, EnsureEli form_class = AgeWhenStartedSmokingForm model = AgeWhenStartedSmokingResponse success_url = reverse_lazy("questions:periods_when_you_stopped_smoking") - back_link_url = reverse_lazy("questions:relatives_age_when_diagnosed") page_title = "How old were you when you started smoking? – NHS" def get_success_url(self): - if self.should_redirect_to_responses(self.request): + if self.is_changing_responses(): return reverse( "questions:periods_when_you_stopped_smoking", query={"change": "True"} ) else: return super().get_success_url() + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:relatives_age_when_diagnosed") From 593a932fc81ae609aea69d840a6c7586d60aa0c2 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 12:50:22 +0100 Subject: [PATCH 11/19] fix: updated asbestos exposure backlink --- .../tests/unit/views/test_asbestos_exposure.py | 15 +++++++++++++++ .../questions/views/asbestos_exposure.py | 9 +++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_asbestos_exposure.py b/lung_cancer_screening/questions/tests/unit/views/test_asbestos_exposure.py index ebd50d7d..c47cd6a2 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_asbestos_exposure.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_asbestos_exposure.py @@ -51,6 +51,21 @@ def test_responds_successfully(self): self.assertEqual(response.status_code, 200) + def test_back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:asbestos_exposure", query={"change": "True"}) + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_is_weight_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get(reverse("questions:asbestos_exposure")) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:respiratory_conditions")) @tag("AsbestosExposure") class TestPostAsbestosExposure(TestCase): diff --git a/lung_cancer_screening/questions/views/asbestos_exposure.py b/lung_cancer_screening/questions/views/asbestos_exposure.py index 3bad7239..37981c58 100644 --- a/lung_cancer_screening/questions/views/asbestos_exposure.py +++ b/lung_cancer_screening/questions/views/asbestos_exposure.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -13,4 +13,9 @@ class AsbestosExposureView(LoginRequiredMixin, EnsureResponseSet, EnsureEligible form_class = AsbestosExposureForm model = AsbestosExposureResponse success_url = reverse_lazy("questions:cancer_diagnosis") - back_link_url = reverse_lazy("questions:respiratory_conditions") + + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:respiratory_conditions") From a3edbc4117a49776e560982022a825c9d3d04e73 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 14:08:39 +0100 Subject: [PATCH 12/19] fix: updated backlinks --- .../unit/views/test_asbestos_exposure.py | 4 +++- .../tests/unit/views/test_cancer_diagnosis.py | 18 +++++++++++++++ .../tests/unit/views/test_date_of_birth.py | 4 ++-- .../tests/unit/views/test_education.py | 18 +++++++++++++++ .../tests/unit/views/test_ethnicity.py | 16 +++++++++++++ .../views/test_family_history_lung_cancer.py | 16 +++++++++++++ .../unit/views/test_have_you_ever_smoked.py | 4 ++-- .../test_periods_when_you_stopped_smoking.py | 11 +++++++++ .../test_relatives_age_when_diagnosed.py | 23 +++++++++++++++++++ .../unit/views/test_respiratory_conditions.py | 18 +++++++++++++++ .../tests/unit/views/test_sex_at_birth.py | 16 +++++++++++++ .../questions/views/cancer_diagnosis.py | 8 +++++-- .../questions/views/education.py | 8 +++++-- .../questions/views/ethnicity.py | 8 +++++-- .../views/family_history_lung_cancer.py | 8 +++++-- .../views/periods_when_you_stopped_smoking.py | 8 +++++-- .../views/relatives_age_when_diagnosed.py | 6 ++++- .../questions/views/respiratory_conditions.py | 8 +++++-- .../questions/views/sex_at_birth.py | 8 +++++-- 19 files changed, 190 insertions(+), 20 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_asbestos_exposure.py b/lung_cancer_screening/questions/tests/unit/views/test_asbestos_exposure.py index c47cd6a2..77ce81b0 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_asbestos_exposure.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_asbestos_exposure.py @@ -51,6 +51,7 @@ def test_responds_successfully(self): self.assertEqual(response.status_code, 200) + def test_back_link_url_is_responses_if_change_query_param_is_true(self): ResponseSetFactory.create(user=self.user, eligible=True) @@ -60,7 +61,8 @@ def test_back_link_url_is_responses_if_change_query_param_is_true(self): self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) - def test_back_link_url_is_weight_if_change_query_param_is_not_true(self): + + def test_back_link_url_is_respiratory_conditions_if_change_query_param_is_not_true(self): ResponseSetFactory.create(user=self.user, eligible=True) response = self.client.get(reverse("questions:asbestos_exposure")) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_cancer_diagnosis.py b/lung_cancer_screening/questions/tests/unit/views/test_cancer_diagnosis.py index 5d3a6863..92617d63 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_cancer_diagnosis.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_cancer_diagnosis.py @@ -43,6 +43,24 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) + def test_back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:cancer_diagnosis", query={"change": "True"}) + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_is_asbestos_exposure_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:cancer_diagnosis") + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:asbestos_exposure")) + def test_responds_successfully(self): ResponseSetFactory.create(user=self.user, eligible=True) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_date_of_birth.py b/lung_cancer_screening/questions/tests/unit/views/test_date_of_birth.py index 8ef1d43b..e19895c2 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_date_of_birth.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_date_of_birth.py @@ -86,14 +86,14 @@ def test_get_back_link_url_points_to_responses_if_change_query_param_is_true(sel reverse("questions:date_of_birth") + "?change=True" ) - self.assertContains(response, reverse("questions:responses")) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) def test_get_back_link_url_points_to_have_you_ever_smoked_if_change_query_param_is_not_true(self): response = self.client.get( reverse("questions:date_of_birth") ) - self.assertContains(response, reverse("questions:have_you_ever_smoked")) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:have_you_ever_smoked")) @tag("DateOfBirth") class TestPostDateOfBirth(TestCase): diff --git a/lung_cancer_screening/questions/tests/unit/views/test_education.py b/lung_cancer_screening/questions/tests/unit/views/test_education.py index 81da78e0..d0f140cc 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_education.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_education.py @@ -46,6 +46,24 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) + def test_back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:education", query={"change": "True"}) + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_is_ethnicity_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:education") + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:ethnicity")) + def test_responds_successfully(self): ResponseSetFactory.create(user=self.user, eligible=True) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_ethnicity.py b/lung_cancer_screening/questions/tests/unit/views/test_ethnicity.py index ea530f96..38bd3b66 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_ethnicity.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_ethnicity.py @@ -45,6 +45,22 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) + def test_back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:ethnicity", query={"change": "True"}) + ) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_is_sex_at_birth_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:ethnicity") + ) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:sex_at_birth")) + def test_responds_successfully(self): ResponseSetFactory.create(user=self.user, eligible=True) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_family_history_lung_cancer.py b/lung_cancer_screening/questions/tests/unit/views/test_family_history_lung_cancer.py index 5aaf6c7b..eb560100 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_family_history_lung_cancer.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_family_history_lung_cancer.py @@ -45,6 +45,22 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) + def back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:family_history_lung_cancer", query={"change": "True"}) + ) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def back_link_url_is_cancer_diagnosis_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:family_history_lung_cancer") + ) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:cancer_diagnosis")) + def test_responds_successfully(self): ResponseSetFactory.create(user=self.user, eligible=True) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_have_you_ever_smoked.py b/lung_cancer_screening/questions/tests/unit/views/test_have_you_ever_smoked.py index 87a1cfb0..d69a45e1 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_have_you_ever_smoked.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_have_you_ever_smoked.py @@ -56,7 +56,7 @@ def test_get_back_link_url_points_to_responses_if_change_query_param_is_true(sel reverse("questions:have_you_ever_smoked") + "?change=True" ) - self.assertContains(response, reverse("questions:responses")) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) def test_get_back_link_url_points_to_agree_terms_of_use_if_change_query_param_is_not_true(self): TermsOfUseResponseFactory.create( @@ -68,7 +68,7 @@ def test_get_back_link_url_points_to_agree_terms_of_use_if_change_query_param_is reverse("questions:have_you_ever_smoked") ) - self.assertContains(response, reverse("questions:agree_terms_of_use")) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:agree_terms_of_use")) @tag("HaveYouEverSmoked") diff --git a/lung_cancer_screening/questions/tests/unit/views/test_periods_when_you_stopped_smoking.py b/lung_cancer_screening/questions/tests/unit/views/test_periods_when_you_stopped_smoking.py index 622f4607..ce2d1917 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_periods_when_you_stopped_smoking.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_periods_when_you_stopped_smoking.py @@ -47,6 +47,17 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) + def back_link_url_is_responses_if_change_query_param_is_true(self): + response = self.client.get( + reverse("questions:periods_when_you_stopped_smoking", query={"change": "True"}) + ) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def back_link_url_is_age_when_started_smoking_if_change_query_param_is_not_true(self): + response = self.client.get( + reverse("questions:periods_when_you_stopped_smoking") + ) + self.assertEqual(response.context_data["back_link_url"], reverse("questions:age_when_started_smoking")) def test_responds_successfully(self): response = self.client.get(reverse("questions:periods_when_you_stopped_smoking")) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_relatives_age_when_diagnosed.py b/lung_cancer_screening/questions/tests/unit/views/test_relatives_age_when_diagnosed.py index 3f7fb17a..ead99c9e 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_relatives_age_when_diagnosed.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_relatives_age_when_diagnosed.py @@ -75,6 +75,29 @@ def test_responds_redirect_for_no_family_history(self): fetch_redirect_response=False ) + def test_back_link_url_points_to_responses_if_change_query_param_is_true(self): + FamilyHistoryLungCancerResponseFactory( + response_set=ResponseSetFactory.create(user=self.user, eligible=True), + value=FamilyHistoryLungCancerValues.YES + ) + + response = self.client.get( + reverse("questions:relatives_age_when_diagnosed") + "?change=True" + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_points_to_family_history_lung_cancer_if_change_query_param_is_not_true(self): + FamilyHistoryLungCancerResponseFactory( + response_set=ResponseSetFactory.create(user=self.user, eligible=True), + value=FamilyHistoryLungCancerValues.YES + ) + + response = self.client.get( + reverse("questions:relatives_age_when_diagnosed") + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:family_history_lung_cancer")) @tag("RelativesAgeWhenDiagnosed") class TestPostRelativesAgeWhenDiagnosed(TestCase): diff --git a/lung_cancer_screening/questions/tests/unit/views/test_respiratory_conditions.py b/lung_cancer_screening/questions/tests/unit/views/test_respiratory_conditions.py index cdfeac99..fd5c73e9 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_respiratory_conditions.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_respiratory_conditions.py @@ -44,6 +44,24 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) + def test_back_link_url_points_to_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:respiratory_conditions") + "?change=True" + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_points_to_education_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:respiratory_conditions") + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:education")) + def test_responds_successfully(self): ResponseSetFactory.create(user=self.user, eligible=True) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_sex_at_birth.py b/lung_cancer_screening/questions/tests/unit/views/test_sex_at_birth.py index 5b3513e3..fa7cce29 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_sex_at_birth.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_sex_at_birth.py @@ -45,6 +45,22 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) + def test_back_link_url_points_to_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + response = self.client.get( + reverse("questions:sex_at_birth") + "?change=True" + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_points_to_agree_terms_of_use_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + response = self.client.get( + reverse("questions:sex_at_birth") + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:gender")) + def test_responds_successfully(self): ResponseSetFactory.create(user=self.user, eligible=True) diff --git a/lung_cancer_screening/questions/views/cancer_diagnosis.py b/lung_cancer_screening/questions/views/cancer_diagnosis.py index dcfd47ad..12cb0ffe 100644 --- a/lung_cancer_screening/questions/views/cancer_diagnosis.py +++ b/lung_cancer_screening/questions/views/cancer_diagnosis.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -13,4 +13,8 @@ class CancerDiagnosisView(LoginRequiredMixin, EnsureResponseSet, EnsureEligibleM form_class = CancerDiagnosisForm model = CancerDiagnosisResponse success_url = reverse_lazy("questions:family_history_lung_cancer") - back_link_url = reverse_lazy("questions:asbestos_exposure") + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:asbestos_exposure") diff --git a/lung_cancer_screening/questions/views/education.py b/lung_cancer_screening/questions/views/education.py index ec69b662..21290f38 100644 --- a/lung_cancer_screening/questions/views/education.py +++ b/lung_cancer_screening/questions/views/education.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -13,4 +13,8 @@ class EducationView(LoginRequiredMixin, EnsureResponseSet, EnsureEligibleMixin, form_class = EducationForm model = EducationResponse success_url = reverse_lazy("questions:respiratory_conditions") - back_link_url = reverse_lazy("questions:ethnicity") + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:ethnicity") diff --git a/lung_cancer_screening/questions/views/ethnicity.py b/lung_cancer_screening/questions/views/ethnicity.py index a4ee8a44..55474f34 100644 --- a/lung_cancer_screening/questions/views/ethnicity.py +++ b/lung_cancer_screening/questions/views/ethnicity.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -13,4 +13,8 @@ class EthnicityView(LoginRequiredMixin, EnsureResponseSet, EnsureEligibleMixin, form_class = EthnicityForm model = EthnicityResponse success_url = reverse_lazy("questions:education") - back_link_url = reverse_lazy("questions:sex_at_birth") + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:sex_at_birth") diff --git a/lung_cancer_screening/questions/views/family_history_lung_cancer.py b/lung_cancer_screening/questions/views/family_history_lung_cancer.py index 70fb5837..d19c8f4c 100644 --- a/lung_cancer_screening/questions/views/family_history_lung_cancer.py +++ b/lung_cancer_screening/questions/views/family_history_lung_cancer.py @@ -15,11 +15,10 @@ class FamilyHistoryLungCancerView(LoginRequiredMixin, EnsureResponseSet, EnsureE form_class = FamilyHistoryLungCancerForm model = FamilyHistoryLungCancerResponse success_url = reverse_lazy("questions:age_when_started_smoking") - back_link_url = reverse_lazy("questions:cancer_diagnosis") def get_success_url(self): if self.object.is_truthy(): - if self.should_redirect_to_responses(self.request): + if self.is_changing_responses(): return reverse( "questions:relatives_age_when_diagnosed", query={"change": "True"} @@ -28,3 +27,8 @@ def get_success_url(self): return reverse("questions:relatives_age_when_diagnosed") else: return super().get_success_url() + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:cancer_diagnosis") diff --git a/lung_cancer_screening/questions/views/periods_when_you_stopped_smoking.py b/lung_cancer_screening/questions/views/periods_when_you_stopped_smoking.py index d770ec78..8b751674 100644 --- a/lung_cancer_screening/questions/views/periods_when_you_stopped_smoking.py +++ b/lung_cancer_screening/questions/views/periods_when_you_stopped_smoking.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -13,4 +13,8 @@ class PeriodsWhenYouStoppedSmokingView(LoginRequiredMixin, EnsureResponseSet, En form_class = PeriodsWhenYouStoppedSmokingForm model = PeriodsWhenYouStoppedSmokingResponse success_url = reverse_lazy("questions:types_tobacco_smoking") - back_link_url = reverse_lazy("questions:age_when_started_smoking") + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:age_when_started_smoking") diff --git a/lung_cancer_screening/questions/views/relatives_age_when_diagnosed.py b/lung_cancer_screening/questions/views/relatives_age_when_diagnosed.py index b79bb8e1..44c1d76d 100644 --- a/lung_cancer_screening/questions/views/relatives_age_when_diagnosed.py +++ b/lung_cancer_screening/questions/views/relatives_age_when_diagnosed.py @@ -15,7 +15,6 @@ class RelativesAgeWhenDiagnosedView(LoginRequiredMixin, EnsureResponseSet, Ensur form_class = RelativesAgeWhenDiagnosedForm model = RelativesAgeWhenDiagnosedResponse success_url = reverse_lazy("questions:age_when_started_smoking") - back_link_url = reverse_lazy("questions:family_history_lung_cancer") def get(self, request, *args, **kwargs): if not ( @@ -25,3 +24,8 @@ def get(self, request, *args, **kwargs): ): return redirect(reverse("questions:family_history_lung_cancer")) return super().get(request, *args, **kwargs) + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:family_history_lung_cancer") diff --git a/lung_cancer_screening/questions/views/respiratory_conditions.py b/lung_cancer_screening/questions/views/respiratory_conditions.py index 6d4c8c68..d9400602 100644 --- a/lung_cancer_screening/questions/views/respiratory_conditions.py +++ b/lung_cancer_screening/questions/views/respiratory_conditions.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -13,5 +13,9 @@ class RespiratoryConditionsView(LoginRequiredMixin, EnsureResponseSet, EnsureEli form_class = RespiratoryConditionsForm model = RespiratoryConditionsResponse success_url = reverse_lazy("questions:asbestos_exposure") - back_link_url = reverse_lazy("questions:education") page_title = "Respiratory conditions – Check if you need a lung scan – NHS" + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:education") diff --git a/lung_cancer_screening/questions/views/sex_at_birth.py b/lung_cancer_screening/questions/views/sex_at_birth.py index 4ec045f1..890b3491 100644 --- a/lung_cancer_screening/questions/views/sex_at_birth.py +++ b/lung_cancer_screening/questions/views/sex_at_birth.py @@ -1,4 +1,4 @@ -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.mixins import LoginRequiredMixin from .mixins.ensure_response_set import EnsureResponseSet @@ -13,4 +13,8 @@ class SexAtBirthView(LoginRequiredMixin, EnsureResponseSet, EnsureEligibleMixin, form_class = SexAtBirthForm model = SexAtBirthResponse success_url = reverse_lazy("questions:ethnicity") - back_link_url = reverse_lazy("questions:gender") + + def get_back_link_url(self): + if self.is_changing_responses(): + return reverse("questions:responses") + return reverse("questions:gender") From 659ed731fa29ea8a236fd77474cca4610ce7f3ed Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 14:09:24 +0100 Subject: [PATCH 13/19] fix: update tests to be more specific --- .../questions/tests/unit/views/test_height.py | 37 ++++++++++--------- .../questions/tests/unit/views/test_weight.py | 37 ++++++++++--------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_height.py b/lung_cancer_screening/questions/tests/unit/views/test_height.py index b0abeb77..0c7e124b 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_height.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_height.py @@ -85,6 +85,25 @@ def test_renders_the_imperial_form_if_specified(self): self.assertContains(response, "Feet") self.assertContains(response, "Inches") + def test_back_link_url_is_check_your_answers_if_changing_responses(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:height"), {"change": "True"} + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_is_check_need_appointment_if_not_changing_responses(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:height") + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:check_need_appointment")) + + @tag("Height") class TestPostHeight(TestCase): @@ -174,21 +193,3 @@ def test_responds_with_422_if_the_response_fails_to_create(self): ) self.assertEqual(response.status_code, 422) - - def test_back_link_url_is_check_your_answers_if_changing_responses(self): - ResponseSetFactory.create(user=self.user, eligible=True) - - response = self.client.get( - reverse("questions:height"), {"change": "True"} - ) - - self.assertContains(response, reverse("questions:responses")) - - def test_back_link_url_is_check_need_appointment_if_not_changing_responses(self): - ResponseSetFactory.create(user=self.user, eligible=True) - - response = self.client.get( - reverse("questions:height") - ) - - self.assertContains(response, reverse("questions:check_need_appointment")) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_weight.py b/lung_cancer_screening/questions/tests/unit/views/test_weight.py index c66f8b17..5f9ecd4f 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_weight.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_weight.py @@ -85,6 +85,25 @@ def test_renders_the_imperial_form_if_specified(self): self.assertContains(response, "Stone") self.assertContains(response, "Pounds") + def test_back_link_url_is_responses_if_change_query_param_is_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:weight"), + {"change": "True"} + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) + + def test_back_link_url_is_height_if_change_query_param_is_not_true(self): + ResponseSetFactory.create(user=self.user, eligible=True) + + response = self.client.get( + reverse("questions:weight") + ) + + self.assertEqual(response.context_data["back_link_url"], reverse("questions:height")) + @tag("Weight") class TestPostWeight(TestCase): @@ -175,21 +194,3 @@ def test_responds_with_422_if_the_response_fails_to_create(self): self.assertEqual(response.status_code, 422) - def test_back_link_url_is_responses_if_change_query_param_is_true(self): - ResponseSetFactory.create(user=self.user, eligible=True) - - response = self.client.get( - reverse("questions:weight"), - {"change": "True"} - ) - - self.assertContains(response, reverse("questions:responses")) - - def test_back_link_url_is_height_if_change_query_param_is_not_true(self): - ResponseSetFactory.create(user=self.user, eligible=True) - - response = self.client.get( - reverse("questions:weight") - ) - - self.assertContains(response, reverse("questions:height")) From 5ca462ab1194996e9c4ac942d95fac6906c30901 Mon Sep 17 00:00:00 2001 From: Steph Housden <167300771+stephhou@users.noreply.github.com> Date: Mon, 30 Mar 2026 14:59:06 +0100 Subject: [PATCH 14/19] Update lung_cancer_screening/questions/tests/unit/views/test_periods_when_you_stopped_smoking.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Steph Housden <167300771+stephhou@users.noreply.github.com> --- .../tests/unit/views/test_periods_when_you_stopped_smoking.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_periods_when_you_stopped_smoking.py b/lung_cancer_screening/questions/tests/unit/views/test_periods_when_you_stopped_smoking.py index ce2d1917..a995a8c4 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_periods_when_you_stopped_smoking.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_periods_when_you_stopped_smoking.py @@ -47,13 +47,13 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) - def back_link_url_is_responses_if_change_query_param_is_true(self): + def test_back_link_url_is_responses_if_change_query_param_is_true(self): response = self.client.get( reverse("questions:periods_when_you_stopped_smoking", query={"change": "True"}) ) self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) - def back_link_url_is_age_when_started_smoking_if_change_query_param_is_not_true(self): + def test_back_link_url_is_age_when_started_smoking_if_change_query_param_is_not_true(self): response = self.client.get( reverse("questions:periods_when_you_stopped_smoking") ) From fb80a0540fc76d3c009f8243ae3ac853304e55e0 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 15:22:57 +0100 Subject: [PATCH 15/19] fix: renamed tests --- .../tests/unit/views/test_family_history_lung_cancer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_family_history_lung_cancer.py b/lung_cancer_screening/questions/tests/unit/views/test_family_history_lung_cancer.py index eb560100..45316db5 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_family_history_lung_cancer.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_family_history_lung_cancer.py @@ -45,7 +45,7 @@ def test_redirects_when_the_user_is_not_eligible(self): self.assertRedirects(response, reverse("questions:agree_terms_of_use")) - def back_link_url_is_responses_if_change_query_param_is_true(self): + def test_back_link_url_is_responses_if_change_query_param_is_true(self): ResponseSetFactory.create(user=self.user, eligible=True) response = self.client.get( @@ -53,7 +53,7 @@ def back_link_url_is_responses_if_change_query_param_is_true(self): ) self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) - def back_link_url_is_cancer_diagnosis_if_change_query_param_is_not_true(self): + def test_back_link_url_is_cancer_diagnosis_if_change_query_param_is_not_true(self): ResponseSetFactory.create(user=self.user, eligible=True) response = self.client.get( From f5640e9bbede95edb92402bc98093a50b683a3b1 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 15:25:11 +0100 Subject: [PATCH 16/19] fix: corrected indentaion --- .../unit/views/test_types_tobacco_smoking.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_types_tobacco_smoking.py b/lung_cancer_screening/questions/tests/unit/views/test_types_tobacco_smoking.py index 005f0472..ff80515a 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_types_tobacco_smoking.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_types_tobacco_smoking.py @@ -72,16 +72,16 @@ def test_get_back_link_url_returns_responses_url_if_changing_responses(self): ) def test_get_back_link_url_returns_periods_when_you_stopped_smoking_url_if_not_changing_responses(self): - ResponseSetFactory.create(user=self.user, eligible=True) + ResponseSetFactory.create(user=self.user, eligible=True) - response = self.client.get( - reverse("questions:types_tobacco_smoking") - ) + response = self.client.get( + reverse("questions:types_tobacco_smoking") + ) - self.assertEqual( - response.context_data["back_link_url"], - reverse("questions:periods_when_you_stopped_smoking") - ) + self.assertEqual( + response.context_data["back_link_url"], + reverse("questions:periods_when_you_stopped_smoking") + ) @tag("TypesTobaccoSmoking") From 0093c39c0004ee66dc4a5337876ce830bae6f312 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 15:27:10 +0100 Subject: [PATCH 17/19] fix: corrected test name --- .../questions/tests/unit/views/test_sex_at_birth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lung_cancer_screening/questions/tests/unit/views/test_sex_at_birth.py b/lung_cancer_screening/questions/tests/unit/views/test_sex_at_birth.py index fa7cce29..495691b6 100644 --- a/lung_cancer_screening/questions/tests/unit/views/test_sex_at_birth.py +++ b/lung_cancer_screening/questions/tests/unit/views/test_sex_at_birth.py @@ -53,7 +53,7 @@ def test_back_link_url_points_to_responses_if_change_query_param_is_true(self): self.assertEqual(response.context_data["back_link_url"], reverse("questions:responses")) - def test_back_link_url_points_to_agree_terms_of_use_if_change_query_param_is_not_true(self): + def test_back_link_url_points_to_gender_if_change_query_param_is_not_true(self): ResponseSetFactory.create(user=self.user, eligible=True) response = self.client.get( reverse("questions:sex_at_birth") From 530c738c020b797f9d7c49b49c0729bc507abf51 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 15:46:43 +0100 Subject: [PATCH 18/19] fix: corrected condition --- lung_cancer_screening/questions/views/question_base_view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lung_cancer_screening/questions/views/question_base_view.py b/lung_cancer_screening/questions/views/question_base_view.py index d97ea49a..c0dddb09 100644 --- a/lung_cancer_screening/questions/views/question_base_view.py +++ b/lung_cancer_screening/questions/views/question_base_view.py @@ -7,7 +7,7 @@ class QuestionBaseView(UpdateView): page_title = "Check if you need a lung scan – NHS" def is_changing_responses(self): - return bool(self.request.GET.get("change")) or bool(self.request.POST.get("change")) + return self.request.GET.get("change") == "True" or self.request.POST.get("change") == "True" def get_change_query_params(self): if not self.is_changing_responses(): From 5c1bc4da9651a179ca02bfbbe55caddc04672583 Mon Sep 17 00:00:00 2001 From: stephhou Date: Mon, 30 Mar 2026 16:24:14 +0100 Subject: [PATCH 19/19] fix: updated boolean --- lung_cancer_screening/questions/views/types_tobacco_smoking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lung_cancer_screening/questions/views/types_tobacco_smoking.py b/lung_cancer_screening/questions/views/types_tobacco_smoking.py index 60f718bc..f81da304 100644 --- a/lung_cancer_screening/questions/views/types_tobacco_smoking.py +++ b/lung_cancer_screening/questions/views/types_tobacco_smoking.py @@ -42,7 +42,7 @@ def get_success_url(self): ) def is_changing_responses(self): - return bool(self.request.GET.get("change")) or bool(self.request.POST.get("change")) + return self.request.GET.get("change") == "True" or self.request.POST.get("change") == "True" def get_back_link_url(self): if self.is_changing_responses():