Skip to content

Commit 83a3f38

Browse files
committed
Merge branch 'upstream'
2 parents c6a6f45 + 874222d commit 83a3f38

File tree

2 files changed

+298
-13
lines changed

2 files changed

+298
-13
lines changed

src/pydicomweb_client/web.py

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
Union,
2222
Tuple,
2323
)
24-
from urllib.parse import urlparse
24+
from urllib.parse import urlencode, urlparse
2525
from warnings import warn
2626
from xml.etree.ElementTree import (
2727
Element,
@@ -1659,7 +1659,7 @@ def search_for_studies(
16591659
Study representations
16601660
(see `Study Result Attributes <http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2>`_)
16611661
1662-
Notes
1662+
Note
16631663
----
16641664
- The server may only return a subset of search results. In this case,
16651665
a warning will notify the client that there are remaining results.
@@ -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(
@@ -2118,13 +2126,19 @@ def retrieve_study_metadata(
21182126
url += '/metadata'
21192127
return self._http_get_application_json(url, params=additional_params)
21202128

2121-
def delete_study(self, study_instance_uid: str) -> None:
2129+
def delete_study(
2130+
self,
2131+
study_instance_uid: str,
2132+
additional_params: Optional[Dict[str, Any]] = None
2133+
) -> None:
21222134
"""Delete all instances of a study.
21232135
21242136
Parameters
21252137
----------
21262138
study_instance_uid: str
21272139
Study Instance UID
2140+
additional_params: Union[Dict[str, Any], None], optional
2141+
Additional HTTP DELETE query parameters
21282142
21292143
Note
21302144
----
@@ -2141,6 +2155,12 @@ def delete_study(self, study_instance_uid: str) -> None:
21412155
'Study Instance UID is required for deletion of a study.'
21422156
)
21432157
url = self._get_studies_url(_Transaction.DELETE, study_instance_uid)
2158+
# Append query string if additional_params is provided
2159+
if additional_params:
2160+
additional_params_query_string = urlencode(
2161+
additional_params, doseq=True
2162+
)
2163+
url += f'?{additional_params_query_string}'
21442164
self._http_delete(url)
21452165

21462166
def _assert_uid_format(self, uid: str) -> None:
@@ -2207,7 +2227,7 @@ def search_for_series(
22072227
Series representations
22082228
(see `Series Result Attributes <http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2a>`_)
22092229
2210-
Notes
2230+
Note
22112231
----
22122232
- The server may only return a subset of search results. In this case,
22132233
a warning will notify the client that there are remaining results.
@@ -2317,7 +2337,8 @@ def retrieve_series(
23172337
self,
23182338
study_instance_uid: str,
23192339
series_instance_uid: str,
2320-
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None
2340+
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None,
2341+
additional_params: Optional[Dict[str, Any]] = None
23212342
) -> List[pydicom.dataset.Dataset]:
23222343
"""Retrieve all instances of a series.
23232344
@@ -2330,6 +2351,8 @@ def retrieve_series(
23302351
media_types: Union[Tuple[Union[str, Tuple[str, str]], ...], None], optional
23312352
Acceptable media types and optionally the UIDs of the
23322353
acceptable transfer syntaxes
2354+
additional_params: Union[Dict[str, Any], None], optional
2355+
Additional HTTP GET query parameters
23332356
23342357
Returns
23352358
-------
@@ -2352,15 +2375,17 @@ def retrieve_series(
23522375
study_instance_uid=study_instance_uid,
23532376
series_instance_uid=series_instance_uid,
23542377
media_types=media_types,
2355-
stream=False
2378+
stream=False,
2379+
additional_params=additional_params
23562380
)
23572381
)
23582382

23592383
def iter_series(
23602384
self,
23612385
study_instance_uid: str,
23622386
series_instance_uid: str,
2363-
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None
2387+
media_types: Optional[Tuple[Union[str, Tuple[str, str]], ...]] = None,
2388+
additional_params: Optional[Dict[str, Any]] = None
23642389
) -> Iterator[pydicom.dataset.Dataset]:
23652390
"""Iterate over all instances of a series.
23662391
@@ -2373,6 +2398,8 @@ def iter_series(
23732398
media_types: Union[Tuple[Union[str, Tuple[str, str]], ...], None], optional
23742399
Acceptable media types and optionally the UIDs of the
23752400
acceptable transfer syntaxes
2401+
additional_params: Union[Dict[str, Any], None], optional
2402+
Additional HTTP GET query parameters
23762403
23772404
Returns
23782405
-------
@@ -2398,7 +2425,8 @@ def iter_series(
23982425
study_instance_uid=study_instance_uid,
23992426
series_instance_uid=series_instance_uid,
24002427
media_types=media_types,
2401-
stream=True
2428+
stream=True,
2429+
additional_params=additional_params
24022430
)
24032431

24042432
def retrieve_series_metadata(
@@ -2525,7 +2553,8 @@ def retrieve_series_rendered(
25252553
def delete_series(
25262554
self,
25272555
study_instance_uid: str,
2528-
series_instance_uid: str
2556+
series_instance_uid: str,
2557+
additional_params: Optional[Dict[str, Any]] = None
25292558
) -> None:
25302559
"""Delete all instances of a series.
25312560
@@ -2535,6 +2564,8 @@ def delete_series(
25352564
Study Instance UID
25362565
series_instance_uid: str
25372566
Series Instance UID
2567+
additional_params: Union[Dict[str, Any], None], optional
2568+
Additional HTTP DELETE query parameters
25382569
25392570
Note
25402571
----
@@ -2563,6 +2594,12 @@ def delete_series(
25632594
study_instance_uid,
25642595
series_instance_uid
25652596
)
2597+
# Append query string if additional_params is provided
2598+
if additional_params:
2599+
additional_params_query_string = urlencode(
2600+
additional_params, doseq=True
2601+
)
2602+
url += f'?{additional_params_query_string}'
25662603
self._http_delete(url)
25672604

25682605
def search_for_instances(
@@ -2741,7 +2778,8 @@ def retrieve_instance(
27412778
def store_instances(
27422779
self,
27432780
datasets: Sequence[pydicom.dataset.Dataset],
2744-
study_instance_uid: Optional[str] = None
2781+
study_instance_uid: Optional[str] = None,
2782+
additional_params: Optional[Dict[str, Any]] = None
27452783
) -> pydicom.dataset.Dataset:
27462784
"""Store instances.
27472785
@@ -2751,6 +2789,8 @@ def store_instances(
27512789
Instances that should be stored
27522790
study_instance_uid: Union[str, None], optional
27532791
Study Instance UID
2792+
additional_params: Union[Dict[str, Any], None], optional
2793+
Additional HTTP POST query parameters
27542794
27552795
Returns
27562796
-------
@@ -2770,6 +2810,12 @@ def _iter_encoded_datasets(datasets):
27702810
message += f' of study "{study_instance_uid}"'
27712811
logger.info(message)
27722812
url = self._get_studies_url(_Transaction.STORE, study_instance_uid)
2813+
# Append query string if additional_params is provided
2814+
if additional_params:
2815+
additional_params_query_string = urlencode(
2816+
additional_params, doseq=True
2817+
)
2818+
url += f'?{additional_params_query_string}'
27732819
encoded_datasets = _iter_encoded_datasets(datasets)
27742820
return self._http_post_multipart_application_dicom(
27752821
url,
@@ -2780,7 +2826,8 @@ def delete_instance(
27802826
self,
27812827
study_instance_uid: str,
27822828
series_instance_uid: str,
2783-
sop_instance_uid: str
2829+
sop_instance_uid: str,
2830+
additional_params: Optional[Dict[str, Any]] = None
27842831
) -> None:
27852832
"""Delete specified instance.
27862833
@@ -2792,6 +2839,8 @@ def delete_instance(
27922839
Series Instance UID
27932840
sop_instance_uid: str
27942841
SOP Instance UID
2842+
additional_params: Union[Dict[str, Any], None], optional
2843+
Additional HTTP DELETE query parameters
27952844
27962845
Note
27972846
----
@@ -2821,6 +2870,12 @@ def delete_instance(
28212870
series_instance_uid,
28222871
sop_instance_uid
28232872
)
2873+
# Append query string if additional_params is provided
2874+
if additional_params:
2875+
additional_params_query_string = urlencode(
2876+
additional_params, doseq=True
2877+
)
2878+
url += f'?{additional_params_query_string}'
28242879
self._http_delete(url)
28252880

28262881
def retrieve_instance_metadata(

0 commit comments

Comments
 (0)