diff --git a/src/utils_flask_sqla/pagination.py b/src/utils_flask_sqla/pagination.py new file mode 100644 index 0000000..c06555c --- /dev/null +++ b/src/utils_flask_sqla/pagination.py @@ -0,0 +1,22 @@ +from flask_sqlalchemy.pagination import SelectPagination + + +class AugmentedSelectedPagination(SelectPagination): + + def __init__( + self, page=None, per_page=None, max_per_page=100, error_out=True, count=True, **kwargs + ): + self.scalars = kwargs.get("scalars", False) + self.unique = kwargs.get("unique", False) + super().__init__(page, per_page, max_per_page, error_out, count, **kwargs) + + def _query_items(self): + select = self._query_args["select"] + select = select.limit(self.per_page).offset(self._query_offset) + session = self._query_args["session"] + obj_ = session.execute(select) + if self.scalars: + if self.unique: + obj_.unique() + obj_ = obj_.scalars() + return list(obj_) diff --git a/src/utils_flask_sqla/sqlalchemy.py b/src/utils_flask_sqla/sqlalchemy.py new file mode 100644 index 0000000..4ae3319 --- /dev/null +++ b/src/utils_flask_sqla/sqlalchemy.py @@ -0,0 +1,29 @@ +from flask_sqlalchemy import SQLAlchemy +from utils_flask_sqla.pagination import AugmentedSelectedPagination + + +class AugmentedSQLAlchemy(SQLAlchemy): + + def paginate( + self, + select, + *, + page=None, + per_page=None, + max_per_page=None, + error_out=True, + count=True, + scalars=False, + unique=False, + ): + return AugmentedSelectedPagination( + select=select, + session=self.session(), + page=page, + per_page=per_page, + max_per_page=max_per_page, + error_out=error_out, + count=count, + scalars=scalars, + unique=unique, + )