Skip to content

Commit ded5bc7

Browse files
committed
Move WorklistItem into models.py
The storage service is quite large and with additional return key fields the WorklistItem dataclass was adding bloat. We all understand what models.py does.
1 parent 0625047 commit ded5bc7

6 files changed

Lines changed: 67 additions & 61 deletions

File tree

src/models.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from dataclasses import dataclass, field
2+
from typing import Optional
3+
4+
from services.mwl import MWLStatus
5+
6+
7+
@dataclass
8+
class WorklistItem:
9+
accession_number: str = field(
10+
doc="A departmental Information System generated number that identifies the Imaging Service Request.",
11+
)
12+
modality: str = field(doc="Code for type of equipment that will perform the procedure.")
13+
patient_birth_date: str = field(doc="Date of Birth of the Patient.")
14+
patient_id: str = field(doc="Patient NHS Number", hash=True)
15+
patient_name: str = field(doc="Name of the patient. Lastname^Firstname.")
16+
scheduled_date: str = field(doc="Date the procedure is scheduled for.")
17+
scheduled_time: str = field(doc="Time the procedure is scheduled for.")
18+
status: str = field(doc="Status of the worklist item", default=MWLStatus.SCHEDULED.value)
19+
20+
source_message_id: Optional[str] = field(
21+
default=None, doc="Message ID from system which created this worklist item", hash=True
22+
)
23+
study_instance_uid: Optional[str] = field(default=None, doc="Instance UID for the study", hash=True)
24+
procedure_code: Optional[str] = field(default=None, doc="Code that identifies the requested procedure.")
25+
patient_sex: Optional[str] = field(default=None, doc="Sex of the patient.")
26+
study_description: Optional[str] = field(default=None, doc="Description of the study.")
27+
mpps_instance_uid: Optional[str] = field(
28+
default=None, doc="Modality Performed Procedure Step (MPPS) instance UID if available."
29+
)
30+
31+
patient_age: Optional[str] = field(default=None, doc="Age of the patient at the time of scheduling.")
32+
patient_weight: Optional[str] = field(default=None, doc="Weight of the patient at the time of scheduling.")
33+
patient_address: Optional[str] = field(default=None, doc="Address of the patient.")
34+
patient_comments: Optional[str] = field(default=None, doc="Additional comments about the patient.")
35+
36+
procedure_coding_scheme_designator: Optional[str] = field(
37+
default=None, doc="Coding scheme designator for the procedure code."
38+
)
39+
procedure_code_meaning: Optional[str] = field(default=None, doc="Code meaning for the procedure code.")
40+
41+
reason_code_value: Optional[str] = field(default=None, doc="Code value for the reason for requested procedure.")
42+
reason_coding_scheme_designator: Optional[str] = field(
43+
default=None, doc="Coding scheme designator for the reason for requested procedure."
44+
)
45+
reason_code_meaning: Optional[str] = field(default=None, doc="Code meaning for the reason for requested procedure.")
46+
47+
scheduled_performing_physician_name: Optional[str] = field(
48+
default=None, doc="Name of the scheduled performing physician."
49+
)
50+
scheduled_procedure_step_location: Optional[str] = field(
51+
default=None, doc="Location of the scheduled procedure step."
52+
)
53+
scheduled_station_aet: Optional[str] = field(default=None, doc="AE Title of the scheduled station.")
54+
scheduled_station_name: Optional[str] = field(default=None, doc="Name of the scheduled station.")
55+
scheduled_protocol_code_value: Optional[str] = field(default=None, doc="Code value for the scheduled protocol.")
56+
scheduled_protocol_coding_scheme_designator: Optional[str] = field(
57+
default=None, doc="Coding scheme designator for the scheduled protocol."
58+
)
59+
scheduled_protocol_code_meaning: Optional[str] = field(default=None, doc="Code meaning for the scheduled protocol.")

src/services/mwl/c_find.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
from pydicom import Dataset
1111
from pynetdicom import evt
1212

13+
from models import WorklistItem
1314
from services.dicom import CHARSET_UTF8, FAILURE, PENDING, SUCCESS
14-
from services.storage import MWLStorage, WorklistItem
15+
from services.storage import MWLStorage
1516

1617
logger = logging.getLogger(__name__)
1718

src/services/mwl/create_worklist_item.py

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

3-
from services.storage import DuplicateWorklistItemError, MWLStorage, WorklistItem
3+
from models import WorklistItem
4+
from services.storage import DuplicateWorklistItemError, MWLStorage
45

56
logger = logging.getLogger(__name__)
67

src/services/storage.py

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
import os
44
import sqlite3
55
from contextlib import contextmanager
6-
from dataclasses import dataclass, field
76
from pathlib import Path
87
from typing import Dict, List, Optional
98

10-
from services.mwl import MWLStatus
9+
from models import WorklistItem
1110

1211
logger = logging.getLogger(__name__)
1312

@@ -279,61 +278,6 @@ def mark_upload_failed(self, sop_instance_uid: str, error: str, permanent: bool
279278
conn.commit()
280279

281280

282-
@dataclass
283-
class WorklistItem:
284-
accession_number: str = field(
285-
doc="A departmental Information System generated number that identifies the Imaging Service Request.",
286-
)
287-
modality: str = field(doc="Code for type of equipment that will perform the procedure.")
288-
patient_birth_date: str = field(doc="Date of Birth of the Patient.")
289-
patient_id: str = field(doc="Patient NHS Number", hash=True)
290-
patient_name: str = field(doc="Name of the patient. Lastname^Firstname.")
291-
scheduled_date: str = field(doc="Date the procedure is scheduled for.")
292-
scheduled_time: str = field(doc="Time the procedure is scheduled for.")
293-
status: str = field(doc="Status of the worklist item", default=MWLStatus.SCHEDULED.value)
294-
295-
source_message_id: Optional[str] = field(
296-
default=None, doc="Message ID from system which created this worklist item", hash=True
297-
)
298-
study_instance_uid: Optional[str] = field(default=None, doc="Instance UID for the study", hash=True)
299-
procedure_code: Optional[str] = field(default=None, doc="Code that identifies the requested procedure.")
300-
patient_sex: Optional[str] = field(default=None, doc="Sex of the patient.")
301-
study_description: Optional[str] = field(default=None, doc="Description of the study.")
302-
mpps_instance_uid: Optional[str] = field(
303-
default=None, doc="Modality Performed Procedure Step (MPPS) instance UID if available."
304-
)
305-
306-
patient_age: Optional[str] = field(default=None, doc="Age of the patient at the time of scheduling.")
307-
patient_weight: Optional[str] = field(default=None, doc="Weight of the patient at the time of scheduling.")
308-
patient_address: Optional[str] = field(default=None, doc="Address of the patient.")
309-
patient_comments: Optional[str] = field(default=None, doc="Additional comments about the patient.")
310-
311-
procedure_coding_scheme_designator: Optional[str] = field(
312-
default=None, doc="Coding scheme designator for the procedure code."
313-
)
314-
procedure_code_meaning: Optional[str] = field(default=None, doc="Code meaning for the procedure code.")
315-
316-
reason_code_value: Optional[str] = field(default=None, doc="Code value for the reason for requested procedure.")
317-
reason_coding_scheme_designator: Optional[str] = field(
318-
default=None, doc="Coding scheme designator for the reason for requested procedure."
319-
)
320-
reason_code_meaning: Optional[str] = field(default=None, doc="Code meaning for the reason for requested procedure.")
321-
322-
scheduled_performing_physician_name: Optional[str] = field(
323-
default=None, doc="Name of the scheduled performing physician."
324-
)
325-
scheduled_procedure_step_location: Optional[str] = field(
326-
default=None, doc="Location of the scheduled procedure step."
327-
)
328-
scheduled_station_aet: Optional[str] = field(default=None, doc="AE Title of the scheduled station.")
329-
scheduled_station_name: Optional[str] = field(default=None, doc="Name of the scheduled station.")
330-
scheduled_protocol_code_value: Optional[str] = field(default=None, doc="Code value for the scheduled protocol.")
331-
scheduled_protocol_coding_scheme_designator: Optional[str] = field(
332-
default=None, doc="Coding scheme designator for the scheduled protocol."
333-
)
334-
scheduled_protocol_code_meaning: Optional[str] = field(default=None, doc="Code meaning for the scheduled protocol.")
335-
336-
337281
class WorklistItemNotFoundError(Exception):
338282
"""Raised when a worklist item is not found in storage."""
339283

tests/services/test_storage.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import pytest
66
from pydicom.uid import generate_uid
77

8-
from services.storage import MWLStorage, PACSStorage, WorklistItem, WorklistItemNotFoundError
8+
from models import WorklistItem
9+
from services.storage import MWLStorage, PACSStorage, WorklistItemNotFoundError
910

1011

1112
@patch("services.storage.sqlite3")

tests/test_relay_listener.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
from websockets.exceptions import ConnectionClosedError
66
from websockets.frames import Close, CloseCode
77

8+
from models import WorklistItem
89
from relay_listener import RelayListener, RelayURI, main
9-
from services.storage import WorklistItem
1010

1111

1212
class TestRelayListener:

0 commit comments

Comments
 (0)