Skip to content

Commit 6b96ba7

Browse files
committed
[feature/PI-606-changelog_add_an_mhs] update message set updater
1 parent 6c310b9 commit 6b96ba7

File tree

4 files changed

+64
-45
lines changed

4 files changed

+64
-45
lines changed

src/layers/domain/core/device_reference_data/v1.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from domain.core.aggregate_root import AggregateRoot, event
77
from domain.core.cpm_system_id import ProductId
88
from domain.core.device import DuplicateQuestionnaireResponse
9+
from domain.core.device.v1 import QuestionnaireResponseNotFoundError
910
from domain.core.enum import Status
1011
from domain.core.event import Event, EventDeserializer
1112
from domain.core.questionnaire import QuestionnaireResponse
@@ -95,11 +96,20 @@ def remove_questionnaire(
9596
def remove_questionnaire_response(
9697
self, questionnaire_id: str, questionnaire_response_id: str
9798
) -> QuestionnaireResponseUpdatedEvent:
98-
self.questionnaire_responses[questionnaire_id] = [
99-
qr
100-
for qr in self.questionnaire_responses[questionnaire_id]
101-
if qr.id != questionnaire_response_id
99+
qid_to_remove = str(questionnaire_response_id)
100+
questionnaire_response_ids = [
101+
str(qr.id) for qr in self.questionnaire_responses[questionnaire_id]
102102
]
103+
104+
try:
105+
idx_to_remove = questionnaire_response_ids.index(qid_to_remove)
106+
except ValueError:
107+
raise QuestionnaireResponseNotFoundError(
108+
f"Could not find QuestionnaireResponse {qid_to_remove}"
109+
)
110+
else:
111+
self.questionnaire_responses[questionnaire_id].pop(idx_to_remove)
112+
103113
return QuestionnaireResponseUpdatedEvent(
104114
id=self.id,
105115
questionnaire_responses={

src/layers/sds/epr/tests/test_updaters.py

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ def test_update_message_sets(message_sets: DeviceReferenceData):
105105
questionnaire.validate(
106106
{
107107
str(SdsFieldName.INTERACTION_ID): interaction_id,
108-
"MHS SN": "",
109-
"MHS IN": "",
108+
"MHS SN": "the new value",
109+
"MHS IN": "the new value",
110110
}
111111
)
112112
for interaction_id in ("foo", "bar")
@@ -119,17 +119,31 @@ def test_update_message_sets(message_sets: DeviceReferenceData):
119119
qid = f"{QuestionnaireInstance.SPINE_MHS_MESSAGE_SETS}/1"
120120
assert final_state.pop("updated_on") > initial_state.pop("updated_on")
121121
questionnaire_responses = final_state.pop("questionnaire_responses")[qid]
122-
assert len(questionnaire_responses) == 2
123-
assert questionnaire_responses[0]["data"] == {
124-
str(SdsFieldName.INTERACTION_ID): "foo",
125-
"MHS SN": "",
126-
"MHS IN": "",
127-
}
128-
assert questionnaire_responses[1]["data"] == {
129-
str(SdsFieldName.INTERACTION_ID): "bar",
130-
"MHS SN": "",
131-
"MHS IN": "",
132-
}
122+
assert len(questionnaire_responses) == 4
123+
124+
qr_data = [qr["data"] for qr in questionnaire_responses]
125+
assert qr_data == [
126+
{
127+
"Interaction ID": "baz",
128+
"MHS IN": "",
129+
"MHS SN": "",
130+
},
131+
{
132+
"Interaction ID": "bob",
133+
"MHS IN": "",
134+
"MHS SN": "",
135+
},
136+
{
137+
"Interaction ID": "foo", # replaced old "foo"
138+
"MHS IN": "the new value",
139+
"MHS SN": "the new value",
140+
},
141+
{
142+
"Interaction ID": "bar",
143+
"MHS IN": "the new value",
144+
"MHS SN": "the new value",
145+
},
146+
]
133147

134148
del initial_state["questionnaire_responses"]
135149
assert initial_state == final_state

src/layers/sds/epr/updaters.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,25 @@ def remove_erroneous_additional_interactions(
2121

2222

2323
def update_message_sets(
24-
message_sets: DeviceReferenceData, message_set_data: QuestionnaireResponse
24+
message_sets: DeviceReferenceData, message_set_data: list[QuestionnaireResponse]
2525
) -> DeviceReferenceData:
26-
if message_sets.questionnaire_responses:
27-
(questionnaire_id,) = message_sets.questionnaire_responses.keys()
28-
message_sets.remove_questionnaire(questionnaire_id)
26+
"""
27+
Updates the MessageSets questionnaire responses with the provided message_set_data,
28+
with any replacements based on matching by interaction id.
29+
"""
30+
interaction_id_to_qid = {
31+
msg_set.data[SdsFieldName.INTERACTION_ID]: msg_set.id
32+
for msg_sets in message_sets.questionnaire_responses.values()
33+
for msg_set in msg_sets
34+
}
2935

3036
for _message_set in message_set_data:
37+
new_interaction_id = _message_set.data[SdsFieldName.INTERACTION_ID]
38+
qid_to_remove = interaction_id_to_qid.get(new_interaction_id)
39+
if qid_to_remove:
40+
message_sets.remove_questionnaire_response(
41+
questionnaire_id=_message_set.questionnaire_id,
42+
questionnaire_response_id=qid_to_remove,
43+
)
3144
message_sets.add_questionnaire_response(_message_set)
3245
return message_sets

src/layers/sds/epr/updates/change_request_routing.py

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from typing import Literal
22

3-
from domain.core.aggregate_root import AggregateRoot
3+
from domain.core.cpm_product.v1 import CpmProduct
4+
from domain.core.device.v1 import Device
5+
from domain.core.device_reference_data.v1 import DeviceReferenceData
6+
from domain.core.product_team.v1 import ProductTeam
47
from domain.core.questionnaire import Questionnaire
58
from domain.repository.cpm_product_repository import CpmProductRepository
69
from domain.repository.device_reference_data_repository import (
@@ -13,6 +16,7 @@
1316
from sds.domain.parse import UnknownSdsModel
1417
from sds.domain.sds_deletion_request import SdsDeletionRequest
1518
from sds.domain.sds_modification_request import SdsModificationRequest
19+
from sds.epr.constants import BAD_UNIQUE_IDENTIFIERS
1620
from sds.epr.updates.change_request_processors import (
1721
process_request_to_add_as,
1822
process_request_to_add_mhs,
@@ -26,28 +30,6 @@
2630
)
2731
from sds.epr.utils import is_as_device, is_mhs_device
2832

29-
EXCEPTIONAL_ODS_CODES = { # TODO: use these
30-
"696B001",
31-
"TESTEBS1",
32-
"TESTLSP0",
33-
"TESTLSP1",
34-
"TESTLSP3",
35-
"TMSAsync1",
36-
"TMSAsync2",
37-
"TMSAsync3",
38-
"TMSAsync4",
39-
"TMSAsync5",
40-
"TMSAsync6",
41-
"TMSEbs2",
42-
}
43-
44-
BAD_UNIQUE_IDENTIFIERS = { # TODO: put these somewhere
45-
"31af51067f47f1244d38", # pragma: allowlist secret
46-
"a83e1431f26461894465", # pragma: allowlist secret
47-
"S2202584A2577603",
48-
"S100049A300185",
49-
}
50-
5133

5234
def process_change_request(
5335
record: dict[Literal["object_class", "unique_identifier"] | str, str],
@@ -63,7 +45,7 @@ def process_change_request(
6345
message_set_questionnaire: Questionnaire,
6446
message_set_field_mapping: dict,
6547
additional_interactions_questionnaire: Questionnaire,
66-
) -> list[AggregateRoot]:
48+
) -> list[ProductTeam | CpmProduct | Device | DeviceReferenceData]:
6749
unique_identifier = record["unique_identifier"]
6850
if unique_identifier in BAD_UNIQUE_IDENTIFIERS:
6951
return []

0 commit comments

Comments
 (0)