about summary refs log tree commit diff
path: root/uploader
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2025-10-13 13:13:02 -0500
committerFrederick Muriuki Muriithi2025-10-13 13:13:58 -0500
commitf2d21da16508d1859d0e2aeac63ccb5709540aab (patch)
tree516751554c970da86d5a8f2a8aadcdb93b8e3b31 /uploader
parenteecc17d9c7b79a31eed40ed72df9dc06eec9056d (diff)
downloadgn-uploader-f2d21da16508d1859d0e2aeac63ccb5709540aab.tar.gz
Publications: Enable deletion of unlinked publications.
Diffstat (limited to 'uploader')
-rw-r--r--uploader/publications/models.py21
-rw-r--r--uploader/publications/views.py32
-rw-r--r--uploader/templates/publications/view-publication.html18
3 files changed, 63 insertions, 8 deletions
diff --git a/uploader/publications/models.py b/uploader/publications/models.py
index f83be58..ba8f026 100644
--- a/uploader/publications/models.py
+++ b/uploader/publications/models.py
@@ -71,6 +71,27 @@ def update_publications(conn: Connection , publications: tuple[dict, ...]) -> tu
     return tuple()
 
 
+def delete_publications(conn: Connection , publications: tuple[dict, ...]):
+    """Delete multiple publications"""
+    publications = tuple(pub for pub in publications if bool(pub))
+    if len(publications) > 0:
+        _pub_ids = tuple(pub["Id"] for pub in publications)
+        _paramstr = ", ".join(["%s"] * len(_pub_ids))
+        _phenos_query = (
+            "SELECT PublicationId, COUNT(PhenotypeId) FROM PublishXRef "
+            f"WHERE PublicationId IN ({_paramstr}) GROUP BY PublicationId;")
+
+        with conn.cursor(cursorclass=DictCursor) as cursor:
+            cursor.execute(_phenos_query, _pub_ids)
+            _linked_phenos = cursor.fetchall()
+            if len(_linked_phenos) > 0:
+                raise Exception(
+                    "Cannot delete publications with linked phenotypes.")
+
+            cursor.execute(
+                f"DELETE FROM Publication WHERE Id IN ({_paramstr})", _pub_ids)
+
+
 def fetch_publication_by_id(conn: Connection, publication_id: int) -> dict:
     """Fetch a specific publication from the database."""
     with conn.cursor(cursorclass=DictCursor) as cursor:
diff --git a/uploader/publications/views.py b/uploader/publications/views.py
index 23efa2e..f97de75 100644
--- a/uploader/publications/views.py
+++ b/uploader/publications/views.py
@@ -14,6 +14,7 @@ from flask import (
 from uploader.authorisation import require_login
 
 from .models import (
+    delete_publications,
     update_publications,
     fetch_publication_by_id,
     create_new_publications,
@@ -142,3 +143,34 @@ def edit_publication(publication_id: int):
               "alert-success")
         return redirect(url_for(
             "publications.view_publication", publication_id=publication_id))
+
+
+@pubbp.route("/delete/<int:publication_id>", methods=["GET", "POST"])
+@require_login
+def delete_publication(publication_id: int):
+    """Delete a particular publication."""
+    with database_connection(app.config["SQL_URI"]) as conn:
+        publication = fetch_publication_by_id(conn, publication_id)
+        linked_phenotypes=tuple(fetch_publication_phenotypes(
+            conn, publication_id))
+
+        if not bool(publication):
+            flash("Requested publication was not found!", "alert-warning")
+            return redirect(url_for('publications.index'))
+
+        if len(linked_phenotypes) > 0:
+            flash("Cannot delete publication with linked phenotypes!",
+                  "alert-warning")
+            return redirect(url_for(
+                "publications.view_publication", publication_id=publication_id))
+
+        if request.method == "GET":
+            return render_template(
+                "publications/delete-publication.html",
+                publication=publication,
+                linked_phenotypes=linked_phenotypes,
+                publication_id=publication_id)
+
+        delete_publications(conn, (publication,))
+        flash("Deleted the publication successfully.", "alert-success")
+        return render_template("publications/delete-publication-success.html")
diff --git a/uploader/templates/publications/view-publication.html b/uploader/templates/publications/view-publication.html
index 4de5da8..0bd7bc5 100644
--- a/uploader/templates/publications/view-publication.html
+++ b/uploader/templates/publications/view-publication.html
@@ -12,6 +12,10 @@
 <div class="row">
   <table class="table">
     <tr>
+      <th>Linked Phenotypes</th>
+      <td>{{linked_phenotypes | count}}</td>
+    </tr>
+    <tr>
       <th>PubMed</th>
       <td>
         {%if publication.PubMed_ID%}
@@ -58,17 +62,15 @@
 </div>
 
 <div class="row">
+  <div>
   <a href="{{url_for('publications.edit_publication', publication_id=publication.Id)}}"
      title="Edit details for this publication."
      class="btn btn-primary">Edit</a>
-  <form id="frm-edit-delete-publication" method="POST" action="#">
-    <input type="hidden" name="publication_id" value="{{publication.Id}}" />
-    <div class="form-group">
-      {%if linked_phenotypes | length == 0%}
-      <input type="submit" value="delete" class="btn btn-danger not-implemented" />
-      {%endif%}
-    </div>
-  </form>
+  {%if linked_phenotypes | length == 0%}
+  <a href="{{url_for('publications.delete_publication', publication_id=publication.Id)}}"
+     class="btn btn-danger">delete</a>
+  {%endif%}
+  </div>
 </div>
 {%endblock%}