Skip to content

Commit 1ebf07b

Browse files
committed
Merge branch 'develop' of github.com:NHSDigital/NRLF into feature/eema1-NRL-1075-multiCategorySearch
2 parents 22e931b + af36c46 commit 1ebf07b

19 files changed

+1517
-370
lines changed

api/producer/createDocumentReference/create_document_reference.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from nrlf.core.constants import (
55
PERMISSION_AUDIT_DATES_FROM_PAYLOAD,
66
PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL,
7-
TYPE_CATEGORIES,
87
)
98
from nrlf.core.decorators import request_handler
109
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
@@ -91,19 +90,6 @@ def _check_permissions(
9190
expression="type.coding[0].code",
9291
)
9392

94-
type_category = TYPE_CATEGORIES.get(core_model.type)
95-
if type_category != core_model.category:
96-
logger.log(
97-
LogReference.PROCREATE005a,
98-
ods_code=metadata.ods_code,
99-
type=core_model.type,
100-
category=core_model.category,
101-
)
102-
return SpineErrorResponse.BAD_REQUEST(
103-
diagnostics=f"The Category code of the provided document '{core_model.category}' must match the allowed category for pointer type '{core_model.type}' with a category value of '{type_category}'",
104-
expression="category.coding[0].code",
105-
)
106-
10793

10894
def _get_document_ids_to_supersede(
10995
resource: DocumentReference,

api/producer/createDocumentReference/tests/test_create_document_reference.py

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
from unittest.mock import patch
23

34
from freeze_uuid import freeze_uuid
45
from freezegun import freeze_time
@@ -412,6 +413,55 @@ def test_create_document_reference_invalid_pointer_type():
412413
result = handler(event, create_mock_context())
413414
body = result.pop("body")
414415

416+
assert result == {
417+
"statusCode": "400",
418+
"headers": default_response_headers(),
419+
"isBase64Encoded": False,
420+
}
421+
422+
parsed_body = json.loads(body)
423+
424+
assert parsed_body == {
425+
"resourceType": "OperationOutcome",
426+
"issue": [
427+
{
428+
"severity": "error",
429+
"code": "value",
430+
"details": {
431+
"coding": [
432+
{
433+
"code": "INVALID_RESOURCE",
434+
"display": "Invalid validation of resource",
435+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
436+
}
437+
]
438+
},
439+
"diagnostics": "Invalid type code: invalid Type must be a member of the England-NRLRecordType value set (https://fhir.nhs.uk/England/CodeSystem/England-NRLRecordType)",
440+
"expression": ["type.coding[0].code"],
441+
}
442+
],
443+
}
444+
445+
446+
@mock_aws
447+
@mock_repository
448+
@patch("nrlf.core.decorators.parse_permissions_file")
449+
def test_create_document_reference_pointer_type_not_allowed(
450+
parse_permissions_mock, repository: DocumentPointerRepository
451+
):
452+
doc_ref = load_document_reference("Y05868-736253002-Valid")
453+
454+
assert doc_ref.type and doc_ref.type.coding
455+
456+
event = create_test_api_gateway_event(
457+
headers=create_headers(),
458+
body=doc_ref.model_dump_json(exclude_none=True),
459+
)
460+
461+
parse_permissions_mock.return_value = ["invalid"]
462+
result = handler(event, create_mock_context())
463+
body = result.pop("body")
464+
415465
assert result == {
416466
"statusCode": "403",
417467
"headers": default_response_headers(),
@@ -470,12 +520,12 @@ def test_create_document_reference_invalid_category_type():
470520
"issue": [
471521
{
472522
"severity": "error",
473-
"code": "invalid",
523+
"code": "value",
474524
"details": {
475525
"coding": [
476526
{
477-
"code": "BAD_REQUEST",
478-
"display": "Bad request",
527+
"code": "INVALID_RESOURCE",
528+
"display": "Invalid validation of resource",
479529
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
480530
}
481531
]
@@ -757,6 +807,7 @@ def test_create_document_reference_invalid_relatesto_type(
757807

758808
assert doc_ref.type and doc_ref.type.coding
759809
doc_ref.type.coding[0].code = "861421000000109"
810+
doc_ref.type.coding[0].display = "End of life care coordination summary"
760811
doc_ref.relatesTo = [
761812
DocumentReferenceRelatesTo(
762813
code="transforms",

api/producer/updateDocumentReference/tests/test_update_document_reference.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,8 +500,8 @@ def test_update_document_reference_immutable_fields(repository):
500500
id=None,
501501
system="http://snomed.info/sct",
502502
version=None,
503-
code="1213324",
504-
display="Some Code",
503+
code="861421000000109",
504+
display="End of life care coordination summary",
505505
userSelected=None,
506506
)
507507
],

api/producer/upsertDocumentReference/tests/test_upsert_document_reference.py

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
from unittest.mock import patch
23

34
from freezegun import freeze_time
45
from moto import mock_aws
@@ -221,12 +222,12 @@ def test_upsert_document_reference_invalid_category_type():
221222
"issue": [
222223
{
223224
"severity": "error",
224-
"code": "invalid",
225+
"code": "value",
225226
"details": {
226227
"coding": [
227228
{
228-
"code": "BAD_REQUEST",
229-
"display": "Bad request",
229+
"code": "INVALID_RESOURCE",
230+
"display": "Invalid validation of resource",
230231
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
231232
}
232233
]
@@ -538,6 +539,55 @@ def test_upsert_document_reference_invalid_pointer_type():
538539
result = handler(event, create_mock_context())
539540
body = result.pop("body")
540541

542+
assert result == {
543+
"statusCode": "400",
544+
"headers": default_response_headers(),
545+
"isBase64Encoded": False,
546+
}
547+
548+
parsed_body = json.loads(body)
549+
550+
assert parsed_body == {
551+
"resourceType": "OperationOutcome",
552+
"issue": [
553+
{
554+
"severity": "error",
555+
"code": "value",
556+
"details": {
557+
"coding": [
558+
{
559+
"code": "INVALID_RESOURCE",
560+
"display": "Invalid validation of resource",
561+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
562+
}
563+
]
564+
},
565+
"diagnostics": "Invalid type code: invalid Type must be a member of the England-NRLRecordType value set (https://fhir.nhs.uk/England/CodeSystem/England-NRLRecordType)",
566+
"expression": ["type.coding[0].code"],
567+
},
568+
],
569+
}
570+
571+
572+
@mock_aws
573+
@mock_repository
574+
@patch("nrlf.core.decorators.parse_permissions_file")
575+
def test_upsert_document_reference_pointer_type_not_allowed(
576+
parse_permissions_mock, repository: DocumentPointerRepository
577+
):
578+
doc_ref = load_document_reference("Y05868-736253002-Valid")
579+
580+
assert doc_ref.type and doc_ref.type.coding
581+
582+
event = create_test_api_gateway_event(
583+
headers=create_headers(),
584+
body=doc_ref.model_dump_json(exclude_none=True),
585+
)
586+
587+
parse_permissions_mock.return_value = ["invalid"]
588+
result = handler(event, create_mock_context())
589+
body = result.pop("body")
590+
541591
assert result == {
542592
"statusCode": "403",
543593
"headers": default_response_headers(),
@@ -848,6 +898,7 @@ def test_upsert_document_reference_invalid_relatesto_type(
848898

849899
assert doc_ref.type and doc_ref.type.coding
850900
doc_ref.type.coding[0].code = "861421000000109"
901+
doc_ref.type.coding[0].display = "End of life care coordination summary"
851902
doc_ref.relatesTo = [
852903
DocumentReferenceRelatesTo(
853904
code="transforms",

api/producer/upsertDocumentReference/upsert_document_reference.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from nrlf.core.constants import (
33
PERMISSION_AUDIT_DATES_FROM_PAYLOAD,
44
PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL,
5-
TYPE_CATEGORIES,
65
)
76
from nrlf.core.decorators import request_handler
87
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
@@ -89,19 +88,6 @@ def _check_permissions(
8988
expression="type.coding[0].code",
9089
)
9190

92-
type_category = TYPE_CATEGORIES.get(core_model.type)
93-
if type_category != core_model.category:
94-
logger.log(
95-
LogReference.PROUPSERT005a,
96-
ods_code=metadata.ods_code,
97-
type=core_model.type,
98-
category=core_model.category,
99-
)
100-
return SpineErrorResponse.BAD_REQUEST(
101-
diagnostics=f"The Category code of the provided document '{core_model.category}' must match the allowed category for pointer type '{core_model.type}' with a category value of '{type_category}'",
102-
expression="category.coding[0].code",
103-
)
104-
10591

10692
def _get_document_ids_to_supersede(
10793
resource: DocumentReference,

layer/nrlf/core/constants.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,51 @@ def coding_value(self):
113113
},
114114
}
115115

116+
TYPE_ATTRIBUTES = {
117+
PointerTypes.MENTAL_HEALTH_PLAN.value: {
118+
"display": "Mental health crisis plan",
119+
},
120+
PointerTypes.EMERGENCY_HEALTHCARE_PLAN.value: {
121+
"display": "Emergency health care plan",
122+
},
123+
PointerTypes.EOL_COORDINATION_SUMMARY.value: {
124+
"display": "End of life care coordination summary",
125+
},
126+
PointerTypes.RESPECT_FORM.value: {
127+
"display": "ReSPECT (Recommended Summary Plan for Emergency Care and Treatment) form",
128+
},
129+
PointerTypes.NEWS2_CHART.value: {
130+
"display": "Royal College of Physicians NEWS2 (National Early Warning Score 2) chart",
131+
},
132+
PointerTypes.CONTINGENCY_PLAN.value: {
133+
"display": "Contingency plan",
134+
},
135+
PointerTypes.EOL_CARE_PLAN.value: {
136+
"display": "End of life care plan",
137+
},
138+
PointerTypes.LLOYD_GEORGE_FOLDER.value: {
139+
"display": "Lloyd George record folder",
140+
},
141+
PointerTypes.ADVANCED_CARE_PLAN.value: {
142+
"display": "Advanced care plan",
143+
},
144+
PointerTypes.TREATMENT_ESCALATION_PLAN.value: {
145+
"display": "Treatment escalation plan",
146+
},
147+
PointerTypes.SUMMARY_RECORD.value: {
148+
"display": "Summary record",
149+
},
150+
PointerTypes.PERSONALISED_CARE_AND_SUPPORT_PLAN.value: {
151+
"display": "Personalised Care and Support Plan",
152+
},
153+
PointerTypes.MRA_UPPER_LIMB_ARTERY.value: {
154+
"display": "MRA Upper Limb Rt",
155+
},
156+
PointerTypes.MRI_AXILLA_BOTH.value: {
157+
"display": "MRI Axilla Both",
158+
},
159+
}
160+
116161
TYPE_CATEGORIES = {
117162
#
118163
# Care plans

layer/nrlf/core/log_references.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,7 @@ class LogReference(Enum):
227227
)
228228
PROCREATE005 = _Reference(
229229
"WARN", "Organisation is not allowed to create pointer type"
230-
) #
231-
PROCREATE005a = _Reference(
232-
"WARN",
233-
"Organisation is not allowed to create pointer type with incorrect category",
234-
) #
230+
)
235231
PROCREATE006 = _Reference("DEBUG", "Performing relatesTo validation on resource")
236232
PROCREATE007a = _Reference(
237233
"WARN", "RelatesTo validation failed - no target identifier value"

0 commit comments

Comments
 (0)