Skip to content

Commit 4bfa932

Browse files
committed
Merge branch '3.0.x'
2 parents fcf29c3 + 26d298d commit 4bfa932

File tree

5 files changed

+29
-5
lines changed

5 files changed

+29
-5
lines changed

CHANGES.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ Unreleased
77
- Pass extra keyword arguments from ``get_or_404`` to ``session.get``. :issue:`1149`
88

99

10+
Version 3.0.5
11+
-------------
12+
13+
Released 2023-06-21
14+
15+
- ``Pagination.next()`` enforces ``max_per_page``. :issue:`1201`
16+
- Improve type hint for ``get_or_404`` return value to be non-optional. :pr:`1226`
17+
18+
1019
Version 3.0.4
1120
-------------
1221

src/flask_sqlalchemy/extension.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ def get_or_404(
621621
*,
622622
description: str | None = None,
623623
**kwargs: t.Any,
624-
) -> t.Optional[_O]:
624+
) -> _O:
625625
"""Like :meth:`session.get() <sqlalchemy.orm.Session.get>` but aborts with a
626626
``404 Not Found`` error instead of returning ``None``.
627627

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

tests/test_view_query.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ class Quiz(db.Model):
7070

7171
db.create_all()
7272

73-
item: Quiz = Quiz()
73+
item: Quiz = Quiz(topic="Python")
7474
db.session.add(item)
7575
db.session.commit()
7676
result = db.get_or_404(Quiz, 1)
77+
assert result.topic == "Python"
7778
assert result is item
7879
if hasattr(t, "assert_type"):
7980
t.assert_type(result, Quiz)

0 commit comments

Comments
 (0)