diff options
-rw-r--r-- | uploader/publications/models.py | 17 | ||||
-rw-r--r-- | uploader/publications/views.py | 22 | ||||
-rw-r--r-- | uploader/templates/phenotypes/add-phenotypes-base.html | 1 |
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" |