mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-12-22 23:13:46 +00:00
Add pagination in search results
This commit is contained in:
parent
a7d871e204
commit
83a6dea5c9
5 changed files with 139 additions and 21 deletions
|
@ -242,13 +242,13 @@ class SortTable:
|
|||
return request
|
||||
|
||||
|
||||
def re2o_paginator(request, query_set, pagination_number):
|
||||
def re2o_paginator(request, query_set, pagination_number, page_arg="page"):
|
||||
"""Paginator script for list display in re2o.
|
||||
:request:
|
||||
:query_set: Query_set to paginate
|
||||
:pagination_number: Number of entries to display"""
|
||||
paginator = Paginator(query_set, pagination_number)
|
||||
page = request.GET.get("page")
|
||||
page = request.GET.get(page_arg)
|
||||
try:
|
||||
results = paginator.page(page)
|
||||
except PageNotAnInteger:
|
||||
|
|
89
re2o/templatetags/pagination_extra.py
Normal file
89
re2o/templatetags/pagination_extra.py
Normal file
|
@ -0,0 +1,89 @@
|
|||
# -*- mode: python; coding: utf-8 -*-
|
||||
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||
# quelques clics.
|
||||
#
|
||||
# Copyright © 2019 Jean-Romain Garnier
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
from django import template
|
||||
from .url_insert_param import url_insert_param
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.simple_tag
|
||||
def pagination_insert_page_and_id(url, page=1, id=None, **kwargs):
|
||||
"""
|
||||
Return the URL with some specific parameters inserted into the query
|
||||
part. If a URL has already some parameters, those requested will be
|
||||
modified if already exisiting or will be added and the other parameters
|
||||
will stay unmodified. If parameters with the same name are already in the
|
||||
URL and a value is specified for this parameter, it will replace all
|
||||
existing parameters.
|
||||
|
||||
**Tag name**::
|
||||
|
||||
pagination_insert_page_and_id
|
||||
|
||||
**Parameters**:
|
||||
|
||||
url
|
||||
The URL to use as a base. The parameters will be added to this URL.
|
||||
|
||||
page (optional)
|
||||
The page number (greater or equal to 1) to add as a parameter.
|
||||
If not specified, it will default to 1.
|
||||
|
||||
id (optional)
|
||||
The ID to jump to in the page.
|
||||
If not specified, it will not be added.
|
||||
|
||||
**Other accepted parameters***
|
||||
|
||||
page_args (optional)
|
||||
The name of the parameter used to specify the page number.
|
||||
It must be specifically set as a keyword.
|
||||
If not specified, defaults to 1.
|
||||
Example: {% pagination_insert_page_and_id https://example.com 2 page_args="page_id" %}
|
||||
returns https://example.com?page_id=2
|
||||
|
||||
**Usage**::
|
||||
|
||||
{% pagination_insert_page_and_id [URL] [page number] [go to id] %}
|
||||
|
||||
**Example**::
|
||||
|
||||
{% pagination_insert_page_and_id https://example.com/bar 2 settings %}
|
||||
return "https://example.com/bar?page=2#settings"
|
||||
|
||||
{% pagination_insert_page_and_id https://example.com/bar?foo=0 2 %}
|
||||
return "https://example.com/bar?foo=0&page=2"
|
||||
|
||||
{% pagination_insert_page_and_id https://example.com/bar?foo=0 2 page_arg="page_id" %}
|
||||
return "https://example.com/bar?foo=0&page_id=2"
|
||||
"""
|
||||
|
||||
page_arg = "page"
|
||||
if "page_arg" in kwargs and kwargs["page_arg"] is not None and len(kwargs["page_arg"]) > 0:
|
||||
page_arg = kwargs["page_arg"]
|
||||
|
||||
args = { "url": url, page_arg: page}
|
||||
new_url = url_insert_param(**args)
|
||||
|
||||
if id != None:
|
||||
new_url += "#" + str(id)
|
||||
|
||||
return new_url
|
|
@ -30,40 +30,66 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
|
||||
{% block content %}
|
||||
{% if users %}
|
||||
<div id="users_results">
|
||||
<h2>{% trans "Results among users:" %}</h2>
|
||||
{% include 'users/aff_users.html' with users_list=users %}
|
||||
{% include 'pagination.html' with list=users page_arg='users_page' go_to_id='users_results' %}
|
||||
{% include 'users/aff_users.html' with users_list=users.object_list %}
|
||||
</div>
|
||||
{% endif%}
|
||||
{% if clubs %}
|
||||
<div id="clubs_results">
|
||||
<h2>{% trans "Results among clubs:" %}</h2>
|
||||
{% include 'users/aff_clubs.html' with clubs_list=clubs %}
|
||||
{% include 'pagination.html' with list=clubs page_arg='clubs_page' go_to_id='clubs_results' %}
|
||||
{% include 'users/aff_clubs.html' with clubs_list=clubs.object_list %}
|
||||
</div>
|
||||
{% endif%}
|
||||
{% if machines %}
|
||||
<div id="machines_results">
|
||||
<h2>{% trans "Results among machines:" %}</h2>
|
||||
{% include 'machines/aff_machines.html' with machines_list=machines %}
|
||||
{% include 'pagination.html' with list=machines page_arg='machines_page' go_to_id='machines_results' %}
|
||||
{% include 'machines/aff_machines.html' with machines_list=machines.object_list %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if factures %}
|
||||
<div id="invoices_results">
|
||||
<h2>{% trans "Results among invoices:" %}</h2>
|
||||
{% include 'cotisations/aff_cotisations.html' with facture_list=factures %}
|
||||
{% include 'pagination.html' with list=factures page_arg='factures_page' go_to_id='invoices_results' %}
|
||||
{% include 'cotisations/aff_cotisations.html' with facture_list=factures.object_list %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if whitelists %}
|
||||
<div id="whitelists_results">
|
||||
<h2>{% trans "Results among whitelists:" %}</h2>
|
||||
{% include 'users/aff_whitelists.html' with white_list=whitelists %}
|
||||
{% include 'pagination.html' with list=whitelists page_arg='whitelists_page' go_to_id='whitelists_results' %}
|
||||
{% include 'users/aff_whitelists.html' with white_list=whitelists.object_list %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if bans %}
|
||||
<div id="bans_results">
|
||||
<h2>{% trans "Results among bans:" %}</h2>
|
||||
{% include 'users/aff_bans.html' with ban_list=bans %}
|
||||
{% include 'pagination.html' with list=bans page_arg='bans_page' go_to_id='bans_results' %}
|
||||
{% include 'users/aff_bans.html' with ban_list=bans.object_list %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if rooms %}
|
||||
<div id="rooms_results">
|
||||
<h2>{% trans "Results among rooms:" %}</h2>
|
||||
{% include 'topologie/aff_chambres.html' with room_list=rooms %}
|
||||
{% include 'pagination.html' with list=rooms page_arg='rooms_page' go_to_id='rooms_results' %}
|
||||
{% include 'topologie/aff_chambres.html' with room_list=rooms.object_list %}
|
||||
{% endif %}
|
||||
{% if ports %}
|
||||
<div id="ports_results">
|
||||
<h2>{% trans "Results among ports:" %}</h2>
|
||||
{% include 'topologie/aff_port.html' with port_list=ports search=True %}
|
||||
{% include 'pagination.html' with list=ports page_arg='ports_page' go_to_id='ports_results' %}
|
||||
{% include 'topologie/aff_port.html' with port_list=ports.object_list search=True %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if switches %}
|
||||
<div id="switches_results">
|
||||
<h2>{% trans "Results among switches:" %}</h2>
|
||||
{% include 'topologie/aff_switch.html' with switch_list=switches %}
|
||||
{% include 'pagination.html' with list=switches page_arg='switches_page' go_to_id='switches_results' %}
|
||||
{% include 'topologie/aff_switch.html' with switch_list=switches.object_list %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if not users and not machines and not factures and not whitelists and not bans and not rooms and not ports and not switches %}
|
||||
<h3>{% trans "No result" %}</h3>
|
||||
|
@ -74,4 +100,3 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
<br />
|
||||
<br />
|
||||
{% endblock %}
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ from search.forms import (
|
|||
CHOICES_AFF,
|
||||
initial_choices,
|
||||
)
|
||||
from re2o.base import SortTable
|
||||
from re2o.base import SortTable, re2o_paginator
|
||||
from re2o.acl import can_view_all
|
||||
|
||||
|
||||
|
@ -61,7 +61,7 @@ def is_int(variable):
|
|||
return True
|
||||
|
||||
|
||||
def finish_results(results, col, order):
|
||||
def finish_results(request, results, col, order):
|
||||
"""Sort the results by applying filters and then limit them to the
|
||||
number of max results. Finally add the info of the nmax number of results
|
||||
to the dict"""
|
||||
|
@ -93,7 +93,9 @@ def finish_results(results, col, order):
|
|||
|
||||
max_result = GeneralOption.get_cached_value("search_display_page")
|
||||
for name, val in results.items():
|
||||
results[name] = val.distinct()[:max_result]
|
||||
page_arg = name + "_page"
|
||||
results[name] = re2o_paginator(request, val.distinct(), max_result, page_arg=page_arg)
|
||||
|
||||
results.update({"max_result": max_result})
|
||||
|
||||
return results
|
||||
|
@ -316,7 +318,7 @@ def get_results(query, request, params):
|
|||
"switches": Switch.objects.filter(filters["switches"]),
|
||||
}
|
||||
|
||||
results = finish_results(results, request.GET.get("col"), request.GET.get("order"))
|
||||
results = finish_results(request, results, request.GET.get("col"), request.GET.get("order"))
|
||||
results.update({"search_term": query})
|
||||
|
||||
return results
|
||||
|
|
|
@ -23,19 +23,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
{% endcomment %}
|
||||
|
||||
{% load url_insert_param %}
|
||||
{% load pagination_extra %}
|
||||
{% load i18n %}
|
||||
|
||||
{% if list.paginator.num_pages > 1 %}
|
||||
<ul class="pagination text-center">
|
||||
{% if list.has_previous %}
|
||||
<li>
|
||||
<a href="{% url_insert_param request.get_full_path page=1 %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">
|
||||
<a href="{% pagination_insert_page_and_id request.get_full_path 1 page_arg=page_arg %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">
|
||||
<span aria-hidden="true">«</span>
|
||||
<span class="sr-only">{% trans "First" %}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{% url_insert_param request.get_full_path page=list.previous_page_number %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">
|
||||
<a href="{% pagination_insert_page_and_id request.get_full_path list.previous_page_number page_arg=page_arg %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">
|
||||
<span aria-hidden="true">‹</span>
|
||||
<span class="sr-only">{% trans "Previous" %}</span>
|
||||
</a>
|
||||
|
@ -48,20 +49,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
{% for page in list.paginator.page_range %}
|
||||
{% if list.number <= page|add:"3" and list.number >= page|add:"-3" %}
|
||||
<li class="{% if list.number == page %}active{% endif %}">
|
||||
<a href="{% url_insert_param request.get_full_path page=page %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">{{ page }}</a>
|
||||
<a href="{% pagination_insert_page_and_id request.get_full_path page page_arg=page_arg %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">{{ page }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% if list.has_next %}
|
||||
<li>
|
||||
<a href="{% url_insert_param request.get_full_path page=list.next_page_number %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">
|
||||
<a href="{% pagination_insert_page_and_id request.get_full_path list.next_page_number page_arg=page_arg %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">
|
||||
<span aria-hidden="true">›</span>
|
||||
<span class="sr-only">{% trans "Next" %}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{% url_insert_param request.get_full_path page=list.paginator.page_range|length %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">
|
||||
<a href="{% pagination_insert_page_and_id request.get_full_path list.paginator.page_range|length page_arg=page_arg %}{% if go_to_id %}#{{ go_to_id }}{% endif %}">
|
||||
<span aria-hidden="true">»</span>
|
||||
<span class="sr-only">{% trans "Last" %}</span>
|
||||
</a>
|
||||
|
@ -71,4 +72,5 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
<li class="disabled"><span aria-hidden="true">»</span></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
{% endif %}
|
||||
|
|
Loading…
Reference in a new issue