Ejemplo n.º 1
0
Archivo: links.py Proyecto: NikaAb/FaIR
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]
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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]
Ejemplo n.º 8
0
Archivo: links.py Proyecto: NikaAb/FaIR
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)
Ejemplo n.º 9
0
Archivo: links.py Proyecto: NikaAb/FaIR
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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
 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)
Ejemplo n.º 13
0
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}
Ejemplo n.º 14
0
Archivo: links.py Proyecto: NikaAb/FaIR
    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,
Ejemplo n.º 15
0
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)
Ejemplo n.º 16
0
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)
Ejemplo n.º 17
0
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)
Ejemplo n.º 18
0
 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)
Ejemplo n.º 19
0
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)
Ejemplo n.º 20
0
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}
Ejemplo n.º 21
0
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,