"""The endpoints for the platforms""" from MySQLdb.cursors import DictCursor from gn_libs.mysqldb import database_connection 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.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) 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("/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("/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 exists 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.list_platforms", species_id=species_id))