1- from nrlf .core .constants import PERMISSION_AUDIT_DATES_FROM_PAYLOAD
1+ from nrlf .core .constants import (
2+ PERMISSION_AUDIT_DATES_FROM_PAYLOAD ,
3+ PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL ,
4+ )
25from nrlf .core .decorators import request_handler
36from nrlf .core .dynamodb .repository import DocumentPointer , DocumentPointerRepository
47from nrlf .core .logger import LogReference , logger
@@ -105,6 +108,9 @@ def handler(
105108
106109 if result .resource .relatesTo :
107110 logger .log (LogReference .PROUPSERT006 , relatesTo = result .resource .relatesTo )
111+ can_ignore_delete_fail = (
112+ PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL in metadata .nrl_permissions
113+ )
108114
109115 for idx , relates_to in enumerate (result .resource .relatesTo ):
110116 if not (identifier := getattr (relates_to .target .identifier , "value" , None )):
@@ -125,27 +131,33 @@ def handler(
125131 diagnostics = "The relatesTo target identifier value does not include the expected ODS code for this organisation" ,
126132 expression = f"relatesTo[{ idx } ].target.identifier.value" ,
127133 )
128-
129- if not (existing_pointer := repository .get_by_id (identifier )):
130- logger .log (LogReference .PROUPSERT007c , related_identifier = identifier )
131- return SpineErrorResponse .BAD_REQUEST (
132- diagnostics = "The relatesTo target document does not exist" ,
133- expression = f"relatesTo[{ idx } ].target.identifier.value" ,
134- )
135-
136- if existing_pointer .nhs_number != core_model .nhs_number :
137- logger .log (LogReference .PROUPSERT007d , related_identifier = identifier )
138- return SpineErrorResponse .BAD_REQUEST (
139- diagnostics = "The relatesTo target document NHS number does not match the NHS number in the request" ,
140- expression = f"relatesTo[{ idx } ].target.identifier.value" ,
141- )
142-
143- if existing_pointer .type != core_model .type :
144- logger .log (LogReference .PROUPSERT007e , related_identifier = identifier )
145- return SpineErrorResponse .BAD_REQUEST (
146- diagnostics = "The relatesTo target document type does not match the type in the request" ,
147- expression = f"relatesTo[{ idx } ].target.identifier.value" ,
148- )
134+ if not can_ignore_delete_fail :
135+ if not (existing_pointer := repository .get_by_id (identifier )):
136+ logger .log (
137+ LogReference .PROCREATE007c , related_identifier = identifier
138+ )
139+ return SpineErrorResponse .BAD_REQUEST (
140+ diagnostics = "The relatesTo target document does not exist" ,
141+ expression = f"relatesTo[{ idx } ].target.identifier.value" ,
142+ )
143+
144+ if existing_pointer .nhs_number != core_model .nhs_number :
145+ logger .log (
146+ LogReference .PROUPSERT007d , related_identifier = identifier
147+ )
148+ return SpineErrorResponse .BAD_REQUEST (
149+ diagnostics = "The relatesTo target document NHS number does not match the NHS number in the request" ,
150+ expression = f"relatesTo[{ idx } ].target.identifier.value" ,
151+ )
152+
153+ if existing_pointer .type != core_model .type :
154+ logger .log (
155+ LogReference .PROUPSERT007e , related_identifier = identifier
156+ )
157+ return SpineErrorResponse .BAD_REQUEST (
158+ diagnostics = "The relatesTo target document type does not match the type in the request" ,
159+ expression = f"relatesTo[{ idx } ].target.identifier.value" ,
160+ )
149161
150162 if relates_to .code == "replaces" :
151163 logger .log (
@@ -161,7 +173,9 @@ def handler(
161173 pointer_id = result .resource .id ,
162174 ids_to_delete = ids_to_delete ,
163175 )
164- saved_model = repository .supersede (core_model , ids_to_delete )
176+ saved_model = repository .supersede (
177+ core_model , ids_to_delete , can_ignore_delete_fail
178+ )
165179 logger .log (LogReference .PROUPSERT999 )
166180 return NRLResponse .RESOURCE_SUPERSEDED (resource_id = saved_model .id )
167181
0 commit comments