Projet

Général

Profil

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

Lauréline Guérin, 12 novembre 2020 09:56

Télécharger (4,92 ko)

Voir les différences:

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

 .../includes/resource-logs-table.html         | 18 ++++-
 passerelle/utils/paginator.py                 | 66 +++++++++++++++++++
 passerelle/views.py                           |  2 +
 3 files changed, 83 insertions(+), 3 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 %}" >
......
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 }}">&laquo;</a>
29
    {% else %}
30
        <span>&laquo;</span>
31
    {% endif %}
32
    {% if page_obj.has_next %}
33
        <a href="{% querystring "page"=page_obj.next_page_number %}{{ anchor }}">&raquo;</a>
34
    {% else %}
35
        <span>&raquo;</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
-