aboutsummaryrefslogtreecommitdiff
path: root/uploader/phenotypes
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-10-07 13:32:01 -0500
committerFrederick Muriuki Muriithi2024-10-07 13:42:22 -0500
commit4c0186d281ff77b28fa1abe1f84da0e8cb72dea1 (patch)
tree1900f94939deaf3ef49b2122a576bb45e632c231 /uploader/phenotypes
parent40ae605d358440212a2617d1ec0dddb5f75df5bb (diff)
downloadgn-uploader-4c0186d281ff77b28fa1abe1f84da0e8cb72dea1.tar.gz
Create new phenotype dataset (PublishFreeze).
Provide the UI and code to create a new phenotype dataset.
Diffstat (limited to 'uploader/phenotypes')
-rw-r--r--uploader/phenotypes/models.py28
-rw-r--r--uploader/phenotypes/views.py54
2 files changed, 82 insertions, 0 deletions
diff --git a/uploader/phenotypes/models.py b/uploader/phenotypes/models.py
index be970ac..9324601 100644
--- a/uploader/phenotypes/models.py
+++ b/uploader/phenotypes/models.py
@@ -1,6 +1,7 @@
"""Database and utility functions for phenotypes."""
from typing import Optional
from functools import reduce
+from datetime import datetime
import MySQLdb as mdb
from MySQLdb.cursors import Cursor, DictCursor
@@ -202,3 +203,30 @@ def phenotypes_data(conn: mdb.Connection,
cursor.execute(_query, (population_id, dataset_id))
debug_query(cursor)
return tuple(dict(row) for row in cursor.fetchall())
+
+
+def save_new_dataset(cursor: Cursor,
+ population_id: int,
+ dataset_name: str,
+ dataset_fullname: str,
+ dataset_shortname: str) -> dict:
+ """Create a new phenotype dataset."""
+ params = {
+ "population_id": population_id,
+ "dataset_name": dataset_name,
+ "dataset_fullname": dataset_fullname,
+ "dataset_shortname": dataset_shortname,
+ "created": datetime.now().date().isoformat(),
+ "public": 2,
+ "confidentiality": 0,
+ "users": None
+ }
+ cursor.execute(
+ "INSERT INTO PublishFreeze(Name, FullName, ShortName, CreateTime, "
+ "public, InbredSetId, confidentiality, AuthorisedUsers) "
+ "VALUES(%(dataset_name)s, %(dataset_fullname)s, %(dataset_shortname)s, "
+ "%(created)s, %(public)s, %(population_id)s, %(confidentiality)s, "
+ "%(users)s)",
+ params)
+ debug_query(cursor)
+ return {**params, "Id": cursor.lastrowid}
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"]))