Skip to content
queries.py 4 KiB
Newer Older
Franziska Koehn's avatar
Franziska Koehn committed
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=None):
        download(r, host)

def download_async(result, dest_folder='', host=None, cb=(lambda *_: None), cb_args=()):
Franziska Koehn's avatar
Franziska Koehn committed
    from threading import Thread
    download_thread = Thread(target=download, args=(result, dest_folder, host, cb, cb_args))
Franziska Koehn's avatar
Franziska Koehn committed
    download_thread.start()
    return download_thread
Franziska Koehn's avatar
Franziska Koehn committed

def download(result, dest_folder='', host=None, cb=(lambda *_: None), cb_args=()):
    if not host:
        host = HOST
Franziska Koehn's avatar
Franziska Koehn committed
    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)
Franziska Koehn's avatar
Franziska Koehn committed
    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
    from pyxnat import Interface
        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