Skip to content

Commit 9352a19

Browse files
committed
Support scheduled procedure step time on C-FIND service class calls
1 parent bfdd459 commit 9352a19

3 files changed

Lines changed: 100 additions & 4 deletions

File tree

src/services/mwl/c_find.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ def call(self, event: evt.Event) -> Iterator[Tuple[int, Dataset | None]]:
4444
query_modality = procedure_sequence[0].get("Modality")
4545
query_date = procedure_sequence[0].get("ScheduledProcedureStepStartDate")
4646
query_accession_number = identifier.get("AccessionNumber")
47+
query_time = procedure_sequence[0].get("ScheduledProcedureStepStartTime")
4748

4849
try:
4950
items = self.storage.find_worklist_items(
5051
accession_number=query_accession_number if query_accession_number else None,
5152
modality=query_modality if query_modality else None,
5253
scheduled_date=query_date if query_date else None,
54+
scheduled_time=query_time if query_time else None,
5355
patient_id=query_patient_id if query_patient_id else None,
5456
)
5557

tests/integration/test_c_find_returns_worklist_items.py

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

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

tests/services/mwl/test_c_find.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def test_call_with_accession_number_filter(self, handler, mock_storage, mock_eve
114114
list(handler.call(mock_event))
115115

116116
mock_storage.find_worklist_items.assert_called_once_with(
117-
accession_number="ACC12345", modality=None, scheduled_date=None, patient_id=None
117+
accession_number="ACC12345", modality=None, scheduled_date=None, scheduled_time=None, patient_id=None
118118
)
119119

120120
def test_call_with_modality_filter(self, handler, mock_storage, mock_event):
@@ -127,7 +127,7 @@ def test_call_with_modality_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-
accession_number=None, modality="MG", scheduled_date=None, patient_id=None
130+
accession_number=None, modality="MG", scheduled_date=None, scheduled_time=None, patient_id=None
131131
)
132132

133133
def test_call_with_date_filter(self, handler, mock_storage, mock_event):
@@ -139,7 +139,19 @@ def test_call_with_date_filter(self, handler, mock_storage, mock_event):
139139
list(handler.call(mock_event))
140140

141141
mock_storage.find_worklist_items.assert_called_once_with(
142-
accession_number=None, modality=None, scheduled_date="20260107", patient_id=None
142+
accession_number=None, modality=None, scheduled_date="20260107", scheduled_time=None, patient_id=None
143+
)
144+
145+
def test_call_with_time_filter(self, handler, mock_storage, mock_event):
146+
sps_item = Dataset()
147+
sps_item.ScheduledProcedureStepStartTime = "100000"
148+
mock_event.identifier.ScheduledProcedureStepSequence = [sps_item]
149+
mock_storage.find_worklist_items.return_value = []
150+
151+
list(handler.call(mock_event))
152+
153+
mock_storage.find_worklist_items.assert_called_once_with(
154+
accession_number=None, modality=None, scheduled_date=None, scheduled_time="100000", patient_id=None
143155
)
144156

145157
def test_call_with_patient_id_filter(self, handler, mock_storage, mock_event):
@@ -149,7 +161,7 @@ def test_call_with_patient_id_filter(self, handler, mock_storage, mock_event):
149161
list(handler.call(mock_event))
150162

151163
mock_storage.find_worklist_items.assert_called_once_with(
152-
accession_number=None, modality=None, scheduled_date=None, patient_id="9876543210"
164+
accession_number=None, modality=None, scheduled_date=None, scheduled_time=None, patient_id="9876543210"
153165
)
154166

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

0 commit comments

Comments
 (0)