Projet

Général

Profil

0002-logs-change-paginator-to-avoid-count-48074.patch

Lauréline Guérin, 12 novembre 2020 12:04

Télécharger (4,43 ko)

Voir les différences:

Subject: [PATCH 2/2] logs: change paginator to avoid count (#48074)

 .../includes/resource-logs-table.html         | 29 ++++++++++++--
 passerelle/utils/paginator.py                 | 38 +++++++++++++++++++
 passerelle/views.py                           |  2 +
 3 files changed, 65 insertions(+), 4 deletions(-)
 create mode 100644 passerelle/utils/paginator.py
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
-