aboutsummaryrefslogtreecommitdiff
path: root/qc_app/samples.py
blob: cc745ca9305b8d2464e1405f20204702a575b359 (plain)
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
99
100
101
102
103
104
105
106
107
108
"""Code regarding samples"""
import MySQLdb as mdb
from MySQLdb.cursors import DictCursor
from flask import (
    flash, request, url_for, redirect, Blueprint, render_template, current_app as app)

from .db_utils import with_db_connection
from .dbinsert import species_by_id, groups_by_species

samples = Blueprint("samples", __name__)

@samples.route("/upload/species", methods=["POST"])
def select_species():
    """Select the species."""
    index_page = redirect(url_for("entry.upload_file"))
    species_id = request.form.get("species_id")
    if bool(species_id):
        species_id = int(species_id)
        species = species_by_id(species_id)
        if bool(species):
            return render_template(
                "samples/select-population.html",
                species=species,
                populations=groups_by_species(species_id))
        flash("Invalid species selected!", "alert-error")
    flash("You need to select a species", "alert-error")
    return index_page

def save_population(conn: mdb.Connection, population_details: dict) -> int:
    """Save the population details to the db."""
    with conn.cursor(cursorclass=DictCursor) as cursor:
        cursor.execute("SELECT MAX(Id) AS last_id FROM InbredSet")
        new_id = cursor.fetchone()["last_id"] + 1
        cursor.execute(
            "INSERT INTO InbredSet("
            "Id, InbredSetId, InbredSetName, Name, SpeciesId, FullName, "
            "MenuOrderId, Description"
            ") "
            "VALUES ("
            "%(Id)s, %(InbredSetId)s, %(InbredSetName)s, %(Name)s, "
            "%(SpeciesId)s, %(FullName)s, %(MenuOrderId)s, %(Description)s"
            ")",
            {
                "Id": new_id,
                "InbredSetId": new_id,
                "MenuOrderId": 0,
                **population_details
            })
        return new_id

def population_by_id(conn: mdb.Connection, population_id: int) -> dict:
    """Get the grouping/population by id."""
    with conn.cursor(cursorclass=DictCursor) as cursor:
        cursor.execute("SELECT * FROM InbredSet WHERE InbredSetId=%s",
                       (population_id,))
        return cursor.fetchone()

@samples.route("/upload/create-population", methods=["POST"])
def create_population():
    """Create new grouping/population."""
    species_page = redirect(url_for("samples.select_species"), code=307)
    species = species_by_id(request.form.get("species_id"))
    pop_name = request.form.get("inbredset_name").strip()
    pop_fullname = request.form.get("inbredset_fullname").strip()

    if not bool(species):
        flash("Invalid species!", "alert-error error-create-population")
        return species_page
    if (not bool(pop_name)) or (not bool(pop_fullname)):
        flash("You *MUST* provide a grouping/population name",
              "alert-error error-create-population")
        return species_page

    pop_id = with_db_connection(lambda conn: save_population(conn, {
        "SpeciesId": species["SpeciesId"],
        "Name": pop_name,
        "InbredSetName": pop_fullname,
        "FullName": pop_fullname,
        "Family": request.form.get("inbredset_family") or None,
        "Description": request.form.get("description") or None
    }))
    flash("Grouping/Population created successfully.", "alert-success")
    return render_template(
        "samples/upload-samples.html",
        species=species,
        population=with_db_connection(
            lambda conn: population_by_id(conn, pop_id)))

@samples.route("/upload/select-population", methods=["POST"])
def select_population():
    """Select from existing groupings/populations."""
    species_page = redirect(url_for("samples.select_species"), code=307)
    species = species_by_id(request.form.get("species_id"))
    pop_id = int(request.form.get("inbredset_id"))
    population = with_db_connection(lambda conn: population_by_id(conn, pop_id))

    if not bool(species):
        flash("Invalid species!", "alert-error error-select-population")
        return species_page

    if not bool(population):
        flash("Invalid grouping/population!",
              "alert-error error-select-population")
        return species_page

    return render_template("samples/upload-samples.html",
                           species=species,
                           population=population)