"""Views handling ('classical') phenotypes.""" from flask import (flash, request, url_for, redirect, Blueprint, render_template, current_app as app) from uploader.authorisation import require_login from uploader.db_utils import database_connection from uploader.species.models import all_species, species_by_id from uploader.request_checks import with_species, with_population from uploader.datautils import safe_int, order_by_family, enumerate_sequence from uploader.population.models import (populations_by_species, population_by_species_and_id) from .models import (dataset_by_id, phenotypes_count, dataset_phenotypes, datasets_by_population) phenotypesbp = Blueprint("phenotypes", __name__) @phenotypesbp.route("/phenotypes", methods=["GET"]) @require_login def index(): """Direct entry-point for phenotypes data handling.""" with database_connection(app.config["SQL_URI"]) as conn: if not bool(request.args.get("species_id")): return render_template("phenotypes/index.html", species=order_by_family(all_species(conn)), activelink="phenotypes") species = species_by_id(conn, request.args.get("species_id")) if not bool(species): flash("No such species!", "alert-danger") return redirect(url_for("species.populations.phenotypes.index")) return redirect(url_for("species.populations.phenotypes.select_population", species_id=species["SpeciesId"])) @phenotypesbp.route("/phenotypes/select-population", methods=["GET"]) @require_login @with_species(redirect_uri="species.populations.phenotypes.index") def select_population(species: dict, **kwargs):# pylint: disable=[unused-argument] """Select the population for your phenotypes.""" with database_connection(app.config["SQL_URI"]) as conn: if not bool(request.args.get("population_id")): return render_template("phenotypes/select-population.html", species=species, populations=order_by_family( populations_by_species( conn, species["SpeciesId"]), order_key="FamilyOrder"), activelink="phenotypes") population = population_by_species_and_id( conn, species["SpeciesId"], int(request.args["population_id"])) if not bool(population): flash("No such population found!", "alert-danger") return redirect(url_for( "species.populations.phenotypes.select_population", species_id=species["SpeciesId"])) return redirect(url_for("species.populations.phenotypes.list_datasets", species_id=species["SpeciesId"], population_id=population["Id"])) @phenotypesbp.route( "/populations//phenotypes/datasets", methods=["GET"]) @require_login @with_population(species_redirect_uri="species.populations.phenotypes.index", redirect_uri="species.populations.phenotypes.select_population") def list_datasets(species: dict, population: dict, **kwargs):# pylint: disable=[unused-argument] """List available phenotype datasets.""" with database_connection(app.config["SQL_URI"]) as conn: return render_template("phenotypes/list-datasets.html", species=species, population=population, datasets=datasets_by_population( conn, species["SpeciesId"], population["Id"]), activelink="list-datasets") @phenotypesbp.route( "/populations//phenotypes/datasets" "//view", methods=["GET"]) @require_login @with_population(species_redirect_uri="species.populations.phenotypes.index", redirect_uri="species.populations.phenotypes.select_population") def view_dataset(# pylint: disable=[unused-argument] species: dict, population: dict, dataset_id: int, **kwargs): """View a specific dataset""" with database_connection(app.config["SQL_URI"]) as conn: dataset = dataset_by_id( conn, species["SpeciesId"], population["Id"], dataset_id) if not bool(dataset): flash("Could not find such a phenotype dataset!", "alert-danger") return redirect(url_for( "species.populations.phenotypes.list_datasets", species_id=species["SpeciesId"], population_id=population["Id"])) start_at = max(safe_int(request.args.get("start_at") or 0), 0) count = int(request.args.get("count") or 20) return render_template("phenotypes/view-dataset.html", species=species, population=population, dataset={"Id": dataset_id}, phenotype_count=phenotypes_count( conn, population["Id"], dataset_id), phenotypes=enumerate_sequence( dataset_phenotypes(conn, population["Id"], dataset_id, offset=start_at, limit=count), start=start_at+1), activelink="view-dataset")