def institute_settings(institute_id): """Show institute settings page""" if institute_id not in current_user.institutes and current_user.is_admin is False: flash( "Current user doesn't have the permission to modify this institute", "warning", ) return redirect(request.referrer) institute_obj = store.institute(institute_id) form = InstituteForm(request.form) # if institute is to be updated if request.method == "POST" and form.validate_on_submit(): institute_obj = controllers.update_institute_settings( store, institute_obj, request.form) if isinstance(institute_obj, dict): flash("institute was updated ", "success") else: # an error message was retuned flash(institute_obj, "warning") return redirect(request.referrer) data = controllers.institute(store, institute_id) default_phenotypes = controllers.populate_institute_form( form, institute_obj) return render_template( "/overview/institute_settings.html", form=form, default_phenotypes=default_phenotypes, panel=1, **data, )
def panel(panel_id): """Display (and add pending updates to) a specific gene panel.""" panel_obj = store.gene_panel(panel_id) or store.panel(panel_id) if request.method == 'POST': raw_hgnc_id = request.form['hgnc_id'] if '|' in raw_hgnc_id: raw_hgnc_id = raw_hgnc_id.split(' | ', 1)[0] hgnc_id = int(raw_hgnc_id) action = request.form['action'] if action == 'add': panel_gene = controllers.existing_gene(store, panel_obj, hgnc_id) if panel_gene: flash("gene already in panel: {}".format(panel_gene['symbol']), 'warning') else: # ask user to fill-in more information about the gene return redirect( url_for('.gene_edit', panel_id=panel_id, hgnc_id=hgnc_id)) elif action == 'delete': log.debug("marking gene to be deleted: %s", hgnc_id) store.add_pending(panel_obj, hgnc_id, action='delete') data = controllers.panel(store, panel_obj) if request.args.get('case_id'): data['case'] = store.case(request.args['case_id']) if request.args.get('institute_id'): data['institute'] = store.institute(request.args['institute_id']) return data
def panel(panel_id): """Display (and add pending updates to) a specific gene panel.""" panel_obj = store.gene_panel(panel_id) or store.panel(panel_id) if not panel_obj: flash("Panel with id {} not found.".format(panel_id), "warning") return redirect(url_for("panels.panels")) if request.method == "POST": if request.form.get("update_description"): panel_obj["description"] = request.form["panel_description"] if controllers.panel_write_granted(panel_obj, current_user): store.update_panel(panel_obj=panel_obj) else: flash( "Permission denied: please ask a panel maintainer or admin for help.", "danger", ) return redirect(url_for("panels.panel", panel_id=panel_obj["_id"])) raw_hgnc_id = request.form["hgnc_id"] if "|" in raw_hgnc_id: raw_hgnc_id = raw_hgnc_id.split(" | ", 1)[0] hgnc_id = 0 try: hgnc_id = int(raw_hgnc_id) except ValueError: flash("Provided HGNC is not valid : '{}'".format(raw_hgnc_id), "danger") return redirect(request.referrer) action = request.form["action"] gene_obj = store.hgnc_gene_caption( hgnc_identifier=hgnc_id, build="37") or store.hgnc_gene_caption( hgnc_identifier=hgnc_id, build="38") if gene_obj is None: flash("HGNC id not found: {}".format(hgnc_id), "warning") return redirect(request.referrer) if action == "add": panel_gene = controllers.existing_gene(store, panel_obj, hgnc_id) if panel_gene: flash("gene already in panel: {}".format(panel_gene["symbol"]), "warning") else: # ask user to fill-in more information about the gene return redirect( url_for(".gene_edit", panel_id=panel_id, hgnc_id=hgnc_id)) elif action == "delete": LOG.debug("marking gene to be deleted: %s", hgnc_id) panel_obj = store.add_pending(panel_obj, gene_obj, action="delete") data = controllers.panel(store, panel_obj) if request.args.get("case_id"): data["case"] = store.case(request.args["case_id"]) if request.args.get("institute_id"): data["institute"] = store.institute(request.args["institute_id"]) return data
def institute(institute_id): """ Edit institute data """ if institute_id not in current_user.institutes and current_user.is_admin is False: flash( "Current user doesn't have the permission to modify this institute", "warning", ) return redirect(request.referrer) institute_obj = store.institute(institute_id) form = InstituteForm(request.form) # if institute is to be updated if request.method == "POST" and form.validate_on_submit(): institute_obj = controllers.update_institute_settings( store, institute_obj, request.form) if isinstance(institute_obj, dict): flash("institute was updated ", "success") else: # an error message was retuned flash(institute_obj, "warning") return redirect(request.referrer) data = controllers.institute(store, institute_id) # get all other institutes to populate the select of the possible collaborators institutes_tuples = [] for inst in store.institutes(): if not inst["_id"] == institute_id: institutes_tuples.append(((inst["_id"], inst["display_name"]))) form.display_name.default = institute_obj.get("display_name") form.institutes.choices = institutes_tuples form.coverage_cutoff.default = institute_obj.get("coverage_cutoff") form.frequency_cutoff.default = institute_obj.get("frequency_cutoff") # collect all available default HPO terms default_phenotypes = [ choice[0].split(" ")[0] for choice in form.pheno_groups.choices ] if institute_obj.get("phenotype_groups"): for key, value in institute_obj["phenotype_groups"].items(): if not key in default_phenotypes: custom_group = " ".join([ key, ",", value.get("name"), "( {} )".format(value.get("abbr")) ]) form.pheno_groups.choices.append((custom_group, custom_group)) return render_template("/overview/institute.html", form=form, default_phenotypes=default_phenotypes, **data)
def add_beacon_dataset(institute_id): """Add a dataset to Beacon for a given institute""" if current_user.is_admin is False: flash( "Only an admin can create a new Beacon dataset", "warning", ) return redirect(request.referrer) dataset_id = request.form.get("beacon_dataset") institute_obj = store.institute(institute_id) beacon.add_dataset(institute_obj, dataset_id) return redirect(request.referrer)
def institute(store, institute_id): """Process institute data. Args: store(adapter.MongoAdapter) institute_id(str) Returns data(dict): includes institute obj and specific settings """ institute_obj = store.institute(institute_id) users = list(store.users(institute_id)) data = {"institute": institute_obj, "users": users} return data
def panel(panel_id): """Display (and add pending updates to) a specific gene panel.""" panel_obj = store.gene_panel(panel_id) or store.panel(panel_id) if request.method == 'POST': if request.form.get('update_description'): panel_obj['description'] = request.form['panel_description'] store.update_panel(panel_obj=panel_obj) return redirect( url_for('panels.panel', panel_id=panel_obj['_id']) ) raw_hgnc_id = request.form['hgnc_id'] if '|' in raw_hgnc_id: raw_hgnc_id = raw_hgnc_id.split(' | ', 1)[0] hgnc_id = 0 try: hgnc_id = int(raw_hgnc_id) except: flash("Provided HGNC is not valid : '{}'". format(raw_hgnc_id), 'danger') return redirect(request.referrer) action = request.form['action'] gene_obj = store.hgnc_gene(hgnc_id) if gene_obj is None: flash("HGNC id not found: {}".format(hgnc_id), 'warning') return redirect(request.referrer) if action == 'add': panel_gene = controllers.existing_gene(store, panel_obj, hgnc_id) if panel_gene: flash("gene already in panel: {}".format(panel_gene['symbol']), 'warning') else: # ask user to fill-in more information about the gene return redirect(url_for('.gene_edit', panel_id=panel_id, hgnc_id=hgnc_id)) elif action == 'delete': log.debug("marking gene to be deleted: %s", hgnc_id) panel_obj = store.add_pending(panel_obj, gene_obj, action='delete') data = controllers.panel(store, panel_obj) if request.args.get('case_id'): data['case'] = store.case(request.args['case_id']) if request.args.get('institute_id'): data['institute'] = store.institute(request.args['institute_id']) return data
def panel(panel_id): """Display (and add pending updates to) a specific gene panel.""" panel_obj = store.gene_panel(panel_id) or store.panel(panel_id) if request.method == 'POST': raw_hgnc_id = request.form['hgnc_id'] if '|' in raw_hgnc_id: raw_hgnc_id = raw_hgnc_id.split(' | ', 1)[0] hgnc_id = 0 try: hgnc_id = int(raw_hgnc_id) except: flash("Provided HGNC is not valid : '{}'". format(raw_hgnc_id), 'danger') return redirect(request.referrer) action = request.form['action'] gene_obj = store.hgnc_gene(hgnc_id) if gene_obj is None: flash("HGNC id not found: {}".format(hgnc_id), 'warning') return redirect(request.referrer) if action == 'add': panel_gene = controllers.existing_gene(store, panel_obj, hgnc_id) if panel_gene: flash("gene already in panel: {}".format(panel_gene['symbol']), 'warning') else: # ask user to fill-in more information about the gene return redirect(url_for('.gene_edit', panel_id=panel_id, hgnc_id=hgnc_id)) elif action == 'delete': log.debug("marking gene to be deleted: %s", hgnc_id) panel_obj = store.add_pending(panel_obj, gene_obj, action='delete') data = controllers.panel(store, panel_obj) if request.args.get('case_id'): data['case'] = store.case(request.args['case_id']) if request.args.get('institute_id'): data['institute'] = store.institute(request.args['institute_id']) return data
def case(store, institute_obj, case_obj): """Preprocess a single case. Prepare the case to be displayed in the case view. Args: store(adapter.MongoAdapter) institute_obj(models.Institute) case_obj(models.Case) Returns: data(dict): includes the cases, how many there are and the limit. """ # Convert individual information to more readable format case_obj["individual_ids"] = [] for individual in case_obj["individuals"]: try: sex = int(individual.get("sex", 0)) except ValueError as err: sex = 0 individual["sex_human"] = SEX_MAP[sex] pheno_map = PHENOTYPE_MAP if case_obj.get("track", "rare") == "cancer": pheno_map = CANCER_PHENOTYPE_MAP individual["phenotype_human"] = pheno_map.get(individual["phenotype"]) case_obj["individual_ids"].append(individual["individual_id"]) case_obj["assignees"] = [store.user(user_email) for user_email in case_obj.get("assignees", [])] # Provide basic info on alignment files availability for this case case_has_alignments(case_obj) case_has_mt_alignments(case_obj) case_groups = {} case_group_label = {} _populate_case_groups(store, case_obj, case_groups, case_group_label) # Fetch the variant objects for suspects and causatives suspects = [ store.variant(variant_id) or variant_id for variant_id in case_obj.get("suspects", []) ] _populate_assessments(suspects) causatives = [ store.variant(variant_id) or variant_id for variant_id in case_obj.get("causatives", []) ] _populate_assessments(causatives) # get evaluated variants evaluated_variants = store.evaluated_variants(case_obj["_id"], case_obj["owner"]) _populate_assessments(evaluated_variants) # check for partial causatives and associated phenotypes partial_causatives = [] if case_obj.get("partial_causatives"): for var_id, values in case_obj["partial_causatives"].items(): causative_obj = { "variant": store.variant(var_id) or var_id, "omim_terms": values.get("diagnosis_phenotypes"), "hpo_terms": values.get("phenotype_terms"), } partial_causatives.append(causative_obj) _populate_assessments(partial_causatives) # Set of all unique genes in the default gene panels distinct_genes = set() case_obj["panel_names"] = [] case_obj["outdated_panels"] = {} for panel_info in case_obj.get("panels", []): if not panel_info.get("is_default"): continue panel_name = panel_info["panel_name"] panel_version = panel_info.get("version") panel_obj = store.gene_panel(panel_name, version=panel_version) latest_panel = store.gene_panel(panel_name) panel_info["removed"] = False if latest_panel is None else latest_panel.get("hidden", False) if not panel_obj: panel_obj = latest_panel if not panel_obj: flash(f"Case default panel '{panel_name}' could not be found.", "warning") continue flash( f"Case default panel '{panel_name}' version {panel_version} could not be found, using latest existing version", "warning", ) # Check if case-specific panel is up-to-date with latest version of the panel if panel_obj["version"] < latest_panel["version"]: extra_genes, missing_genes = _check_outdated_gene_panel(panel_obj, latest_panel) if extra_genes or missing_genes: case_obj["outdated_panels"][panel_name] = { "missing_genes": missing_genes, "extra_genes": extra_genes, } distinct_genes.update([gene["hgnc_id"] for gene in panel_obj.get("genes", [])]) full_name = "{} ({})".format(panel_obj["display_name"], panel_obj["version"]) case_obj["panel_names"].append(full_name) case_obj["default_genes"] = list(distinct_genes) for hpo_term in itertools.chain( case_obj.get("phenotype_groups", []), case_obj.get("phenotype_terms", []) ): hpo_term["hpo_link"] = "http://hpo.jax.org/app/browse/term/{}".format( hpo_term["phenotype_id"] ) if case_obj.get("rank_model_version"): rank_model_link = "".join( [ current_app.config.get("RANK_MODEL_LINK_PREFIX", ""), str(case_obj["rank_model_version"]), current_app.config.get("RANK_MODEL_LINK_POSTFIX", ""), ] ) case_obj["rank_model_link"] = rank_model_link if case_obj.get("sv_rank_model_version"): case_obj["sv_rank_model_link"] = "".join( [ current_app.config.get("SV_RANK_MODEL_LINK_PREFIX", ""), str(case_obj["sv_rank_model_version"]), current_app.config.get("SV_RANK_MODEL_LINK_POSTFIX", ""), ] ) # other collaborators than the owner of the case o_collaborators = [] for collab_id in case_obj.get("collaborators", []): if collab_id != case_obj["owner"] and store.institute(collab_id): o_collaborators.append(store.institute(collab_id)) case_obj["o_collaborators"] = [ (collab_obj["_id"], collab_obj["display_name"]) for collab_obj in o_collaborators ] collab_ids = None if institute_obj.get("collaborators"): collab_ids = [ (collab["_id"], collab["display_name"]) for collab in store.institutes() if institute_obj.get("collaborators") and collab["_id"] in institute_obj.get("collaborators") ] events = list(store.events(institute_obj, case=case_obj))