Use custom pager instead of Suq-Pagination. Don't request the first GeoJSON items...
[infos-pratiques:etalage.git] / poiscasse / pagers.py
1 # -*- coding: utf-8 -*-
2
3
4 # PoisCasse -- Open Data POIs portal
5 # By: Emmanuel Raviart <eraviart@easter-eggs.com>
6 #     Romain Soufflet <rsoufflet@easter-eggs.com>
7 #
8 # Copyright (C) 2011 Easter-eggs
9 # http://gitorious.org/infos-pratiques/poiscasse
10 #
11 # This file is part of PoisCasse.
12 #
13 # PoisCasse is free software; you can redistribute it and/or modify
14 # it under the terms of the GNU Affero General Public License as
15 # published by the Free Software Foundation, either version 3 of the
16 # License, or (at your option) any later version.
17 #
18 # PoisCasse is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 # GNU Affero General Public License for more details.
22 #
23 # You should have received a copy of the GNU Affero General Public License
24 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
25
26
27 """Helpers for pagination of sequences"""
28
29
30 from suq import representations
31
32 from . import conv
33
34
35 class Pager(representations.UserRepresentable):
36     """A representation of one page of items in a larger sequence"""
37     first_item_index = None # index of first item on the current page - starts with 0
38     first_item_number = None # number of first item on the current page - starts with 1 (= first_item_index + 1)
39     first_page_number = 1 # number of the first page - starts with 1
40     item_count = None # number of items in the collection
41     items = None
42     last_item_index = None # index of last item on the current page
43     last_item_number = None # number of last item on the current page (= last_item_index + 1)
44     last_page_number = None # number of the last page
45     page_count = None # number of pages
46     page_max_size = None # maximal number of items displayed on a page
47     page_number = None # number of the current page
48     page_size = None # number of items displayed on currrent page
49     to_json = conv.check(conv.object_to_clean_dict)
50
51     def __init__(self, item_count = None, items = None, page_number = 1, page_max_size = 20):
52         """Create a "Pagination" instance.
53
54         item_count
55             The total number of items in the collection
56
57         page_number
58             The requested page number - starts with 1. Default: 1
59
60         page_max_size
61             The maximal number of items to be displayed per page
62             Default: 20.
63         """
64         assert isinstance(item_count, (int, long))
65         self.item_count = item_count
66         if items is not None:
67             self.items = items
68         assert isinstance(page_max_size, int)
69         self.page_max_size = page_max_size
70         assert isinstance(page_number, (int, long))
71         self.page_number = page_number
72
73         # Compute the number of the first and last available page.
74         if self.item_count > 0:
75             self.page_count = ((self.item_count - 1) / self.page_max_size) + 1
76             self.last_page_number = self.first_page_number + self.page_count - 1
77
78             # Ensure that the requested page number is the range of valid pages.
79             if self.page_number > self.last_page_number:
80                 self.page_number = self.last_page_number
81             elif self.page_number < self.first_page_number:
82                 self.page_number = self.first_page_number
83
84             # Note: the number of items on this page can be less than page_max_size if the last page is not full.
85             self.first_item_index = (self.page_number - 1) * self.page_max_size
86             self.first_item_number = self.first_item_index + 1
87             self.last_item_index = min(self.first_item_index + self.page_max_size, self.item_count) - 1
88             self.last_item_number = self.last_item_index + 1
89             self.page_size = self.last_item_index + 1 - self.first_item_index
90         else:
91             # No item available.
92             self.first_item_index = 0
93             self.page_count = 0
94             self.page_number = 1
95             self.page_size = 0
96