1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
"""Views handling ('classical') phenotypes."""
from flask import (request,
url_for,
redirect,
Blueprint,
render_template,
current_app as app)
from uploader.datautils import order_by_family
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.population.models import (populations_by_species,
population_by_species_and_id)
from .models import 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("<int:species_id>/phenotypes/select-population",
methods=["GET"])
@require_login
@with_species(redirect_uri="species.populations.phenotypes.index")
def select_population(species: dict, **kwargs):
"""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_id))
return redirect(url_for("species.populations.phenotypes.list_datasets",
species_id=species["SpeciesId"],
population_id=population["Id"]))
@phenotypesbp.route(
"<int:species_id>/populations/<int:population_id>/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: int, population: int, **kwargs):
"""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")
|