"""Pagination utilities.""" from flask import request, current_app from typing import Tuple def get_pagination_params(req=None) -> Tuple[int, int]: """ Extract pagination parameters from request. Returns: Tuple of (page, per_page) """ if req is None: req = request default_size = current_app.config.get('DEFAULT_PAGE_SIZE', 20) max_size = current_app.config.get('MAX_PAGE_SIZE', 100) try: page = max(1, int(req.args.get('page', 1))) except (TypeError, ValueError): page = 1 try: per_page = int(req.args.get('perpage', req.args.get('per_page', default_size))) per_page = max(1, min(per_page, max_size)) except (TypeError, ValueError): per_page = default_size return page, per_page def paginate_query(query, page: int, per_page: int): """ Apply pagination to a SQLAlchemy query. Returns: Tuple of (items, total) """ total = query.count() items = query.offset((page - 1) * per_page).limit(per_page).all() return items, total