about summary refs log tree commit diff
path: root/uploader/species/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'uploader/species/views.py')
-rw-r--r--uploader/species/views.py45
1 files changed, 37 insertions, 8 deletions
diff --git a/uploader/species/views.py b/uploader/species/views.py
index 08d3728..20acd01 100644
--- a/uploader/species/views.py
+++ b/uploader/species/views.py
@@ -1,18 +1,22 @@
 """Endpoints handling species."""
+from markupsafe import escape
 from pymonad.either import Left, Right, Either
+from gn_libs.mysqldb import database_connection
 from flask import (flash,
                    request,
-                   url_for,
                    redirect,
                    Blueprint,
                    current_app as app)
 
 from uploader.population import popbp
+from uploader.platforms import platformsbp
+from uploader.flask_extensions import url_for
 from uploader.ui import make_template_renderer
-from uploader.db_utils import database_connection
 from uploader.oauth2.client import oauth2_get, oauth2_post
 from uploader.authorisation import require_login, require_token
 from uploader.datautils import order_by_family, enumerate_sequence
+from uploader.population.models import (populations_by_species,
+                                        population_by_species_and_id)
 
 from .models import (all_species,
                      save_species,
@@ -23,10 +27,12 @@ from .models import (all_species,
 
 speciesbp = Blueprint("species", __name__)
 speciesbp.register_blueprint(popbp, url_prefix="/")
+speciesbp.register_blueprint(platformsbp, url_prefix="/")
 render_template = make_template_renderer("species")
 
 
 @speciesbp.route("/", methods=["GET"])
+@require_login
 def list_species():
     """List and display all the species in the database."""
     with database_connection(app.config["SQL_URI"]) as conn:
@@ -37,15 +43,28 @@ def list_species():
 @require_login
 def view_species(species_id: int):
     """View details of a particular species and menus to act upon it."""
+    streamlined_ui = request.args.get("streamlined_ui")
     with database_connection(app.config["SQL_URI"]) as conn:
         species = species_by_id(conn, species_id)
         if bool(species):
-            return render_template("species/view-species.html",
-                                   species=species,
-                                   activelink="view-species")
+            population = population_by_species_and_id(
+                conn, species_id, request.args.get("population_id"))
+            if bool(population):
+                return redirect(url_for("species.populations.view_population",
+                                        species_id=species_id,
+                                        population_id=population["Id"]))
+            return render_template(
+                ("species/sui-view-species.html"
+                 if bool(streamlined_ui)
+                 else "species/view-species.html"),
+                species=species,
+                activelink="view-species",
+                populations=populations_by_species(conn, species["SpeciesId"]))
         flash("Could not find a species with the given identifier.",
               "alert-danger")
-        return redirect(url_for("species.view_species"))
+        return redirect(url_for("base.index"
+                                if streamlined_ui
+                                else "species.view_species"))
 
 @speciesbp.route("/create", methods=["GET", "POST"])
 @require_login
@@ -59,6 +78,8 @@ def create_species():
         if request.method == "GET":
             return render_template("species/create-species.html",
                                    families=species_families(conn),
+                                   return_to=(
+                                       request.args.get("return_to") or ""),
                                    activelink="create-species")
 
         error = False
@@ -76,7 +97,7 @@ def create_species():
             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):
+        if (len(parts) != 2 and len(parts) != 3) or not all(bool(name) for name in parts):
             flash("The scientific name you provided is invalid.", "alert-danger")
             error = True
 
@@ -110,7 +131,15 @@ def create_species():
 
         species = save_species(
             conn, common_name, scientific_name, family, taxon_id)
-        flash("Species saved successfully!", "alert-success")
+        flash(
+            f"You have successfully added species "
+            f"'{escape(species['scientific_name'])} "
+            f"({escape(species['common_name'])})'.",
+            "alert-success")
+
+        return_to = request.form.get("return_to").strip()
+        if return_to:
+            return redirect(url_for(return_to, species_id=species["species_id"]))
         return redirect(url_for("species.view_species", species_id=species["species_id"]))