Skip to content

Commit 50518b8

Browse files
committed
Support scheduled procedure step time on C-FIND service class calls
1 parent 17f12d6 commit 50518b8

3 files changed

Lines changed: 99 additions & 8 deletions

File tree

src/services/mwl/c_find.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,17 @@ def call(self, event: evt.Event) -> Iterator[Tuple[int, Dataset | None]]:
3939
logger.info(f"C-FIND request from {requestor_aet}")
4040

4141
query_patient_id = identifier.get("PatientID")
42-
anonymised_patient_id = f"*******{query_patient_id[7:]}" if query_patient_id else "None"
4342

4443
procedure_sequence = identifier.get("ScheduledProcedureStepSequence", [{}])
4544
query_modality = procedure_sequence[0].get("Modality")
4645
query_date = procedure_sequence[0].get("ScheduledProcedureStepStartDate")
47-
48-
logger.debug(
49-
"Query parameters: modality=%s, date=%s, patient_id=%s", query_modality, query_date, anonymised_patient_id
50-
)
46+
query_time = procedure_sequence[0].get("ScheduledProcedureStepStartTime")
5147

5248
try:
5349
items = self.storage.find_worklist_items(
5450
modality=query_modality if query_modality else None,
5551
scheduled_date=query_date if query_date else None,
52+
scheduled_time=query_time if query_time else None,
5653
patient_id=query_patient_id if query_patient_id else None,
5754
)
5855

tests/integration/test_c_find_returns_worklist_items.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,88 @@ def test_cfind_filters_by_after_scheduled_date(self, event, storage):
156156
assert status == SUCCESS
157157
assert ds is None
158158

159+
def test_cfind_filters_by_scheduled_time_range(self, event, storage):
160+
event.identifier.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartTime = "090000-093000"
161+
162+
results = list(CFind(storage).call(event))
163+
164+
assert len(results) == 2
165+
166+
status, ds = results[0]
167+
assert status == PENDING
168+
assert ds.PatientID == "999123456"
169+
assert ds.PatientName == "SMITH^JANE"
170+
assert ds.PatientBirthDate == "19800101"
171+
assert ds.AccessionNumber == "ACC123456"
172+
assert ds.ScheduledProcedureStepSequence[0].Modality == "MG"
173+
assert ds.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartTime == "090000"
174+
175+
status, ds = results[1]
176+
assert status == SUCCESS
177+
assert ds is None
178+
179+
def test_cfind_filters_by_before_scheduled_time(self, event, storage):
180+
event.identifier.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartTime = "-093000"
181+
182+
results = list(CFind(storage).call(event))
183+
184+
assert len(results) == 2
185+
186+
status, ds = results[0]
187+
assert status == PENDING
188+
assert ds.PatientID == "999123456"
189+
assert ds.PatientName == "SMITH^JANE"
190+
assert ds.PatientBirthDate == "19800101"
191+
assert ds.AccessionNumber == "ACC123456"
192+
assert ds.ScheduledProcedureStepSequence[0].Modality == "MG"
193+
assert ds.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartTime == "090000"
194+
195+
status, ds = results[1]
196+
assert status == SUCCESS
197+
assert ds is None
198+
199+
def test_cfind_filters_by_after_scheduled_time(self, event, storage):
200+
event.identifier.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartTime = "093000-"
201+
202+
results = list(CFind(storage).call(event))
203+
204+
assert len(results) == 2
205+
206+
status, ds = results[0]
207+
assert status == PENDING
208+
assert ds.PatientID == "999234567"
209+
assert ds.PatientName == "JONES^MARY"
210+
assert ds.PatientBirthDate == "19900202"
211+
assert ds.AccessionNumber == "ACC234567"
212+
assert ds.ScheduledProcedureStepSequence[0].Modality == "MG"
213+
assert ds.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartTime == "094500"
214+
215+
status, ds = results[1]
216+
assert status == SUCCESS
217+
assert ds is None
218+
219+
def test_cfind_filters_by_date_and_time_range(self, event, storage):
220+
event.identifier.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartDate = "20240101-20240201"
221+
event.identifier.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartTime = "090000-093000"
222+
223+
results = list(CFind(storage).call(event))
224+
225+
assert len(results) == 2
226+
227+
status, ds = results[0]
228+
assert status == PENDING
229+
assert ds.PatientID == "999123456"
230+
assert ds.PatientName == "SMITH^JANE"
231+
assert ds.PatientBirthDate == "19800101"
232+
assert ds.AccessionNumber == "ACC123456"
233+
assert ds.ScheduledProcedureStepSequence[0].Modality == "MG"
234+
assert ds.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartDate == "20240101"
235+
assert ds.ScheduledProcedureStepSequence[0].ScheduledProcedureStepStartTime == "090000"
236+
237+
status, ds = results[1]
238+
assert status == SUCCESS
239+
assert ds is None
240+
159241
def test_cfind_filters_by_modality(self, event, storage):
160242
storage.store_worklist_item(
161243
WorklistItem(

tests/services/mwl/test_c_find.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def test_call_with_modality_filter(self, handler, mock_storage, mock_event):
116116

117117
list(handler.call(mock_event))
118118

119-
mock_storage.find_worklist_items.assert_called_once_with(modality="MG", scheduled_date=None, patient_id=None)
119+
mock_storage.find_worklist_items.assert_called_once_with(modality="MG", scheduled_date=None, scheduled_time=None, patient_id=None)
120120

121121
def test_call_with_date_filter(self, handler, mock_storage, mock_event):
122122
sps_item = Dataset()
@@ -127,7 +127,19 @@ def test_call_with_date_filter(self, handler, mock_storage, mock_event):
127127
list(handler.call(mock_event))
128128

129129
mock_storage.find_worklist_items.assert_called_once_with(
130-
modality=None, scheduled_date="20260107", patient_id=None
130+
modality=None, scheduled_date="20260107", scheduled_time=None, patient_id=None
131+
)
132+
133+
def test_call_with_time_filter(self, handler, mock_storage, mock_event):
134+
sps_item = Dataset()
135+
sps_item.ScheduledProcedureStepStartTime = "100000"
136+
mock_event.identifier.ScheduledProcedureStepSequence = [sps_item]
137+
mock_storage.find_worklist_items.return_value = []
138+
139+
list(handler.call(mock_event))
140+
141+
mock_storage.find_worklist_items.assert_called_once_with(
142+
modality=None, scheduled_date=None, scheduled_time="100000", patient_id=None
131143
)
132144

133145
def test_call_with_patient_id_filter(self, handler, mock_storage, mock_event):
@@ -137,7 +149,7 @@ def test_call_with_patient_id_filter(self, handler, mock_storage, mock_event):
137149
list(handler.call(mock_event))
138150

139151
mock_storage.find_worklist_items.assert_called_once_with(
140-
modality=None, scheduled_date=None, patient_id="9876543210"
152+
modality=None, scheduled_date=None, scheduled_time=None, patient_id="9876543210"
141153
)
142154

143155
def test_call_handles_storage_exception(self, handler, mock_storage, mock_event):

0 commit comments

Comments
 (0)