aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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%}