22from chrisclient import request
33from loguru import logger
44import sys
5+ from requests .exceptions import RequestException , Timeout , HTTPError
6+ from tenacity import retry , wait_exponential , stop_after_attempt , retry_if_exception_type
7+ from urllib .parse import urlencode
58
69LOG = logger .debug
710
1821
1922
2023class PACSClient (object ):
21- def __init__ (self , url : str , username : str , password : str ):
22- self .cl = request .Request (username , password )
24+ def __init__ (self , url : str , token : str ):
25+ self .api_base = url .rstrip ('/' )
26+ self .auth = token
27+ self .headers = {"Content-Type" : "application/json" }
2328 self .pacs_series_search_url = f"{ url } search/"
2429
30+ # --------------------------
31+ # Retryable request handler
32+ # --------------------------
33+ @retry (
34+ retry = retry_if_exception_type ((RequestException , Timeout , HTTPError )),
35+ wait = wait_exponential (multiplier = 1 , min = 2 , max = 10 ),
36+ stop = stop_after_attempt (5 ),
37+ reraise = True
38+ )
39+ def make_request (self , method , endpoint , ** kwargs ):
40+ response = requests .request (method , endpoint , headers = self .headers , auth = self .auth , timeout = 30 , ** kwargs )
41+ response .raise_for_status ()
42+
43+ try :
44+ return response .json ()
45+ except ValueError :
46+ return response .text
47+
2548
2649 def get_pacs_files (self , params : dict ):
50+ """
51+ Get PACS folder path
52+ """
2753 l_dir_path = set ()
28- resp = self .cl .get (self .pacs_series_search_url ,params )
29- LOG (resp )
30- for item in resp .items :
31- for link in item .links :
32- folder = self .cl .get (link .href )
33- for item_folder in folder .items :
34- path = item_folder .data .path .value
35- l_dir_path .add (path )
54+ query_string = urlencode (params )
55+ response = self .make_request ("GET" , f"{ self .pacs_series_search_url } ?{ query_string } " )
56+ for item in response .get ("collection" , {}).get ("items" , []):
57+ for link in item .get ("links" , []):
58+ folder = self .make_request ("GET" ,link .get ("href" ))
59+ for item_folder in folder .get ("collection" , {}).get ("items" , []):
60+ for field in item_folder .get ("data" , []):
61+ if field .get ("name" ) == "path" :
62+ l_dir_path .add (field .get ("value" ))
63+
3664 return ',' .join (l_dir_path )
0 commit comments