aboutsummaryrefslogtreecommitdiff
path: root/uploader/platforms/views.py
blob: 1030b6c2f1c589871a478f283ac45d57894791e4 (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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"""The endpoints for the platforms"""
from MySQLdb.cursors import DictCursor
from flask import (
    flash,
    request,
    url_for,
    redirect,
    Blueprint,
    current_app as app)

from uploader.ui import make_template_renderer
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.datautils import safe_int, order_by_family, enumerate_sequence

from .models import (save_new_platform,
                     platforms_by_species,
                     species_platforms_count,
                     platform_by_species_and_id)

platformsbp = Blueprint("platforms", __name__)
render_template = make_template_renderer("platforms")

@platformsbp.route("platforms", methods=["GET"])
@require_login
def index():
    """Entry-point to the platforms feature."""
    with database_connection(app.config["SQL_URI"]) as conn:
        if not bool(request.args.get("species_id")):
            return render_template(
                "platforms/index.html",
                species=order_by_family(all_species(conn)),
                activelink="platforms")

        species = species_by_id(conn, request.args["species_id"])
        if not bool(species):
            flash("No species selected.", "alert-danger")
            return redirect(url_for("species.platforms.index"))

        return redirect(url_for("species.platforms.list_platforms",
                                species_id=species["SpeciesId"]))


@platformsbp.route("<int:species_id>/platforms", methods=["GET"])
@require_login
def list_platforms(species_id: int):
    """List all the available genetic sequencing platforms."""
    with database_connection(app.config["SQL_URI"]) as conn:
        species = species_by_id(conn, species_id)
        if not bool(species):
            flash("No species provided.", "alert-danger")
            return redirect(url_for("species.platforms.index"))

        start_from = max(safe_int(request.args.get("start_from") or 0), 0)
        count = safe_int(request.args.get("count") or 20)
        return render_template(
            "platforms/list-platforms.html",
            species=species,
            platforms=enumerate_sequence(
                platforms_by_species(conn,
                                     species_id,
                                     offset=start_from,
                                     limit=count),
                start=start_from+1),
            start_from=start_from,
            count=count,
            total_platforms=species_platforms_count(conn, species_id),
            activelink="list-platforms")


@platformsbp.route("<int:species_id>/platforms/create", methods=["GET", "POST"])
@require_login
def create_platform(species_id: int):
    """Create a new genetic sequencing platform."""
    with (database_connection(app.config["SQL_URI"]) as conn,
          conn.cursor(cursorclass=DictCursor) as cursor):
        species = species_by_id(conn, species_id)
        if not bool(species):
            flash("No species provided.", "alert-danger")
            return redirect(url_for("species.platforms.index"))

        if request.method == "GET":
            return render_template(
                "platforms/create-platform.html",
                species=species,
                activelink="create-platform")

        try:
            form = request.form
            new_platform = save_new_platform(
                cursor,
                species_id,
                form["geo-platform"],
                form["platform-name"],
                form["platform-shortname"],
                form["platform-title"],
                form.get("go-tree-value") or None)
        except KeyError as _kerr:
            flash(f"Required value for field {_kerr.args[0]} was not provided.",
                  "alert-danger")
            return redirect(url_for("species.platforms.create_platform",
                                    species_id=species_id))
        except AssertionError as _aerr:
            flash(f"Platform with GeoPlatform value of '{form['geo-platform']}'"
                  f" already existst for species '{species['FullName']}'.",
                  "alert-danger")
            return redirect(url_for("species.platforms.create_platform",
                                    species_id=species_id))

    flash("Platform created successfully", "alert-success")
    return redirect(url_for("species.platforms.view_platform",
                            species_id=species_id,
                            platform_id=new_platform["Id"]))


@platformsbp.route("<int:species_id>/platforms/<int:platform_id>/view",
                   methods=["GET"])
@require_login
def view_platform(species_id: int, platform_id: int):
    """View details for a specific platform."""
    with database_connection(app.config["SQL_URI"]) as conn:
        return platform_by_species_and_id(
            conn, species_id, platform_id)