Skip to content

Commit c037265

Browse files
committed
make 'Year removed' optional for 'Implanted device has been removed'
1 parent 2b67447 commit c037265

File tree

14 files changed

+256
-110
lines changed

14 files changed

+256
-110
lines changed

manage_breast_screening/data/east_tester_today_clinic_data.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ clinic:
4747
device: OTHER_MEDICAL_DEVICE
4848
other_medical_device_details: Lorem ipsum dolor sit amet
4949
procedure_year: 2005
50+
device_has_been_removed: true
5051
removal_year: 2010
5152
additional_details: Recalled device, removed in 2010
5253
other_procedure_history_items:

manage_breast_screening/mammograms/forms/implanted_medical_device_history_form.py

Lines changed: 49 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,73 @@
1-
import datetime
2-
31
from django import forms
4-
from django.db.models import TextChoices
52
from django.forms.widgets import Textarea
63

74
from manage_breast_screening.core.services.auditor import Auditor
85
from manage_breast_screening.nhsuk_forms.fields import (
6+
BooleanField,
97
CharField,
108
ChoiceField,
11-
IntegerField,
12-
)
13-
from manage_breast_screening.nhsuk_forms.fields.choice_fields import (
14-
MultipleChoiceField,
9+
YearField,
1510
)
1611
from manage_breast_screening.nhsuk_forms.forms import FormWithConditionalFields
1712
from manage_breast_screening.participants.models.implanted_medical_device_history_item import (
1813
ImplantedMedicalDeviceHistoryItem,
1914
)
2015

2116

22-
class RemovalStatusChoices(TextChoices):
23-
HAS_BEEN_REMOVED = "HAS_BEEN_REMOVED", "Implanted device has been removed"
24-
25-
2617
class ImplantedMedicalDeviceHistoryForm(FormWithConditionalFields):
18+
other_medical_device_details = CharField(
19+
required=False,
20+
label="Provide details",
21+
error_messages={"required": "Provide details of the device"},
22+
classes="nhsuk-u-width-two-thirds",
23+
)
24+
procedure_year = YearField(
25+
hint="Leave blank if unknown",
26+
required=False,
27+
label="Year of procedure (optional)",
28+
label_classes="nhsuk-label--m",
29+
classes="nhsuk-input--width-4",
30+
)
31+
device_has_been_removed = BooleanField(
32+
required=False,
33+
label="Implanted device has been removed",
34+
classes="app-checkboxes",
35+
)
36+
removal_year = YearField(
37+
required=False,
38+
label="Year removed (if available)",
39+
classes="nhsuk-input--width-4",
40+
)
41+
additional_details = CharField(
42+
hint="Include any other relevant information about the device or procedure",
43+
required=False,
44+
label="Additional details (optional)",
45+
label_classes="nhsuk-label--m",
46+
widget=Textarea(attrs={"rows": 4}),
47+
max_words=500,
48+
error_messages={"max_words": "Additional details must be 500 words or less"},
49+
)
50+
2751
def __init__(self, *args, participant, **kwargs):
2852
super().__init__(*args, **kwargs)
2953

30-
# if entered, years should be between 80 years ago and this year
31-
max_year = datetime.date.today().year
32-
min_year = max_year - 80
33-
year_outside_range_error_message = (
34-
f"Year should be between {min_year} and {max_year}."
35-
)
36-
year_invalid_format_error_message = "Enter year as a number."
37-
3854
self.fields["device"] = ChoiceField(
3955
choices=ImplantedMedicalDeviceHistoryItem.Device,
4056
label=f"What device does {participant.first_name} have?",
4157
error_messages={"required": "Select the device type"},
4258
)
43-
self.fields["other_medical_device_details"] = CharField(
44-
required=False,
45-
label="Provide details",
46-
error_messages={"required": "Provide details of the device"},
47-
classes="nhsuk-u-width-two-thirds",
48-
)
49-
self.fields["procedure_year"] = IntegerField(
50-
hint="Leave blank if unknown",
51-
required=False,
52-
label="Year of procedure (optional)",
53-
label_classes="nhsuk-label--m",
54-
classes="nhsuk-input--width-4",
55-
min_value=min_year,
56-
max_value=max_year,
57-
error_messages={
58-
"min_value": year_outside_range_error_message,
59-
"max_value": year_outside_range_error_message,
60-
"invalid": year_invalid_format_error_message,
61-
},
62-
)
63-
self.fields["removal_status"] = MultipleChoiceField(
64-
required=False,
65-
choices=RemovalStatusChoices,
66-
widget=forms.CheckboxSelectMultiple,
67-
label="Removed implants",
68-
classes="app-checkboxes",
69-
)
70-
self.fields["removal_year"] = IntegerField(
71-
required=False,
72-
label="Year removed",
73-
classes="nhsuk-input--width-4",
74-
min_value=min_year,
75-
max_value=max_year,
76-
error_messages={
77-
"required": "Enter the year the device was removed",
78-
"min_value": year_outside_range_error_message,
79-
"max_value": year_outside_range_error_message,
80-
"invalid": year_invalid_format_error_message,
81-
},
82-
)
83-
self.fields["additional_details"] = CharField(
84-
hint="Include any other relevant information about the device or procedure",
85-
required=False,
86-
label="Additional details (optional)",
87-
label_classes="nhsuk-label--m",
88-
widget=Textarea(attrs={"rows": 4}),
89-
max_words=500,
90-
error_messages={
91-
"max_words": "Additional details must be 500 words or less"
92-
},
93-
)
9459

9560
self.given_field_value(
9661
"device", ImplantedMedicalDeviceHistoryItem.Device.OTHER_MEDICAL_DEVICE
9762
).require_field("other_medical_device_details")
98-
self.given_field_value(
99-
"removal_status", RemovalStatusChoices.HAS_BEEN_REMOVED
100-
).require_field("removal_year")
10163

10264
def model_values(self):
10365
return dict(
10466
device=self.cleaned_data.get("device", ""),
10567
other_medical_device_details=self.cleaned_data.get(
10668
"other_medical_device_details", ""
10769
),
70+
device_has_been_removed=self.cleaned_data.get("device_has_been_removed"),
10871
removal_year=self.cleaned_data.get("removal_year", ""),
10972
procedure_year=self.cleaned_data.get("procedure_year", ""),
11073
additional_details=self.cleaned_data.get("additional_details", ""),
@@ -125,6 +88,19 @@ def create(self, appointment, request):
12588

12689
return implanted_medical_device_history
12790

91+
def full_clean(self):
92+
# if a removal_year is provided then remove it if device_has_been_removed is False
93+
if self.data.get("removal_year") and not self.data.get(
94+
"device_has_been_removed"
95+
):
96+
# makes QueryDict mutable
97+
self.data = self.data.copy()
98+
self.data["removal_year"] = None
99+
if hasattr(self.data, "_mutable"):
100+
self.data._mutable = False
101+
102+
super().full_clean()
103+
128104
def clean(self):
129105
cleaned_data = super().clean()
130106
procedure_year = cleaned_data.get("procedure_year")

manage_breast_screening/mammograms/jinja2/mammograms/medical_information/medical_history/forms/implanted_medical_device_history.jinja

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,19 @@
33
{% from "nhsuk/components/fieldset/macro.jinja" import fieldset %}
44

55
{% block form %}
6-
{% do form.device.add_conditional_html('OTHER_MEDICAL_DEVICE', form.other_medical_device_details.as_field_group()) %}
7-
8-
{% do form.removal_status.add_conditional_html('HAS_BEEN_REMOVED', form.removal_year.as_field_group()) %}
9-
106
{{ form.device.as_field_group() }}
117

128
{{ form.procedure_year.as_field_group() }}
139

14-
{{ form.removal_status.as_field_group() }}
10+
{% do form.device_has_been_removed.add_conditional_html('true', form.removal_year.as_field_group()) %}
11+
{% call fieldset({
12+
"legend": {
13+
"text": "Removed implants",
14+
"classes": "nhsuk-fieldset__legend--m"
15+
}
16+
}) %}
17+
{{ form.device_has_been_removed.as_field_group() }}
18+
{% endcall %}
1519

1620
{{ form.additional_details.as_field_group() }}
1721

manage_breast_screening/mammograms/presenters/implanted_medical_device_history_item_presenter.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ def __init__(self, implanted_medical_device_history_item):
1212
self._item.other_medical_device_details or "N/A"
1313
)
1414
self.procedure_year = str(self._item.procedure_year)
15-
self.removal_year = str(self._item.removal_year) or "N/A"
15+
self.device_has_been_removed = (
16+
"Yes" if self._item.device_has_been_removed else "No"
17+
)
18+
if self._item.device_has_been_removed and self._item.removal_year:
19+
self.device_has_been_removed += f" ({self._item.removal_year})"
1620
self.additional_details = nl2br(self._item.additional_details)
1721

1822
@property
@@ -33,8 +37,10 @@ def summary_list_params(self):
3337
"value": {"html": self.procedure_year},
3438
},
3539
{
36-
"key": {"text": "Removal year"},
37-
"value": {"html": self.removal_year},
40+
"key": {"text": "Device has been removed"},
41+
"value": {
42+
"html": self.device_has_been_removed,
43+
},
3844
},
3945
{
4046
"key": {"text": "Additional details"},

0 commit comments

Comments
 (0)