from threading import Lock requests_lock = Lock() def get_query_methods(): return ["AND", "OR"] def get_operators(): return ["LIKE", ">", "<", "<=", ">=", "="] def get_credentials(force=False,username="", password="" ): if get_credentials.cache and not force: return get_credentials.cache from getpass import getpass while not len(username): username = raw_input("Username: ").strip() while not len(password): password = getpass().strip() get_credentials.cache = username, password return get_credentials() get_credentials.cache = None def download_all(results, host): for r in results: download(r, host) def download_async(result, host, dest_folder='', cb=(lambda *_: None), cb_args=()): from threading import Thread download_thread = Thread(target=download, args=(result, host, dest_folder, cb, cb_args)) download_thread.start() return download_thread def download(result, host, dest_folder='', cb=(lambda *_: None), cb_args=()): requests_lock.acquire() print(result) subject = result['xnat_mrsessiondata_subject_id'] #TODO download andere typen experiment = result['xnat_mrsessiondata_session_id'] project = result['xnat_mrsessiondata_project'] scan = result['id'] file_name = "%s/%s-%s-%s-%s" % (dest_folder, project, subject, experiment, scan) download_file(host, project, subject, experiment, scan, file_name) requests_lock.release() cb(*cb_args) def download_file(host, project, subject, experiment, scan, file_name): import requests from base64 import b64encode from requests.auth import HTTPBasicAuth if not file_name.endswith(".zip"): file_name += ".zip" url= "%s/data/archive/projects/%s/subjects/%s/experiments/%s/scans/%s/resources/DICOM/files?format=zip" % (host, project, subject, experiment, scan) user, passw = get_credentials() try: with open(file_name, 'wb') as handle: response = requests.get(url, stream=True, auth=HTTPBasicAuth(user, passw)) if not response.ok: raise ValueError(response.status_code) for block in response.iter_content(1024): if not block: break handle.write(block) except IOError as e: print "Error writing file %s, %s" % (file_name, e) except ValueError as e: print "Error downloading file %s, Status Code %s" % (url, e) def search_for(host, root_element, constraints, search_fields, user, passw): import xsa.errors as xsa_errors from pyxnat.core import errors from httplib2 import ServerNotFoundError from httplib import ResponseNotReady get_credentials(username=user, password=passw, force=True) user, passw = get_credentials() # TODO from tempfile import mkdtemp tmp_dir=mkdtemp() from pyxnat import Interface try: central = Interface(server=host, user=user, password=passw, cachedir=tmp_dir) except IndexError as e: raise xsa_errors.ServerNotFoundError("Server not found, check your host-address.") #TODO Ok? result = [] try: result = central.select(root_element,search_fields).where(constraints) except errors.DatabaseError as e: if '401' in str(e): raise xsa_errors.UnauthorizedError("Unauthorizied attempt. Check your User and Password") except ServerNotFoundError: raise xsa_errors.ServerNotFoundError("Server not found, check your host-address.") except ResponseNotReady: raise xsa_errors.ResponseNotReady("Please check your Host-Address") if result == []: raise xsa_errors.QueryError("Please check your query.") try: central.disonnect() except AttributeError: print "can\'t close connection (wrong pyxnat version?)" try: from shutil import rmtree rmtree(tmp_dir) except: pass return result