"""Endpoints handling species.""" from flask import (flash, request, url_for, redirect, Blueprint, current_app as app, render_template as flask_render_template) from uploader.authorisation import require_login from uploader.db_utils import database_connection from .models import all_species, save_species, species_by_id speciesbp = Blueprint("species", __name__) def render_template(template, **kwargs): """Render template for species.""" return flask_render_template(template, **kwargs, activelink="species") @speciesbp.route("/", methods=["GET"]) def list_species(): """List and display all the species in the database.""" with database_connection(app.config["SQL_URI"]) as conn: return render_template("species/list-species.html", allspecies=all_species(conn)) @speciesbp.route("/", methods=["GET"]) @require_login def view_species(species_id: int): """View details of a particular species and menus to act upon it.""" with database_connection(app.config["SQL_URI"]) as conn: return species_by_id(conn, species_id) @speciesbp.route("/create", methods=["GET", "POST"]) @require_login def create_species(): """Create a new species.""" # We can use uniprot's API to fetch the details with something like # https://rest.uniprot.org/taxonomy/ e.g. # https://rest.uniprot.org/taxonomy/6239 if request.method == "GET": return render_template("species/create-species.html") with (database_connection(app.config["SQL_URI"]) as conn, conn.cursor() as cursor): error = False taxon_id = request.form.get("species_taxonomy_id", "").strip() or None common_name = request.form.get("common_name", "").strip() if not bool(common_name): flash("The common species name MUST be provided.", "alert-danger") error = True scientific_name = request.form.get("scientific_name", "").strip() if not bool(scientific_name): flash("The species' scientific name MUST be provided.", "alert-danger") error = True parts = tuple(name.strip() for name in scientific_name.split(" ")) if len(parts) != 2 or not all(bool(name) for name in parts): flash("The scientific name you provided is invalid.", "alert-danger") error = True cursor.execute( "SELECT * FROM Species WHERE FullName=%s", (scientific_name,)) res = cursor.fetchone() if bool(res): flash("A species already exists with the provided scientific name.", "alert-danger") error = True if bool(taxon_id): cursor.execute( "SELECT * FROM Species WHERE TaxonomyId=%s", (taxon_id,)) res = cursor.fetchone() if bool(res): flash("A species already exists with the provided scientific name.", "alert-danger") error = True if error: return redirect(url_for("species.create_species", common_name=common_name, scientific_name=scientific_name, taxon_id=taxon_id)) species = save_species(conn, common_name, scientific_name, taxon_id) flash("Species saved successfully!", "alert-success") return redirect(url_for("species.view_species", species_id=species["species_id"]))