def last_result_by_first_point_by_patient(): res_by_pat = {} for res in db( (db.patient.sample_set_id == db.sample_set_membership.sample_set_id) & (db.sample_set_membership.sequence_file_id == db.sequence_file.id) & (db.results_file.sequence_file_id == db.sequence_file.id) ).select( #groupby=db.patient.id, orderby=db.patient.id | db.sequence_file.sampling_date | ~db.results_file.run_date): if args.filter: if not vidjil_utils.advanced_filter([ res.patient.first_name, res.patient.last_name, res.patient.info ], args.filter): continue if args.creator: if res.patient.creator != args.creator: continue # Remeber only the first element if not str(res.patient.id) in res_by_pat: res_by_pat[str(res.patient.id)] = (res, res.sequence_file) for pat in res_by_pat: yield res_by_pat[pat]
def index(): if auth.is_admin(): query = db((db.results_file.sequence_file_id == db.sequence_file.id) & (db.sequence_file.id == db.sample_set_membership.sequence_file_id) & (db.sample_set_membership.sample_set_id == db.patient.sample_set_id) & (db.results_file.config_id == db.config.id)).select( orderby=~db.results_file.run_date) for row in query: if row.results_file.scheduler_task_id is None: row.status = '' else: row.status = db.scheduler_task[ row.results_file.scheduler_task_id].status pass ##sort result reverse = False if request.vars["reverse"] == "true": reverse = True if request.vars["sort"] == "name": query = query.sort(lambda row: row.patient.last_name, reverse=reverse) elif request.vars["sort"] == "run_date": query = query.sort(lambda row: row.results_file.run_date, reverse=reverse) elif request.vars["sort"] == "config": query = query.sort(lambda row: row.config.name, reverse=reverse) elif request.vars["sort"] == "patient": query = query.sort(lambda row: row.patient.last_name, reverse=reverse) elif request.vars["sort"] == "status": query = query.sort(lambda row: row.status, reverse=reverse) elif "sort" in request.vars and request.vars["sort"] != "": query = query.sort( lambda row: row.sequence_file[request.vars["sort"]], reverse=reverse) ##filter ##filter if "filter" not in request.vars: request.vars["filter"] = "" for row in query: row.string = [ row.sequence_file.filename, row.config.name, row.patient.last_name, row.patient.first_name, row.sequence_file.producer, str(row.results_file.run_date), row.status ] query = query.find(lambda row: vidjil_utils.advanced_filter( row.string, request.vars["filter"])) return dict(query=query, reverse=reverse)
def filter(self, filter_str, data): for row in data: row['string'] = [ row['last_name'], row['first_name'], row['confs'], row['groups'], str(row['birth']), str(row['info']) ] return filter( lambda row: vidjil_utils.advanced_filter(row['string'], filter_str ), data)
def index(): if auth.is_admin(): query = db( (db.results_file.sequence_file_id==db.sequence_file.id) & (db.sequence_file.id==db.sample_set_membership.sequence_file_id) & (db.sample_set_membership.sample_set_id==db.patient.sample_set_id) & (db.results_file.config_id==db.config.id) ).select( orderby = ~db.results_file.run_date ) for row in query : if row.results_file.scheduler_task_id is None : row.status = '' else: row.status = db.scheduler_task[row.results_file.scheduler_task_id ].status pass ##sort result reverse = False if request.vars["reverse"] == "true" : reverse = True if request.vars["sort"] == "name" : query = query.sort(lambda row : row.patient.last_name, reverse=reverse) elif request.vars["sort"] == "run_date" : query = query.sort(lambda row : row.results_file.run_date, reverse=reverse) elif request.vars["sort"] == "config" : query = query.sort(lambda row : row.config.name, reverse=reverse) elif request.vars["sort"] == "patient" : query = query.sort(lambda row : row.patient.last_name, reverse=reverse) elif request.vars["sort"] == "status" : query = query.sort(lambda row : row.status, reverse=reverse) elif "sort" in request.vars and request.vars["sort"] != "": query = query.sort(lambda row : row.sequence_file[request.vars["sort"]], reverse=reverse) ##filter ##filter if "filter" not in request.vars : request.vars["filter"] = "" for row in query : row.string = [row.sequence_file.filename, row.config.name, row.patient.last_name, row.patient.first_name, row.sequence_file.producer, str(row.results_file.run_date), row.status] query = query.find(lambda row : vidjil_utils.advanced_filter(row.string,request.vars["filter"]) ) return dict(query = query, reverse=reverse)
def last_fused_by_patient(): fused_by_patient = {} for res in db((db.patient.id == db.fused_file.patient_id)).select(orderby=db.patient.id|~db.fused_file.fuse_date): if args.config: if args.config != res.fused_file.config_id: continue if args.filter: if not vidjil_utils.advanced_filter([res.patient.first_name,res.patient.last_name,res.patient.info], args.filter): continue if args.creator: if res.patient.creator != args.creator: continue # Remeber only the first element if not str(res.patient.id) in fused_by_patient: fused_by_patient[str(res.patient.id)] = True yield (res, res.fused_file)
def last_result_by_file(): for seq in db(db.sequence_file).select(): print "===", "seq-%d" % seq.id, "\t", seq.sampling_date, "\t", seq.filename, seq.data_file res_with_file = [] for res in db((db.results_file.sequence_file_id == seq.id)).select(orderby=db.results_file.run_date): print " ", "sched-%d" % res.results_file.scheduler_task_id, "\t", res.results_file.run_date, "\t", res.results_file.data_file if args.filter: if not vidjil_utils.advanced_filter([res.patient.first_name,res.patient.last_name,res.patient.info], args.filter): continue if res.results_file.data_file: res_with_file += [res] if not res_with_file: continue # Takes the last result yield (res_with_file[-1], seq)
def last_result_by_first_point_by_patient(): res_by_pat = {} for res in db((db.patient.sample_set_id == db.sample_set_membership.sample_set_id) & (db.sample_set_membership.sequence_file_id == db.sequence_file.id) & (db.results_file.sequence_file_id == db.sequence_file.id)).select(#groupby=db.patient.id, orderby=db.patient.id|db.sequence_file.sampling_date|~db.results_file.run_date): if args.filter: if not vidjil_utils.advanced_filter([res.patient.first_name,res.patient.last_name,res.patient.info], args.filter): continue if args.creator: if res.patient.creator != args.creator: continue # Remeber only the first element if not str(res.patient.id) in res_by_pat: res_by_pat[str(res.patient.id)] = (res, res.sequence_file) for pat in res_by_pat: yield res_by_pat[pat]
def last_fused_by_patient(): fused_by_patient = {} for res in db((db.patient.id == db.fused_file.patient_id)).select( orderby=db.patient.id | ~db.fused_file.fuse_date): if args.config: if args.config != res.fused_file.config_id: continue if args.filter: if not vidjil_utils.advanced_filter([ res.patient.first_name, res.patient.last_name, res.patient.info ], args.filter): continue if args.creator: if res.patient.creator != args.creator: continue # Remeber only the first element if not str(res.patient.id) in fused_by_patient: fused_by_patient[str(res.patient.id)] = True yield (res, res.fused_file)
def last_result_by_file(): for seq in db(db.sequence_file).select(): print "===", "seq-%d" % seq.id, "\t", seq.sampling_date, "\t", seq.filename, seq.data_file res_with_file = [] for res in db((db.results_file.sequence_file_id == seq.id)).select( orderby=db.results_file.run_date): print " ", "sched-%d" % res.results_file.scheduler_task_id, "\t", res.results_file.run_date, "\t", res.results_file.data_file if args.filter: if not vidjil_utils.advanced_filter([ res.patient.first_name, res.patient.last_name, res.patient.info ], args.filter): continue if res.results_file.data_file: res_with_file += [res] if not res_with_file: continue # Takes the last result yield (res_with_file[-1], seq)
def index(): start = time.time() if not auth.user: res = { "redirect": URL('default', 'user', args='login', scheme=True, host=True, vars=dict( _next=URL('patient', 'index', scheme=True, host=True))) } return gluon.contrib.simplejson.dumps(res, separators=(',', ':')) isAdmin = auth.is_admin() ##retrieve patient list query = db( auth.vidjil_accessible_query(PermissionEnum.read.value, db.patient)).select( db.patient.ALL, orderby=~db.patient.id) auth.load_permissions(PermissionEnum.admin.value, 'patient') auth.load_permissions(PermissionEnum.anon.value, 'patient') result = {} for i, row in enumerate(query): result[row.id] = { "id": int(row.id), "sample_set_id": int(row.sample_set_id), "last_name": row.last_name, "first_name": row.first_name, "has_permission": auth.can_modify_patient(row.id), "anon_allowed": auth.can_view_patient_info(row.id), "birth": row.birth, "info": row.info, "creator": row.creator, "confs": "", "conf_list": [], "conf_id_list": [-1], "most_used_conf": "", "groups": "", "group_list": [], "file_count": 0, "size": 0 } patient_ids = result.keys() query1 = db((db.patient.creator == db.auth_user.id) & (db.patient.id.belongs(patient_ids))).select( db.patient.id, db.auth_user.last_name) for i, row in enumerate(query1): result[row.patient.id]['creator'] = row.auth_user.last_name query2 = db( (db.patient.sample_set_id == db.sample_set.id) & (db.sample_set_membership.sample_set_id == db.sample_set.id) & (db.sequence_file.id == db.sample_set_membership.sequence_file_id) & (db.patient.id.belongs(patient_ids))).select( db.patient.id, db.sequence_file.size_file) for i, row in enumerate(query2): result[row.patient.id]['file_count'] += 1 result[row.patient.id]['size'] += row.sequence_file.size_file query3 = db((db.patient.sample_set_id == db.fused_file.sample_set_id) & (db.fused_file.config_id == db.config.id) & (auth.vidjil_accessible_query( PermissionEnum.read_config.value, db.config) | auth.vidjil_accessible_query( PermissionEnum.admin_config.value, db.config)) & (db.patient.id.belongs(patient_ids))).select( db.patient.id, db.config.name, db.config.id, db.fused_file.fused_file) for i, row in enumerate(query3): result[row.patient.id]['conf_list'].append({ 'id': row.config.id, 'name': row.config.name, 'fused_file': row.fused_file.fused_file }) #result[row.patient.id]['conf_list'].append(row.config.name) result[row.patient.id]['conf_id_list'].append(row.config.id) query4 = db(((db.patient.id == db.auth_permission.record_id) | (db.auth_permission.record_id == 0)) & (db.auth_permission.table_name == 'patient') & (db.auth_permission.name == PermissionEnum.access.value) & (db.auth_group.id == db.auth_permission.group_id) & (db.patient.id.belongs(patient_ids))).select( db.patient.id, db.auth_group.role) for i, row in enumerate(query4): result[row.patient.id]['group_list'].append( row.auth_group.role.replace('user_', 'u')) for key, row in result.iteritems(): row['most_used_conf'] = max(set(row['conf_id_list']), key=row['conf_id_list'].count) #row['confs'] = ", ".join(list(set(row['conf_list']))) row['groups'] = ", ".join( filter(lambda g: g != 'admin', set(row['group_list']))) result = result.values() ##sort result reverse = False if request.vars["reverse"] == "true": reverse = True if request.vars["sort"] == "configs": result = sorted(result, key=lambda row: row['confs'], reverse=reverse) elif request.vars["sort"] == "groups": result = sorted(result, key=lambda row: row['groups'], reverse=reverse) elif request.vars["sort"] == "files": result = sorted(result, key=lambda row: row['file_count'], reverse=reverse) elif "sort" in request.vars: result = sorted(result, key=lambda row: vidjil_utils.prevent_none( row[request.vars["sort"]], datetime.date.min), reverse=reverse) else: result = sorted(result, key=lambda row: row['id'], reverse=not reverse) ##filter if "filter" not in request.vars: request.vars["filter"] = "" for row in result: row['string'] = [ row['last_name'], row['first_name'], row['confs'], row['groups'], str(row['birth']), str(row['info']) ] result = filter( lambda row: vidjil_utils.advanced_filter(row['string'], request.vars[ "filter"]), result) log.debug("patient list (%.3fs) %s" % (time.time() - start, request.vars["filter"])) return dict(query=result, isAdmin=isAdmin, reverse=reverse)
def custom(): start = time.time() if request.vars["config_id"] and request.vars["config_id"] != "-1" : config_id = long(request.vars["config_id"]) config_name = db.config[request.vars["config_id"]].name config = True else: request.vars["config_id"] = -1 config_id = -1 config_name = None config = False if "custom_list" not in request.vars : request.vars["custom_list"] = [] if type(request.vars["custom_list"]) is str : request.vars["custom_list"] = [request.vars["custom_list"]] myGroupBy = None helper = None if request.vars["id"] and auth.can_view_sample_set(request.vars["id"]): sample_set = db.sample_set[request.vars["id"]] factory = ModelFactory() helper = factory.get_instance(type=sample_set.sample_type) qq = (db.sample_set.id == request.vars["id"]) else: qq = (auth.vidjil_accessible_query(PermissionEnum.read.value, db.sample_set)) myGroupBy = db.sequence_file.id|db.patient.id|db.run.id|db.generic.id|db.results_file.config_id q = (qq & (auth.vidjil_accessible_query(PermissionEnum.read_config.value, db.config)) & (db.sample_set_membership.sample_set_id == db.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.data_file != '') & (db.config.id==db.results_file.config_id)) group_ids = get_involved_groups() ##filter if "filter" not in request.vars : request.vars["filter"] = "" search, tags = parse_search(request.vars["filter"]) left_join = [ db.patient.on(db.patient.sample_set_id == db.sample_set.id), db.run.on(db.run.sample_set_id == db.sample_set.id), db.generic.on(db.generic.sample_set_id == db.sample_set.id) ] select = [ db.patient.id, db.patient.sample_set_id, db.patient.info, db.patient.first_name, db.patient.last_name, db.run.id, db.run.info, db.run.name, db.generic.id, db.generic.info, db.generic.name, db.results_file.id, db.results_file.config_id, db.sequence_file.sampling_date, db.sequence_file.pcr, db.config.name, db.results_file.run_date, db.results_file.data_file, db.sequence_file.filename, db.sequence_file.data_file, db.sequence_file.id, db.sequence_file.info, db.sequence_file.size_file ] if (tags is not None and len(tags) > 0): q = filter_by_tags(q, 'sequence_file', tags) count = db.tag.name.count() select = select + [db.tag_ref.record_id, db.tag_ref.table_name, count] query = db(q).select( *select, left = left_join, orderby = db.sequence_file.id|db.results_file.run_date, groupby = db.tag_ref.table_name|db.tag_ref.record_id, having = count >= len(tags) ) else: query = db(q).select( *select, left = left_join, orderby = db.sequence_file.id|db.results_file.run_date, groupby = myGroupBy ) for row in query : row.checked = False if (str(row.results_file.id) in request.vars["custom_list"]) : row.checked = True if row.patient.id is not None: #TODO use helper. row.names = vidjil_utils.display_names(row.patient.sample_set_id, row.patient.first_name, row.patient.last_name) info = row.patient.info elif row.run.id is not None: row.names = row.run.name info = row.run.info elif row.generic.id is not None: row.names = row.generic.name info = row.generic.info row.string = [row.names, row.sequence_file.filename, str(row.sequence_file.sampling_date), str(row.sequence_file.pcr), str(row.config.name), str(row.results_file.run_date), info] query = query.find(lambda row : ( vidjil_utils.advanced_filter(row.string,search) or row.checked) ) if config : query = query.find(lambda row : ( row.results_file.config_id==config_id or (str(row.results_file.id) in request.vars["custom_list"])) ) tag_decorator = TagDecorator(get_tag_prefix()) log.info("load compare list", extra={'user_id': auth.user.id, 'record_id': None, 'table_name': "results_file"}) log.debug("sample_set/custom (%.3fs) %s" % (time.time()-start, search)) return dict(query=query, config_id=config_id, config=config, helper=helper, tag_decorator=tag_decorator, group_ids=group_ids)
def filter(self, filter_str, data): keys = ['last_name', 'first_name', 'confs', 'groups', 'birth', 'info'] self.create_filter_string(data, keys) return filter( lambda row: vidjil_utils.advanced_filter(row['string'], filter_str ), data)
def showlog(): if auth.is_admin(): lines = [] file = open(defs.DIR_LOG + request.vars["file"]) log_format = request.vars['format'] if 'format' in request.vars else '' if log_format == 'raw': return {'raw': ''.join(file.readlines()), 'format': log_format} if "filter" not in request.vars: request.vars["filter"] = "" for row in reversed(file.readlines()): parsed = False if not vidjil_utils.advanced_filter([row], request.vars["filter"]): continue if log_format: # == 'vidjil' # Parses lines such as # [11889] 2015-02-01 12:01:28,367 INFO - default.py:312 1.23.45.67/user/Toto <Toto> xxxxx log message # [11889] 2015-02-01 12:01:28,367 INFO - default.py:312 1.23.45.67 log message # [11889] 2015-02-01 12:01:28,367 INFO - default.py:312 log message line = {} tmp = re.split('\t+| +', row) if len(tmp) >= 7: parsed = True line["date"] = tmp[1] line["date2"] = tmp[2].split(',')[0] line["type"] = tmp[3] line["file"] = vidjil_utils.log_links(tmp[5]) if tmp[6] != "Creating": if len(tmp) < 9: j = 0 parsed = False elif '<' in tmp[8]: line["user"] = tmp[8] + ' ' + tmp[7] j = 9 else: line["user"] = tmp[7] j = 8 line["mes"] = " ".join(tmp[j:]) else: line["user"] = "" line["mes"] = " ".join(tmp[6:]) line["mes"] = line["mes"].replace(" at ", "\nat ") line["mes"] = vidjil_utils.log_links(line["mes"]) if not parsed: line = { 'mes': row, 'date': '', 'date2': '', 'user': '', 'type': '', 'file': '' } ### Stores log line lines.append(line) if len(lines) >= MAX_LOG_LINES: break return {'lines': lines, 'format': log_format}
if link: print "ln -s %s %s \t# %s" % (from_name, to_name, comments) else: print from_name if args.sequences: print "### Sequences" for res in db(db.patient.sample_set_id == db.sample_set_membership. sample_set_id) & (db.sample_set_membership.sequence_file_id == db.sequence_file.id).select(): if args.filter: if not vidjil_utils.advanced_filter([ res.patient.first_name, res.patient.last_name, res.patient.info ], args.filter): continue if args.creator: if res.patient.creator != args.creator: continue if args.original: f = res.sequence_file.filename else: our_id += 1 f = "%5s.fa" % our_id link( "%s/%-20s" % (defs.DIR_SEQUENCES, res.sequence_file.data_file), f,
def custom(): start = time.time() if request.vars["config_id"] and request.vars["config_id"] != "-1" : config_id = long(request.vars["config_id"]) config_name = db.config[request.vars["config_id"]].name config = True else: request.vars["config_id"] = -1 config_id = -1 config_name = None config = False if "custom_list" not in request.vars : request.vars["custom_list"] = [] if type(request.vars["custom_list"]) is str : request.vars["custom_list"] = [request.vars["custom_list"]] myGroupBy = None helper = None if request.vars["id"] and auth.can_view_sample_set(request.vars["id"]): sample_set = db.sample_set[request.vars["id"]] factory = ModelFactory() helper = factory.get_instance(type=sample_set.sample_type) q = ((auth.vidjil_accessible_query(PermissionEnum.read_config.value, db.config)) & (db.sample_set.id == request.vars["id"]) & (db.sample_set_membership.sample_set_id == db.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.data_file != '') & (db.config.id==db.results_file.config_id) ) else: q = ((auth.vidjil_accessible_query(PermissionEnum.read.value, db.patient) | auth.vidjil_accessible_query(PermissionEnum.read.value, db.run) | auth.vidjil_accessible_query(PermissionEnum.read.value, db.generic)) & (auth.vidjil_accessible_query(PermissionEnum.read_config.value, db.config)) & (db.sample_set_membership.sample_set_id == db.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.data_file != '') & (db.config.id==db.results_file.config_id) ) myGroupBy = db.sequence_file.id|db.patient.id|db.run.id|db.generic.id|db.results_file.config_id query = db(q).select( db.patient.id, db.patient.info, db.patient.first_name, db.patient.last_name, db.run.id, db.run.info, db.run.name, db.generic.id, db.generic.info, db.generic.name, db.results_file.id, db.results_file.config_id, db.sequence_file.sampling_date, db.sequence_file.pcr, db.config.name, db.results_file.run_date, db.results_file.data_file, db.sequence_file.filename, db.sequence_file.data_file, db.sequence_file.id, db.sequence_file.info, db.sequence_file.size_file, left = [ db.patient.on(db.patient.sample_set_id == db.sample_set.id), db.run.on(db.run.sample_set_id == db.sample_set.id), db.generic.on(db.generic.sample_set_id == db.sample_set.id) ], orderby = db.sequence_file.id|db.results_file.run_date, groupby = myGroupBy ) ##filter if "filter" not in request.vars : request.vars["filter"] = "" for row in query : row.checked = False if (str(row.results_file.id) in request.vars["custom_list"]) : row.checked = True if row.patient.id is not None: row.names = vidjil_utils.anon_names(row.patient.id, row.patient.first_name, row.patient.last_name) info = row.patient.info elif row.run.id is not None: row.names = row.run.name info = row.run.info elif row.generic.id is not None: row.names = row.generic.name info = row.generic.info row.string = [row.names, row.sequence_file.filename, str(row.sequence_file.sampling_date), str(row.sequence_file.pcr), str(row.config.name), str(row.results_file.run_date), info] query = query.find(lambda row : ( vidjil_utils.advanced_filter(row.string,request.vars["filter"]) or row.checked) ) if config : query = query.find(lambda row : ( row.results_file.config_id==config_id or (str(row.results_file.id) in request.vars["custom_list"])) ) log.debug("sample_set/custom (%.3fs) %s" % (time.time()-start, request.vars["filter"])) return dict(query=query, config_id=config_id, config=config, helper=helper)
def custom(): start = time.time() if request.vars["config_id"] and request.vars["config_id"] != "-1" : config_id = long(request.vars["config_id"]) config_name = db.config[request.vars["config_id"]].name config = True else: request.vars["config_id"] = -1 config_id = -1 config_name = None config = False if "custom_list" not in request.vars : request.vars["custom_list"] = [] if type(request.vars["custom_list"]) is str : request.vars["custom_list"] = [request.vars["custom_list"]] myGroupBy = None helper = None if request.vars["id"] and auth.can_view_sample_set(request.vars["id"]): sample_set = db.sample_set[request.vars["id"]] factory = ModelFactory() helper = factory.get_instance(type=sample_set.sample_type) qq = (db.sample_set.id == request.vars["id"]) else: qq = (auth.vidjil_accessible_query(PermissionEnum.read.value, db.sample_set)) myGroupBy = db.sequence_file.id|db.patient.id|db.run.id|db.generic.id|db.results_file.config_id q = (qq & (auth.vidjil_accessible_query(PermissionEnum.read_config.value, db.config)) & (db.sample_set_membership.sample_set_id == db.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.data_file != '') & (db.results_file.hidden == False) & (db.config.id==db.results_file.config_id)) group_ids = get_involved_groups() ##filter if "filter" not in request.vars : request.vars["filter"] = "" search, tags = parse_search(request.vars["filter"]) left_join = [ db.patient.on(db.patient.sample_set_id == db.sample_set.id), db.run.on(db.run.sample_set_id == db.sample_set.id), db.generic.on(db.generic.sample_set_id == db.sample_set.id) ] select = [ db.patient.id, db.patient.sample_set_id, db.patient.info, db.patient.first_name, db.patient.last_name, db.run.id, db.run.info, db.run.name, db.generic.id, db.generic.info, db.generic.name, db.results_file.id, db.results_file.config_id, db.sequence_file.sampling_date, db.sequence_file.pcr, db.config.name, db.results_file.run_date, db.results_file.data_file, db.sequence_file.filename, db.sequence_file.data_file, db.sequence_file.id, db.sequence_file.info, db.sequence_file.size_file ] if (tags is not None and len(tags) > 0): q = filter_by_tags(q, 'sequence_file', tags) count = db.tag.name.count() select = select + [db.tag_ref.record_id, db.tag_ref.table_name, count] query = db(q).select( *select, left = left_join, orderby = db.sequence_file.id|db.results_file.run_date, groupby = db.tag_ref.table_name|db.tag_ref.record_id, having = count >= len(tags) ) else: query = db(q).select( *select, left = left_join, orderby = db.sequence_file.id|db.results_file.run_date, groupby = myGroupBy ) for row in query : row.checked = False if (str(row.results_file.id) in request.vars["custom_list"]) : row.checked = True if row.patient.id is not None: #TODO use helper. row.names = vidjil_utils.display_names(row.patient.sample_set_id, row.patient.first_name, row.patient.last_name) info = row.patient.info elif row.run.id is not None: row.names = row.run.name info = row.run.info elif row.generic.id is not None: row.names = row.generic.name info = row.generic.info row.string = [row.names, row.sequence_file.filename, str(row.sequence_file.sampling_date), str(row.sequence_file.pcr), str(row.config.name), str(row.results_file.run_date), info] query = query.find(lambda row : ( vidjil_utils.advanced_filter(row.string,search) or row.checked) ) if config : query = query.find(lambda row : ( row.results_file.config_id==config_id or (str(row.results_file.id) in request.vars["custom_list"])) ) tag_decorator = TagDecorator(get_tag_prefix()) log.info("load compare list", extra={'user_id': auth.user.id, 'record_id': None, 'table_name': "results_file"}) log.debug("sample_set/custom (%.3fs) %s" % (time.time()-start, search)) classification = getConfigsByClassification() return dict(query=query, config_id=config_id, config=config, helper=helper, tag_decorator=tag_decorator, classification=classification, group_ids=group_ids)
def index(): start = time.time() if not auth.user : res = {"redirect" : URL('default', 'user', args='login', scheme=True, host=True, vars=dict(_next=URL('patient', 'index', scheme=True, host=True))) } return gluon.contrib.simplejson.dumps(res, separators=(',',':')) isAdmin = auth.is_admin() ##retrieve patient list query = db( auth.vidjil_accessible_query(PermissionEnum.read.value, db.patient) ).select( db.patient.ALL, orderby = ~db.patient.id ) auth.load_permissions(PermissionEnum.admin.value, 'patient') auth.load_permissions(PermissionEnum.anon.value, 'patient') result = {} for i, row in enumerate(query) : result[row.id] = { "id" :int(row.id), "sample_set_id" : int(row.sample_set_id), "last_name" : row.last_name, "first_name" : row.first_name, "has_permission" : auth.can_modify_patient(row.id), "anon_allowed": auth.can_view_patient_info(row.id), "birth" : row.birth, "info" : row.info, "creator" : row.creator, "confs" : "", "conf_list" : [], "conf_id_list" : [-1], "most_used_conf" : "", "groups" : "", "group_list" : [], "file_count" : 0, "size" : 0 } keys = result.keys() query1 = db( db.patient.creator == db.auth_user.id ).select( db.patient.id, db.auth_user.last_name ) for i, row in enumerate(query1) : if row.patient.id in keys : result[row.patient.id]['creator'] = row.auth_user.last_name query2 = db( (db.patient.sample_set_id == db.sample_set.id) &(db.sample_set_membership.sample_set_id == db.sample_set.id) &(db.sequence_file.id == db.sample_set_membership.sequence_file_id) ).select( db.patient.id, db.sequence_file.size_file ) for i, row in enumerate(query2) : if row.patient.id in keys : result[row.patient.id]['file_count'] += 1 result[row.patient.id]['size'] += row.sequence_file.size_file query3 = db( (db.patient.sample_set_id == db.fused_file.sample_set_id) & (db.fused_file.config_id == db.config.id) & (auth.vidjil_accessible_query(PermissionEnum.read_config.value, db.config) | auth.vidjil_accessible_query(PermissionEnum.admin_config.value, db.config) ) ).select( db.patient.id, db.config.name, db.config.id, db.fused_file.fused_file ) for i, row in enumerate(query3) : if row.patient.id in keys : result[row.patient.id]['conf_list'].append({'id': row.config.id, 'name': row.config.name, 'fused_file': row.fused_file.fused_file}) #result[row.patient.id]['conf_list'].append(row.config.name) result[row.patient.id]['conf_id_list'].append(row.config.id) query4 = db( ((db.patient.id == db.auth_permission.record_id) | (db.auth_permission.record_id == 0)) & (db.auth_permission.table_name == 'patient') & (db.auth_permission.name == PermissionEnum.access.value) & (db.auth_group.id == db.auth_permission.group_id) ).select( db.patient.id, db.auth_group.role ) for i, row in enumerate(query4) : if row.patient.id in keys : result[row.patient.id]['group_list'].append(row.auth_group.role.replace('user_','u')) for key, row in result.iteritems(): row['most_used_conf'] = max(set(row['conf_id_list']), key=row['conf_id_list'].count) #row['confs'] = ", ".join(list(set(row['conf_list']))) row['groups'] = ", ".join(filter(lambda g: g != 'admin', set(row['group_list']))) result = result.values() ##sort result reverse = False if request.vars["reverse"] == "true" : reverse = True if request.vars["sort"] == "configs" : result = sorted(result, key = lambda row : row['confs'], reverse=reverse) elif request.vars["sort"] == "groups" : result = sorted(result, key = lambda row : row['groups'], reverse=reverse) elif request.vars["sort"] == "files" : result = sorted(result, key = lambda row : row['file_count'], reverse=reverse) elif "sort" in request.vars: result = sorted(result, key = lambda row : row[request.vars["sort"]], reverse=reverse) else: result = sorted(result, key = lambda row : row['id'], reverse=not reverse) ##filter if "filter" not in request.vars : request.vars["filter"] = "" for row in result : row['string'] = [row['last_name'], row['first_name'], row['confs'], row['groups'], str(row['birth']), str(row['info'])] result = filter(lambda row : vidjil_utils.advanced_filter(row['string'],request.vars["filter"]), result ) log.debug("patient list (%.3fs) %s" % (time.time()-start, request.vars["filter"])) return dict(query = result, isAdmin = isAdmin, reverse = reverse)
def filter(self, filter_str, data): keys = ['last_name', 'first_name', 'confs', 'groups', 'birth', 'info'] self.create_filter_string(data, keys) return filter(lambda row : vidjil_utils.advanced_filter(row['string'], filter_str), data)
def custom(): start = time.time() if request.vars["config_id"] and request.vars["config_id"] != "-1" : config_id = long(request.vars["config_id"]) config_name = db.config[request.vars["config_id"]].name config = True else: request.vars["config_id"] = -1 config_id = -1 config_name = None config = False if "custom_list" not in request.vars : request.vars["custom_list"] = [] if type(request.vars["custom_list"]) is str : request.vars["custom_list"] = [request.vars["custom_list"]] myGroupBy = None if request.vars["id"] and auth.can_view_sample_set(request.vars["id"]): q = ((auth.vidjil_accessible_query(PermissionEnum.read_config.value, db.config)) & (db.sample_set.id == request.vars["id"]) & (db.sample_set_membership.sample_set_id == db.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.data_file != '') & (db.config.id==db.results_file.config_id) ) else: q = ((auth.vidjil_accessible_query(PermissionEnum.read.value, db.patient) | auth.vidjil_accessible_query(PermissionEnum.read.value, db.run)) & (auth.vidjil_accessible_query(PermissionEnum.read_config.value, db.config)) & (db.sample_set_membership.sample_set_id == db.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.data_file != '') & (db.config.id==db.results_file.config_id) ) myGroupBy = db.sequence_file.id|db.patient.id|db.run.id|db.results_file.config_id query = db(q).select( db.patient.id, db.patient.info, db.patient.first_name, db.patient.last_name, db.run.id, db.run.info, db.run.name, db.results_file.id, db.results_file.config_id, db.sequence_file.sampling_date, db.sequence_file.pcr, db.config.name, db.results_file.run_date, db.results_file.data_file, db.sequence_file.filename, db.sequence_file.data_file, db.sequence_file.id, db.sequence_file.info, db.sequence_file.size_file, left = [ db.patient.on(db.patient.sample_set_id == db.sample_set.id), db.run.on(db.run.sample_set_id == db.sample_set.id) ], orderby = ~db.patient.id|db.sequence_file.id|db.results_file.run_date, groupby = myGroupBy ) ##filter if "filter" not in request.vars : request.vars["filter"] = "" for row in query : row.checked = False if (str(row.results_file.id) in request.vars["custom_list"]) : row.checked = True if row.patient.id is not None: row.names = vidjil_utils.anon_names(row.patient.id, row.patient.first_name, row.patient.last_name) info = row.patient.info else: row.names = row.run.name info = row.run.info row.string = [row.names, row.sequence_file.filename, str(row.sequence_file.sampling_date), str(row.sequence_file.pcr), str(row.config.name), str(row.results_file.run_date), info] query = query.find(lambda row : ( vidjil_utils.advanced_filter(row.string,request.vars["filter"]) or row.checked) ) if config : query = query.find(lambda row : ( row.results_file.config_id==config_id or (str(row.results_file.id) in request.vars["custom_list"])) ) log.debug("sample_set/custom (%.3fs) %s" % (time.time()-start, request.vars["filter"])) return dict(query=query, config_id=config_id, config=config)
def showlog(): if auth.is_admin(): lines = [] file = open(defs.DIR_LOG+request.vars["file"]) log_format = request.vars['format'] if 'format' in request.vars else '' if log_format == 'raw': return {'raw': ''.join(file.readlines()), 'format': log_format} if "filter" not in request.vars : request.vars["filter"] = "" for row in reversed(file.readlines()) : parsed = False if not vidjil_utils.advanced_filter([row], request.vars["filter"]) : continue if log_format: # == 'vidjil' # Parses lines such as # [11889] 2015-02-01 12:01:28,367 INFO - default.py:312 1.23.45.67/user/Toto <Toto> xxxxx log message # [11889] 2015-02-01 12:01:28,367 INFO - default.py:312 1.23.45.67 log message # [11889] 2015-02-01 12:01:28,367 INFO - default.py:312 log message line = {} tmp = re.split('\t+| +', row) if len(tmp) >= 7: parsed = True line["date"] = tmp[1] line["date2"] = tmp[2].split(',')[0] line["type"] = tmp[3] line["file"] = vidjil_utils.log_links(tmp[5]) if tmp[6] != "Creating": if len(tmp) < 9: j = 0 parsed = False elif '<' in tmp[8]: line["user"] = tmp[8] + ' ' + tmp[7] j = 9 else: line["user"] = tmp[7] j = 8 line["mes"] = " ".join(tmp[j:]) else: line["user"] = "" line["mes"] = " ".join(tmp[6:]) line["mes"] = line["mes"].replace(" at ", "\nat ") line["mes"] = vidjil_utils.log_links(line["mes"]) if not parsed: line = { 'mes': row, 'date': '', 'date2': '', 'user': '', 'type':'', 'file':''} ### Stores log line lines.append(line) if len(lines) >= MAX_LOG_LINES : break return {'lines': lines, 'format': log_format}
def patient_string(row): return "u%s pat-%04d (%s %s) - %s" % (row.creator, row.id, row.first_name, row.last_name, row.info.replace('\n', ' ')) def link(from_name, to_name, comments, link): if link: print "ln -s %s %s \t# %s" % (from_name, to_name, comments) else: print from_name if args.sequences: print "### Sequences" for res in db(db.patient.sample_set_id == db.sample_set_membership.sample_set_id) & (db.sample_set_membership.sequence_file_id == db.sequence_file.id).select(): if args.filter: if not vidjil_utils.advanced_filter([res.patient.first_name,res.patient.last_name,res.patient.info], args.filter): continue if args.creator: if res.patient.creator != args.creator: continue if args.original: f = res.sequence_file.filename else: our_id += 1 f = "%5s.fa" % our_id link("%s/%-20s" % (defs.DIR_SEQUENCES, res.sequence_file.data_file), f,