Skip to content

Commit eb2be7c

Browse files
committed
Use MWLStatus enum for valid status updates with N-SET
1 parent ed5fc8c commit eb2be7c

4 files changed

Lines changed: 30 additions & 14 deletions

File tree

src/services/mwl/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@
22

33
from enum import Enum
44

5-
from services.mwl.c_find import CFindHandler
6-
7-
__all__ = ["CFindHandler"]
8-
95

106
class MWLStatus(Enum):
117
SCHEDULED = "SCHEDULED"

src/services/mwl/n_set.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from pynetdicom.events import Event
55
from pynetdicom.sop_class import ModalityPerformedProcedureStep # pyright: ignore[reportAttributeAccessIssue]
66

7-
from services.dicom import PROCESSING_FAILURE, SUCCESS, UNKNOWN_SOP_INSTANCE
7+
from services.dicom import INVALID_ATTRIBUTE, MISSING_ATTRIBUTE, PROCESSING_FAILURE, SUCCESS, UNKNOWN_SOP_INSTANCE
8+
from services.mwl import MWLStatus
89
from services.storage import MWLStorage
910

1011
logger = logging.getLogger(__name__)
@@ -18,24 +19,30 @@ def call(self, event: Event) -> tuple[int, Dataset | None]:
1819
try:
1920
req = event.request
2021
requested_sop_instance_uid = getattr(req, "RequestedSOPInstanceUID", None)
21-
logger.info(f"MPPS N-SET: Received request for SOP Instance UID: {requested_sop_instance_uid}")
22+
logger.info("MPPS N-SET: Received request for SOP Instance UID: %s", requested_sop_instance_uid)
2223

2324
mod_list = event.attribute_list
2425
status = mod_list.get("PerformedProcedureStepStatus")
2526
if not status:
2627
logger.warning("MPPS N-SET: Missing PerformedProcedureStepStatus in request")
27-
return PROCESSING_FAILURE, None
28+
return MISSING_ATTRIBUTE, None
29+
30+
if status not in [MWLStatus.COMPLETED.value, MWLStatus.DISCONTINUED.value]:
31+
logger.warning("MPPS N-SET: Invalid PerformedProcedureStepStatus: %s", status)
32+
return INVALID_ATTRIBUTE, None
2833

2934
worklist_item = self.storage.get_worklist_item_by_mpps_instance_uid(requested_sop_instance_uid)
3035
if not worklist_item:
31-
logger.warning(f"MPPS N-SET: No worklist item found for SOP Instance UID: {requested_sop_instance_uid}")
36+
logger.warning(
37+
"MPPS N-SET: No worklist item found for SOP Instance UID: %s", requested_sop_instance_uid
38+
)
3239
return UNKNOWN_SOP_INSTANCE, None
3340

3441
accession_number = worklist_item.accession_number
3542

3643
source_message_id = self.storage.update_status(accession_number, status)
3744
if source_message_id:
38-
logger.info(f"Database updated: {accession_number} -> {status}")
45+
logger.info("Database updated: %s -> %s", accession_number, status)
3946

4047
ds = Dataset()
4148
ds.SOPClassUID = ModalityPerformedProcedureStep
@@ -48,5 +55,5 @@ def call(self, event: Event) -> tuple[int, Dataset | None]:
4855
logger.warning("MPPS N-SET: Failed to update database with new status")
4956
return PROCESSING_FAILURE, None
5057
except Exception as e:
51-
logger.error(f"Error in handle_set: {str(e)}", exc_info=True)
58+
logger.error("Error in handle_set: %s", str(e), exc_info=True)
5259
return PROCESSING_FAILURE, None

src/services/storage.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from pathlib import Path
88
from typing import Dict, List, Optional
99

10+
from services.mwl import MWLStatus
11+
1012
logger = logging.getLogger(__name__)
1113

1214

@@ -288,7 +290,7 @@ class WorklistItem:
288290
patient_name: str = field(doc="Name of the patient. Lastname^Firstname.")
289291
scheduled_date: str = field(doc="Date the procedure is scheduled for.")
290292
scheduled_time: str = field(doc="Time the procedure is scheduled for.")
291-
status: str = field(doc="Status of the worklist item", default="SCHEDULED")
293+
status: str = field(doc="Status of the worklist item", default=MWLStatus.SCHEDULED.value)
292294
source_message_id: Optional[str] = field(
293295
default=None, doc="Message ID from system which created this worklist item", hash=True
294296
)
@@ -429,7 +431,7 @@ def update_status(
429431
430432
Args:
431433
accession_number: The accession number to update
432-
status: New status (SCHEDULED, IN_PROGRESS, COMPLETED, DISCONTINUED)
434+
status: New status (SCHEDULED, IN PROGRESS, COMPLETED, DISCONTINUED)
433435
mpps_instance_uid: Optional MPPS instance UID
434436
435437
Returns:

tests/services/mwl/test_n_set.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
from pynetdicom.sop_class import ModalityPerformedProcedureStep # pyright: ignore[reportAttributeAccessIssue]
77

88
from services.dicom import (
9+
INVALID_ATTRIBUTE,
10+
MISSING_ATTRIBUTE,
911
PROCESSING_FAILURE,
1012
SUCCESS,
1113
UNKNOWN_SOP_INSTANCE,
@@ -32,12 +34,21 @@ def test_missing_status_returns_processing_failure(self, mock_storage, event):
3234
# No PerformedProcedureStepStatus set
3335
status, ds = NSet(mock_storage).call(event)
3436

35-
assert status == PROCESSING_FAILURE
37+
assert status == MISSING_ATTRIBUTE
38+
assert ds is None
39+
40+
def test_invalid_status_returns_invalid_attribute(self, mock_storage, event, requested_sop_instance_uid):
41+
event.request.RequestedSOPInstanceUID = requested_sop_instance_uid
42+
event.attribute_list.PerformedProcedureStepStatus = "INVALID_STATUS"
43+
44+
status, ds = NSet(mock_storage).call(event)
45+
46+
assert status == INVALID_ATTRIBUTE
3647
assert ds is None
3748

3849
def test_unknown_sop_instance_returns_unknown(self, mock_storage, event, requested_sop_instance_uid):
3950
event.request.RequestedSOPInstanceUID = requested_sop_instance_uid
40-
event.attribute_list.PerformedProcedureStepStatus = "IN PROGRESS"
51+
event.attribute_list.PerformedProcedureStepStatus = "COMPLETED"
4152

4253
mock_storage.get_worklist_item_by_mpps_instance_uid.return_value = None
4354

0 commit comments

Comments
 (0)