def get_custom_data(): from subprocess import Popen, PIPE, STDOUT if not auth.user : res = {"redirect" : URL('default', 'user', args='login', scheme=True, host=True)} #TODO _next return gluon.contrib.simplejson.dumps(res, separators=(',',':')) error = "" samples = [] if not "custom" in request.vars : error += "no file selected, " else: samples = request.vars['custom'] if type(request.vars['custom']) is not str else [request.vars['custom']] if not samples: error += "incorrect query, need at least one sample" else: for id in samples: log.debug("id = '%s'" % str(id)) sequence_file_id = db.results_file[id].sequence_file_id sample_set_id = db((db.sample_set_membership.sequence_file_id == sequence_file_id) ).select(db.sample_set_membership.sample_set_id).first().sample_set_id if not auth.can_view_sample_set(sample_set_id): error += "you do not have permission to consult this element ("+str(sample_set_id)+")" if error == "" : try: data = custom_fuse(samples) except IOError, error: return error_message(str(error)) generic_info = "Compare samples" if len(samples) > 1 else "Sample %s" % samples[0] data["sample_name"] = generic_info data["dataFileName"] = generic_info data["info"] = generic_info data["samples"]["original_names"] = [] data["samples"]["timestamp"] = [] data["samples"]["info"] = [] data["samples"]["commandline"] = [] for id in samples: sequence_file_id = db.results_file[id].sequence_file_id sample_set = db((db.sequence_file.id == sequence_file_id) & (db.sample_set_membership.sequence_file_id == db.sequence_file.id) & (db.sample_set.id == db.sample_set_membership.sample_set_id) & (db.sample_set.sample_type.belongs([defs.SET_TYPE_PATIENT, defs.SET_TYPE_RUN, defs.SET_TYPE_GENERIC])) ).select(db.sample_set.id, db.sample_set.sample_type).first() patient_run = db(db[sample_set.sample_type].sample_set_id == sample_set.id).select().first() config_id = db.results_file[id].config_id name = vidjil_utils.anon_ids([patient_run.id])[0] if sample_set.sample_type == defs.SET_TYPE_PATIENT else patient_run.name filename = db.sequence_file[sequence_file_id].filename data["samples"]["original_names"].append(name + "_" + filename) data["samples"]["timestamp"].append(str(db.sequence_file[sequence_file_id].sampling_date)) data["samples"]["info"].append(db.sequence_file[sequence_file_id].info) data["samples"]["commandline"].append(db.config[config_id].command) log.info("load custom data #TODO log db") return gluon.contrib.simplejson.dumps(data, separators=(',',':'))
def get_names(self): '''Returns the names of all the sample sets. The function returns a dictionary whose keys are sample set IDs and value is the name. The number of queries is constant (which is true only if permissions have been cached: anon_ids checks for permission) ''' results = {} for stype in self.sample_types: stype_ids = self.get_sample_type_ids(stype) if stype == defs.SET_TYPE_PATIENT: patient_ids = db( db[stype].sample_set_id.belongs(stype_ids)).select( db[stype].id, db[stype].sample_set_id) names = vidjil_utils.anon_ids([p.id for p in patient_ids]) for i, p_id in enumerate(patient_ids): results[p_id.sample_set_id] = names[i] else: set_names = db( db[stype].sample_set_id.belongs(stype_ids)).select( db[stype].sample_set_id, db[stype].name) for s in set_names: results[s.sample_set_id] = s.name return results
def get_names(self): '''Returns the names of all the sample sets. The function returns a dictionary whose keys are sample set IDs and value is the name. The number of queries is constant (which is true only if permissions have been cached: anon_ids checks for permission) ''' results = {} for stype in self.sample_types: stype_ids = self.get_sample_type_ids(stype) if stype == defs.SET_TYPE_PATIENT: patient_ids = db(db[stype].sample_set_id.belongs(stype_ids)).select(db[stype].id, db[stype].sample_set_id) names = vidjil_utils.anon_ids([p.id for p in patient_ids]) for i, p_id in enumerate(patient_ids): results[p_id.sample_set_id] = names[i] else: set_names = db(db[stype].sample_set_id.belongs(stype_ids)).select(db[stype].sample_set_id, db[stype].name) for s in set_names: results[s.sample_set_id] = s.name return results
def get_custom_data(): from subprocess import Popen, PIPE, STDOUT if not auth.user : res = {"redirect" : URL('default', 'user', args='login', scheme=True, host=True)} #TODO _next return gluon.contrib.simplejson.dumps(res, separators=(',',':')) error = "" if not "custom" in request.vars : error += "no file selected, " else: if type(request.vars['custom']) is not list or len(request.vars['custom']) < 2: error += "you must select several files." else: for id in request.vars["custom"] : log.debug("id = '%s'" % str(id)) sequence_file_id = db.results_file[id].sequence_file_id patient_id = db((db.sample_set_membership.sequence_file_id == sequence_file_id) & (db.patient.sample_set_id == db.sample_set_membership.sample_set_id) ).select(db.patient.id).first() if not auth.can_view_patient(patient_id): error += "you do not have permission to consult this patient ("+str(patient_id)+")" if error == "" : try: data = custom_fuse(request.vars["custom"]) except IOError, error: return error_message(str(error)) data["dataFileName"] = "Compare patients" data["info"] = "Compare patients" data["samples"]["original_names"] = [] data["samples"]["timestamp"] = [] data["samples"]["info"] = [] data["samples"]["commandline"] = [] for id in request.vars["custom"] : sequence_file_id = db.results_file[id].sequence_file_id sample_set = db((db.sequence_file.id == sequence_file_id) & (db.sample_set_membership.sequence_file_id == db.sequence_file.id) & (db.sample_set.id == db.sample_set_membership.sample_set_id) & (db.sample_set.sample_type.belongs(['patient', 'run'])) ).select(db.sample_set.id, db.sample_set.sample_type).first() patient_run = db(db[sample_set.sample_type].sample_set_id == sample_set.id).select().first() config_id = db.results_file[id].config_id name = vidjil_utils.anon_ids(patient_run.id) if sample_set.sample_type == 'patient' else patient_run.name filename = db.sequence_file[sequence_file_id].filename data["samples"]["original_names"].append(name + "_" + filename) data["samples"]["timestamp"].append(str(db.sequence_file[sequence_file_id].sampling_date)) data["samples"]["info"].append(db.sequence_file[sequence_file_id].info) data["samples"]["commandline"].append(db.config[config_id].command) return gluon.contrib.simplejson.dumps(data, separators=(',',':'))
def get_data(): from subprocess import Popen, PIPE, STDOUT if not auth.user : res = {"redirect" : URL('default', 'user', args='login', scheme=True, host=True, vars=dict(_next=URL('default', 'get_data', scheme=True, host=True, vars=dict(sample_set_id = request.vars["sample_set_id"], config =request.vars["config"])) ) )} return gluon.contrib.simplejson.dumps(res, separators=(',',':')) error = "" if "patient" in request.vars : request.vars["sample_set_id"] = db.patient[request.vars["patient"]].sample_set_id download = False if "filename" in request.vars: download = True if "run" in request.vars : request.vars["sample_set_id"] = db.run[request.vars["run"]].sample_set_id if not "sample_set_id" in request.vars or request.vars['sample_set_id'] is None: error += "id sampleset file needed, " else : if not auth.can_view_sample_set(request.vars["sample_set_id"]): error += "you do not have permission to consult this sample_set ("+str(request.vars["sample_set_id"])+")" if not "config" in request.vars: error += "id config needed, " sample_set = db.sample_set[request.vars["sample_set_id"]] query = db( ( db.fused_file.sample_set_id == request.vars["sample_set_id"]) & ( db.fused_file.config_id == request.vars["config"] ) ).select(db.fused_file.ALL).first() if query is not None: fused_file = defs.DIR_RESULTS+'/'+query.fused_file sequence_file_list = query.sequence_file_list if not 'fused_file' in locals(): error += "file not found" if error == "" : f = open(fused_file, "r") data = gluon.contrib.simplejson.loads(f.read()) f.close() patient_name = "" run_name = "" config_name = db.config[request.vars["config"]].name command = db.config[request.vars["config"]].command log_reference_id = request.vars["sample_set_id"] if (sample_set.sample_type == defs.SET_TYPE_GENERIC) : for row in db( db.generic.sample_set_id == request.vars["sample_set_id"] ).select() : log_reference_id = row.id generic_name = db.generic[row.id].name data["dataFileName"] = generic_name + " (" + config_name + ")" data["info"] = db.generic[row.id].info data["generic_id"] = row.id data["sample_name"] = generic_name data["group_id"] = get_set_group(row.sample_set_id) if (sample_set.sample_type == defs.SET_TYPE_PATIENT): for row in db( db.patient.sample_set_id == request.vars["sample_set_id"] ).select() : log_reference_id = row.id patient_name = vidjil_utils.anon_ids([row.id])[0] data["dataFileName"] = patient_name + " (" + config_name + ")" data["info"] = db.patient[row.id].info data["patient_id"] = row.id data["sample_name"] = patient_name data["group_id"] = get_set_group(row.sample_set_id) if (sample_set.sample_type == defs.SET_TYPE_RUN) : for row in db( db.run.sample_set_id == request.vars["sample_set_id"] ).select() : log_reference_id = row.id run_name = db.run[row.id].name data["dataFileName"] = run_name + " (" + config_name + ")" data["info"] = db.run[row.id].info data["run_id"] = row.id data["sample_name"] = run_name data["group_id"] = get_set_group(row.sample_set_id) log_query = db( ( db.user_log.record_id == log_reference_id ) & ( db.user_log.table_name == sample_set.sample_type ) ).select(db.user_log.ALL, orderby=db.user_log.created) data["logs"] = [] for row in log_query: data["logs"].append({'message': row.msg, 'created': str(row.created)}) ## récupération des infos stockées sur la base de données query = db( ( db.sample_set.id == request.vars["sample_set_id"] ) & ( db.sample_set.id == db.sample_set_membership.sample_set_id ) & ( db.sequence_file.id == db.sample_set_membership.sequence_file_id) & ( db.results_file.sequence_file_id == db.sequence_file.id ) & ( db.results_file.config_id == request.vars["config"] ) ).select(db.sequence_file.ALL,db.results_file.ALL, db.sample_set.id, orderby=db.sequence_file.id|~db.results_file.run_date) query2 = {} sequence_file_id = 0 for row in query : if row.sequence_file.id != sequence_file_id : query2[row.sequence_file.data_file]=row sequence_file_id = row.sequence_file.id data["sample_set_id"] = sample_set.id data["config_name"] = config_name data["samples"]["info"] = [] data["samples"]["timestamp"] = [] data["samples"]["sequence_file_id"] = [] data["samples"]["results_file_id"] = [] data["samples"]["config_id"] = [] data["samples"]["names"] = [] data["samples"]["db_key"] = [] data["samples"]["id"] = [] data["samples"]["patient_id"] = [] data["samples"]["sample_name"] = [] data["samples"]["run_id"] = [] for i in range(len(data["samples"]["original_names"])) : o_n = data["samples"]["original_names"][i].split('/')[-1] data["samples"]["original_names"][i] = data["samples"]["original_names"][i].split('/')[-1] data["samples"]["config_id"].append(request.vars['config']) data["samples"]["db_key"].append('') data["samples"]["commandline"].append(command) if o_n in query2: row = query2[o_n] data["samples"]["info"].append(row.sequence_file.info) data["samples"]["timestamp"].append(str(row.sequence_file.sampling_date)) data["samples"]["sequence_file_id"].append(row.sequence_file.id) data["samples"]["results_file_id"].append(row.results_file.id) data["samples"]["names"].append(row.sequence_file.filename.split('.')[0]) data["samples"]["id"].append(row.sequence_file.id) data["samples"]["patient_id"].append(get_patient_id(row.sequence_file.id)) data["samples"]["sample_name"].append(row.sequence_file.id) data["samples"]["run_id"].append(row.sequence_file.id) else : data["samples"]["info"].append("this file has been deleted from the database, info relative to this sample are no longer available") data["samples"]["timestamp"].append("None") data["samples"]["sequence_file_id"].append("") data["samples"]["results_file_id"].append("") data["samples"]["names"].append("deleted") data["samples"]["id"].append("") log.debug("get_data (%s) c%s -> %s (%s)" % (request.vars["sample_set_id"], request.vars["config"], fused_file, "downloaded" if download else "streamed")) log.info("load sample", extra={'user_id': auth.user.id, 'record_id': request.vars['sample_set_id'], 'table_name': 'sample_set'}) dumped_json = gluon.contrib.simplejson.dumps(data, separators=(',',':')) if download: return response.stream(StringIO.StringIO(dumped_json), attachment = True, filename = request.vars['filename']) return dumped_json else : res = {"success" : "false", "message" : "get_data (%s) c%s : %s " % (request.vars["sample_set_id"], request.vars["config"], error)} log.error(res) return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
def get_custom_data(): from subprocess import Popen, PIPE, STDOUT if not auth.user: res = { "redirect": URL('default', 'user', args='login', scheme=True, host=True) } #TODO _next return gluon.contrib.simplejson.dumps(res, separators=(',', ':')) error = "" if not "custom" in request.vars: error += "no file selected, " else: if type(request.vars['custom']) is not list or len( request.vars['custom']) < 2: error += "you must select several files." else: for id in request.vars["custom"]: log.debug("id = '%s'" % str(id)) sequence_file_id = db.results_file[id].sequence_file_id patient_id = db( (db.sample_set_membership.sequence_file_id == sequence_file_id) & (db.patient.sample_set_id == db.sample_set_membership.sample_set_id)).select( db.patient.id).first() if not auth.can_view_patient(patient_id): error += "you do not have permission to consult this patient (" + str( patient_id) + ")" if error == "": try: data = custom_fuse(request.vars["custom"]) except IOError, error: return error_message(str(error)) generic_info = "Compare sample sets" data["sample_name"] = generic_info data["dataFileName"] = generic_info data["info"] = generic_info data["samples"]["original_names"] = [] data["samples"]["timestamp"] = [] data["samples"]["info"] = [] data["samples"]["commandline"] = [] for id in request.vars["custom"]: sequence_file_id = db.results_file[id].sequence_file_id sample_set = db( (db.sequence_file.id == sequence_file_id) & (db.sample_set_membership.sequence_file_id == db.sequence_file.id) & (db.sample_set.id == db.sample_set_membership.sample_set_id) & (db.sample_set.sample_type.belongs(['patient', 'run'])) ).select(db.sample_set.id, db.sample_set.sample_type).first() patient_run = db(db[sample_set.sample_type].sample_set_id == sample_set.id).select().first() config_id = db.results_file[id].config_id name = vidjil_utils.anon_ids( patient_run.id ) if sample_set.sample_type == 'patient' else patient_run.name filename = db.sequence_file[sequence_file_id].filename data["samples"]["original_names"].append(name + "_" + filename) data["samples"]["timestamp"].append( str(db.sequence_file[sequence_file_id].sampling_date)) data["samples"]["info"].append( db.sequence_file[sequence_file_id].info) data["samples"]["commandline"].append(db.config[config_id].command) return gluon.contrib.simplejson.dumps(data, separators=(',', ':'))