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
86
87
88
89
90
91
92
93
94
95
96
97
98
|
"""Module to handle uploading of R/qtl2 bundles."""
from flask import (
flash,
request,
url_for,
redirect,
Blueprint,
render_template,
current_app as app)
from qc_app.dbinsert import species as all_species
from qc_app.db_utils import with_db_connection, database_connection
from qc_app.db import (
species_by_id,
save_population,
populations_by_species,
population_by_species_and_id)
rqtl2 = Blueprint("rqtl2", __name__)
@rqtl2.route("/", methods=["GET", "POST"])
@rqtl2.route("/select-species", methods=["POST"])
def select_species():
"""Select the species."""
if request.method == "GET":
return render_template("rqtl2/index.html", species=with_db_connection(all_species))
species_id = request.form.get("species_id")
species = with_db_connection(
lambda conn: species_by_id(conn, species_id))
if bool(species):
return redirect(url_for(
"upload.rqtl2.select_population", species_id=species_id))
flash("Invalid species or no species selected!", "alert-error error-rqtl2")
return redirect(url_for("upload.rqtl2.select_species"))
@rqtl2.route("/upload/species/<int:species_id>/select-population",
methods=["GET", "POST"])
def select_population(species_id: int):
"""Select/Create the population to organise data under."""
with database_connection(app.config["SQL_URI"]) as conn:
species = species_by_id(conn, species_id)
if not bool(species):
flash("Invalid species selected!", "alert-error error-rqtl2")
return redirect(url_for("upload.rqtl2.select_species"))
if request.method == "GET":
return render_template(
"rqtl2/select-population.html",
species=species,
populations=populations_by_species(conn, species_id))
population = population_by_species_and_id(
conn, species["SpeciesId"], request.form.get("inbredset_id"))
if not bool(population):
flash("Invalid Population!", "alert-error error-rqtl2")
return redirect(
url_for("upload.rqtl2.select_population", pgsrc="error"),
code=307)
return redirect(url_for("upload.rqtl2.upload_rqtl2_bundle",
species_id=species["SpeciesId"],
population_id=population["InbredSetId"]))
@rqtl2.route("/upload/species/<int:species_id>/create-population",
methods=["POST"])
def create_population(species_id: int):
"""Create a new population for the given species."""
population_page = redirect(url_for("upload.rqtl2.select_population"))
with database_connection(app.config["SQL_URI"]) as conn:
species = species_by_id(conn, species_id)
population_name = request.form.get("inbredset_name", "").strip()
population_fullname = request.form.get("inbredset_fullname", "").strip()
if not bool(species):
flash("Invalid species!", "alert-error error-rqtl2")
return redirect(url_for("upload.rqtl2.select_species"))
if not bool(population_name):
flash("Invalid Population Name!", "alert-error error-rqtl2")
return population_page
if not bool(population_fullname):
flash("Invalid Population Full Name!", "alert-error error-rqtl2")
return population_page
new_population = save_population(conn, {
"SpeciesId": species["SpeciesId"],
"Name": population_name,
"InbredSetName": population_fullname,
"FullName": population_fullname,
"Family": request.form.get("inbredset_family") or None,
"Description": request.form.get("description") or None
})
flash("Population created successfully.", "alert-success")
return redirect(
url_for("upload.rqtl2.upload_rqtl2_bundle",
population_id=new_population["population_id"],
pgsrc="create-population"),
code=307)
|