Skip to content

Commit 5d49250

Browse files
author
hackermd
committed
Fix return value of retrieve_instance_metadata
The retrieve_instance_metadata() method so far returned a list of metadata dictionaries, while the retrieve_instance() method returned an individual object. This behaviour was also in contrast to the docstring of the retrieve_instance_metadata() method claimed that the return value is a single dictionary.
1 parent a78e0f9 commit 5d49250

File tree

3 files changed

+46
-17
lines changed

3 files changed

+46
-17
lines changed

src/dicomweb_client/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
__version__ = '0.12.0'
1+
__version__ = '0.13.0'
22

33
from dicomweb_client.api import DICOMwebClient

src/dicomweb_client/api.py

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class DICOMwebClient(object):
192192
def __init__(self, url, username=None, password=None, ca_bundle=None,
193193
cert=None, qido_url_prefix=None, wado_url_prefix=None,
194194
stow_url_prefix=None, proxies=None, headers=None,
195-
callback=None, auth=None):
195+
callback=None, auth=None, gcp_service_account_key_file=None):
196196
'''
197197
Parameters
198198
----------
@@ -225,10 +225,17 @@ def __init__(self, url, username=None, password=None, ca_bundle=None,
225225
(see `requests event hooks <http://docs.python-requests.org/en/master/user/advanced/#event-hooks>`_)
226226
auth: requests.auth.AuthBase, optional
227227
a subclassed instance of `requests.auth.AuthBase` to be used for authentication with the DICOMweb server
228+
gcp_service_account_key_file: str, optional
229+
path to a Google Cloud Platform (GCP) service account key file in
230+
JSON format
231+
(see `Google Cloud Healthcare API authentication <https://cloud.google.com/healthcare/docs/how-tos/authentication>`)
228232
229233
''' # noqa
230234
logger.debug('initialize HTTP session')
231-
self._session = requests.Session()
235+
if gcp_service_account_key_file is not None:
236+
self._session = self._get_gcp_session(gcp_service_account_key_file)
237+
else:
238+
self._session = requests.Session()
232239
self.base_url = url
233240
self.qido_url_prefix = qido_url_prefix
234241
self.wado_url_prefix = wado_url_prefix
@@ -286,19 +293,41 @@ def __init__(self, url, username=None, password=None, ca_bundle=None,
286293
self._session.proxies = proxies
287294
if callback is not None:
288295
self._session.hooks = {'response': callback}
289-
if auth is not None:
290-
self._session.auth = auth
291-
if username or password:
292-
logger.warning(
293-
'Auth object specified. '
294-
'Username and password ignored.'
295-
)
296-
if username is not None:
297-
if not password:
298-
raise ValueError(
299-
'No password provided for user "{0}".'.format(username)
296+
if gcp_service_account_key_file is not None:
297+
logger.warning(
298+
'GCP service account key file specified. '
299+
'Other authentication mechanisms ignored.'
300+
)
301+
else:
302+
if auth is not None:
303+
self._session.auth = auth
304+
if username or password:
305+
logger.warning(
306+
'Auth object specified. '
307+
'Username and password ignored.'
308+
)
309+
if username is not None:
310+
if not password:
311+
raise ValueError(
312+
'No password provided for user "{0}".'.format(username)
313+
)
314+
self._session.auth = (username, password)
315+
316+
def _get_gcp_session(self, service_account_key_file):
317+
from google.auth.transport import requests
318+
from google.oauth2 import service_account
319+
if not os.path.exists(service_account_key_file):
320+
raise OSError(
321+
'Google service account key file does not exist: "{}"'.format(
322+
service_account_key_file
300323
)
301-
self._session.auth = (username, password)
324+
)
325+
credentials = service_account.Credentials.from_service_account_file(
326+
service_account_file
327+
)
328+
scopes = ['https://www.googleapis.com/auth/cloud-platform', ]
329+
scoped_credentials = credentials.with_scopes(scopes)
330+
return requests.AuthorizedSession(scoped_credentials)
302331

303332
def _parse_qido_query_parameters(self, fuzzymatching, limit, offset,
304333
fields, search_filters):
@@ -1843,7 +1872,7 @@ def retrieve_instance_metadata(self, study_instance_uid,
18431872
'wado', study_instance_uid, series_instance_uid, sop_instance_uid
18441873
)
18451874
url += '/metadata'
1846-
return self._http_get_application_json(url)
1875+
return self._http_get_application_json(url)[0]
18471876

18481877
def retrieve_instance_rendered(self, study_instance_uid,
18491878
series_instance_uid,

src/dicomweb_client/tests/test_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ def test_retrieve_instance_metadata(httpserver, client, cache_dir):
221221
result = client.retrieve_instance_metadata(
222222
study_instance_uid, series_instance_uid, sop_instance_uid
223223
)
224-
assert result == parsed_content
224+
assert result == parsed_content[0]
225225
request = httpserver.requests[0]
226226
expected_path = (
227227
'/studies/{study_instance_uid}/series/{series_instance_uid}/instances'

0 commit comments

Comments
 (0)