Skip to content

Commit 0d3667c

Browse files
committed
adding additional_params to delete methods (delete_study, delete_series, delete_instance)
1 parent 40ffe7f commit 0d3667c

File tree

2 files changed

+118
-4
lines changed

2 files changed

+118
-4
lines changed

src/dicomweb_client/web.py

Lines changed: 34 additions & 4 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,
@@ -2126,13 +2126,19 @@ def retrieve_study_metadata(
21262126
url += '/metadata'
21272127
return self._http_get_application_json(url, params=additional_params)
21282128

2129-
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:
21302134
"""Delete all instances of a study.
21312135
21322136
Parameters
21332137
----------
21342138
study_instance_uid: str
21352139
Study Instance UID
2140+
additional_params: Union[Dict[str, Any], None], optional
2141+
Additional HTTP DELETE query parameters
21362142
21372143
Note
21382144
----
@@ -2149,6 +2155,12 @@ def delete_study(self, study_instance_uid: str) -> None:
21492155
'Study Instance UID is required for deletion of a study.'
21502156
)
21512157
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}'
21522164
self._http_delete(url)
21532165

21542166
def _assert_uid_format(self, uid: str) -> None:
@@ -2541,7 +2553,8 @@ def retrieve_series_rendered(
25412553
def delete_series(
25422554
self,
25432555
study_instance_uid: str,
2544-
series_instance_uid: str
2556+
series_instance_uid: str,
2557+
additional_params: Optional[Dict[str, Any]] = None
25452558
) -> None:
25462559
"""Delete all instances of a series.
25472560
@@ -2551,6 +2564,8 @@ def delete_series(
25512564
Study Instance UID
25522565
series_instance_uid: str
25532566
Series Instance UID
2567+
additional_params: Union[Dict[str, Any], None], optional
2568+
Additional HTTP DELETE query parameters
25542569
25552570
Note
25562571
----
@@ -2579,6 +2594,12 @@ def delete_series(
25792594
study_instance_uid,
25802595
series_instance_uid
25812596
)
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}'
25822603
self._http_delete(url)
25832604

25842605
def search_for_instances(
@@ -2796,7 +2817,8 @@ def delete_instance(
27962817
self,
27972818
study_instance_uid: str,
27982819
series_instance_uid: str,
2799-
sop_instance_uid: str
2820+
sop_instance_uid: str,
2821+
additional_params: Optional[Dict[str, Any]] = None
28002822
) -> None:
28012823
"""Delete specified instance.
28022824
@@ -2808,6 +2830,8 @@ def delete_instance(
28082830
Series Instance UID
28092831
sop_instance_uid: str
28102832
SOP Instance UID
2833+
additional_params: Union[Dict[str, Any], None], optional
2834+
Additional HTTP DELETE query parameters
28112835
28122836
Note
28132837
----
@@ -2837,6 +2861,12 @@ def delete_instance(
28372861
series_instance_uid,
28382862
sop_instance_uid
28392863
)
2864+
# Append query string if additional_params is provided
2865+
if additional_params:
2866+
additional_params_query_string = urlencode(
2867+
additional_params, doseq=True
2868+
)
2869+
url += f'?{additional_params_query_string}'
28402870
self._http_delete(url)
28412871

28422872
def retrieve_instance_metadata(

tests/test_web.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,6 +1342,31 @@ def test_delete_study_error(httpserver, client, cache_dir):
13421342
assert request.method == 'DELETE'
13431343

13441344

1345+
def test_delete_study_error_with_additional_params(
1346+
httpserver, client, cache_dir
1347+
):
1348+
study_instance_uid = '1.2.3'
1349+
httpserver.serve_content(
1350+
content='',
1351+
code=HTTPStatus.METHOD_NOT_ALLOWED,
1352+
headers=''
1353+
)
1354+
params = {"key1": ["value1", "value2"], "key2": "value3"}
1355+
with pytest.raises(HTTPError):
1356+
client.delete_study(
1357+
study_instance_uid=study_instance_uid,
1358+
additional_params=params
1359+
)
1360+
assert len(httpserver.requests) == 1
1361+
request = httpserver.requests[0]
1362+
expected_path = f'/studies/{study_instance_uid}'
1363+
assert request.path == expected_path
1364+
assert request.method == 'DELETE'
1365+
assert request.query_string.decode() == (
1366+
'key1=value1&key1=value2&key2=value3'
1367+
)
1368+
1369+
13451370
def test_delete_series_error(httpserver, client, cache_dir):
13461371
study_instance_uid = '1.2.3'
13471372
series_instance_uid = '1.2.4'
@@ -1363,6 +1388,34 @@ def test_delete_series_error(httpserver, client, cache_dir):
13631388
assert request.method == 'DELETE'
13641389

13651390

1391+
def test_delete_series_error_with_additional_params(
1392+
httpserver, client, cache_dir
1393+
):
1394+
study_instance_uid = '1.2.3'
1395+
series_instance_uid = '1.2.4'
1396+
httpserver.serve_content(
1397+
content='',
1398+
code=HTTPStatus.METHOD_NOT_ALLOWED,
1399+
headers=''
1400+
)
1401+
params = {"key1": ["value1", "value2"], "key2": "value3"}
1402+
with pytest.raises(HTTPError):
1403+
client.delete_series(study_instance_uid=study_instance_uid,
1404+
series_instance_uid=series_instance_uid,
1405+
additional_params=params)
1406+
assert len(httpserver.requests) == 1
1407+
request = httpserver.requests[0]
1408+
expected_path = (
1409+
f'/studies/{study_instance_uid}'
1410+
f'/series/{series_instance_uid}'
1411+
)
1412+
assert request.path == expected_path
1413+
assert request.method == 'DELETE'
1414+
assert request.query_string.decode() == (
1415+
'key1=value1&key1=value2&key2=value3'
1416+
)
1417+
1418+
13661419
def test_delete_instance_error(httpserver, client, cache_dir):
13671420
study_instance_uid = '1.2.3'
13681421
series_instance_uid = '1.2.4'
@@ -1387,6 +1440,37 @@ def test_delete_instance_error(httpserver, client, cache_dir):
13871440
assert request.method == 'DELETE'
13881441

13891442

1443+
def test_delete_instance_error_with_additional_params(
1444+
httpserver, client, cache_dir
1445+
):
1446+
study_instance_uid = '1.2.3'
1447+
series_instance_uid = '1.2.4'
1448+
sop_instance_uid = '1.2.5'
1449+
httpserver.serve_content(
1450+
content='',
1451+
code=HTTPStatus.METHOD_NOT_ALLOWED,
1452+
headers=''
1453+
)
1454+
params = {"key1": ["value1", "value2"], "key2": "value3"}
1455+
with pytest.raises(HTTPError):
1456+
client.delete_instance(study_instance_uid=study_instance_uid,
1457+
series_instance_uid=series_instance_uid,
1458+
sop_instance_uid=sop_instance_uid,
1459+
additional_params=params)
1460+
assert len(httpserver.requests) == 1
1461+
request = httpserver.requests[0]
1462+
expected_path = (
1463+
f'/studies/{study_instance_uid}'
1464+
f'/series/{series_instance_uid}'
1465+
f'/instances/{sop_instance_uid}'
1466+
)
1467+
assert request.path == expected_path
1468+
assert request.method == 'DELETE'
1469+
assert request.query_string.decode() == (
1470+
'key1=value1&key1=value2&key2=value3'
1471+
)
1472+
1473+
13901474
def test_load_json_dataset_da(httpserver, client, cache_dir):
13911475
value = ['2018-11-21']
13921476
dicom_json = {

0 commit comments

Comments
 (0)