| 115 | | |
|---|
| 116 | | class ObjectPaginator(Paginator): |
|---|
| 117 | | """ |
|---|
| 118 | | Legacy ObjectPaginator class, for backwards compatibility. |
|---|
| 119 | | |
|---|
| 120 | | Note that each method on this class that takes page_number expects a |
|---|
| 121 | | zero-based page number, whereas the new API (Paginator/Page) uses one-based |
|---|
| 122 | | page numbers. |
|---|
| 123 | | """ |
|---|
| 124 | | def __init__(self, query_set, num_per_page, orphans=0): |
|---|
| 125 | | Paginator.__init__(self, query_set, num_per_page, orphans) |
|---|
| 126 | | import warnings |
|---|
| 127 | | warnings.warn("The ObjectPaginator is deprecated. Use django.core.paginator.Paginator instead.", DeprecationWarning) |
|---|
| 128 | | |
|---|
| 129 | | # Keep these attributes around for backwards compatibility. |
|---|
| 130 | | self.query_set = query_set |
|---|
| 131 | | self.num_per_page = num_per_page |
|---|
| 132 | | self._hits = self._pages = None |
|---|
| 133 | | |
|---|
| 134 | | def validate_page_number(self, page_number): |
|---|
| 135 | | try: |
|---|
| 136 | | page_number = int(page_number) + 1 |
|---|
| 137 | | except ValueError: |
|---|
| 138 | | raise PageNotAnInteger |
|---|
| 139 | | return self.validate_number(page_number) |
|---|
| 140 | | |
|---|
| 141 | | def get_page(self, page_number): |
|---|
| 142 | | try: |
|---|
| 143 | | page_number = int(page_number) + 1 |
|---|
| 144 | | except ValueError: |
|---|
| 145 | | raise PageNotAnInteger |
|---|
| 146 | | return self.page(page_number).object_list |
|---|
| 147 | | |
|---|
| 148 | | def has_next_page(self, page_number): |
|---|
| 149 | | return page_number < self.pages - 1 |
|---|
| 150 | | |
|---|
| 151 | | def has_previous_page(self, page_number): |
|---|
| 152 | | return page_number > 0 |
|---|
| 153 | | |
|---|
| 154 | | def first_on_page(self, page_number): |
|---|
| 155 | | """ |
|---|
| 156 | | Returns the 1-based index of the first object on the given page, |
|---|
| 157 | | relative to total objects found (hits). |
|---|
| 158 | | """ |
|---|
| 159 | | page_number = self.validate_page_number(page_number) |
|---|
| 160 | | return (self.num_per_page * (page_number - 1)) + 1 |
|---|
| 161 | | |
|---|
| 162 | | def last_on_page(self, page_number): |
|---|
| 163 | | """ |
|---|
| 164 | | Returns the 1-based index of the last object on the given page, |
|---|
| 165 | | relative to total objects found (hits). |
|---|
| 166 | | """ |
|---|
| 167 | | page_number = self.validate_page_number(page_number) |
|---|
| 168 | | if page_number == self.num_pages: |
|---|
| 169 | | return self.count |
|---|
| 170 | | return page_number * self.num_per_page |
|---|
| 171 | | |
|---|
| 172 | | def _get_count(self): |
|---|
| 173 | | # The old API allowed for self.object_list to be either a QuerySet or a |
|---|
| 174 | | # list. Here, we handle both. |
|---|
| 175 | | if self._count is None: |
|---|
| 176 | | try: |
|---|
| 177 | | self._count = self.object_list.count() |
|---|
| 178 | | except (AttributeError, TypeError): |
|---|
| 179 | | # AttributeError if object_list has no count() method. |
|---|
| 180 | | # TypeError if object_list.count() requires arguments |
|---|
| 181 | | # (i.e. is of type list). |
|---|
| 182 | | self._count = len(self.object_list) |
|---|
| 183 | | return self._count |
|---|
| 184 | | count = property(_get_count) |
|---|
| 185 | | |
|---|
| 186 | | # The old API called it "hits" instead of "count". |
|---|
| 187 | | hits = count |
|---|
| 188 | | |
|---|
| 189 | | # The old API called it "pages" instead of "num_pages". |
|---|
| 190 | | pages = Paginator.num_pages |
|---|