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 %}" > |
... | ... | |
22 | 21 |
</tbody> |
23 | 22 |
</table> |
24 | 23 | |
25 |
{% with page_obj=logrecords %} |
|
26 |
{% include "gadjo/pagination.html" with anchor="#logs" without_key="log_id" %} |
|
24 |
{% with page_obj=logrecords anchor="#logs" without_key="log_id" page_key=page_key|default:"page" %} |
|
25 |
{% if page_obj.has_next or page_obj.has_previous %} |
|
26 |
{% spaceless %} |
|
27 |
<p class="paginator"> |
|
28 |
{% if page_obj.number > 1 %} |
|
29 |
{% if page_obj.previous_page_number != 1 %} |
|
30 |
<a href="{% querystring page_key=1 without without_key %}{{ anchor }}">1</a> |
|
31 |
… |
|
32 |
{% endif %} |
|
33 |
{% endif %} |
|
34 | ||
35 |
{% if page_obj.has_previous %} |
|
36 |
<a href="{% querystring page_key=page_obj.previous_page_number without without_key %}{{ anchor }}">{{ page_obj.previous_page_number }}</a> |
|
37 |
{% endif %} |
|
38 | ||
39 |
<span class="this-page">{{ page_obj.number }}</span> |
|
40 | ||
41 |
{% if page_obj.has_next %} |
|
42 |
<a href="{% querystring page_key=page_obj.next_page_number without without_key %}{{ anchor }}">{{ page_obj.next_page_number }}</a> |
|
43 |
… |
|
44 |
{% endif %} |
|
45 |
</p> |
|
46 |
{% endspaceless %} |
|
47 |
{% endif %} |
|
27 | 48 |
{% endwith %} |
28 | 49 | |
29 | 50 |
{% else %} |
passerelle/utils/paginator.py | ||
---|---|---|
1 |
from django.core.paginator import Paginator, Page, EmptyPage |
|
2 |
from django.utils.functional import cached_property |
|
3 |
from django.utils.translation import ugettext_lazy as _ |
|
4 | ||
5 | ||
6 |
class InfinitePaginator(Paginator): |
|
7 |
def page(self, number): |
|
8 |
number = self.validate_number(number) |
|
9 |
offset = (number - 1) * self.per_page |
|
10 | ||
11 |
window_items = list(self.object_list[offset:offset + self.per_page + 1]) |
|
12 |
page_items = window_items[:self.per_page] |
|
13 | ||
14 |
if not page_items: |
|
15 |
if number == 1 and self.allow_empty_first_page: |
|
16 |
pass |
|
17 |
else: |
|
18 |
raise EmptyPage(_("That page contains no results")) |
|
19 | ||
20 |
has_next = len(window_items) > len(page_items) |
|
21 |
return InfinitePage(page_items, number, self, has_next) |
|
22 | ||
23 |
@cached_property |
|
24 |
def count(self): |
|
25 |
return 2**32 |
|
26 | ||
27 |
@cached_property |
|
28 |
def page_range(self): |
|
29 |
return [0] |
|
30 | ||
31 | ||
32 |
class InfinitePage(Page): |
|
33 |
def __init__(self, object_list, number, paginator, has_next): |
|
34 |
super().__init__(object_list, number, paginator) |
|
35 |
self._has_next = has_next |
|
36 | ||
37 |
def has_next(self): |
|
38 |
return self._has_next |
passerelle/views.py | ||
---|---|---|
50 | 50 |
from passerelle.compat import json_loads |
51 | 51 |
from passerelle.utils.jsonresponse import APIError |
52 | 52 |
from passerelle.utils.json import unflatten |
53 |
from passerelle.utils.paginator import InfinitePaginator |
|
53 | 54 | |
54 | 55 |
from .utils import to_json, is_authorized |
55 | 56 |
from .forms import ResourceLogSearchForm |
... | ... | |
214 | 215 |
class GenericViewLogsConnectorView(GenericConnectorMixin, ListView): |
215 | 216 |
template_name = 'passerelle/manage/service_logs.html' |
216 | 217 |
paginate_by = 25 |
218 |
paginator_class = InfinitePaginator |
|
217 | 219 | |
218 | 220 |
def get_context_data(self, **kwargs): |
219 | 221 |
context = super(GenericViewLogsConnectorView, self).get_context_data(**kwargs) |
220 |
- |