Skip to content

Commit 9d6cdbe

Browse files
authored
Merge pull request #742 from NHSDigital/DTOSS-11447-add-implants-and-augmentation
Add details of breast implants or augmentation form
2 parents b4fc45f + 5a2be26 commit 9d6cdbe

17 files changed

+1006
-6
lines changed

manage_breast_screening/data/east_tester_one_week_ago_clinic_data.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ clinic:
135135
- OTHER_AUGMENTATION
136136
- left_breast_procedures:
137137
- NO_PROCEDURES
138+
- implants_have_been_removed: False
138139
- id: 848c9ecf-94af-45f7-b072-29ba1f82d24b
139140
duration_in_minutes: 8
140141
starts_at_time: 09:32

manage_breast_screening/data/east_tester_today_clinic_data.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ clinic:
6767
- id: 5c3d6f4e-3f4b-4e2a-9f7b-2d6e8f4c9a1b
6868
treatment: NO_TREATMENT
6969
additional_details: Diagnosed in 2022, monitored regularly.
70+
breast_augmentation_history_items:
71+
- id: d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f7a
72+
right_breast_procedures: [BREAST_IMPLANTS]
73+
left_breast_procedures: [BREAST_IMPLANTS]
74+
procedure_year: 2015
7075
- id: aa1b4c5c-3742-4f97-aa68-04a6f3bd631b
7176
duration_in_minutes: 8
7277
starts_at_time: 09:08

manage_breast_screening/mammograms/forms/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .appointment_cannot_go_ahead_form import AppointmentCannotGoAheadForm
22
from .ask_for_medical_information_form import AskForMedicalInformationForm
3+
from .breast_augmentation_history_form import BreastAugmentationHistoryForm
34
from .cyst_history_form import CystHistoryForm
45
from .implanted_medical_device_history_form import ImplantedMedicalDeviceHistoryForm
56
from .record_medical_information_form import RecordMedicalInformationForm
@@ -12,6 +13,7 @@
1213
__all__ = [
1314
"AppointmentCannotGoAheadForm",
1415
"AskForMedicalInformationForm",
16+
"BreastAugmentationHistoryForm",
1517
"CystHistoryForm",
1618
"RecordMedicalInformationForm",
1719
"ScreeningAppointmentForm",
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
import datetime
2+
3+
from django import forms
4+
from django.forms import Form
5+
from django.forms.widgets import Textarea
6+
7+
from manage_breast_screening.core.services.auditor import Auditor
8+
from manage_breast_screening.nhsuk_forms.fields import (
9+
BooleanField,
10+
CharField,
11+
IntegerField,
12+
)
13+
from manage_breast_screening.nhsuk_forms.fields.choice_fields import (
14+
MultipleChoiceField,
15+
)
16+
from manage_breast_screening.participants.models.breast_augmentation_history_item import (
17+
BreastAugmentationHistoryItem,
18+
)
19+
20+
21+
class BreastAugmentationHistoryForm(Form):
22+
right_breast_procedures = MultipleChoiceField(
23+
label="Right breast",
24+
label_classes="nhsuk-fieldset__legend--s",
25+
choices=BreastAugmentationHistoryItem.Procedure,
26+
error_messages={
27+
"required": "Select procedures for the right breast",
28+
},
29+
exclusive_choices={"NO_PROCEDURES"},
30+
)
31+
left_breast_procedures = MultipleChoiceField(
32+
label="Left breast",
33+
label_classes="nhsuk-fieldset__legend--s",
34+
choices=BreastAugmentationHistoryItem.Procedure,
35+
error_messages={
36+
"required": "Select procedures for the left breast",
37+
},
38+
exclusive_choices={"NO_PROCEDURES"},
39+
)
40+
implants_have_been_removed = BooleanField(
41+
required=False,
42+
label="Implants have been removed",
43+
classes="app-checkboxes",
44+
)
45+
additional_details = CharField(
46+
hint="Include any other relevant information about the procedure",
47+
required=False,
48+
label="Additional details (optional)",
49+
label_classes="nhsuk-label--m",
50+
widget=Textarea(attrs={"rows": 4}),
51+
max_words=500,
52+
error_messages={"max_words": "Additional details must be 500 words or less"},
53+
)
54+
55+
def __init__(self, *args, participant, **kwargs):
56+
super().__init__(*args, **kwargs)
57+
58+
# if entered, years should be between 80 years ago and this year
59+
max_year = datetime.date.today().year
60+
min_year = max_year - 80
61+
year_outside_range_error_message = (
62+
f"Year should be between {min_year} and {max_year}."
63+
)
64+
year_invalid_format_error_message = "Enter year as a number."
65+
66+
self.fields["procedure_year"] = IntegerField(
67+
hint="Leave blank if unknown",
68+
required=False,
69+
label="Year of procedure (optional)",
70+
label_classes="nhsuk-label--m",
71+
classes="nhsuk-input--width-4",
72+
min_value=min_year,
73+
max_value=max_year,
74+
error_messages={
75+
"min_value": year_outside_range_error_message,
76+
"max_value": year_outside_range_error_message,
77+
"invalid": year_invalid_format_error_message,
78+
},
79+
)
80+
self.fields["removal_year"] = IntegerField(
81+
required=False,
82+
label="Year removed (if available)",
83+
classes="nhsuk-input--width-4",
84+
min_value=min_year,
85+
max_value=max_year,
86+
error_messages={
87+
"min_value": year_outside_range_error_message,
88+
"max_value": year_outside_range_error_message,
89+
"invalid": year_invalid_format_error_message,
90+
},
91+
)
92+
93+
def model_values(self):
94+
return dict(
95+
left_breast_procedures=self.cleaned_data.get("left_breast_procedures", []),
96+
right_breast_procedures=self.cleaned_data.get(
97+
"right_breast_procedures", []
98+
),
99+
implants_have_been_removed=self.cleaned_data.get(
100+
"implants_have_been_removed"
101+
),
102+
removal_year=self.cleaned_data.get("removal_year"),
103+
procedure_year=self.cleaned_data.get("procedure_year", ""),
104+
additional_details=self.cleaned_data.get("additional_details", ""),
105+
)
106+
107+
def create(self, appointment, request):
108+
auditor = Auditor.from_request(request)
109+
field_values = self.model_values()
110+
breast_augmentation_history = (
111+
appointment.breast_augmentation_history_items.create(
112+
appointment=appointment,
113+
**field_values,
114+
)
115+
)
116+
auditor.audit_create(breast_augmentation_history)
117+
118+
return breast_augmentation_history
119+
120+
def full_clean(self):
121+
# if a removal_year is provided then remove it if implants_have_been_removed is False
122+
if self.data.get("removal_year") and not self.data.get(
123+
"implants_have_been_removed"
124+
):
125+
# makes QueryDict mutable
126+
self.data = self.data.copy()
127+
self.data["removal_year"] = None
128+
if hasattr(self.data, "_mutable"):
129+
self.data._mutable = False
130+
131+
super().full_clean()
132+
133+
def clean(self):
134+
cleaned_data = super().clean()
135+
procedure_year = cleaned_data.get("procedure_year")
136+
removal_year = cleaned_data.get("removal_year")
137+
138+
if procedure_year and removal_year and procedure_year > removal_year:
139+
self.add_error(
140+
"removal_year",
141+
forms.ValidationError(
142+
message="Year removed cannot be before year of procedure",
143+
code="required",
144+
),
145+
)
146+
147+
return cleaned_data
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{% extends "layout-form.jinja" %}
2+
{% from "nhsuk/components/button/macro.jinja" import button %}
3+
{% from "nhsuk/components/fieldset/macro.jinja" import fieldset %}
4+
5+
{% block form %}
6+
<h2 aria-hidden="true">What procedures has {{ participant_first_name }} had?</h2>
7+
<div class="nhsuk-grid-row">
8+
<div class="nhsuk-grid-column-one-half">
9+
{% do form.right_breast_procedures.add_divider_after("OTHER_AUGMENTATION", "or") %}
10+
{{ form.right_breast_procedures.as_field_group() }}
11+
</div>
12+
<div class="nhsuk-grid-column-one-half">
13+
{% do form.left_breast_procedures.add_divider_after("OTHER_AUGMENTATION", "or") %}
14+
{{ form.left_breast_procedures.as_field_group() }}
15+
</div>
16+
</div>
17+
18+
{{ form.procedure_year.as_field_group() }}
19+
20+
{% do form.implants_have_been_removed.add_conditional_html('true', form.removal_year.as_field_group()) %}
21+
{% call fieldset({
22+
"legend": {
23+
"text": "Removed devices",
24+
"classes": "nhsuk-fieldset__legend--m"
25+
}
26+
}) %}
27+
{{ form.implants_have_been_removed.as_field_group() }}
28+
{% endcall %}
29+
30+
{{ form.additional_details.as_field_group() }}
31+
32+
<div class="nhsuk-button-group">
33+
{{ button({
34+
"text": "Save"
35+
}) }}
36+
</div>
37+
{% endblock %}
38+

manage_breast_screening/mammograms/jinja2/mammograms/record_medical_information.jinja

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
{% for presented_item in presenter.breast_augmentation_history %}
5757
{{ summaryList(presented_item.summary_list_params) }}
5858
{% endfor %}
59+
<a href="{{ presenter.add_breast_augmentation_history_link.href }}" class="nhsuk-link nhsuk-link--no-visited-state">{{ presenter.add_breast_augmentation_history_link.text }}</a><br>
5960
{% endset %}
6061

6162
{% set other_procedure_history_html %}

manage_breast_screening/mammograms/presenters/medical_information_presenter.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,15 @@ def add_cyst_history_link(self):
173173
"href": url,
174174
"text": ("Add cyst history"),
175175
}
176+
177+
@property
178+
def add_breast_augmentation_history_link(self):
179+
url = reverse(
180+
"mammograms:add_breast_augmentation_history_item",
181+
kwargs={"pk": self.appointment.pk},
182+
)
183+
184+
return {
185+
"href": url,
186+
"text": ("Add breast augmentation history"),
187+
}

0 commit comments

Comments
 (0)