Skip to content

Commit 901f79d

Browse files
committed
Move status update transition logic to services.mwl module
1 parent f5e86e4 commit 901f79d

3 files changed

Lines changed: 34 additions & 23 deletions

File tree

src/services/mwl/__init__.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,37 @@
33
from enum import Enum
44

55

6+
class InvalidStatusTransitionError(Exception):
7+
"""Raised when a requested status transition is not permitted."""
8+
9+
pass
10+
11+
612
class MWLStatus(Enum):
713
SCHEDULED = "SCHEDULED"
814
IN_PROGRESS = "IN PROGRESS"
915
COMPLETED = "COMPLETED"
1016
DISCONTINUED = "DISCONTINUED"
17+
18+
19+
class MWLStatusManager:
20+
_TRANSITIONS = {
21+
MWLStatus.IN_PROGRESS: MWLStatus.SCHEDULED,
22+
MWLStatus.COMPLETED: MWLStatus.IN_PROGRESS,
23+
MWLStatus.DISCONTINUED: MWLStatus.IN_PROGRESS,
24+
}
25+
26+
@staticmethod
27+
def transition_for(status: str) -> tuple[MWLStatus, MWLStatus]:
28+
"""
29+
Get the previous and next status for a given MWL status.
30+
31+
Raises:
32+
InvalidStatusTransitionError: If the transition is not permitted
33+
"""
34+
try:
35+
current_status = MWLStatus(status)
36+
previous_status = MWLStatusManager._TRANSITIONS[current_status]
37+
return previous_status, current_status
38+
except KeyError:
39+
raise InvalidStatusTransitionError(f"Cannot transition to '{status}'")

src/services/storage.py

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from typing import Dict, List, Optional
88

99
from models import WorklistItem
10-
from services.mwl import MWLStatus
10+
from services.mwl import MWLStatusManager
1111

1212
logger = logging.getLogger(__name__)
1313

@@ -285,25 +285,13 @@ class WorklistItemNotFoundError(Exception):
285285
pass
286286

287287

288-
class InvalidStatusTransitionError(Exception):
289-
"""Raised when a requested status transition is not permitted."""
290-
291-
pass
292-
293-
294288
class WorklistItemExistsError(Exception):
295289
"""Raised when a worklist item with the same accession number already exists."""
296290

297291
pass
298292

299293

300294
class MWLStorage(Storage):
301-
_STATUS_TRANSITIONS: dict[MWLStatus, MWLStatus] = {
302-
MWLStatus.IN_PROGRESS: MWLStatus.SCHEDULED,
303-
MWLStatus.COMPLETED: MWLStatus.IN_PROGRESS,
304-
MWLStatus.DISCONTINUED: MWLStatus.IN_PROGRESS,
305-
}
306-
307295
def __init__(self, db_path: str = "/var/lib/pacs/worklist.db"):
308296
"""
309297
Initialize Worklist storage.
@@ -481,14 +469,8 @@ def update_status(
481469
482470
Returns:
483471
source_message_id if item was updated, None if not found
484-
485-
Raises:
486-
InvalidStatusTransitionError: If the transition is not permitted
487472
"""
488-
target = MWLStatus(status)
489-
if target not in self._STATUS_TRANSITIONS:
490-
raise InvalidStatusTransitionError(f"Cannot transition to '{status}'")
491-
from_status = self._STATUS_TRANSITIONS[target]
473+
from_status, to_status = MWLStatusManager.transition_for(status)
492474

493475
with self._get_connection() as conn:
494476
cursor = conn.execute(
@@ -500,7 +482,7 @@ def update_status(
500482
WHERE accession_number = ?
501483
AND status = ?
502484
""",
503-
(status, mpps_instance_uid, accession_number, from_status.value),
485+
(to_status.value, mpps_instance_uid, accession_number, from_status.value),
504486
)
505487
conn.commit()
506488

tests/services/test_storage.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from pydicom.uid import generate_uid
77

88
from models import WorklistItem
9+
from services.mwl import InvalidStatusTransitionError
910
from services.storage import (
10-
InvalidStatusTransitionError,
1111
MWLStorage,
1212
PACSStorage,
1313
WorklistItemExistsError,
@@ -116,7 +116,7 @@ def test_store_instance_saves_to_db(self, pacs_storage):
116116
assert row["accession_number"] == metadata["accession_number"]
117117

118118

119-
class TestWorkingStorage:
119+
class TestMWLStorage:
120120
def _insert_item(self, storage, result):
121121
item = WorklistItem(**result)
122122
storage.store_worklist_item(item)

0 commit comments

Comments
 (0)