From ad608865250dab90cb67312c74ea0f7278d0b195 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Tue, 15 Oct 2024 14:31:27 -0700 Subject: [PATCH] try handmade pagination --- app/dao/jobs_dao.py | 17 +++++++++++++---- app/dao/pagination.py | 13 +++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 app/dao/pagination.py diff --git a/app/dao/jobs_dao.py b/app/dao/jobs_dao.py index 72bc6e1c0..1d2584aa5 100644 --- a/app/dao/jobs_dao.py +++ b/app/dao/jobs_dao.py @@ -6,6 +6,7 @@ from flask import current_app from sqlalchemy import and_, asc, desc, func, select from app import db +from app.dao.pagination import Pagination from app.enums import JobStatus from app.models import ( FactNotificationStatus, @@ -65,10 +66,18 @@ def dao_get_jobs_by_service_id( if statuses is not None and statuses != [""]: query_filter.append(Job.job_status.in_(statuses)) - stmt = select(*query_filter).order_by( - Job.processing_started.desc(), - Job.created_at.desc()).limit(page_size).offset(page) - return db.session.execute(stmt).scalars().all() + total_items = db.session.execute( + select(func.count()).select_from(*query_filter).scalar_one() + ) + + stmt = ( + select(*query_filter) + .order_by(Job.processing_started.desc(), Job.created_at.desc()) + .limit(page_size) + .offset(page) + ) + items = db.session.execute(stmt).scalars().all() + return Pagination(items, page, page_size, total_items) def dao_get_scheduled_job_stats( diff --git a/app/dao/pagination.py b/app/dao/pagination.py new file mode 100644 index 000000000..247f08fd3 --- /dev/null +++ b/app/dao/pagination.py @@ -0,0 +1,13 @@ +class Pagination: + def __init__(self, items, page, per_page, total): + self.items = items + self.page = page + self.per_page = per_page + self.total = total + self.pages = (total + per_page - 1) // per_page + + def has_next(self): + return self.page < self.pages + + def has_prev(self): + return self.page > 1