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)
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)
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)))
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)
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)))
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)
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)
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)
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)
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)
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)
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)
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)
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
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)))
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)
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)
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)
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)
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