Files
ad/molodetz/database/pagination.py
T

37 lines
1.1 KiB
Python
Raw Normal View History

2026-10-05 09:36:20 +02:00
# retoor <retoor@molodetz.nl>
import math
from molodetz.database.core import db
def paginate(table_name, before=None, order="desc", cursor_field="created_at", limit=25, **filters):
if table_name not in db.tables:
return [], None
table = db[table_name]
criteria = dict(filters)
if "deleted_at" not in criteria:
criteria["deleted_at"] = None
if before:
criteria[cursor_field] = {"<": before} if order == "desc" else {">": before}
order_by = [f"-{cursor_field}"] if order == "desc" else [cursor_field]
rows = list(table.find(_limit=limit + 1, order_by=order_by, **criteria))
next_cursor = None
if len(rows) > limit:
rows = rows[:limit]
next_cursor = rows[-1][cursor_field]
return rows, next_cursor
def build_pagination(page, total, per_page):
pages = max(1, math.ceil(total / per_page)) if per_page else 1
page = min(max(1, page), pages)
return {
"page": page,
"pages": pages,
"total": total,
"per_page": per_page,
"offset": (page - 1) * per_page,
"has_prev": page > 1,
"has_next": page < pages,
}