about summary refs log tree commit diff
path: root/uploader/platforms/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'uploader/platforms/views.py')
-rw-r--r--uploader/platforms/views.py46
1 files changed, 43 insertions, 3 deletions
diff --git a/uploader/platforms/views.py b/uploader/platforms/views.py
index 1abf52e..1030b6c 100644
--- a/uploader/platforms/views.py
+++ b/uploader/platforms/views.py
@@ -1,4 +1,5 @@
 """The endpoints for the platforms"""
+from MySQLdb.cursors import DictCursor
 from flask import (
     flash,
     request,
@@ -13,7 +14,10 @@ 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 platforms_by_species, species_platforms_count
+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")
@@ -69,7 +73,8 @@ def list_platforms(species_id: int):
 @require_login
 def create_platform(species_id: int):
     """Create a new genetic sequencing platform."""
-    with database_connection(app.config["SQL_URI"]) as conn:
+    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")
@@ -81,4 +86,39 @@ def create_platform(species_id: int):
                 species=species,
                 activelink="create-platform")
 
-        raise NotImplementedError("This still needs to be implemented.")
+        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)