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