Пример #1
0
def handle_resource(resource_type):

    if resource_type == 'metadata':
        return redirect("/static/doc/metadata")

    if resource_type in [
            'callsets', 'variantsets', 'readgroupsets', 'referencesets',
            'variant'
    ]:
        if request.method == 'GET':
            return ga4gh.api.ga_handle_search(request, resource_type)
    elif resource_type in [
            'variantset', 'genomes', 'files', 'runs', 'genomes'
    ]:
        if request.method == 'GET':
            return basespace.api.bs_handle_search(request, resource_type)
    elif resource_type in RESOURCES:
        if request.method == 'GET':
            return ttam.api.ttam_handle_search(request, resource_type)
    else:
        return fhir_error.inform_not_found()

    g.api_base = request.api_base = util.get_api_base()
    fhir_request = fhir_api.FHIRRequest(request)

    if request.method == 'GET':
        return fhir_api.handle_search(fhir_request, resource_type)
    else:
        return fhir_api.handle_create(fhir_request, resource_type)
Пример #2
0
def read_history(resource_type, resource_id, version):
    if resource_type is not None and resource_type not in RESOURCES:
        return fhir_error.inform_not_found()

    request.api_base = util.get_api_base() 
    fhir_request = fhir_api.FHIRRequest(request)
    return fhir_api.handle_history(fhir_request, resource_type, resource_id, version)
Пример #3
0
def launch_app(client_id):
    # TODO refactor this. No DRY!!!
    user = request.session.user
    app = (App.query.filter_by(user_id=user.email,
                               client_id=client_id).first())
    if app is None:
        return NOT_FOUND
    if request.method == 'GET':
        # prompt user to select a patient to launch
        # TODO make this more readable
        patients = [{
            'id':
            pt.resource_id,
            'desc':
            json.loads(pt.data).get('text',
                                    {}).get('div', 'No description available')
        } for pt in Resource.query.filter_by(owner_id=user.email,
                                             resource_type='Patient').all()]
        if len(patients) > 0:
            return render_template('launch_context.html',
                                   cont_url=request.url,
                                   resources=json.dumps({'Patient': patients}))
        else:
            selected_pt = None
    else:
        selected_pt = request.form['Patient']

    ctx = Context()
    if selected_pt is not None:
        ctx.context = json.dumps({'Patient': selected_pt})
    db.session.add(ctx)
    db.session.commit()
    # launch!
    launch_args = {'launch': ctx.id, 'iss': get_api_base()}
    return redirect('%s?%s' % (app.launch_uri, urlencode(launch_args)))
Пример #4
0
def handle_resources(resource_type, resource_id):
    if resource_type in [
            'callsets', 'variantsets', 'readgroupsets', 'referencesets',
            'variant'
    ]:
        if request.method == 'GET':
            return ga4gh.api.ga_handle_read(request, resource_type,
                                            resource_id)
    elif resource_type in [
            'variantset', 'genomes', 'files', 'runs', 'genomes'
    ]:
        if request.method == 'GET':
            return basespace.api.bs_handle_read(request, resource_type,
                                                resource_id)
    elif resource_type in RESOURCES:
        if request.method == 'GET':
            return ttam.api.ttam_handle_read(request, resource_type,
                                             resource_id)
    else:
        return fhir_error.inform_not_found()

    request.api_base = util.get_api_base()
    fhir_request = fhir_api.FHIRRequest(request, is_resource=False)

    if request.method == 'GET':
        return fhir_api.handle_read(fhir_request, resource_type, resource_id)
    elif request.method == 'PUT':
        return fhir_api.handle_update(fhir_request, resource_type, resource_id)
    else:
        return fhir_api.handle_delete(fhir_request, resource_type, resource_id)
Пример #5
0
def launch_app(client_id):
    # TODO refactor this. No DRY!!!
    user = request.session.user
    app = App.query.filter_by(user_id=user.email, client_id=client_id).first()
    if app is None:
        return NOT_FOUND
    if request.method == "GET":
        # prompt user to select a patient to launch
        # TODO make this more readable
        patients = [
            {"id": pt.resource_id, "desc": json.loads(pt.data).get("text", {}).get("div", "No description available")}
            for pt in Resource.query.filter_by(owner_id=user.email, resource_type="Patient").all()
        ]
        if len(patients) > 0:
            return render_template(
                "launch_context.html", cont_url=request.url, resources=json.dumps({"Patient": patients})
            )
        else:
            selected_pt = None
    else:
        selected_pt = request.form["Patient"]

    ctx = Context()
    if selected_pt is not None:
        ctx.context = json.dumps({"Patient": selected_pt})
    db.session.add(ctx)
    db.session.commit()
    # launch!
    launch_args = {"launch": ctx.id, "iss": get_api_base()}
    return redirect("%s?%s" % (app.launch_uri, urlencode(launch_args)))
Пример #6
0
def handle_resources(resource_type, resource_id):
    if resource_type in ['callsets', 'variantsets', 'readgroupsets', 'referencesets', 'variant']:
        if request.method == 'GET':
            return ga4gh.api.ga_handle_read(request, resource_type, resource_id)
    elif resource_type in ['variantset', 'genomes', 'files', 'runs', 'genomes']:
        if request.method == 'GET':
            return basespace.api.bs_handle_read(request, resource_type, resource_id)
    elif resource_type in RESOURCES:
        if request.method == 'GET':
            return ttam.api.ttam_handle_read(request, resource_type, resource_id)
    else:
        return fhir_error.inform_not_found()



    request.api_base = util.get_api_base() 
    fhir_request = fhir_api.FHIRRequest(request, is_resource=False)

    if request.method == 'GET':
        return fhir_api.handle_read(fhir_request,
                                    resource_type,
                                    resource_id)
    elif request.method == 'PUT':
        return fhir_api.handle_update(fhir_request,
                                      resource_type,
                                      resource_id)
    else:
        return fhir_api.handle_delete(fhir_request,
                                      resource_type,
                                      resource_id)
Пример #7
0
def read_history(resource_type, resource_id, version):
    if resource_type is not None and resource_type not in RESOURCES:
        return fhir_error.inform_not_found()

    request.api_base = util.get_api_base()
    fhir_request = fhir_api.FHIRRequest(request)
    return fhir_api.handle_history(fhir_request, resource_type, resource_id,
                                   version)
Пример #8
0
def handle_resource(resource_type):
    if resource_type not in RESOURCES:
        return fhir_error.inform_not_found()

    g.api_base = request.api_base = util.get_api_base()
    fhir_request = fhir_api.FHIRRequest(request)

    if request.method == 'GET':
        return fhir_api.handle_search(fhir_request, resource_type)
    else:
        return fhir_api.handle_create(fhir_request, resource_type)
Пример #9
0
def handle_resource(resource_type):
    if resource_type not in RESOURCES:
        return fhir_error.inform_not_found()

    g.api_base = request.api_base = util.get_api_base()
    fhir_request = fhir_api.FHIRRequest(request)

    if request.method == "GET":
        return fhir_api.handle_search(fhir_request, resource_type)
    else:
        return fhir_api.handle_create(fhir_request, resource_type)
Пример #10
0
def handle_resources(resource_type, resource_id):
    if resource_type not in RESOURCES:
        return fhir_error.inform_not_found()

    request.api_base = util.get_api_base()
    fhir_request = fhir_api.FHIRRequest(request, is_resource=False)

    if request.method == 'GET':
        return fhir_api.handle_read(fhir_request, resource_type, resource_id)
    elif request.method == 'PUT':
        return fhir_api.handle_update(fhir_request, resource_type, resource_id)
    else:
        return fhir_api.handle_delete(fhir_request, resource_type, resource_id)
Пример #11
0
def handle_resources(resource_type, resource_id):
    if resource_type not in RESOURCES:
        return fhir_error.inform_not_found()

    request.api_base = util.get_api_base()
    fhir_request = fhir_api.FHIRRequest(request, is_resource=False)

    if request.method == "GET":
        return fhir_api.handle_read(fhir_request, resource_type, resource_id)
    elif request.method == "PUT":
        return fhir_api.handle_update(fhir_request, resource_type, resource_id)
    else:
        return fhir_api.handle_delete(fhir_request, resource_type, resource_id)
Пример #12
0
def handle_resource(resource_type):
    if resource_type in ['callsets', 'variantsets', 'readgroupsets', 'referencesets', 'variant']:
        if request.method == 'GET':
            return ga4gh.api.ga_handle_search(request, resource_type)

    if resource_type not in RESOURCES:
        return fhir_error.inform_not_found()

    g.api_base = request.api_base = util.get_api_base() 
    fhir_request = fhir_api.FHIRRequest(request)

    if request.method == 'GET':
        return fhir_api.handle_search(fhir_request, resource_type)
    else:
        return fhir_api.handle_create(fhir_request, resource_type)
Пример #13
0
def handle_resource(resource_type):
    if resource_type in [
            'callsets', 'variantsets', 'readgroupsets', 'referencesets',
            'variant'
    ]:
        if request.method == 'GET':
            return ga4gh.api.ga_handle_search(request, resource_type)

    if resource_type not in RESOURCES:
        return fhir_error.inform_not_found()

    g.api_base = request.api_base = util.get_api_base()
    fhir_request = fhir_api.FHIRRequest(request)

    if request.method == 'GET':
        return fhir_api.handle_search(fhir_request, resource_type)
    else:
        return fhir_api.handle_create(fhir_request, resource_type)
Пример #14
0
def handle_resources_policy(resource_type, resource_id):
    if resource_type not in RESOURCES:
        return fhir_error.inform_not_found()

    request.api_base = util.get_api_base()
    fhir_request = fhir_api.FHIRRequest(request, is_resource=False)

    if request.method == 'GET':
        return fhir_api.handle_read(fhir_request,
                                    resource_type,
                                    resource_id)
    elif request.method == 'PUT' or request.method == 'POST':
        return fhir_api.handle_add_policy(fhir_request,
                                      resource_type,
                                      resource_id)
    else:
        return fhir_api.handle_delete_policy(fhir_request,
                                      resource_type,
                                      resource_id)
Пример #15
0
def index_reference(index, element, owner_id, g):
    '''
    index a reference
    '''
    if 'display' in element:
        index['text'] = '::%s::' % (element['display'], )

    if 'reference' in element:
        reference_url = element['reference']
        reference = REFERENCE_RE.match(reference_url)
        index['referenced_url'] = reference_url
        if reference.group('extern_base') is None or reference.group(
                'extern_base') == get_api_base():
            # reference is internal reference, we want to link the reference to a Resource
            index['referenced'] = Resource.query.filter_by(
                resource_type=reference.group('resource_type'),
                resource_id=reference.group('resource_id'),
                owner_id=owner_id,
                visible=True).first()
    return index
Пример #16
0
def launch_app(client_id):
    # TODO refactor this. No DRY!!!
    user = request.session.user
    app = (App.query
            .filter_by(user_id=user.email, client_id=client_id)
            .first())
    if app is None:
        return NOT_FOUND
    if request.method == 'GET':
        # prompt user to select a patient to launch
        # TODO make this more readable
        patients = [{'id': pt.resource_id, 'desc': json.loads(pt.data).get('text', {}).get('div', 'No description available')}
                for pt in Resource
                .query
                .filter_by(
                    owner_id=user.email,
                    resource_type='Patient')
                .all()]
        if len(patients) > 0:
            return render_template(
                    'launch_context.html',
                    cont_url=request.url,
                    resources=json.dumps({'Patient': patients}))
        else:
            selected_pt = None
    else:
        selected_pt = request.form['Patient']

    ctx = Context()
    if selected_pt is not None:
        ctx.context = json.dumps({'Patient': selected_pt})
    db.session.add(ctx)
    db.session.commit()
    # launch!
    launch_args = {
        'launch': ctx.id,
        'iss': get_api_base()
    }
    return redirect('%s?%s'% (
        app.launch_uri,
        urlencode(launch_args)))
Пример #17
0
    def __init__(self,
                 query,
                 request,
                 version_specific=False,
                 ttam_resource=None):
        self.api_base = get_api_base()
        self.request_url = request.url
        self.data_format = request.format
        self.version_specific = version_specific
        self.update_time = datetime.now().isoformat()
        self.resources = query.\
                limit(request.count).\
                offset(request.offset).all()
        self.resource_count = query.count()
        #print self.resource_count

        if ttam_resource is not None:
            # 23andMe resource(s) are being requested here.
            # We need to figure out the paging properties for 23andme resources.
            # We preserve determinism here by lining all internal resources before
            # 23andMe resources (
            # think about it like this ...---, with '.' being internal, and '-' being 23andMe.
            # Here we have three internal resources and 3 23andMe resources.
            # So a 4-offset is the same as a 0-offset of 23andMe resources,
            # and a 1-offset is also a 0-offset of 23andMe. And so forth).
            num_resources = len(self.resources)
            ttam_offset = (request.offset - self.resource_count
                           if request.offset >= self.resource_count else 0)
            ttam_limit = request.count - num_resources
            ttam_resources, ttam_count = ttam.get_many(ttam_resource,
                                                       request.args,
                                                       ttam_offset, ttam_limit)
            self.resource_count += ttam_count
            if num_resources < request.count:
                self.resources.extend(ttam_resources)

        self.next_url = (request.get_next_url() if len(self.resources) +
                         request.offset < self.resource_count else None)
        self.prev_url = (request.get_prev_url()
                         if request.offset - request.count >= 0 else None)
Пример #18
0
    def __init__(self, request, is_resource=True):
        self.args = request.args
        self.format = self.args.get('_format', 'xml')
        self.api_base = get_api_base()
        self.url = request.url
        self.base_url = request.base_url
        self.authorizer = request.authorizer
        # paging params
        self.count = int(self.args.get('_count', PAGE_SIZE))
        self.offset = int(self.args.get('_offset', 0))

        if request.method in ('POST', 'PUT'):
            # regardless of format of uploaded data
            # we process it as a json object (technically a Python Dict)
            if self.format == 'xml':
                dataroot = etree.fromstring(request.data)
                # tag of an etree element = {whatever xmlns value is}[element name]
                # we only care about `element name` here
                resource_type = dataroot.tag.split('}')[-1]
                self.data = xml_to_json(dataroot, resource_type)
            else:
                self.data = json.loads(request.data)
Пример #19
0
    def __init__(self, request, is_resource=True):
        self.args = request.args
        self.format = self.args.get('_format', 'xml')
        self.api_base = get_api_base()
        self.url = request.url
        self.base_url = request.base_url
        self.authorizer = request.authorizer
        # paging params
        self.count = int(self.args.get('_count', PAGE_SIZE))
        self.offset = int(self.args.get('_offset', 0))

        if request.method in ('POST', 'PUT'):
            # regardless of format of uploaded data
            # we process it as a json object (technically a Python Dict)
            if self.format == 'xml':
                dataroot = etree.fromstring(request.data)
                # tag of an etree element = {whatever xmlns value is}[element name]
                # we only care about `element name` here
                resource_type = dataroot.tag.split('}')[-1]
                self.data = xml_to_json(dataroot, resource_type)
            else:
                self.data = json.loads(request.data)
Пример #20
0
    def __init__(self, query, request, version_specific=False, ttam_resource=None):
        self.api_base = get_api_base()
        self.request_url = request.url
        self.data_format = request.format
        self.version_specific = version_specific
        self.update_time = datetime.now().isoformat()

        self.resources = query.\
                limit(request.count).\
                offset(request.offset).all()
        self.resource_count = query.count()

        if ttam_resource is not None:
            # 23andMe resource(s) are being requested here.
            # We need to figure out the paging properties for 23andme resources.
            # We preserve determinism here by lining all internal resources before
            # 23andMe resources (
            # think about it like this ...---, with '.' being internal, and '-' being 23andMe.
            # Here we have three internal resources and 3 23andMe resources.
            # So a 4-offset is the same as a 0-offset of 23andMe resources,
            # and a 1-offset is also a 0-offset of 23andMe. And so forth).
            num_resources = len(self.resources)
            ttam_offset = (request.offset - self.resource_count
                    if request.offset >= self.resource_count
                    else 0)
            ttam_limit = request.count - num_resources
            ttam_resources, ttam_count = ttam.get_many(ttam_resource, request.args, ttam_offset, ttam_limit)
            self.resource_count += ttam_count
            if num_resources < request.count:
                self.resources.extend(ttam_resources)

        self.next_url = (request.get_next_url()
                         if len(self.resources) + request.offset < self.resource_count
                         else None)
        self.prev_url = (request.get_prev_url()
                         if request.offset - request.count >= 0
                         else None)
Пример #21
0
def handle_resource(resource_type):

    if resource_type == 'metadata':
        return redirect("/static/doc/metadata")

    if resource_type in ['callsets', 'variantsets', 'readgroupsets', 'referencesets', 'variant']:
        if request.method == 'GET':
            return ga4gh.api.ga_handle_search(request, resource_type)
    elif resource_type in ['variantset', 'genomes', 'files', 'runs', 'genomes']:
        if request.method == 'GET':
            return basespace.api.bs_handle_search(request, resource_type)
    elif resource_type in RESOURCES:
        if request.method == 'GET':
            return ttam.api.ttam_handle_search(request, resource_type)
    else:
        return fhir_error.inform_not_found()

    g.api_base = request.api_base = util.get_api_base() 
    fhir_request = fhir_api.FHIRRequest(request)

    if request.method == 'GET':
        return fhir_api.handle_search(fhir_request, resource_type)
    else:
        return fhir_api.handle_create(fhir_request, resource_type)
Пример #22
0
def index_reference(index, element, owner_id, g):
    '''
    index a reference
    '''
    if 'display' in element:
        index['text'] = '::%s::' % (element['display'],)

    if 'reference' in element:
        reference_url = element['reference']
        reference = REFERENCE_RE.match(reference_url)
        index['referenced_url'] = reference_url
        if reference.group('extern_base') is None or reference.group('extern_base') == get_api_base():
            # reference is internal reference, we want to link the reference to a Resource
            index['referenced'] = Resource.query.filter_by(resource_type=reference.group('resource_type'),
                                                           resource_id=reference.group('resource_id'),
                                                           owner_id=owner_id,
                                                           visible=True).first()
    return index