aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzsloan2023-05-10 17:13:07 +0000
committerzsloan2023-05-22 17:18:15 +0000
commit70c2c10cf0bb8a6e14f744f258eccf5f396111b1 (patch)
treef7e9467b6f0cd3a6f9f7522b4af860d6ad29ecad
parent0c7106202cd0cb549e731a43a64a95116756daf6 (diff)
downloadgenenetwork2-70c2c10cf0bb8a6e14f744f258eccf5f396111b1.tar.gz
Add support for editing sample data via an HTML table
This doesn't yet support adding sample data for samples that don't already have values
-rw-r--r--wqflask/wqflask/metadata_edits.py71
1 files changed, 56 insertions, 15 deletions
diff --git a/wqflask/wqflask/metadata_edits.py b/wqflask/wqflask/metadata_edits.py
index df52fdc6..437a9cb4 100644
--- a/wqflask/wqflask/metadata_edits.py
+++ b/wqflask/wqflask/metadata_edits.py
@@ -35,6 +35,7 @@ from gn3.db import fetchall
from gn3.db import fetchone
from gn3.db import insert
from gn3.db import update
+from gn3.db.datasets import retrieve_sample_list, retrieve_group_name, retrieve_trait_dataset
from gn3.db.metadata_audit import MetadataAudit
from gn3.db.phenotypes import Phenotype
from gn3.db.phenotypes import Probeset
@@ -42,7 +43,7 @@ from gn3.db.phenotypes import Publication
from gn3.db.phenotypes import PublishXRef
from gn3.db.phenotypes import probeset_mapping
from gn3.db.sample_data import delete_sample_data
-from gn3.db.sample_data import get_trait_csv_sample_data
+from gn3.db.sample_data import get_trait_sample_data, get_trait_csv_sample_data
from gn3.db.sample_data import insert_sample_data
from gn3.db.sample_data import update_sample_data
@@ -131,8 +132,15 @@ def edit_probeset(conn, name):
def display_phenotype_metadata(dataset_id: str, name: str):
with database_connection() as conn:
_d = edit_phenotype(conn=conn, name=name, dataset_id=dataset_id)
+
+ group_name = retrieve_group_name(dataset_id, conn)
+ sample_list = retrieve_sample_list(group_name)
+ sample_data = get_trait_sample_data(conn, name, _d.get("publish_xref").phenotype_id)
+
return render_template(
"edit_phenotype.html",
+ sample_list = sample_list,
+ sample_data = sample_data,
publish_xref=_d.get("publish_xref"),
phenotype=_d.get("phenotype"),
publication=_d.get("publication"),
@@ -171,7 +179,7 @@ def update_phenotype(dataset_id: str, name: str):
or ""
)
phenotype_id = str(data_.get("phenotype-id"))
- if not (file_ := request.files.get("file")):
+ if not (file_ := request.files.get("file")) and data_.get('edited') == "false":
flash("No sample-data has been uploaded", "warning")
else:
create_dirs_if_not_exists(
@@ -189,20 +197,31 @@ def update_phenotype(dataset_id: str, name: str):
diff_data = {}
with database_connection() as conn:
headers = ["Strain Name", "Value", "SE", "Count"]
- diff_data = remove_insignificant_edits(
- diff_data=csv_diff(
- base_csv=(
- base_csv := get_trait_csv_sample_data(
- conn=conn,
- trait_name=str(name),
- phenotype_id=str(phenotype_id),
- )
- ),
- delta_csv=(delta_csv := file_.read().decode()),
- tmp_dir=TMPDIR,
- ),
- epsilon=0.001,
+ base_csv = get_trait_csv_sample_data(
+ conn=conn,
+ trait_name=str(name),
+ phenotype_id=str(phenotype_id),
)
+ if not (file_) and data_.get('edited') == "true":
+ delta_csv = create_delta_csv(base_csv, data_)
+ diff_data = remove_insignificant_edits(
+ diff_data=csv_diff(
+ base_csv=base_csv,
+ delta_csv=delta_csv,
+ tmp_dir=TMPDIR,
+ ),
+ epsilon=0.001,
+ )
+ else:
+ diff_data = remove_insignificant_edits(
+ diff_data=csv_diff(
+ base_csv=base_csv,
+ delta_csv=(delta_csv := file_.read().decode()),
+ tmp_dir=TMPDIR,
+ ),
+ epsilon=0.001,
+ )
+
invalid_headers = extract_invalid_csv_headers(
allowed_headers=headers, csv_text=delta_csv
)
@@ -706,3 +725,25 @@ def approve_data(resource_id: str, file_name: str):
"warning",
)
return redirect(url_for("metadata_edit.list_diffs"))
+
+def create_delta_csv(base_csv, form_data):
+ base_csv_lines = base_csv.split("\n")
+ delta_csv_lines = [base_csv_lines[0]]
+
+ for line in base_csv_lines[1:]:
+ sample = {}
+ sample['name'], sample['value'], sample['error'], sample['n_cases'] = line.split(",")
+ for key in form_data:
+ if sample['name'] in key:
+ new_line_items = [sample['name']]
+ for field in ["value", "error", "n_cases"]:
+ if form_data.get(field + ":" + sample['name']):
+ new_line_items.append(form_data.get(field + ":" + sample['name']))
+ else:
+ new_line_items.append(sample[field])
+ delta_csv_lines.append(",".join(new_line_items))
+ break
+ else:
+ delta_csv_lines.append(line)
+
+ return "\n".join(delta_csv_lines) \ No newline at end of file