Skip to content

Commit cc072bf

Browse files
orlandobcrraOrlando Becerra
andauthored
Pagination per_page gets wrong value after calling next() #1201 (#1202)
Co-authored-by: Orlando Becerra <[email protected]>
1 parent b206d0a commit cc072bf

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

CHANGES.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
Version 3.0.5
2+
-------------
3+
4+
Unreleased
5+
6+
- ``Pagination.next()`` enforces ``max_per_page``. :issue:`1201`
7+
8+
19
Version 3.0.4
210
-------------
311

src/flask_sqlalchemy/pagination.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ def __init__(
6666
self.per_page: int = per_page
6767
"""The maximum number of items on a page."""
6868

69+
self.max_per_page: int | None = max_per_page
70+
"""The maximum allowed value for ``per_page``."""
71+
6972
items = self._query_items()
7073

7174
if not items and page != 1 and error_out:
@@ -249,6 +252,7 @@ def next(self, *, error_out: bool = False) -> Pagination:
249252
p = type(self)(
250253
page=self.page + 1,
251254
per_page=self.per_page,
255+
max_per_page=self.max_per_page,
252256
error_out=error_out,
253257
count=False,
254258
**self._query_args,

tests/test_pagination.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def __call__(
145145
@pytest.fixture
146146
def paginate(app: Flask, db: SQLAlchemy, Todo: t.Any) -> _PaginateCallable:
147147
with app.app_context():
148-
for i in range(1, 101):
148+
for i in range(1, 251):
149149
db.session.add(Todo(title=f"task {i}"))
150150

151151
db.session.commit()
@@ -158,8 +158,8 @@ def test_paginate(paginate: _PaginateCallable) -> None:
158158
assert p.page == 1
159159
assert p.per_page == 20
160160
assert len(p.items) == 20
161-
assert p.total == 100
162-
assert p.pages == 5
161+
assert p.total == 250
162+
assert p.pages == 13
163163

164164

165165
def test_paginate_qs(paginate: _PaginateCallable) -> None:
@@ -173,6 +173,16 @@ def test_paginate_max(paginate: _PaginateCallable) -> None:
173173
assert p.per_page == 50
174174

175175

176+
@pytest.mark.usefixtures("app_ctx")
177+
def test_next_page_size(paginate: _PaginateCallable) -> None:
178+
p = paginate(per_page=110, max_per_page=250)
179+
assert p.page == 1
180+
assert p.per_page == 110
181+
p = p.next()
182+
assert p.page == 2
183+
assert p.per_page == 110
184+
185+
176186
def test_no_count(paginate: _PaginateCallable) -> None:
177187
p = paginate(count=False)
178188
assert p.total is None

0 commit comments

Comments
 (0)