from typing import TypedDict, Union from flask import current_app from flask_sqlalchemy import BaseQuery from sqlalchemy import desc class PaginationResponse(TypedDict): items: list max_pages: int def order_by_column_name( query: BaseQuery, model_field: str, order_by_col_name: Union[str, None] ) -> BaseQuery: if order_by_col_name is not None: if order_by_col_name == "asc": query = query.order_by(model_field) elif order_by_col_name == "desc": query = query.order_by(desc(model_field)) return query def paginate_models(page: int, query: BaseQuery, per_page=10) -> PaginationResponse: default_page = 1 if page is not None: query = query.paginate(page=page, per_page=per_page, error_out=False) else: query = query.paginate(page=default_page, per_page=per_page, error_out=False) return {"items": query.items, "max_pages": query.pages} def is_allowed_extensions(filename: str): return ( "." in filename and filename.rsplit(".", 1)[1].lower() in current_app.config["ALLOWED_EXTENSIONS"] )