예제 #1
0
def generate_attributes(component, target_id):
    da_object = DAComponent(component=component)

    if component in da_dict:
        da_object = da_dict[component]()

    # get and filter schema elements based on displayable columns
    schema = [x for x in da_object.get_schema().get("schema_dict") if x.get("show_as_attribute", False)]

    # build db column projection
    projection = [(x["id"].split(".")[-1], 1) for x in schema]

    # account for description metadata in datafiles
    if component == "datafile":
        projection.append(('description', 1))

    filter_by = dict(_id=ObjectId(target_id))
    record = da_object.get_all_records_columns(projection=dict(projection), filter_by=filter_by)

    result = dict()

    if len(record):
        record = record[0]

        if component == "sample":  # filter based on sample type
            sample_types = [s_t['value'] for s_t in d_utils.get_sample_type_options()]
            sample_type = record.get("sample_type", str())
            schema = [x for x in schema if sample_type in x.get("specifications", sample_types)]

        for x in schema:
            x['id'] = x["id"].split(".")[-1]

        if component == "datafile":
            key_split = "___0___"
            attributes = record.get("description", dict()).get("attributes", dict())
            stages = record.get("description", dict()).get("stages", list())

            datafile_attributes = dict()
            datafile_items = list()

            for st in stages:
                for item in st.get("items", list()):
                    if str(item.get("hidden", False)).lower() == "false":
                        atrib_val = attributes.get(st["ref"], dict()).get(item["id"], str())
                        item["id"] = st["ref"] + key_split + item["id"]
                        datafile_attributes[item["id"]] = atrib_val
                        datafile_items.append(item)

            record.update(datafile_attributes)
            schema = schema + datafile_items

        result = resolve_display_data(schema, record)

    return result
예제 #2
0
def generate_table_records(profile_id=str(), component=str()):
    # function generates component records for building an UI table - please note that for effective tabular display,
    # all array and object-type fields (e.g., characteristics) are deferred to sub-table display.
    # please define such in the schema as "show_in_table": false and "show_as_attribute": true

    columns = list()
    data_set = list()

    # instantiate data access object
    da_object = DAComponent(profile_id, component)

    # get and filter schema elements based on displayable columns
    schema = [x for x in da_object.get_schema().get("schema_dict") if x.get("show_in_table", True)]

    # build db column projection
    projection = [(x["id"].split(".")[-1], 1) for x in schema]

    # retrieve and process records
    if component == "submission":
        records = da_object.get_all_records_columns(sort_by="date_created", sort_direction=1,
                                                    projection=dict(projection))
    else:
        records = da_object.get_all_records_columns(projection=dict(projection))

    if len(records):
        df = pd.DataFrame(records)
        df['s_n'] = df.index

        df['record_id'] = df._id.astype(str)
        df["DT_RowId"] = df.record_id
        df.DT_RowId = 'row_' + df.DT_RowId
        df = df.drop('_id', axis='columns')

        if component == "submission":
            df["special_repositories"] = df["repository"]

            columns.append(dict(data="special_repositories", visible=False))

        columns.append(dict(data="record_id", visible=False))
        detail_dict = dict(className='summary-details-control detail-hover-message', orderable=False, data=None,
                           title='', defaultContent='', width="5%")

        columns.insert(0, detail_dict)

        df_columns = list(df.columns)

        for x in schema:
            x["id"] = x["id"].split(".")[-1]
            columns.append(dict(data=x["id"], title=x["label"]))
            if x["id"] not in df_columns:
                df[x["id"]] = str()
            df[x["id"]] = df[x["id"]].fillna('')
            df[x["id"]] = df[x["id"]].apply(resolve_control_output_apply, args=(x,))

        data_set = df.to_dict('records')

    return_dict = dict(dataSet=data_set,
                       columns=columns
                       )

    # do check for custom repos here
    if component == "submission":
        correct_repos = list()
        user = ThreadLocal.get_current_user()
        repo_ids = user.userdetails.repo_submitter
        all_repos = Repository().get_by_ids(repo_ids)

        for repo in all_repos:
            for r_id in repo_ids:
                if r_id == str(repo["_id"]):
                    correct_repos.append(repo)

        for repo in correct_repos:
            repo["_id"] = str(repo["_id"])

        return_dict["repos"] = correct_repos

    return return_dict