Skip to content

Commit 143b7cc

Browse files
committed
PPHA-475: switch height to height_metric and remember imperial when going back
1 parent 63b84eb commit 143b7cc

File tree

12 files changed

+91
-79
lines changed

12 files changed

+91
-79
lines changed

lung_cancer_screening/questions/forms/imperial_height_form.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ def clean_height(self):
2323

2424
class Meta:
2525
model = ResponseSet
26-
fields = ['height_imperial', 'height']
26+
fields = ['height_imperial', 'height_metric']

lung_cancer_screening/questions/forms/metric_height_form.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ def __init__(self, *args, **kwargs):
1010
super().__init__(*args, **kwargs)
1111

1212
# Convert mm to cm for display
13-
if self.instance and self.instance.height is not None:
14-
self.initial['height'] = self.instance.height / 10
13+
if self.instance and self.instance.height_metric is not None:
14+
self.initial['height_metric'] = self.instance.height_metric / 10
1515

16-
self.fields["height"] = DecimalField(
16+
self.fields["height_metric"] = DecimalField(
1717
decimal_places=1,
1818
label="Centimetres",
1919
classes="nhsuk-input--width-4",
@@ -27,12 +27,12 @@ def __init__(self, *args, **kwargs):
2727
suffix="cm"
2828
)
2929

30-
def clean_height(self):
31-
return self.cleaned_data['height'] * 10
30+
def clean_height_metric(self):
31+
return self.cleaned_data['height_metric'] * 10
3232

3333
def clean_height_imperial(self):
3434
return None
3535

3636
class Meta:
3737
model = ResponseSet
38-
fields = ['height', 'height_imperial']
38+
fields = ['height_metric', 'height_imperial']

lung_cancer_screening/questions/jinja2/height.jinja

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
{% if unit == "imperial" %}
4141
{{ form.height_imperial.as_field_group() }}
4242
{% else %}
43-
{{ form.height.as_field_group() }}
43+
{{ form.height_metric.as_field_group() }}
4444
{% endif %}
4545

4646

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.2.9 on 2025-12-11 16:01
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('questions', '0022_remove_responseset_unique_unsubmitted_response_per_participant_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.RenameField(
14+
model_name='responseset',
15+
old_name='height',
16+
new_name='height_metric',
17+
),
18+
]

lung_cancer_screening/questions/models/response_set.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class ResponseSet(BaseModel):
7777
MIN_HEIGHT_METRIC = 1397
7878
MAX_HEIGHT_IMPERIAL = 96
7979
MIN_HEIGHT_IMPERIAL = 55
80-
height = models.PositiveIntegerField(null=True, blank=True, validators=[
80+
height_metric = models.PositiveIntegerField(null=True, blank=True, validators=[
8181
MinValueValidator(MIN_HEIGHT_METRIC, message="Height must be between 139.7cm and 243.8 cm"),
8282
MaxValueValidator(MAX_HEIGHT_METRIC, message="Height must be between 139.7cm and 243.8 cm"),
8383
])
@@ -163,8 +163,8 @@ def clean(self):
163163

164164
@property
165165
def formatted_height(self):
166-
if self.height:
167-
return f"{Decimal(self.height) / 10}cm"
166+
if self.height_metric:
167+
return f"{Decimal(self.height_metric) / 10}cm"
168168
elif self.height_imperial:
169169
value = Decimal(self.height_imperial)
170170
return f"{value // 12} feet {value % 12} inches"

lung_cancer_screening/questions/tests/unit/forms/test_imperial_height_form.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class TestImperialHeightForm(TestCase):
99
def setUp(self):
1010
self.user = UserFactory()
1111
self.response_set = ResponseSet(user=self.user)
12-
self.response_set.height = 1704
12+
self.response_set.height_metric = 1704
1313

1414
def test_is_valid_with_valid_input(self):
1515
form = ImperialHeightForm(
@@ -43,7 +43,7 @@ def test_setting_imperial_height_clears_height(self):
4343
}
4444
)
4545
form.save()
46-
self.assertEqual(self.response_set.height, None)
46+
self.assertEqual(self.response_set.height_metric, None)
4747

4848
def test_is_invalid_with_missing_data(self):
4949
form = ImperialHeightForm(

lung_cancer_screening/questions/tests/unit/forms/test_metric_height_form.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,42 @@ def setUp(self):
1212
self.response_set.height_imperial = 68
1313

1414
def test_is_valid_with_valid_input(self):
15-
height = "170.4"
15+
height_metric = "170.4"
1616
form = MetricHeightForm(
1717
instance=self.response_set,
1818
data={
19-
"height": height
19+
"height_metric": height_metric
2020
}
2121
)
2222
self.assertTrue(form.is_valid())
2323

2424
def test_converts_cm_to_mm_before_saving(self):
25-
height = "170.4"
25+
height_metric = "170.4"
2626
form = MetricHeightForm(
2727
instance=self.response_set,
2828
data={
29-
"height": height
29+
"height_metric": height_metric
3030
}
3131
)
3232

3333
form.is_valid()
34-
self.assertEqual(form.cleaned_data["height"], 1704)
34+
self.assertEqual(form.cleaned_data["height_metric"], 1704)
3535

3636
def test_converts_mm_to_cm_before_rendering(self):
37-
self.response_set.height = 1704
37+
self.response_set.height_metric = 1704
3838
form = MetricHeightForm(
3939
instance=self.response_set
4040
)
4141

42-
self.assertEqual(form["height"].value(), 170.4)
42+
self.assertEqual(form["height_metric"].value(), 170.4)
4343

4444

4545
def test_setting_height_clears_imperial_height(self):
46-
height = "170.4"
46+
height_metric = "170.4"
4747
form = MetricHeightForm(
4848
instance=self.response_set,
4949
data={
50-
"height": height
50+
"height_metric": height_metric
5151
}
5252
)
5353
form.save()
@@ -57,7 +57,7 @@ def test_is_invalid(self):
5757
form = MetricHeightForm(
5858
instance=self.response_set,
5959
data={
60-
"height": "invalid"
60+
"height_metric": "invalid"
6161
}
6262
)
6363
self.assertFalse(form.is_valid())
@@ -66,11 +66,11 @@ def test_is_invalid_with_multiple_decimal_places(self):
6666
form = MetricHeightForm(
6767
instance=self.response_set,
6868
data={
69-
"height": "170.45" # too many decimal places
69+
"height_metric": "170.45" # too many decimal places
7070
}
7171
)
7272
self.assertFalse(form.is_valid())
7373
self.assertEqual(
74-
form.errors["height"],
74+
form.errors["height_metric"],
7575
["Centimetres must be to 1 decimal place, for example 185.5cm"]
7676
)

lung_cancer_screening/questions/tests/unit/models/test_response_set.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ def test_has_date_of_birth_as_a_date(self):
3535
date
3636
)
3737

38-
def test_has_height_as_a_int(self):
39-
self.response_set.height = 1700
38+
def test_has_height_metric_as_a_int(self):
39+
self.response_set.height_metric = 1700
4040
self.response_set.save()
4141

4242
self.assertIsInstance(
43-
self.response_set.height,
43+
self.response_set.height_metric,
4444
int
4545
)
4646

@@ -149,7 +149,7 @@ def test_is_invalid_if_another_response_set_was_submitted_within_the_last_year(s
149149
)
150150

151151
def test_is_invalid_if_height_is_below_lower_bound(self):
152-
self.response_set.height = ResponseSet.MIN_HEIGHT_METRIC - 1
152+
self.response_set.height_metric = ResponseSet.MIN_HEIGHT_METRIC - 1
153153

154154
with self.assertRaises(ValidationError) as context:
155155
self.response_set.full_clean()
@@ -160,7 +160,7 @@ def test_is_invalid_if_height_is_below_lower_bound(self):
160160
)
161161

162162
def test_is_invalid_if_height_is_above_upper_bound(self):
163-
self.response_set.height = ResponseSet.MAX_HEIGHT_METRIC + 1
163+
self.response_set.height_metric = ResponseSet.MAX_HEIGHT_METRIC + 1
164164

165165
with self.assertRaises(ValidationError) as context:
166166
self.response_set.full_clean()
@@ -193,7 +193,7 @@ def test_is_invalid_if_imperial_height_is_above_upper_bound(self):
193193
)
194194

195195
def test_formatted_height_returns_height_in_cm_if_set(self):
196-
self.response_set.height = 1701
196+
self.response_set.height_metric = 1701
197197
self.response_set.save()
198198

199199
self.assertEqual(

lung_cancer_screening/questions/tests/unit/test_auth.py

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@
99

1010
User = get_user_model()
1111

12-
12+
@override_settings(
13+
OIDC_RP_CLIENT_PRIVATE_KEY=None, # Will be set per test
14+
OIDC_OP_TOKEN_ENDPOINT='https://auth.example.com/token',
15+
OIDC_RP_CLIENT_ID='test-client-id',
16+
OIDC_RP_REDIRECT_URI='https://app.example.com/callback',
17+
OIDC_RP_SIGN_ALGO='RS512',
18+
)
1319
class TestNHSLoginOIDCBackend(TestCase):
1420

1521
def setUp(self):
@@ -70,14 +76,6 @@ def test_update_user_returns_user(self):
7076

7177
self.assertEqual(result, user)
7278

73-
74-
@override_settings(
75-
OIDC_RP_CLIENT_PRIVATE_KEY=None, # Will be set per test
76-
OIDC_OP_TOKEN_ENDPOINT='https://auth.example.com/token',
77-
OIDC_RP_CLIENT_ID='test-client-id',
78-
OIDC_RP_REDIRECT_URI='https://app.example.com/callback',
79-
OIDC_RP_SIGN_ALGO='RS512',
80-
)
8179
@patch('lung_cancer_screening.questions.auth.requests.post')
8280
def test_get_token_success(self, mock_post):
8381
settings.OIDC_RP_CLIENT_PRIVATE_KEY = self.test_private_key_pem
@@ -115,12 +113,6 @@ def test_get_token_success(self, mock_post):
115113
data['redirect_uri'], 'https://app.example.com/somewhereelse'
116114
)
117115

118-
@override_settings(
119-
OIDC_RP_CLIENT_PRIVATE_KEY=None, # Will be set per test
120-
OIDC_OP_TOKEN_ENDPOINT='https://auth.example.com/token',
121-
OIDC_RP_CLIENT_ID='test-client-id',
122-
OIDC_RP_REDIRECT_URI='https://app.example.com/callback',
123-
)
124116
@patch('lung_cancer_screening.questions.auth.requests.post')
125117
def test_get_token_without_redirect_uri(self, mock_post):
126118
settings.OIDC_RP_CLIENT_PRIVATE_KEY = self.test_private_key_pem
@@ -142,9 +134,7 @@ def test_get_token_without_redirect_uri(self, mock_post):
142134
)
143135

144136
@override_settings(
145-
OIDC_RP_CLIENT_PRIVATE_KEY=None,
146-
OIDC_OP_TOKEN_ENDPOINT='https://auth.example.com/token',
147-
OIDC_RP_REDIRECT_URI='https://app.example.com/callback',
137+
OIDC_RP_CLIENT_PRIVATE_KEY=None, # Will be set per test
148138
)
149139
@patch('lung_cancer_screening.questions.auth.requests.post')
150140
def test_get_token_no_client_assertion(self, mock_post):
@@ -161,13 +151,6 @@ def test_get_token_no_client_assertion(self, mock_post):
161151
mock_parent_get_token.assert_called_once_with(token_payload)
162152
mock_post.assert_not_called()
163153

164-
@override_settings(
165-
OIDC_RP_CLIENT_PRIVATE_KEY=None, # Will be set per test
166-
OIDC_OP_TOKEN_ENDPOINT='https://auth.example.com/token',
167-
OIDC_RP_CLIENT_ID='test-client-id',
168-
OIDC_RP_REDIRECT_URI='https://app.example.com/callback',
169-
OIDC_RP_SIGN_ALGO='RS512',
170-
)
171154
@patch('lung_cancer_screening.questions.auth.requests.post')
172155
def test_get_token_nhs_login_error_response(self, mock_post):
173156
settings.OIDC_RP_CLIENT_PRIVATE_KEY = self.test_private_key_pem
@@ -189,13 +172,6 @@ def test_get_token_nhs_login_error_response(self, mock_post):
189172

190173
self.assertIn('Token request failed: 400', str(context.exception))
191174

192-
@override_settings(
193-
OIDC_RP_CLIENT_PRIVATE_KEY=None, # Will be set per test
194-
OIDC_OP_TOKEN_ENDPOINT='https://auth.example.com/token',
195-
OIDC_RP_CLIENT_ID='test-client-id',
196-
OIDC_RP_REDIRECT_URI='https://app.example.com/callback',
197-
OIDC_RP_SIGN_ALGO='RS512',
198-
)
199175
@patch('lung_cancer_screening.questions.auth.requests.post')
200176
def test_get_token_nhs_login_error_response_no_json(self, mock_post):
201177
settings.OIDC_RP_CLIENT_PRIVATE_KEY = self.test_private_key_pem

lung_cancer_screening/questions/tests/unit/views/test_height.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ class TestPostHeight(TestCase):
5959
def setUp(self):
6060
self.user = login_user(self.client)
6161

62-
self.valid_height = 170
63-
self.valid_params = {"height": self.valid_height}
62+
self.valid_height_metric = 170
63+
self.valid_params = {"height_metric": self.valid_height_metric}
6464
self.invalid_height = 80000
6565

6666
def test_post_redirects_if_the_user_is_not_logged_in(self):
@@ -88,7 +88,7 @@ def test_post_creates_unsubmitted_response_set_when_no_response_set_exists(
8888
response_set = self.user.responseset_set.first()
8989
self.assertEqual(self.user.responseset_set.count(), 1)
9090
self.assertEqual(response_set.submitted_at, None)
91-
self.assertEqual(response_set.height, self.valid_height * 10)
91+
self.assertEqual(response_set.height_metric, self.valid_height_metric * 10)
9292
self.assertEqual(response_set.user, self.user)
9393

9494
def test_post_updates_unsubmitted_response_set_when_one_exists(self):
@@ -102,7 +102,7 @@ def test_post_updates_unsubmitted_response_set_when_one_exists(self):
102102
response_set.refresh_from_db()
103103
self.assertEqual(self.user.responseset_set.count(), 1)
104104
self.assertEqual(response_set.submitted_at, None)
105-
self.assertEqual(response_set.height, self.valid_height * 10)
105+
self.assertEqual(response_set.height_metric, self.valid_height_metric * 10)
106106
self.assertEqual(response_set.user, self.user)
107107

108108
def test_post_creates_new_unsubmitted_response_set_when_submitted_exists_over_year_ago( # noqa: E501
@@ -122,7 +122,7 @@ def test_post_creates_new_unsubmitted_response_set_when_submitted_exists_over_ye
122122

123123
response_set = self.user.responseset_set.last()
124124
self.assertEqual(response_set.submitted_at, None)
125-
self.assertEqual(response_set.height, self.valid_height * 10)
125+
self.assertEqual(response_set.height_metric, self.valid_height_metric * 10)
126126
self.assertEqual(response_set.user, self.user)
127127

128128
def test_post_redirects_when_submitted_response_set_exists_within_last_year( # noqa: E501
@@ -147,7 +147,7 @@ def test_post_stores_a_valid_response_set_for_the_user(self):
147147

148148
response_set = self.user.responseset_set.first()
149149

150-
self.assertEqual(response_set.height, self.valid_height * 10)
150+
self.assertEqual(response_set.height_metric, self.valid_height_metric * 10)
151151
self.assertEqual(response_set.user, self.user)
152152

153153
def test_post_redirects_to_weight_path(self):

0 commit comments

Comments
 (0)