aboutsummaryrefslogtreecommitdiff
path: root/qc_app/dbinsert.py
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2022-07-12 08:51:20 +0300
committerFrederick Muriuki Muriithi2022-07-19 04:59:59 +0300
commitee44431de6cf860fe89e796eab2bb0d555d90105 (patch)
tree79b80c7577044a0b79296ca460d989d6fa53975c /qc_app/dbinsert.py
parent3038c5166aad408d7255f83668b78d635878d3d3 (diff)
downloadgn-uploader-ee44431de6cf860fe89e796eab2bb0d555d90105.tar.gz
Add 'group' and 'tissue' selection.
- Build code to populate the "Group" and "Tissue" dropdown lists - Enable redirect with POST data (code 307) in case there is input error to enable the user fix their errors - Move hidden fields to macro to reduce repetition
Diffstat (limited to 'qc_app/dbinsert.py')
-rw-r--r--qc_app/dbinsert.py103
1 files changed, 63 insertions, 40 deletions
diff --git a/qc_app/dbinsert.py b/qc_app/dbinsert.py
index e506175..18bc7c2 100644
--- a/qc_app/dbinsert.py
+++ b/qc_app/dbinsert.py
@@ -6,7 +6,9 @@ from functools import reduce
import requests
from redis import Redis
from MySQLdb.cursors import DictCursor
-from flask import request, Blueprint, render_template, current_app as app
+from flask import (
+ flash, request, url_for, Blueprint, redirect, render_template,
+ current_app as app)
from . import jobs
from .db_utils import database_connection
@@ -70,6 +72,32 @@ def studies_by_species_and_platform(speciesid:int, genechipid:int) -> tuple:
return tuple()
+def groups_by_species(speciesid:int) -> tuple:
+ "Retrieve group (InbredSet) information from the database."
+ with database_connection() as conn:
+ with conn.cursor(cursorclass=DictCursor) as cursor:
+ query = "SELECT * FROM InbredSet WHERE SpeciesId=%s"
+ cursor.execute(query, (speciesid,))
+ return tuple(cursor.fetchall())
+
+ return tuple()
+
+def organise_groups_by_family(acc:dict, group:dict) -> dict:
+ "Organise the group (InbredSet) information by the group field"
+ family = group["Family"]
+ if acc.get(family):
+ return {**acc, family: acc[family] + (group,)}
+ return {**acc, family: (group,)}
+
+def tissues() -> tuple:
+ "Retrieve type (Tissue) information from the database."
+ with database_connection() as conn:
+ with conn.cursor(cursorclass=DictCursor) as cursor:
+ cursor.execute("SELECT * FROM Tissue ORDER BY Name")
+ return tuple(cursor.fetchall())
+
+ return tuple()
+
@dbinsertbp.route("/platform", methods=["POST"])
def select_platform():
"Select the platform (GeneChipId) used for the data."
@@ -105,54 +133,49 @@ def select_study():
genechipid = form["genechipid"]
the_studies = studies_by_species_and_platform(speciesid, genechipid)
+ the_groups = reduce(
+ organise_groups_by_family, groups_by_species(speciesid), {})
return render_template(
"select_study.html", filename=form["filename"],
filetype=form["filetype"], species=speciesid, genechipid=genechipid,
- studies=the_studies)
+ studies=the_studies, groups=the_groups, tissues = tissues(),
+ selected_group=int(form.get("inbredsetid", -13)),
+ selected_tissue=int(form.get("tissueid", -13)))
except AssertionError as aserr:
return render_error(f"Missing data: {aserr.args[0]}")
-@dbinsertbp.route("/select-dataset", methods=["POST"])
+@dbinsertbp.route("/create-study", methods=["POST"])
+def create_study():
+ "Create a new study (ProbeFreeze)."
+ form = request.form
+ try:
+ assert form.get("studyname"), "study name"
+ assert form.get("inbredsetid"), "group"
+ assert form.get("tissueid"), "type/tissue"
+ except AssertionError as aserr:
+ flash(f"Missing data: {aserr.args[0]}", "alert-error")
+ return redirect(url_for("dbinsert.select_study"), code=307)
+
+@dbinsertbp.route("/dataset", methods=["POST"])
def select_dataset():
"Select the dataset to add the file contents against"
- job_id = request.form["job_id"]
- with Redis.from_url(app.config["REDIS_URL"], decode_responses=True) as rconn:
- job = jobs.job(rconn, job_id)
- if job:
- filename = job["filename"]
- filepath = f"{app.config['UPLOAD_FOLDER']}/{filename}"
- if os.path.exists(filepath):
- req = requests.get(
- "https://genenetwork.org/api3/api/menu/generate/json")
- menu_contents = req.json()
- default_species = "mouse"
- mouse_groups = reduce(
- make_menu_items_grouper(
- lambda item: item.strip()[7:].strip()),
- menu_contents["groups"][default_species], {})
- default_group = "BXD"
- group_types = reduce(
- make_menu_items_grouper(),
- menu_contents["types"][default_species][default_group], {})
- default_type = group_types[tuple(group_types)[0]][0][0]
- datasets = menu_contents[
- "datasets"][default_species][default_group][
- default_type]
-
- gchips = genechips()
+ form = request.form
+ try:
+ assert form.get("filename"), "filename"
+ assert form.get("filetype"), "filetype"
+ assert form.get("species"), "species"
+ assert form.get("genechipid"), "platform"
+ assert (form.get("studyid") or form.get(studyname)), ""
+ assert form.get(""), ""
+ assert form.get(""), ""
+ assert form.get(""), ""
+ assert form.get(""), ""
- return render_template(
- "select_dataset.html", filename=filename,
- species=menu_contents["species"],
- default_species=default_species, groups=mouse_groups,
- types=group_types, datasets=datasets,
- menu_contents=json.dumps(menu_contents),
- genechips_data=json.dumps(gchips),
- genechips=gchips.get(default_species, []),
- filetype=job["filetype"])
- return render_error(f"File '{filename}' no longer exists.")
- return render_error(f"Job '{job_id}' no longer exists.")
- return render_error("Unknown error")
+ return render_template(
+ "select_dataset.html", filename=form["filename"],
+ filetype=form["filetype"], species=speciesid, genechipid=genechipid)
+ except AssertionError as aserr:
+ return render_error(f"Missing data: {aserr.args[0]}")
@dbinsertbp.route("/insert_data", methods=["POST"])