Skip to content

Commit 9a3a2df

Browse files
committed
make measurement of pagination page length optional
1 parent 2f7063e commit 9a3a2df

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

flask_sqlalchemy/__init__.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ def __init__(self, query, page, per_page, total, items):
325325
@property
326326
def pages(self):
327327
"""The total number of pages"""
328-
if self.per_page == 0:
328+
if self.per_page == 0 or self.total is None:
329329
pages = 0
330330
else:
331331
pages = int(ceil(self.total / float(self.per_page)))
@@ -427,7 +427,7 @@ def first_or_404(self):
427427
abort(404)
428428
return rv
429429

430-
def paginate(self, page=None, per_page=None, error_out=True, max_per_page=None):
430+
def paginate(self, page=None, per_page=None, error_out=True, max_per_page=None, count=True):
431431
"""Returns ``per_page`` items from page ``page``.
432432
433433
If ``page`` or ``per_page`` are ``None``, they will be retrieved from
@@ -494,8 +494,11 @@ def paginate(self, page=None, per_page=None, error_out=True, max_per_page=None):
494494
abort(404)
495495

496496
# No need to count if we're on the first page and there are fewer
497-
# items than we expected.
498-
if page == 1 and len(items) < per_page:
497+
# items than we expected or if count is disabled.
498+
499+
if not count:
500+
total = None
501+
elif page == 1 and len(items) < per_page:
499502
total = len(items)
500503
else:
501504
total = self.order_by(None).count()

tests/test_pagination.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ def test_pagination_pages_when_0_items_per_page():
2222
assert p.pages == 0
2323

2424

25+
def test_pagination_pages_when_total_is_none():
26+
p = fsa.Pagination(None, 1, 100, None, [])
27+
assert p.pages == 0
28+
29+
2530
def test_query_paginate(app, db, Todo):
2631
with app.app_context():
2732
db.session.add_all([Todo('', '') for _ in range(100)])
@@ -68,3 +73,11 @@ def test_paginate_min(app, db, Todo):
6873

6974
with pytest.raises(NotFound):
7075
Todo.query.paginate(per_page=-1)
76+
77+
78+
def test_paginate_without_count(app, db, Todo):
79+
with app.app_context():
80+
db.session.add_all(Todo('', '') for _ in range(20))
81+
db.session.commit()
82+
83+
assert len(Todo.query.paginate(count=False, page=1, per_page=10).items) == 10

0 commit comments

Comments
 (0)