about summary refs log tree commit diff
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
parent77f18b73276d2bf57b52703b48e3b44b3c89c516 (diff)
downloadgn-uploader-4a16f580a25aba122a4990a61e0e96f4692b833c.tar.gz
Initialise entry-point for managing publications.
-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%}