Skip to content

Commit 7ad658c

Browse files
Log a warning if duplicate worklist item detected (#41)
1 parent 01f8f36 commit 7ad658c

3 files changed

Lines changed: 42 additions & 16 deletions

File tree

src/services/mwl/create_worklist_item.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22

3-
from services.storage import MWLStorage, WorklistItem
3+
from services.storage import DuplicateWorklistItemError, MWLStorage, WorklistItem
44

55
logger = logging.getLogger(__name__)
66

@@ -38,6 +38,11 @@ def call(self, payload: dict):
3838
)
3939
logger.info(f"Created worklist item: {item.get('accession_number')}")
4040
return {"status": "created", "action_id": action_id}
41+
except DuplicateWorklistItemError:
42+
logger.warning(
43+
f"Duplicate worklist item ignored: accession_number={item.get('accession_number')!r}, action_id={action_id!r}"
44+
)
45+
return {"status": "duplicate", "action_id": action_id}
4146
except Exception as e:
4247
logger.error(f"Failed to create worklist item: {e}")
4348
return {"status": "error", "action_id": action_id, "error": str(e)}

src/services/storage.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,12 @@ class WorklistItemNotFoundError(Exception):
309309
pass
310310

311311

312+
class DuplicateWorklistItemError(Exception):
313+
"""Raised when a worklist item with the same accession number already exists."""
314+
315+
pass
316+
317+
312318
class MWLStorage(Storage):
313319
def __init__(self, db_path: str = "/var/lib/pacs/worklist.db"):
314320
"""
@@ -336,20 +342,23 @@ def store_worklist_item(
336342
Raises:
337343
sqlite3.IntegrityError: If accession number already exists
338344
"""
339-
with self._get_connection() as conn:
340-
conn.execute(
341-
(
342-
"INSERT INTO worklist_items (accession_number, modality, patient_birth_date, "
343-
"patient_id, patient_name, patient_sex, procedure_code, scheduled_date, "
344-
"scheduled_time, source_message_id, study_description, study_instance_uid) "
345-
"VALUES (:accession_number, :modality, :patient_birth_date, "
346-
":patient_id, :patient_name, :patient_sex, :procedure_code, "
347-
":scheduled_date, :scheduled_time, :source_message_id, "
348-
":study_description, :study_instance_uid)"
349-
),
350-
worklist_item.__dict__,
351-
)
352-
conn.commit()
345+
try:
346+
with self._get_connection() as conn:
347+
conn.execute(
348+
(
349+
"INSERT INTO worklist_items (accession_number, modality, patient_birth_date, "
350+
"patient_id, patient_name, patient_sex, procedure_code, scheduled_date, "
351+
"scheduled_time, source_message_id, study_description, study_instance_uid) "
352+
"VALUES (:accession_number, :modality, :patient_birth_date, "
353+
":patient_id, :patient_name, :patient_sex, :procedure_code, "
354+
":scheduled_date, :scheduled_time, :source_message_id, "
355+
":study_description, :study_instance_uid)"
356+
),
357+
worklist_item.__dict__,
358+
)
359+
conn.commit()
360+
except sqlite3.IntegrityError:
361+
raise DuplicateWorklistItemError(f"Worklist item already exists: {worklist_item.accession_number}")
353362

354363
return worklist_item.accession_number
355364

tests/services/mwl/test_create_worklist_item.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from unittest.mock import patch
22

33
from services.mwl.create_worklist_item import CreateWorklistItem
4-
from services.storage import WorklistItem
4+
from services.storage import DuplicateWorklistItemError, WorklistItem
55

66

77
@patch(f"{CreateWorklistItem.__module__}.MWLStorage")
@@ -40,6 +40,18 @@ def test_call_missing_action_id(self, mock_mwl_storage, listener_payload):
4040

4141
mock_storage_instance.store_worklist_item.assert_not_called()
4242

43+
def test_call_duplicate_worklist_item(self, mock_mwl_storage, listener_payload):
44+
mock_storage_instance = mock_mwl_storage.return_value
45+
mock_storage_instance.store_worklist_item.side_effect = DuplicateWorklistItemError(
46+
"Worklist item already exists: ACC999999"
47+
)
48+
subject = CreateWorklistItem(mock_storage_instance)
49+
50+
response = subject.call(listener_payload)
51+
assert response == {"status": "duplicate", "action_id": "action-12345"}
52+
53+
mock_storage_instance.store_worklist_item.assert_called_once()
54+
4355
def test_call_storage_exception(self, mock_mwl_storage, listener_payload):
4456
mock_storage_instance = mock_mwl_storage.return_value
4557
mock_storage_instance.store_worklist_item.side_effect = Exception("DB error")

0 commit comments

Comments
 (0)