41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
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"]
|
|
)
|