aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2025-06-11 14:11:56 -0500
committerFrederick Muriuki Muriithi2025-06-11 14:12:47 -0500
commit78217b0a98b475af1596ab5d8300e9a85ea72b65 (patch)
treef7906dc43c395f4fb9f3226621842f924b8e585b
parent48e78b9521b4a1e5c7538869068e1884bab1a97b (diff)
downloadgn-uploader-78217b0a98b475af1596ab5d8300e9a85ea72b65.tar.gz
Enable server-side searching.
-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"