0002-logs-change-paginator-to-avoid-count-48074.patch
passerelle/templates/passerelle/includes/resource-logs-table.html | ||
---|---|---|
1 |
{% load i18n passerelle %} |
|
2 |
{% load tz %} |
|
1 |
{% load i18n passerelle tz gadjo %} |
|
3 | 2 | |
4 | 3 |
{% if logrecords %} |
5 | 4 |
<table class="main" data-log-base-url="{% url 'view-logs-connector' connector=object.get_connector_slug slug=object.slug %}" > |
... | ... | |
23 | 22 |
</table> |
24 | 23 | |
25 | 24 |
{% with page_obj=logrecords %} |
26 |
{% include "gadjo/pagination.html" with anchor="#logs" without_key="log_id" %} |
|
25 |
{% if page_obj.has_previous or page_obj.has_next %} |
|
26 |
<p class="paginator"> |
|
27 |
{% if page_obj.has_previous %} |
|
28 |
<a href="{% querystring "page"=page_obj.previous_page_number %}{{ anchor }}">«</a> |
|
29 |
{% else %} |
|
30 |
<span>«</span> |
|
31 |
{% endif %} |
|
32 |
{% if page_obj.has_next %} |
|
33 |
<a href="{% querystring "page"=page_obj.next_page_number %}{{ anchor }}">»</a> |
|
34 |
{% else %} |
|
35 |
<span>»</span> |
|
36 |
{% endif %} |
|
37 |
</p> |
|
38 |
{% endif %} |
|
27 | 39 |
{% endwith %} |
28 | 40 | |
29 | 41 |
{% else %} |
passerelle/utils/paginator.py | ||
---|---|---|
1 |
from django.core.paginator import Paginator, Page, PageNotAnInteger, EmptyPage |
|
2 |
from django.utils.translation import ugettext_lazy as _ |
|
3 | ||
4 | ||
5 |
class InfinitePaginator(Paginator): |
|
6 |
def __init__(self, object_list, per_page, orphans=None, |
|
7 |
allow_empty_first_page=True): |
|
8 |
super().__init__( |
|
9 |
object_list, per_page, |
|
10 |
orphans=0, allow_empty_first_page=allow_empty_first_page) |
|
11 | ||
12 |
def validate_number(self, number): |
|
13 |
try: |
|
14 |
number = int(number) |
|
15 |
except (TypeError, ValueError): |
|
16 |
raise PageNotAnInteger(_('That page number is not an integer')) |
|
17 |
if number < 1: |
|
18 |
raise EmptyPage(_('That page number is less than 1')) |
|
19 |
return number |
|
20 | ||
21 |
def page(self, number): |
|
22 |
number = self.validate_number(number) |
|
23 |
offset = (number - 1) * self.per_page |
|
24 | ||
25 |
window_items = list(self.object_list[offset:offset + self.per_page + 1]) |
|
26 |
page_items = window_items[:self.per_page] |
|
27 | ||
28 |
if not page_items: |
|
29 |
if number == 1 and self.allow_empty_first_page: |
|
30 |
pass |
|
31 |
else: |
|
32 |
raise EmptyPage("That page contains no results") |
|
33 | ||
34 |
has_next = len(window_items) > len(page_items) |
|
35 |
return InfinitePage(page_items, number, self, has_next) |
|
36 | ||
37 |
def _get_count(self): |
|
38 |
raise NotImplementedError |
|
39 |
count = property(_get_count) |
|
40 | ||
41 |
def _get_num_pages(self): |
|
42 |
raise NotImplementedError |
|
43 |
num_pages = property(_get_num_pages) |
|
44 | ||
45 |
def _get_page_range(self): |
|
46 |
raise NotImplementedError |
|
47 |
page_range = property(_get_page_range) |
|
48 | ||
49 | ||
50 |
class InfinitePage(Page): |
|
51 | ||
52 |
def __init__(self, object_list, number, paginator, has_next): |
|
53 |
super(InfinitePage, self).__init__(object_list, number, paginator) |
|
54 |
self._has_next = has_next |
|
55 | ||
56 |
def __repr__(self): |
|
57 |
return "<Page %s>" % self.number |
|
58 | ||
59 |
def has_next(self): |
|
60 |
return self._has_next |
|
61 | ||
62 |
def end_index(self): |
|
63 |
return (self.number - 1) * self.paginator.per_page + len(self.object_list) |
|
64 | ||
65 | ||
66 |
__all__ = ["InfinitePaginator", "InfinitePage"] |
passerelle/views.py | ||
---|---|---|
49 | 49 |
from passerelle.compat import json_loads |
50 | 50 |
from passerelle.utils.jsonresponse import APIError |
51 | 51 |
from passerelle.utils.json import unflatten |
52 |
from passerelle.utils.paginator import InfinitePaginator |
|
52 | 53 | |
53 | 54 |
from .utils import to_json, is_authorized |
54 | 55 |
from .forms import ResourceLogSearchForm |
... | ... | |
213 | 214 |
class GenericViewLogsConnectorView(GenericConnectorMixin, ListView): |
214 | 215 |
template_name = 'passerelle/manage/service_logs.html' |
215 | 216 |
paginate_by = 25 |
217 |
paginator_class = InfinitePaginator |
|
216 | 218 | |
217 | 219 |
def get_context_data(self, **kwargs): |
218 | 220 |
context = super(GenericViewLogsConnectorView, self).get_context_data(**kwargs) |
219 |
- |