about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--uploader/publications/models.py17
-rw-r--r--uploader/publications/views.py22
-rw-r--r--uploader/templates/phenotypes/add-phenotypes-base.html1
3 files changed, 32 insertions, 8 deletions
diff --git a/uploader/publications/models.py b/uploader/publications/models.py
index 2b0339b..992ebfa 100644
--- a/uploader/publications/models.py
+++ b/uploader/publications/models.py
@@ -1,6 +1,6 @@
 """Module to handle persistence and retrieval of publication to/from MariaDB"""
 import logging
-from typing import Iterable
+from typing import Iterable, Optional
 
 from MySQLdb.cursors import DictCursor
 
@@ -69,10 +69,21 @@ def update_publications(conn: Connection , publications: tuple[dict, ...]) -> tu
     return tuple()
 
 
-def fetch_publications(conn: Connection) -> Iterable[dict]:
+def fetch_publications(
+        conn: Connection,
+        search: Optional[str] = None
+) -> Iterable[dict]:
     """Fetch publications from the database."""
+    _query = "SELECT * FROM Publication"
+    _params = None
+    if search is not None and bool(search):
+        _query = (f"{_query} "
+                  "WHERE CONCAT(PubMed_ID, ' ', Authors, ' ', Title) "
+                  "LIKE %s")
+        _params = (f"%{search}%",)
     with conn.cursor(cursorclass=DictCursor) as cursor:
-        cursor.execute("SELECT * FROM Publication")
+        cursor.execute(_query, _params)
+        debug_query(_query, logger)
         for row in cursor.fetchall():
             yield dict(row)
 
diff --git a/uploader/publications/views.py b/uploader/publications/views.py
index ebb8740..63acf1b 100644
--- a/uploader/publications/views.py
+++ b/uploader/publications/views.py
@@ -1,6 +1,7 @@
 """Endpoints for publications"""
 import json
 
+from MySQLdb.cursors import DictCursor
 from gn_libs.mysqldb import database_connection
 from flask import (
     flash,
@@ -35,12 +36,23 @@ def index():
 @pubbp.route("/list", methods=["GET"])
 @require_login
 def list_publications():
-    with database_connection(app.config["SQL_URI"]) as conn:
+    # request breakdown:
+    # https://datatables.net/manual/server-side
+    with (database_connection(app.config["SQL_URI"]) as conn,
+          conn.cursor(cursorclass=DictCursor) as cursor):
+        cursor.execute("SELECT COUNT(*) FROM Publication")
+        _totalrows = int(cursor.fetchone()["COUNT(*)"])
+        _publications = tuple({
+            **row, "index": idx
+        } for idx,row in enumerate(
+            fetch_publications(
+                conn, request.args["search[value]"]), start=1))
+
         return json.dumps({
-            "publications": tuple({
-                **row, "index": idx
-            } for idx,row in enumerate(
-                fetch_publications(conn), start=1)),
+            "draw": request.args.get("draw"),
+            "recordsTotal": _totalrows,
+            "recordsFiltered": len(_publications),
+            "publications": _publications,
             "status": "success"
         })
 
diff --git a/uploader/templates/phenotypes/add-phenotypes-base.html b/uploader/templates/phenotypes/add-phenotypes-base.html
index 9730852..928fb84 100644
--- a/uploader/templates/phenotypes/add-phenotypes-base.html
+++ b/uploader/templates/phenotypes/add-phenotypes-base.html
@@ -129,6 +129,7 @@
               }
           ],
           {
+              serverSide: true,
               ajax: {
                   url: "/publications/list",
                   dataSrc: "publications"