about summary refs log tree commit diff
path: root/uploader/phenotypes
diff options
context:
space:
mode:
Diffstat (limited to 'uploader/phenotypes')
-rw-r--r--uploader/phenotypes/views.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/uploader/phenotypes/views.py b/uploader/phenotypes/views.py
index 5ae9588..fe591f1 100644
--- a/uploader/phenotypes/views.py
+++ b/uploader/phenotypes/views.py
@@ -234,6 +234,7 @@ def view_phenotype(# pylint: disable=[unused-argument]
             species=species,
             population=population,
             dataset=dataset,
+            xref_id=xref_id,
             phenotype=phenotype,
             has_se=all(bool(item.get("error")) for item in phenotype["data"]),
             publish_data={
@@ -589,3 +590,87 @@ def review_job_data(
                                job=job,
                                summary=summary,
                                activelink="add-phenotypes")
+
+
+
+@phenotypesbp.route(
+    "<int:species_id>/populations/<int:population_id>/phenotypes/datasets"
+    "/<int:dataset_id>/phenotype/<int:xref_id>/edit",
+    methods=["GET", "POST"])
+@require_login
+@with_dataset(
+    species_redirect_uri="species.populations.phenotypes.index",
+    population_redirect_uri="species.populations.phenotypes.select_population",
+    redirect_uri="species.populations.phenotypes.list_datasets")
+def edit_phenotype_data(
+        species: dict,
+        population: dict,
+        dataset: dict,
+        xref_id: int,
+        **kwargs
+):
+    """Edit the data for a particular phenotype."""
+    def __render__(**kwargs):
+        processed_kwargs = {
+            **kwargs,
+            "privileges": (kwargs.get("privileges", tuple())
+                           ### For demo! Do not commit this part
+                            + ("group:resource:edit-resource",
+                               "group:resource:delete-resource",)
+                           ### END: For demo! Do not commit this part
+                            )
+        }
+        return render_template(
+            "phenotypes/edit-phenotype.html",
+            species=species,
+            population=population,
+            dataset=dataset,
+            xref_id=xref_id,
+            families_with_se_and_n=_FAMILIES_WITH_SE_AND_N_,
+            **processed_kwargs,
+            activelink="edit-phenotype")
+
+    with database_connection(app.config["SQL_URI"]) as conn:
+        def __fetch_phenotype__(privileges):
+            phenotype = phenotype_by_id(conn,
+                                        species["SpeciesId"],
+                                        population["Id"],
+                                        dataset["Id"],
+                                        xref_id)
+            if phenotype is None:
+                msg = ("Could not find the phenotype with cross-reference ID"
+                       f" '{xref_id}' from dataset '{dataset['FullName']}' "
+                       f" from the '{population['FullName']}' population of "
+                       f" species '{species['FullName']}'.")
+                return Left({"privileges": privileges, "phenotype-error": msg})
+            return {"privileges": privileges, "phenotype": phenotype}
+
+        def __fetch_publication_data__(**kwargs):
+            pheno = kwargs["phenotype"]
+            return {
+                **kwargs,
+                "publication_data": phenotype_publication_data(
+                    conn, pheno["Id"])
+            }
+
+        def __fail__(failure_object):
+            # process the object
+            return __render__(failure_object=failure_object)
+
+        return oauth2_post(
+            "/auth/resource/phenotypes/individual/linked-resource",
+            json={
+                "species_id": species["SpeciesId"],
+                "population_id": population["Id"],
+                "dataset_id": dataset["Id"],
+                "xref_id": xref_id
+            }
+        ).then(
+            lambda resource: tuple(
+                privilege["privilege_id"] for role in resource["roles"]
+                for privilege in role["privileges"])
+        ).then(
+            __fetch_phenotype__
+        ).then(
+            lambda args: __fetch_publication_data__(**args)
+        ).either(__fail__, lambda args: __render__(**args))