aboutsummaryrefslogtreecommitdiff
path: root/uploader
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2025-04-28 02:11:25 -0500
committerFrederick Muriuki Muriithi2025-04-28 02:37:45 -0500
commit4a16f580a25aba122a4990a61e0e96f4692b833c (patch)
treeeb3fd65bad0f4bbaa033a0444edb0f0f18d474a7 /uploader
parent77f18b73276d2bf57b52703b48e3b44b3c89c516 (diff)
downloadgn-uploader-4a16f580a25aba122a4990a61e0e96f4692b833c.tar.gz
Initialise entry-point for managing publications.
Diffstat (limited to 'uploader')
-rw-r--r--uploader/__init__.py2
-rw-r--r--uploader/publications/__init__.py1
-rw-r--r--uploader/publications/views.py34
-rw-r--r--uploader/templates/base.html3
-rw-r--r--uploader/templates/publications/base.html12
-rw-r--r--uploader/templates/publications/index.html83
6 files changed, 135 insertions, 0 deletions
diff --git a/uploader/__init__.py b/uploader/__init__.py
index 24c45a5..69d34f7 100644
--- a/uploader/__init__.py
+++ b/uploader/__init__.py
@@ -16,6 +16,7 @@ from . import session
from .base_routes import base
from .files.views import files
from .species import speciesbp
+from .publications import pubbp
from .oauth2.views import oauth2
from .expression_data import exprdatabp
from .errors import register_error_handlers
@@ -103,6 +104,7 @@ def create_app(config: dict = {}):
app.register_blueprint(files, url_prefix="/files")
app.register_blueprint(oauth2, url_prefix="/oauth2")
app.register_blueprint(speciesbp, url_prefix="/species")
+ app.register_blueprint(pubbp, url_prefix="/publications")
app.register_blueprint(background_jobs_bp, url_prefix="/background-jobs/")
register_error_handlers(app)
diff --git a/uploader/publications/__init__.py b/uploader/publications/__init__.py
index 57c0cbb..7efcabb 100644
--- a/uploader/publications/__init__.py
+++ b/uploader/publications/__init__.py
@@ -1 +1,2 @@
"""Package for handling publications."""
+from .views import pubbp
diff --git a/uploader/publications/views.py b/uploader/publications/views.py
new file mode 100644
index 0000000..85d3aef
--- /dev/null
+++ b/uploader/publications/views.py
@@ -0,0 +1,34 @@
+"""Endpoints for publications"""
+import json
+
+from gn_libs.mysqldb import database_connection
+from flask import Blueprint, render_template, current_app as app
+
+from uploader.authorisation import require_login
+
+from .models import fetch_publications
+
+from gn_libs.debug import __pk__
+
+pubbp = Blueprint("publications", __name__)
+
+
+@pubbp.route("/", methods=["GET"])
+@require_login
+def index():
+ """Index page for publications."""
+ with database_connection(app.config["SQL_URI"]) as conn:
+ return render_template("publications/index.html")
+
+
+@pubbp.route("/list", methods=["GET"])
+@require_login
+def list_publications():
+ with database_connection(app.config["SQL_URI"]) as conn:
+ return json.dumps({
+ "publications": tuple({
+ **row, "index": idx
+ } for idx,row in enumerate(
+ fetch_publications(conn), start=1)),
+ "status": "success"
+ })
diff --git a/uploader/templates/base.html b/uploader/templates/base.html
index 09e6470..de9c226 100644
--- a/uploader/templates/base.html
+++ b/uploader/templates/base.html
@@ -46,6 +46,9 @@
<ul class="nav flex-column">
<li {%if activemenu=="home"%}class="activemenu"{%endif%}>
<a href="/" >Home</a></li>
+ <li {%if activemenu=="publications"%}class="activemenu"{%endif%}>
+ <a href="{{url_for('publications.index')}}"
+ title="View and manage publications.">Publications</a></li>
<li {%if activemenu=="species"%}class="activemenu"{%endif%}>
<a href="{{url_for('species.list_species')}}"
title="View and manage species information.">Species</a></li>
diff --git a/uploader/templates/publications/base.html b/uploader/templates/publications/base.html
new file mode 100644
index 0000000..db80bfa
--- /dev/null
+++ b/uploader/templates/publications/base.html
@@ -0,0 +1,12 @@
+{%extends "base.html"%}
+
+{%block lvl1_breadcrumbs%}
+<li {%if activelink=="publications"%}
+ class="breadcrumb-item active"
+ {%else%}
+ class="breadcrumb-item"
+ {%endif%}>
+ <a href="{{url_for('publications.index')}}">Publications</a>
+</li>
+{%block lvl2_breadcrumbs%}{%endblock%}
+{%endblock%}
diff --git a/uploader/templates/publications/index.html b/uploader/templates/publications/index.html
new file mode 100644
index 0000000..f6f6fa0
--- /dev/null
+++ b/uploader/templates/publications/index.html
@@ -0,0 +1,83 @@
+{%extends "publications/base.html"%}
+{%from "flash_messages.html" import flash_all_messages%}
+
+{%block title%}Publications{%endblock%}
+
+{%block pagetitle%}Publications{%endblock%}
+
+
+{%block contents%}
+{{flash_all_messages()}}
+
+<div class="row">
+ <table id="tbl-list-publications" class="table compact stripe">
+ <thead>
+ <tr>
+ <th>#</th>
+ <th>PubMed ID</th>
+ <th>Title</th>
+ <th>Authors</th>
+ </tr>
+ </thead>
+
+ <tbody></tbody>
+ </table>
+</div>
+{%endblock%}
+
+
+{%block javascript%}
+<script type="text/javascript">
+ $(function() {
+ var publicationsDataTable = buildDataTable(
+ "#tbl-list-publications",
+ [],
+ [
+ {data: "index"},
+ {
+ data: (pub) => {
+ if(pub.PubMed_ID) {
+ return `<a href="https://pubmed.ncbi.nlm.nih.gov/` +
+ `${pub.PubMed_ID}/" target="_blank">` +
+ `${pub.PubMed_ID}</a>`;
+ }
+ return "";
+ }
+ },
+ {
+ data: (pub) => {
+ var title = "βΈ»";
+ if(pub.Title) {
+ title = pub.Title
+ }
+ return `<a href="/publications/view/${pub.Id}" ` +
+ `target="_blank">${title}</a>`;
+ }
+ },
+ {
+ data: (pub) => {
+ authors = pub.Authors.split(",").map(
+ (item) => {return item.trim();});
+ if(authors.length > 1) {
+ return authors[0] + ", et. al.";
+ }
+ return authors[0];
+ }
+ }
+ ],
+ {
+ ajax: {
+ url: "/publications/list",
+ dataSrc: "publications"
+ },
+ scrollY: 700,
+ paging: false,
+ deferRender: true,
+ layout: {
+ topStart: "info",
+ topEnd: "search"
+ }
+ });
+ });
+</script>
+{%endblock%}