about summary refs log tree commit diff
path: root/uploader
diff options
context:
space:
mode:
Diffstat (limited to 'uploader')
-rw-r--r--uploader/phenotypes/views.py85
-rw-r--r--uploader/static/css/styles.css7
-rw-r--r--uploader/templates/phenotypes/edit-phenotype.html195
3 files changed, 287 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))
diff --git a/uploader/static/css/styles.css b/uploader/static/css/styles.css
index 1c3e677..7bd51a9 100644
--- a/uploader/static/css/styles.css
+++ b/uploader/static/css/styles.css
@@ -136,11 +136,13 @@ input[type="submit"], .btn {
 
 .heading {
     border-bottom: solid #EEBB88;
+    text-transform: capitalize;
 }
 
 .subheading {
     padding: 1em 0 0.1em 0.5em;
     border-bottom: solid #88BBEE;
+    text-transform: capitalize;
 }
 
 form {
@@ -154,6 +156,11 @@ form .form-control {
     background-color: #EAEAFF;
 }
 
+.table-form-table thead {
+    background: #E5E5FF;
+}
+
+
 .sidebar-content .card .card-title {
     font-size: 1.5em;
 }
diff --git a/uploader/templates/phenotypes/edit-phenotype.html b/uploader/templates/phenotypes/edit-phenotype.html
new file mode 100644
index 0000000..8b1642c
--- /dev/null
+++ b/uploader/templates/phenotypes/edit-phenotype.html
@@ -0,0 +1,195 @@
+{%extends "phenotypes/base.html"%}
+{%from "flash_messages.html" import flash_all_messages%}
+{%from "populations/macro-display-population-card.html" import display_population_card%}
+
+{%block title%}Phenotypes{%endblock%}
+
+{%block pagetitle%}Phenotypes{%endblock%}
+
+{%block lvl4_breadcrumbs%}
+<li {%if activelink=="edit-phenotype"%}
+    class="breadcrumb-item active"
+    {%else%}
+    class="breadcrumb-item"
+    {%endif%}>
+  <a href="{{url_for('species.populations.phenotypes.edit_phenotype_data',
+           species_id=species.SpeciesId,
+           population_id=population.Id,
+           dataset_id=dataset.Id,
+           xref_id=xref_id)}}">View Datasets</a>
+</li>
+{%endblock%}
+
+{%block contents%}
+{{flash_all_messages()}}
+
+<div class="row">
+  <h2 class="heading">edit phenotype data</h2>
+  <p>The two (2) forms provided in this page help you update the data for the
+    phenotypes, and the publication information for the phenotype,
+    respectively.</p>
+</div>
+
+<div class="row">
+  <h3 class="subheading">phenotype data</h3>
+  <form id="frm-edit-phenotype-data">
+    <div style="max-height: 23.37em;overflow-y: scroll;">
+    <table class="table table-striped table-responsive table-form-table">
+      <thead style="position: sticky; top: 0;">
+        <tr>
+          <th>#</th>
+          <th>Sample</th>
+          <th>Value</th>
+          {%if population.Family in families_with_se_and_n%}
+          <th>Standard-Error</th>
+          <th>Number of Samples</th>
+          {%endif%}
+        </tr>
+      </thead>
+
+      <tbody>
+        {%for item in phenotype.data%}
+        <tr>
+          <td>{{loop.index}}</td>
+          <td>{{item.StrainName}}</td>
+          <td>
+            <input type="text"
+                   name="value::{{item.DataId}}::{{item.StrainId}}"
+                   value="{{item.value}}"
+                   data-original-value="{{item.value}}"
+                   class="form-control" /></td>
+          {%if population.Family in families_with_se_and_n%}
+          <td>
+            <input type="text"
+                   name="se::{{item.DataId}}::{{item.StrainId}}"
+                   value="{{item.error or ''}}"
+                   data-original-value="{{item.error or ''}}"
+                   class="form-control" /></td>
+          <td><input type="text"
+                     name="n::{{item.DataId}}::{{item.StrainId}}"
+                     value="{{item.count or ''}}"
+                     data-original-value="{{item.count or "-"}}"
+                     class="form-control" /></td>
+          {%endif%}
+        </tr>
+        {%endfor%}
+      </tbody>
+    </table>
+    </div>
+    <div class="form-group">
+      <input type="submit"
+             name="submit"
+             class="btn btn-primary not-implemented"
+             value="update data" />
+    </div>
+  </form>
+</div>
+
+<div class="row">
+  <h3 class="subheading">publication information</h3>
+  <p>Use the form below to update the publication information for this
+    phenotype.</p>
+  <form id="frm-edit-phenotype-pub-data"
+        method="POST"
+        action="#">
+    <div class="form-group">
+      <label for="txt-pubmed-id" class="form-label">Pubmed ID</label>
+      <input id="txt-pubmed-id" name="pubmed-id" type="text"
+             class="form-control" />
+      <span class="form-text text-muted">
+        Enter your publication's PubMed ID.
+      </span>
+    </div>
+
+    <div class="form-group">
+      <label for="txt-publication-authors" class="form-label">Authors</label>
+      <input id="txt-publication-authors" name="publication-authors"
+             type="text" class="form-control" />
+      <span class="form-text text-muted">
+        Enter the authors.</span>
+    </div>
+
+    <div class="form-group">
+      <label for="txt-publication-title" class="form-label">
+        Publication Title</label>
+      <input id="txt-publication-title" name="publication-title" type="text"
+             class="form-control" />
+      <span class="form-text text-muted">
+        Enter your publication's title.</span>
+    </div>
+
+    <div class="form-group">
+      <label for="txt-publication-abstract" class="form-label">
+        Publication Abstract</label>
+      <textarea id="txt-publication-abstract" name="publication-abstract"
+                class="form-control" rows="10"></textarea>
+      <span class="form-text text-muted">
+        Enter the abstract for your publication.</span>
+    </div>
+
+    <div class="form-group">
+      <label for="txt-publication-journal" class="form-label">Journal</label>
+      <input id="txt-publication-journal" name="journal" type="text"
+             class="form-control" />
+      <span class="form-text text-muted">
+        Enter the name of the journal where your work was published.</span>
+    </div>
+
+    <div class="form-group">
+      <label for="txt-publication-volume" class="form-label">Volume</label>
+      <input id="txt-publication-volume" name="publication-volume" type="text"
+             class="form-control" />
+      <span class="form-text text-muted">
+        Enter the volume in the following format &hellip;</span>
+    </div>
+
+    <div class="form-group">
+      <label for="txt-publication-pages" class="form-label">Pages</label>
+      <input id="txt-publication-pages" name="publication-pages" type="text"
+             class="form-control" />
+      <span class="form-text text-muted">
+        Enter the journal volume where your work was published.</span>
+    </div>
+
+    <div class="form-group">
+      <label for="select-publication-month" class="form-label">
+        Publication Month</label>
+      <select id="select-publication-month" name="publication-month"
+              class="form-control">
+        {%for month in monthnames%}
+        <option value="{{month | lower}}"
+                {%if current_month | lower == month | lower%}
+                selected="selected"
+                {%endif%}>{{month | capitalize}}</option>
+        {%endfor%}
+      </select>
+      <span class="form-text text-muted">
+        Select the month when the work was published.
+        <span class="text-danger">
+          This cannot be before, say 1600 and cannot be in the future!</span></span>
+    </div>
+
+    <div class="form-group">
+      <label for="txt-publication-year" class="form-label">Publication Year</label>
+      <input id="txt-publication-year" name="publication-year" type="text"
+             class="form-control" value="{{current_year}}" />
+      <span class="form-text text-muted">
+        Enter the year your work was published.
+        <span class="text-danger">
+          This cannot be before, say 1600 and cannot be in the future!</span>
+      </span>
+    </div>
+    <div class="form-group">
+      <input type="submit"
+             name="submit"
+             class="btn btn-primary not-implemented"
+             value="update publication" />
+    </div>
+  </form>
+</div>
+
+{%endblock%}
+
+{%block sidebarcontents%}
+{{display_population_card(species, population)}}
+{%endblock%}