Skip to content

Commit 8833d4e

Browse files
authored
Merge pull request #121 from NHSDigital/PPHA-264-sex-at-birth-page
PPHA-264: Add sex-at-birth page
2 parents 1d3e841 + 8eaaaba commit 8833d4e

21 files changed

+337
-108
lines changed

lung_cancer_screening/core/tests/acceptance/helpers/user_interaction_helpers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,11 @@ def fill_in_and_submit_weight_imperial(page, stone, pounds):
5252
page.get_by_label("Pounds").fill(str(pounds))
5353

5454
page.click("text=Continue")
55+
56+
def fill_in_and_submit_sex_at_birth(page, sex):
57+
expect(page.locator("legend")).to_have_text(
58+
"What was your sex at birth?")
59+
60+
page.get_by_label(sex, exact=True).check()
61+
62+
page.click("text=Continue")

lung_cancer_screening/core/tests/acceptance/test_cannot_change_answers_after_submission.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
fill_in_and_submit_weight_metric,
1010
fill_in_and_submit_participant_id,
1111
fill_in_and_submit_smoking_eligibility,
12-
fill_in_and_submit_date_of_birth
12+
fill_in_and_submit_date_of_birth,
13+
fill_in_and_submit_sex_at_birth
1314
)
1415

1516
class TestQuestionnaire(StaticLiveServerTestCase):
@@ -40,6 +41,7 @@ def test_cannot_change_responses_once_checked_and_submitted(self):
4041
fill_in_and_submit_date_of_birth(page, age)
4142
fill_in_and_submit_height_metric(page, "170")
4243
fill_in_and_submit_weight_metric(page, "25.4")
44+
fill_in_and_submit_sex_at_birth(page, "Male")
4345

4446
page.click("text=Submit")
4547

lung_cancer_screening/core/tests/acceptance/test_questionnaire.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
fill_in_and_submit_smoking_eligibility,
1212
fill_in_and_submit_date_of_birth,
1313
fill_in_and_submit_weight_metric,
14-
fill_in_and_submit_weight_imperial
14+
fill_in_and_submit_weight_imperial,
15+
fill_in_and_submit_sex_at_birth
1516
)
1617

1718
from .helpers.assertion_helpers import expect_back_link_to_have_url
@@ -49,43 +50,45 @@ def test_full_questionnaire_user_journey(self):
4950

5051
expect(page).to_have_url(
5152
f"{self.live_server_url}/have-you-ever-smoked")
52-
53+
expect_back_link_to_have_url(page, "/start")
5354
fill_in_and_submit_smoking_eligibility(page, smoking_status)
5455

5556
expect(page).to_have_url(f"{self.live_server_url}/date-of-birth")
5657
expect_back_link_to_have_url(page, "/have-you-ever-smoked")
57-
5858
fill_in_and_submit_date_of_birth(page, age)
5959

6060
expect(page).to_have_url(f"{self.live_server_url}/height")
61-
61+
expect_back_link_to_have_url(page, "/date-of-birth")
6262
fill_in_and_submit_height_metric(page, height)
6363

64-
expect(page).to_have_url(f"{self.live_server_url}/weight")
65-
6664
page.click("text=Back")
67-
6865
expect(page).to_have_url(f"{self.live_server_url}/height")
69-
7066
page.click("text=Switch to imperial")
71-
7267
fill_in_and_submit_height_imperial(page, feet, inches)
7368

7469
expect(page).to_have_url(f"{self.live_server_url}/weight")
75-
70+
expect_back_link_to_have_url(page, "/height")
7671
fill_in_and_submit_weight_metric(page, weight_metric)
77-
78-
expect(page).to_have_url(f"{self.live_server_url}/responses")
7972
page.click("text=Back")
73+
74+
expect(page).to_have_url(f"{self.live_server_url}/weight")
8075
page.get_by_role("link", name="Switch to stone and pounds").click()
8176
fill_in_and_submit_weight_imperial(page, weight_stone, weight_pound)
77+
78+
expect(page).to_have_url(f"{self.live_server_url}/sex-at-birth")
79+
expect_back_link_to_have_url(page, "/weight")
80+
fill_in_and_submit_sex_at_birth(page, "Male")
81+
8282
expect(page).to_have_url(f"{self.live_server_url}/responses")
83+
expect_back_link_to_have_url(page, "/sex-at-birth")
84+
8385
responses = page.locator(".responses")
8486
expect(responses).to_contain_text("Have you ever smoked? Yes, I used to smoke regularly")
8587
expect(responses).to_contain_text(
8688
age.strftime("What is your date of birth? %Y-%m-%d"))
8789
expect(responses).to_contain_text(f"What is your height? {feet} feet {inches} inches")
8890
expect(responses).to_contain_text(f"What is your weight? {weight_stone} stone {weight_pound} pound")
91+
expect(responses).to_contain_text("What was your sex at birth? Male")
8992

9093
page.click("text=Submit")
9194

lung_cancer_screening/nhsuk_forms/choice_field.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
from django import forms
22
from django.forms import widgets
33

4-
from .bound_choice_field import BoundChoiceField
5-
64
class ChoiceField(forms.ChoiceField):
75
"""
86
A ChoiceField that renders using NHS.UK design system radios/select
97
components.
108
"""
119

1210
widget = widgets.RadioSelect
13-
bound_field_class = BoundChoiceField
1411

1512
def __init__(
1613
self,

lung_cancer_screening/nhsuk_forms/jinja2/radios.jinja

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,12 @@
55
{% endif %}
66
{% set ns = namespace(items=[]) %}
77
{% for value, text in unbound_field.choices %}
8-
{% set conditional_html = field.conditional_html(value) %}
98
{% set ns.items = ns.items + [{
109
"id": field.auto_id if loop.first,
1110
"value": value,
1211
"text": text,
13-
"checked": field.value() == value,
14-
"conditional": {
15-
"html": conditional_html
16-
} if conditional_html else undefined
12+
"checked": field.value() == value
1713
}] %}
18-
{% set divider = field.get_divider_after(value) %}
19-
{% if divider %}
20-
{% set ns.items = ns.items + [{"divider": divider}] %}
21-
{% endif %}
2214
{% endfor %}
2315
{{ radios({
2416
"name": field.html_name,

lung_cancer_screening/nhsuk_forms/tests/unit/test_choice_field.py

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -38,41 +38,3 @@ def test_renders_nhs_radios(self):
3838
</div>
3939
""",
4040
)
41-
42-
def test_renders_radios_with_conditional_html(self):
43-
form = TestForm()
44-
form["field"].add_conditional_html("b", "<p>Hello</p>")
45-
46-
self.assertHTMLEqual(
47-
form["field"].as_field_group(),
48-
"""
49-
<div class="nhsuk-form-group">
50-
<fieldset aria-describedby="id_field-hint" class="nhsuk-fieldset">
51-
<legend class="nhsuk-fieldset__legend app-abc">
52-
Abc
53-
</legend>
54-
<div class="nhsuk-hint" id="id_field-hint">
55-
Pick either one
56-
</div>
57-
<div class="nhsuk-radios nhsuk-radios--conditional" data-module="nhsuk-radios">
58-
<div class="nhsuk-radios__item">
59-
<input class="nhsuk-radios__input" id="id_field" name="field" type="radio" value="a">
60-
<label class="nhsuk-label nhsuk-radios__label" for="id_field">A</label>
61-
</div>
62-
<div class="nhsuk-radios__item">
63-
<input aria-controls="conditional-id_field-2" aria-expanded="false" class="nhsuk-radios__input" id="id_field-2" name="field" type="radio" value="b">
64-
<label class="nhsuk-label nhsuk-radios__label" for="id_field-2">B</label>
65-
</div>
66-
<div class="nhsuk-radios__conditional nhsuk-radios__conditional--hidden" id="conditional-id_field-2">
67-
<p>Hello</p>
68-
</div>
69-
</div>
70-
</fieldset>
71-
</div>
72-
""",
73-
)
74-
75-
def test_adding_dividers_via_boundfield(self):
76-
bound_field = TestForm()["field"]
77-
bound_field.add_divider_after("a", "or")
78-
assert bound_field.get_divider_after("a") == "or"

lung_cancer_screening/nhsuk_forms/tests/unit/test_typed_choice_field.py

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from ...typed_choice_field import TypedChoiceField
55

6-
76
class TestForm(Form):
87
field = TypedChoiceField(
98
label="Abc",
@@ -39,41 +38,3 @@ def test_renders_nhs_radios(self):
3938
</div>
4039
""",
4140
)
42-
43-
def test_renders_radios_with_conditional_html(self):
44-
form = TestForm()
45-
form["field"].add_conditional_html("b", "<p>Hello</p>")
46-
47-
self.assertHTMLEqual(
48-
form["field"].as_field_group(),
49-
"""
50-
<div class="nhsuk-form-group">
51-
<fieldset aria-describedby="id_field-hint" class="nhsuk-fieldset">
52-
<legend class="nhsuk-fieldset__legend app-abc">
53-
Abc
54-
</legend>
55-
<div class="nhsuk-hint" id="id_field-hint">
56-
Pick either one
57-
</div>
58-
<div class="nhsuk-radios nhsuk-radios--conditional" data-module="nhsuk-radios">
59-
<div class="nhsuk-radios__item">
60-
<input class="nhsuk-radios__input" id="id_field" name="field" type="radio" value="a">
61-
<label class="nhsuk-label nhsuk-radios__label" for="id_field">A</label>
62-
</div>
63-
<div class="nhsuk-radios__item">
64-
<input aria-controls="conditional-id_field-2" aria-expanded="false" class="nhsuk-radios__input" id="id_field-2" name="field" type="radio" value="b">
65-
<label class="nhsuk-label nhsuk-radios__label" for="id_field-2">B</label>
66-
</div>
67-
<div class="nhsuk-radios__conditional nhsuk-radios__conditional--hidden" id="conditional-id_field-2">
68-
<p>Hello</p>
69-
</div>
70-
</div>
71-
</fieldset>
72-
</div>
73-
""",
74-
)
75-
76-
def test_adding_dividers_via_boundfield(self):
77-
bound_field = TestForm()["field"]
78-
bound_field.add_divider_after("a", "or")
79-
assert bound_field.get_divider_after("a") == "or"
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from django import forms
2+
3+
from ...nhsuk_forms.typed_choice_field import TypedChoiceField
4+
from ..models.response_set import ResponseSet, SexAtBirthValues
5+
6+
class SexAtBirthForm(forms.ModelForm):
7+
8+
def __init__(self, *args, **kwargs):
9+
self.participant = kwargs.pop('participant')
10+
super().__init__(*args, **kwargs)
11+
self.instance.participant = self.participant
12+
13+
self.fields["sex_at_birth"] = TypedChoiceField(
14+
choices=SexAtBirthValues.choices,
15+
widget=forms.RadioSelect,
16+
label="What was your sex at birth?",
17+
label_classes="nhsuk-fieldset__legend--m",
18+
hint="Your sex may impact your chances of developing lung cancer.",
19+
error_messages={
20+
'required': 'Select your sex at birth.'
21+
}
22+
)
23+
24+
class Meta:
25+
model = ResponseSet
26+
fields = ['sex_at_birth']

lung_cancer_screening/questions/jinja2/have_you_ever_smoked.jinja

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
{% extends 'layout.jinja' %}
22
{% from 'nhsuk/components/button/macro.jinja' import button %}
33
{% from 'nhsuk/components/radios/macro.jinja' import radios %}
4+
{% from 'nhsuk/components/back-link/macro.jinja' import backLink %}
5+
6+
{% block beforeContent %}
7+
{{
8+
backLink({
9+
"href": url("questions:start"),
10+
"text": "Back"
11+
})
12+
}}
13+
{% endblock beforeContent %}
414

515
{% block content %}
616
<div class="nhsuk-grid-row">

lung_cancer_screening/questions/jinja2/responses.jinja

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
{% block beforeContent %}
66
{{
77
backLink({
8-
"href": url("questions:weight"),
8+
"href": url("questions:sex_at_birth"),
99
"text": "Back"
1010
})
1111
}}
@@ -20,6 +20,7 @@
2020
<li>What is your date of birth? {{ response_set.date_of_birth }}</li>
2121
<li>What is your height? {{ response_set.formatted_height }}</li>
2222
<li>What is your weight? {{ response_set.formatted_weight }}</li>
23+
<li>What was your sex at birth? {{ response_set.get_sex_at_birth_display() }}</li>
2324
</ul>
2425

2526
<form action="{{ request.path }}" method="post">

0 commit comments

Comments
 (0)