about summary refs log tree commit diff
path: root/uploader/phenotypes/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'uploader/phenotypes/views.py')
-rw-r--r--uploader/phenotypes/views.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/uploader/phenotypes/views.py b/uploader/phenotypes/views.py
index 47fbd51..c7bc965 100644
--- a/uploader/phenotypes/views.py
+++ b/uploader/phenotypes/views.py
@@ -1,6 +1,7 @@
 """Views handling ('classical') phenotypes."""
 from functools import wraps
 
+from MySQLdb.cursors import DictCursor
 from flask import (flash,
                    request,
                    url_for,
@@ -18,10 +19,14 @@ from uploader.request_checks import with_species, with_population
 from uploader.datautils import safe_int, order_by_family, enumerate_sequence
 from uploader.population.models import (populations_by_species,
                                         population_by_species_and_id)
+from uploader.input_validation import (encode_errors,
+                                       decode_errors,
+                                       is_valid_representative_name)
 
 from .models import (dataset_by_id,
                      phenotype_by_id,
                      phenotypes_count,
+                     save_new_dataset,
                      dataset_phenotypes,
                      datasets_by_population)
 
@@ -222,3 +227,52 @@ def view_phenotype(# pylint: disable=[unused-argument]
             make_either_error_handler(
                 "There was an error fetching the roles and privileges."),
             lambda resp: resp)
+
+
+@phenotypesbp.route(
+    "<int:species_id>/populations/<int:population_id>/phenotypes/datasets/create",
+    methods=["GET", "POST"])
+@require_login
+@with_population(
+    species_redirect_uri="species.populations.phenotypes.index",
+    redirect_uri="species.populations.phenotypes.select_population")
+def create_dataset(species: dict, population: dict, **kwargs):
+    """Create a new phenotype dataset."""
+    with (database_connection(app.config["SQL_URI"]) as conn,
+          conn.cursor(cursorclass=DictCursor) as cursor):
+        if request.method == "GET":
+            return render_template("phenotypes/create-dataset.html",
+                                   activelink="create-dataset",
+                                   species=species,
+                                   population=population,
+                                   **decode_errors(
+                                       request.args.get("error_values", "")))
+
+        form = request.form
+        _errors = tuple()
+        if not is_valid_representative_name(
+                (form.get("dataset-name") or "").strip()):
+            _errors = _errors + (("dataset-name", "Invalid dataset name."),)
+
+        if not bool((form.get("dataset-fullname") or "").strip()):
+            _errors = _errors + (("dataset-fullname",
+                                  "You must provide a value for 'Full Name'."),)
+
+        if bool(_errors) > 0:
+            return redirect(url_for(
+                "species.populations.phenotypes.create_dataset",
+                species_id=species["SpeciesId"],
+                population_id=population["Id"],
+                error_values=encode_errors(_errors, form)))
+
+        dataset_shortname = (
+            form["dataset-shortname"] or form["dataset-name"]).strip()
+        pheno_dataset = save_new_dataset(
+            cursor,
+            population["Id"],
+            form["dataset-name"].strip(),
+            form["dataset-fullname"].strip(),
+            dataset_shortname)
+        return redirect(url_for("species.populations.phenotypes.list_datasets",
+                                species_id=species["SpeciesId"],
+                                population_id=population["Id"]))