37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
# 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,
|
||
|
|
}
|