Skip to content

Commit 40ffe7f

Browse files
committed
adding additional params to retrieve_study, iter_study, retrieve_series, iter_series
1 parent 5d4a25f commit 40ffe7f

File tree

2 files changed

+113
-6
lines changed

2 files changed

+113
-6
lines changed

src/dicomweb_client/web.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2013,6 +2013,7 @@ def retrieve_study(
20132013
self,
20142014
study_instance_uid: str,
20152015
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None,
2016+
additional_params: Optional[Dict[str, Any]] = None
20162017
) -> List[pydicom.dataset.Dataset]:
20172018
"""Retrieve all instances of a study.
20182019
@@ -2023,6 +2024,8 @@ def retrieve_study(
20232024
media_types: Union[Tuple[Union[str, Tuple[str, str]], ...], None], optional
20242025
Acceptable media types and optionally the UIDs of the
20252026
acceptable transfer syntaxes
2027+
additional_params: Union[Dict[str, Any], None], optional
2028+
Additional HTTP GET query parameters
20262029
20272030
Returns
20282031
-------
@@ -2044,14 +2047,16 @@ def retrieve_study(
20442047
self._get_study(
20452048
study_instance_uid=study_instance_uid,
20462049
media_types=media_types,
2047-
stream=False
2050+
stream=False,
2051+
additional_params=additional_params
20482052
)
20492053
)
20502054

20512055
def iter_study(
20522056
self,
20532057
study_instance_uid: str,
20542058
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None,
2059+
additional_params: Optional[Dict[str, Any]] = None
20552060
) -> Iterator[pydicom.dataset.Dataset]:
20562061
"""Iterate over all instances of a study.
20572062
@@ -2062,6 +2067,8 @@ def iter_study(
20622067
media_types: Union[Tuple[Union[str, Tuple[str, str]], ...], None], optional
20632068
Acceptable media types and optionally the UIDs of the
20642069
acceptable transfer syntaxes
2070+
additional_params: Union[Dict[str, Any], None], optional
2071+
Additional HTTP GET query parameters
20652072
20662073
Returns
20672074
-------
@@ -2086,7 +2093,8 @@ def iter_study(
20862093
return self._get_study(
20872094
study_instance_uid=study_instance_uid,
20882095
media_types=media_types,
2089-
stream=True
2096+
stream=True,
2097+
additional_params=additional_params
20902098
)
20912099

20922100
def retrieve_study_metadata(
@@ -2317,7 +2325,8 @@ def retrieve_series(
23172325
self,
23182326
study_instance_uid: str,
23192327
series_instance_uid: str,
2320-
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None
2328+
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None,
2329+
additional_params: Optional[Dict[str, Any]] = None
23212330
) -> List[pydicom.dataset.Dataset]:
23222331
"""Retrieve all instances of a series.
23232332
@@ -2330,6 +2339,8 @@ def retrieve_series(
23302339
media_types: Union[Tuple[Union[str, Tuple[str, str]], ...], None], optional
23312340
Acceptable media types and optionally the UIDs of the
23322341
acceptable transfer syntaxes
2342+
additional_params: Union[Dict[str, Any], None], optional
2343+
Additional HTTP GET query parameters
23332344
23342345
Returns
23352346
-------
@@ -2352,15 +2363,17 @@ def retrieve_series(
23522363
study_instance_uid=study_instance_uid,
23532364
series_instance_uid=series_instance_uid,
23542365
media_types=media_types,
2355-
stream=False
2366+
stream=False,
2367+
additional_params=additional_params
23562368
)
23572369
)
23582370

23592371
def iter_series(
23602372
self,
23612373
study_instance_uid: str,
23622374
series_instance_uid: str,
2363-
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None
2375+
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None,
2376+
additional_params: Optional[Dict[str, Any]] = None
23642377
) -> Iterator[pydicom.dataset.Dataset]:
23652378
"""Iterate over all instances of a series.
23662379
@@ -2373,6 +2386,8 @@ def iter_series(
23732386
media_types: Union[Tuple[Union[str, Tuple[str, str]], ...], None], optional
23742387
Acceptable media types and optionally the UIDs of the
23752388
acceptable transfer syntaxes
2389+
additional_params: Union[Dict[str, Any], None], optional
2390+
Additional HTTP GET query parameters
23762391
23772392
Returns
23782393
-------
@@ -2398,7 +2413,8 @@ def iter_series(
23982413
study_instance_uid=study_instance_uid,
23992414
series_instance_uid=series_instance_uid,
24002415
media_types=media_types,
2401-
stream=True
2416+
stream=True,
2417+
additional_params=additional_params
24022418
)
24032419

24042420
def retrieve_series_metadata(

tests/test_web.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,53 @@ def test_iter_series(client, httpserver, cache_dir):
554554
assert len(response) == n_resources
555555

556556

557+
def test_iter_series_with_additional_params(client, httpserver, cache_dir):
558+
cache_filename = str(cache_dir.joinpath('file.dcm'))
559+
with open(cache_filename, 'rb') as f:
560+
data = f.read()
561+
562+
n_resources = 3
563+
chunk_size = 10**3
564+
media_type = 'application/dicom'
565+
boundary = 'boundary'
566+
headers = {
567+
'content-type': (
568+
'multipart/related; '
569+
f'type="{media_type}"; '
570+
f'boundary="{boundary}"'
571+
),
572+
'transfer-encoding': 'chunked'
573+
}
574+
params = {"key1": ["value1", "value2"], "key2": "value3"}
575+
576+
message = DICOMwebClient._encode_multipart_message(
577+
content=[data for _ in range(n_resources)],
578+
content_type=headers['content-type']
579+
)
580+
chunked_message = _chunk_message(message, chunk_size)
581+
582+
httpserver.serve_content(content=chunked_message, code=200, headers=headers)
583+
study_uid = '1.2.3'
584+
series_uid = '1.2.4'
585+
iterator = client.iter_series(
586+
study_uid, series_uid, additional_params=params
587+
)
588+
assert isinstance(iterator, Generator)
589+
response = list(iterator)
590+
for instance in response:
591+
with BytesIO() as fp:
592+
pydicom.dcmwrite(fp, instance)
593+
raw_result = fp.getvalue()
594+
assert raw_result == data
595+
request = httpserver.requests[0]
596+
assert request.path == f'/studies/{study_uid}/series/{series_uid}'
597+
assert request.query_string.decode() == (
598+
'key1=value1&key1=value2&key2=value3'
599+
)
600+
assert request.accept_mimetypes[0][0][:43] == headers['content-type'][:43]
601+
assert len(response) == n_resources
602+
603+
557604
def test_retrieve_series(client, httpserver, cache_dir):
558605
cache_filename = str(cache_dir.joinpath('file.dcm'))
559606
with open(cache_filename, 'rb') as f:
@@ -594,6 +641,50 @@ def test_retrieve_series(client, httpserver, cache_dir):
594641
assert len(response) == n_resources
595642

596643

644+
def test_retrieve_series_with_additional_params(client, httpserver, cache_dir):
645+
cache_filename = str(cache_dir.joinpath('file.dcm'))
646+
with open(cache_filename, 'rb') as f:
647+
data = f.read()
648+
649+
n_resources = 3
650+
media_type = 'application/dicom'
651+
boundary = 'boundary'
652+
headers = {
653+
'content-type': (
654+
'multipart/related; '
655+
f'type="{media_type}"; '
656+
f'boundary="{boundary}"'
657+
),
658+
}
659+
params = {"key1": ["value1", "value2"], "key2": "value3"}
660+
message = DICOMwebClient._encode_multipart_message(
661+
content=[data for _ in range(n_resources)],
662+
content_type=headers['content-type']
663+
)
664+
httpserver.serve_content(content=message, code=200, headers=headers)
665+
study_instance_uid = '1.2.3'
666+
series_instance_uid = '1.2.4'
667+
response = client.retrieve_series(
668+
study_instance_uid, series_instance_uid, additional_params=params
669+
)
670+
for resource in response:
671+
with BytesIO() as fp:
672+
pydicom.dcmwrite(fp, resource)
673+
raw_result = fp.getvalue()
674+
assert raw_result == data
675+
request = httpserver.requests[0]
676+
expected_path = (
677+
f'/studies/{study_instance_uid}'
678+
f'/series/{series_instance_uid}'
679+
)
680+
assert request.query_string.decode() == (
681+
'key1=value1&key1=value2&key2=value3'
682+
)
683+
assert request.path == expected_path
684+
assert request.accept_mimetypes[0][0][:43] == headers['content-type'][:43]
685+
assert len(response) == n_resources
686+
687+
597688
def test_retrieve_instance(httpserver, client, cache_dir):
598689
cache_filename = str(cache_dir.joinpath('file.dcm'))
599690
with open(cache_filename, 'rb') as f:

0 commit comments

Comments
 (0)