diff options
author | Frederick Muriuki Muriithi | 2025-10-13 13:13:02 -0500 |
---|---|---|
committer | Frederick Muriuki Muriithi | 2025-10-13 13:13:58 -0500 |
commit | f2d21da16508d1859d0e2aeac63ccb5709540aab (patch) | |
tree | 516751554c970da86d5a8f2a8aadcdb93b8e3b31 /uploader | |
parent | eecc17d9c7b79a31eed40ed72df9dc06eec9056d (diff) | |
download | gn-uploader-f2d21da16508d1859d0e2aeac63ccb5709540aab.tar.gz |
Publications: Enable deletion of unlinked publications.
Diffstat (limited to 'uploader')
-rw-r--r-- | uploader/publications/models.py | 21 | ||||
-rw-r--r-- | uploader/publications/views.py | 32 | ||||
-rw-r--r-- | uploader/templates/publications/view-publication.html | 18 |
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%} |