1+ import math
2+
3+ class Page (object ):
4+
5+ def __init__ (self , items , page , page_size , total ):
6+ self .data = items
7+ self .previous_page = None
8+ self .next_page = None
9+ # self.has_previous = page > 1
10+ # if self.has_previous:
11+ # self.previous_page = page - 1
12+ self .previous_page = page - 1 if page > 1 else None
13+ previous_items = (page - 1 ) * page_size
14+ # self.has_next = previous_items + len(items) < total
15+ # if self.has_next:
16+ # self.next_page = page + 1
17+ has_next = previous_items + len (items ) < total
18+ self .next_page = page + 1 if has_next else None
19+ self .total = total
20+ self .pages = int (math .ceil (total / float (page_size )))
21+
22+
23+ def paginate (query , page , page_size ):
24+ if page <= 0 :
25+ raise AttributeError ('page needs to be >= 1' )
26+ if page_size <= 0 :
27+ raise AttributeError ('page_size needs to be >= 1' )
28+ items = query .limit (page_size ).offset ((page - 1 ) * page_size ).all ()
29+ # We remove the ordering of the query since it doesn't matter for getting a count and
30+ # might have performance implications as discussed on this Flask-SqlAlchemy issue
31+ # https://github.com/mitsuhiko/flask-sqlalchemy/issues/100
32+ total = query .order_by (None ).count ()
33+ return Page (items , page , page_size , total )
34+
35+
36+ # def paginate(query, page, per_page=20, error_out=True):
37+ # if error_out and page < 1:
38+ # abort(404)
39+ # items = query.limit(per_page).offset((page - 1) * per_page).all()
40+ # if not items and page != 1 and error_out:
41+ # abort(404)
42+
43+ # # No need to count if we're on the first page and there are fewer
44+ # # items than we expected.
45+ # if page == 1 and len(items) < per_page:
46+ # total = len(items)
47+ # else:
48+ # total = query.order_by(None).count()
49+
50+ # return Pagination(query, page, per_page, total, items)
0 commit comments