From db20f70a0a87eebd4a9ab521c509398b5653a6c2 Mon Sep 17 00:00:00 2001 From: jacquesfize Date: Wed, 4 Jun 2025 00:01:19 +0200 Subject: [PATCH 1/3] feat: extend and correct pagination from flask_sqlalchemy --- src/utils_flask_sqla/pagination.py | 12 ++++++++++++ src/utils_flask_sqla/sqlalchemy.py | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/utils_flask_sqla/pagination.py create mode 100644 src/utils_flask_sqla/sqlalchemy.py diff --git a/src/utils_flask_sqla/pagination.py b/src/utils_flask_sqla/pagination.py new file mode 100644 index 0000000..9fa9af8 --- /dev/null +++ b/src/utils_flask_sqla/pagination.py @@ -0,0 +1,12 @@ +from flask_sqlalchemy.pagination import SelectPagination + + +class AugmentedSelectedPagination(SelectPagination): + + def _query_items(self): + select = self._query_args["select"] + select = select.limit(self.per_page).offset(self._query_offset) + session = self._query_args["session"] + if len(select.column_descriptions) < 2: + return list(session.execute(select).unique().scalars()) + return list(session.execute(select)) diff --git a/src/utils_flask_sqla/sqlalchemy.py b/src/utils_flask_sqla/sqlalchemy.py new file mode 100644 index 0000000..b63c3eb --- /dev/null +++ b/src/utils_flask_sqla/sqlalchemy.py @@ -0,0 +1,18 @@ +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 + ): + 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, + ) From cfec0f9fd05647c451cc2c76d1f91cde989df25d Mon Sep 17 00:00:00 2001 From: jacquesfize Date: Wed, 4 Jun 2025 13:19:35 +0200 Subject: [PATCH 2/3] add scalar attribute to pagination augmented --- src/utils_flask_sqla/pagination.py | 8 +++++++- src/utils_flask_sqla/sqlalchemy.py | 11 ++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/utils_flask_sqla/pagination.py b/src/utils_flask_sqla/pagination.py index 9fa9af8..b3ed327 100644 --- a/src/utils_flask_sqla/pagination.py +++ b/src/utils_flask_sqla/pagination.py @@ -3,10 +3,16 @@ 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) + 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"] - if len(select.column_descriptions) < 2: + if self.scalars: return list(session.execute(select).unique().scalars()) return list(session.execute(select)) diff --git a/src/utils_flask_sqla/sqlalchemy.py b/src/utils_flask_sqla/sqlalchemy.py index b63c3eb..1fff14c 100644 --- a/src/utils_flask_sqla/sqlalchemy.py +++ b/src/utils_flask_sqla/sqlalchemy.py @@ -5,7 +5,15 @@ class AugmentedSQLAlchemy(SQLAlchemy): def paginate( - self, select, *, page=None, per_page=None, max_per_page=None, error_out=True, count=True + self, + select, + *, + page=None, + per_page=None, + max_per_page=None, + error_out=True, + count=True, + scalars=False ): return AugmentedSelectedPagination( select=select, @@ -15,4 +23,5 @@ def paginate( max_per_page=max_per_page, error_out=error_out, count=count, + scalars=scalars, ) From f9100899e5fa8c3341bae5308877520bf93038b9 Mon Sep 17 00:00:00 2001 From: jacquesfize Date: Wed, 4 Jun 2025 19:32:01 +0200 Subject: [PATCH 3/3] refact --- src/utils_flask_sqla/pagination.py | 8 ++++++-- src/utils_flask_sqla/sqlalchemy.py | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/utils_flask_sqla/pagination.py b/src/utils_flask_sqla/pagination.py index b3ed327..c06555c 100644 --- a/src/utils_flask_sqla/pagination.py +++ b/src/utils_flask_sqla/pagination.py @@ -7,12 +7,16 @@ 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: - return list(session.execute(select).unique().scalars()) - return list(session.execute(select)) + 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 index 1fff14c..4ae3319 100644 --- a/src/utils_flask_sqla/sqlalchemy.py +++ b/src/utils_flask_sqla/sqlalchemy.py @@ -13,7 +13,8 @@ def paginate( max_per_page=None, error_out=True, count=True, - scalars=False + scalars=False, + unique=False, ): return AugmentedSelectedPagination( select=select, @@ -24,4 +25,5 @@ def paginate( error_out=error_out, count=count, scalars=scalars, + unique=unique, )