about summary refs log tree commit diff
path: root/uploader
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-09-10 16:57:41 -0500
committerFrederick Muriuki Muriithi2024-09-10 16:57:41 -0500
commit83b41616825d5abed8543a744d20cf6e4c6ffa64 (patch)
tree12a6a60687974d26b60da2650d13bcf5e5faa4af /uploader
parent3c8ec9af68d593e7e5eef52aca3d001e22c8e0f7 (diff)
downloadgn-uploader-83b41616825d5abed8543a744d20cf6e4c6ffa64.tar.gz
Require that user selects the family.
Diffstat (limited to 'uploader')
-rw-r--r--uploader/species/models.py36
-rw-r--r--uploader/species/views.py35
-rw-r--r--uploader/templates/species/create-species.html16
3 files changed, 66 insertions, 21 deletions
diff --git a/uploader/species/models.py b/uploader/species/models.py
index cea3549..4426b64 100644
--- a/uploader/species/models.py
+++ b/uploader/species/models.py
@@ -46,6 +46,7 @@ def species_by_id(conn: mdb.Connection, speciesid) -> dict:
 def save_species(conn: mdb.Connection,
                  common_name: str,
                  scientific_name: str,
+                 family: str,
                  taxon_id: Optional[str] = None) -> int:
     """
     Save a new species to the database.
@@ -58,20 +59,27 @@ def save_species(conn: mdb.Connection,
     scientific_name; The species' scientific name.
     """
     genus, species = scientific_name.split(" ")
-    species = {
-        "common_name": common_name,
-        "common_name_lower": common_name.lower(),
-        "menu_name": f"{common_name} ({genus[0]}. {species.lower()})",
-        "scientific_name": scientific_name,
-        "taxon_id": taxon_id
-    }
+    families = species_families(conn)
     with conn.cursor() as cursor:
+        cursor.execute("SELECT MAX(OrderId) FROM Species")
+        species = {
+            "common_name": common_name,
+            "common_name_lower": common_name.lower(),
+            "menu_name": f"{common_name} ({genus[0]}. {species.lower()})",
+            "scientific_name": scientific_name,
+            "family": family,
+            "family_order": families[family],
+            "taxon_id": taxon_id,
+            "species_order": cursor.fetchone()[0] + 5
+        }
         cursor.execute(
             "INSERT INTO Species("
-            "SpeciesName, Name, MenuName, FullName, TaxonomyId"
+            "SpeciesName, Name, MenuName, FullName, Family, FamilyOrderId, "
+            "TaxonomyId, OrderId"
             ") VALUES ("
             "%(common_name)s, %(common_name_lower)s, %(menu_name)s, "
-            "%(scientific_name)s, %(taxon_id)s"
+            "%(scientific_name)s, %(family)s, %(family_order)s, %(taxon_id)s, "
+            "%(species_order)s"
             ")",
             species)
         species_id = cursor.lastrowid
@@ -83,9 +91,13 @@ def save_species(conn: mdb.Connection,
         }
 
 
-def species_families(conn: mdb.Connection) -> tuple:
+def species_families(conn: mdb.Connection) -> dict:
     """Retrieve the families under which species are grouped."""
     with conn.cursor(cursorclass=DictCursor) as cursor:
         cursor.execute(
-            "SELECT DISTINCT(Family) FROM Species WHERE Family IS NOT NULL")
-        return tuple(fam["Family"] for fam in cursor.fetchall())
+            "SELECT DISTINCT(Family), FamilyOrderId FROM Species "
+            "WHERE Family IS NOT NULL")
+        return {
+            fam["Family"]: fam["FamilyOrderId"]
+            for fam in cursor.fetchall()
+        }
diff --git a/uploader/species/views.py b/uploader/species/views.py
index d994e41..f39ca98 100644
--- a/uploader/species/views.py
+++ b/uploader/species/views.py
@@ -8,6 +8,7 @@ from flask import (flash,
                    current_app as app)
 
 from uploader.population import popbp
+from uploader.datautils import order_by_family
 from uploader.ui import make_template_renderer
 from uploader.db_utils import database_connection
 from uploader.oauth2.client import oauth2_get, oauth2_post
@@ -49,12 +50,13 @@ def create_species():
     # We can use uniprot's API to fetch the details with something like
     # https://rest.uniprot.org/taxonomy/<taxonID> e.g.
     # https://rest.uniprot.org/taxonomy/6239
-    if request.method == "GET":
-        return render_template("species/create-species.html",
-                               activelink="create-species")
-
     with (database_connection(app.config["SQL_URI"]) as conn,
           conn.cursor() as cursor):
+        if request.method == "GET":
+            return render_template("species/create-species.html",
+                                   families=species_families(conn),
+                                   activelink="create-species")
+
         error = False
         taxon_id = request.form.get("species_taxonomy_id", "").strip() or None
 
@@ -82,6 +84,11 @@ def create_species():
                   "alert-danger")
             error = True
 
+        family = request.form.get("species_family", "").strip()
+        if not bool(family):
+            flash("The species' family MUST be selected.", "alert-danger")
+            error = True
+
         if bool(taxon_id):
             cursor.execute(
                 "SELECT * FROM Species WHERE TaxonomyId=%s", (taxon_id,))
@@ -97,7 +104,8 @@ def create_species():
                                     scientific_name=scientific_name,
                                     taxon_id=taxon_id))
 
-        species = save_species(conn, common_name, scientific_name, taxon_id)
+        species = save_species(
+            conn, common_name, scientific_name, family, taxon_id)
         flash("Species saved successfully!", "alert-success")
         return redirect(url_for("species.view_species", species_id=species["species_id"]))
 
@@ -144,7 +152,11 @@ def edit_species_extra(token: dict, species_id: int):# pylint: disable=[unused-a
 
     with database_connection(app.config["SQL_URI"]) as conn:
         species = species_by_id(conn, species_id)
+        all_the_species = all_species(conn)
         families = species_families(conn)
+        family_order = tuple(
+            item[0] for item in order_by_family(all_the_species)
+            if item[0][1] is not None)
         if bool(species) and request.method == "GET":
             return oauth2_get("auth/user/resources").then(
                 __system_resource_uuid__
@@ -153,10 +165,15 @@ def edit_species_extra(token: dict, species_id: int):# pylint: disable=[unused-a
                     "auth/resource/authorisation",
                     json={"resource-ids": [resource_id]})
             ).then(__check_privileges__).then(
-                lambda authorisations: render_template("species/edit-species.html",
-                                                  species=species,
-                                                  families=families,
-                                                  activelink="edit-species")
+                lambda authorisations: render_template(
+                    "species/edit-species.html",
+                    species=species,
+                    families=families,
+                    family_order=family_order,
+                    max_order_id = max(
+                        row["OrderId"] for row in all_the_species
+                        if row["OrderId"] is not None),
+                    activelink="edit-species")
             ).either(__failure__, lambda res: res)
 
         if bool(species) and request.method == "POST":
diff --git a/uploader/templates/species/create-species.html b/uploader/templates/species/create-species.html
index 1bc3b61..0d0bedf 100644
--- a/uploader/templates/species/create-species.html
+++ b/uploader/templates/species/create-species.html
@@ -69,6 +69,22 @@
     </div>
 
     <div class="form-group">
+      <label for="select-species-family" class="form-label">Family</label>
+      <select id="select-species-family"
+              name="species_family"
+              required="required"
+              class="form-control">
+        <option value="">Please select a grouping</option>
+        {%for family in families%}
+        <option value="{{family}}">{{family}}</option>
+        {%endfor%}
+      </select>
+      <small class="form-text text-muted">
+        This is a generic grouping for the species that determines under which
+        grouping the species appears in the GeneNetwork menus</small>
+    </div>
+
+    <div class="form-group">
       <input type="submit"
              value="create new species"
              class="btn btn-primary" />