aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wqflask/wqflask/templates/edit_case_attributes.html4
-rw-r--r--wqflask/wqflask/views.py39
2 files changed, 39 insertions, 4 deletions
diff --git a/wqflask/wqflask/templates/edit_case_attributes.html b/wqflask/wqflask/templates/edit_case_attributes.html
index e3b6a715..a05ecd17 100644
--- a/wqflask/wqflask/templates/edit_case_attributes.html
+++ b/wqflask/wqflask/templates/edit_case_attributes.html
@@ -18,6 +18,8 @@
<div class="container">
<h1>{{inbredset_group.InbredSetName}}: Edit Case-Attributes</h1>
+ {{flash_me()}}
+
<h3>Instructions</h3>
<ul>
<li>
@@ -32,7 +34,7 @@
</li>
</ul>
- <form method="POST" action="#">
+ <form method="POST" action="{{url_for('edit_case_attributes', inbredset_id=inbredset_id)}}">
<div class="form-group" style="text-align: center; padding: 1em 0 0 0;">
<input type="submit" value="Submit" class="btn btn-primary" />
<input type="reset" value="Reset" class="btn btn-warning" />
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index eba9dedb..11328238 100644
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -18,6 +18,8 @@ import traceback
import uuid
import xlsxwriter
+from functools import reduce
+
from zipfile import ZipFile
from zipfile import ZIP_DEFLATED
@@ -1155,12 +1157,42 @@ def get_genotype(name):
metadata=metadata,
)
-@app.route("/case-attribute/<int:inbredset_id>/edit")
+@app.route("/case-attribute/<int:inbredset_id>/edit", methods=["GET", "POST"])
def edit_case_attributes(inbredset_id: int) -> Response:
"""
Edit the case-attributes for InbredSet group identified by `inbredset_id`.
"""
- from wqflask.oauth2 import client
+ if request.method == "POST":
+ form = request.form
+ def __process_data__(acc, item):
+ _new, strain, calabel = tuple(val.strip() for val in item[0].split(":"))
+ old_row = acc.get(strain, {})
+ return {
+ **acc,
+ strain: {
+ **old_row, "case-attributes": {
+ **old_row.get("case-attributes", {}),
+ calabel: item[1]
+ }
+ }
+ }
+
+ def __edit_fail__(error):
+ err = process_error(error)
+ flash(f"{err['error']}: {err['error_description']}", "alert-danger")
+ return redirect(url_for(
+ "edit_case_attributes", inbredset_id=inbredset_id))
+
+ def __edit_success__(result):
+ flash({result["message"]}, "alert-success")
+ return redirect(url_for(
+ "edit_case_attributes", inbredset_id=inbredset_id))
+ return client.post(
+ f"case-attribute/{inbredset_id}/edit",
+ json={
+ "edit-data": reduce(__process_data__, form.items(), {})
+ }).either(
+ __edit_fail__, __edit_success__)
def __fetch_strains__(inbredset_group):
return client.get(f"case-attribute/{inbredset_id}/strains").then(
@@ -1180,4 +1212,5 @@ def edit_case_attributes(inbredset_id: int) -> Response:
__fetch_strains__).then(__fetch_names__).then(
__fetch_values__).either(
lambda err: err, ## TODO: Handle error better
- lambda values: render_template("edit_case_attributes.html", **values))
+ lambda values: render_template(
+ "edit_case_attributes.html", inbredset_id=inbredset_id, **values))