aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-04-12 09:17:49 +0300
committerFrederick Muriuki Muriithi2024-04-12 09:48:58 +0300
commit8e4e15ae62989f07d3ca8512165ba2a93c42aa94 (patch)
tree6136b56b8ba8537cb54ea6d498f418b6bf81c733
parent09b4b70aae5e65516c766882118a897c75a44974 (diff)
downloadgn-uploader-8e4e15ae62989f07d3ca8512165ba2a93c42aa94.tar.gz
Consistently check for possibly non-existent data
The "geno-dataset", "tissue", "pheno-study" and "pheno-dataset" data "objects" might not exist for a particular uploaded bundle, so we check in a consistent manner to ensure they are provided when needed.
-rw-r--r--qc_app/db/datasets.py22
-rw-r--r--qc_app/templates/rqtl2/summary-info.html11
-rw-r--r--qc_app/upload/rqtl2.py35
3 files changed, 35 insertions, 33 deletions
diff --git a/qc_app/db/datasets.py b/qc_app/db/datasets.py
index 448db18..b56dcf5 100644
--- a/qc_app/db/datasets.py
+++ b/qc_app/db/datasets.py
@@ -18,12 +18,12 @@ def geno_datasets_by_species_and_population(
{"sid": speciesid, "pid": populationid})
return tuple(dict(row) for row in cursor.fetchall())
-def geno_dataset_by_id(conn: mdb.Connection, dataset_id: int) -> dict:
+def geno_dataset_by_id(conn: mdb.Connection, dataset_id) -> Optional[dict]:
"""Retrieve genotype dataset by ID"""
with conn.cursor(cursorclass=DictCursor) as cursor:
- cursor.execute("SELECT * FROM GenoFreeze WHERE Id=%s",
- (dataset_id,))
- return dict(cursor.fetchone())
+ cursor.execute("SELECT * FROM GenoFreeze WHERE Id=%s", (dataset_id,))
+ _dataset = cursor.fetchone()
+ return dict(_dataset) if bool(_dataset) else None
def probeset_studies_by_species_and_population(
conn: mdb.Connection,
@@ -46,12 +46,12 @@ def probeset_datasets_by_study(conn: mdb.Connection,
(studyid,))
return tuple(dict(row) for row in cursor.fetchall())
-def probeset_study_by_id(conn: mdb.Connection, studyid: int) -> dict:
+def probeset_study_by_id(conn: mdb.Connection, studyid) -> Optional[dict]:
"""Retrieve ProbeSet study by ID"""
with conn.cursor(cursorclass=DictCursor) as cursor:
- cursor.execute("SELECT * FROM ProbeFreeze WHERE Id=%s",
- (studyid,))
- return dict(cursor.fetchone())
+ cursor.execute("SELECT * FROM ProbeFreeze WHERE Id=%s", (studyid,))
+ _study = cursor.fetchone()
+ return dict(_study) if bool(_study) else None
def probeset_create_study(conn: mdb.Connection,#pylint: disable=[too-many-arguments]
populationid: int,
@@ -120,12 +120,10 @@ def probeset_create_dataset(conn: mdb.Connection,#pylint: disable=[too-many-argu
dataset)
return {**dataset, "datasetid": cursor.lastrowid}
-def probeset_dataset_by_id(
- conn: mdb.Connection, datasetid: int) -> Optional[dict]:
+def probeset_dataset_by_id(conn: mdb.Connection, datasetid) -> Optional[dict]:
"""Fetch a ProbeSet dataset by its ID"""
with conn.cursor(cursorclass=DictCursor) as cursor:
- cursor.execute("SELECT * FROM ProbeSetFreeze WHERE Id=%s",
- (datasetid,))
+ cursor.execute("SELECT * FROM ProbeSetFreeze WHERE Id=%s", (datasetid,))
result = cursor.fetchone()
if bool(result):
return dict(result)
diff --git a/qc_app/templates/rqtl2/summary-info.html b/qc_app/templates/rqtl2/summary-info.html
index 3882c9c..9a9b6dd 100644
--- a/qc_app/templates/rqtl2/summary-info.html
+++ b/qc_app/templates/rqtl2/summary-info.html
@@ -19,14 +19,25 @@
<dt>Population</dt>
<dd>{{population.InbredSetName}}</dd>
+ {%if geno_dataset%}
<dt>Genotype Dataset</dt>
<dd>{{geno_dataset.Name}} ({{geno_dataset.FullName}})</dd>
+ {%endif%}
+ {%if tissue%}
+ <dt>Tissue</dt>
+ <dd>{{tissue.TissueName}} ({{tissue.Name}}, {{tissue.Short_Name}})</dd>
+ {%endif%}
+
+ {%if probe_study%}
<dt>ProbeSet Study</dt>
<dd>{{probe_study.Name}} ({{probe_study.FullName}})</dd>
+ {%endif%}
+ {%if probe_dataset%}
<dt>ProbeSet Dataset</dt>
<dd>{{probe_dataset.Name2}} ({{probe_dataset.FullName}})</dd>
+ {%endif%}
</dl>
<form id="frm:confirm-rqtl2bundle-details"
diff --git a/qc_app/upload/rqtl2.py b/qc_app/upload/rqtl2.py
index bf392a9..8c80ef3 100644
--- a/qc_app/upload/rqtl2.py
+++ b/qc_app/upload/rqtl2.py
@@ -525,7 +525,7 @@ def create_geno_dataset(species_id: int, population_id: int):
return with_errors(__thunk__,
partial(check_species, conn=conn),
- partial(check_population, conn=conn),
+ partial(check_population, conn=conn, species_id=species_id),
partial(check_r_qtl2_bundle,
species_id=species_id,
population_id=population_id))
@@ -765,6 +765,8 @@ def create_probeset_dataset(species_id: int, population_id: int):#pylint: disabl
flash("Dataset full name not provided!", errorclasses)
return summary_page
+ tissue = tissue_by_id(conn, form.get("tissueid", "").strip())
+
study = probeset_study_by_id(conn, int(form["probe-study-id"]))
if not bool(study):
flash("Invalid ProbeSet study provided!", errorclasses)
@@ -806,6 +808,7 @@ def create_probeset_dataset(species_id: int, population_id: int):#pylint: disabl
geno_dataset=geno_dataset_by_id(
conn,
int(request.form["geno-dataset-id"])),
+ tissue=tissue,
study=study,
avgmethod=avgmethod,
dataset=dset)
@@ -846,6 +849,9 @@ def select_dataset_info(species_id: int, population_id: int):
thefile = fullpath(form["rqtl2_bundle_file"])
with ZipFile(str(thefile), "r") as zfile:
cdata = r_qtl2.control_data(zfile)
+
+ geno_dataset = geno_dataset_by_id(
+ conn,form.get("geno-dataset-id", "").strip())
if "geno" in cdata and not bool(form.get("geno-dataset-id")):
return render_template(
"rqtl2/select-geno-dataset.html",
@@ -854,21 +860,6 @@ def select_dataset_info(species_id: int, population_id: int):
rqtl2_bundle_file=thefile.name,
datasets=geno_datasets_by_species_and_population(
conn, species_id, population_id))
- geno_dataset = geno_dataset_by_id(conn, int(form["geno-dataset-id"]))
-
- if "pheno" in cdata and not bool(form.get("probe-study-id")):
- tissue = tissue_by_id(conn, form.get("tissueid", "").strip())
- if not bool(tissue):
- return render_template(
- "rqtl2/select-tissue.html",
- species=species,
- population=population,
- rqtl2_bundle_file=thefile.name,
- geno_dataset=geno_dataset,
- studies=probeset_studies_by_species_and_population(
- conn, species_id, population_id),
- platforms=platforms_by_species(conn, species_id),
- tissues=all_tissues(conn))
tissue = tissue_by_id(conn, form.get("tissueid", "").strip())
if "pheno" in cdata and not bool(tissue):
@@ -883,6 +874,9 @@ def select_dataset_info(species_id: int, population_id: int):
platforms=platforms_by_species(conn, species_id),
tissues=all_tissues(conn))
+ probeset_study = probeset_study_by_id(
+ conn, form.get("probe-study-id", "").strip())
+ if "pheno" in cdata and not bool(probeset_study):
return render_template(
"rqtl2/select-probeset-study-id.html",
species=species,
@@ -896,7 +890,9 @@ def select_dataset_info(species_id: int, population_id: int):
probeset_study = probeset_study_by_id(
conn, int(form["probe-study-id"]))
- if "pheno" in cdata and not bool(form.get("probe-dataset-id")):
+ probeset_dataset = probeset_dataset_by_id(
+ conn, form.get("probe-dataset-id", "").strip())
+ if "pheno" in cdata and not bool(probeset_dataset):
return render_template(
"rqtl2/select-probeset-dataset.html",
species=species,
@@ -908,16 +904,13 @@ def select_dataset_info(species_id: int, population_id: int):
datasets=probeset_datasets_by_study(
conn, int(form["probe-study-id"])),
avgmethods=averaging_methods(conn))
- probeset_study = probeset_study_by_id(
- conn, int(form["probe-study-id"]))
- probeset_dataset = probeset_dataset_by_id(
- conn, int(form["probe-dataset-id"]))
return render_template("rqtl2/summary-info.html",
species=species,
population=population,
rqtl2_bundle_file=thefile.name,
geno_dataset=geno_dataset,
+ tissue=tissue,
probe_study=probeset_study,
probe_dataset=probeset_dataset)