diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py index 93015232b54..4f8b50bb2f7 100644 --- a/addons/http_routing/models/ir_http.py +++ b/addons/http_routing/models/ir_http.py @@ -15,6 +15,7 @@ except ImportError: import odoo from odoo import api, models from odoo.addons.base.ir.ir_http import RequestUID, ModelConverter +from odoo.addons.portal.controllers.portal import pager from odoo.http import request from odoo.tools import config, ustr @@ -279,6 +280,7 @@ class IrHttp(models.AbstractModel): set on request will be created with uid=None (and it is a lazy property) """ request.routing_iteration = getattr(request, 'routing_iteration', 0) + 1 + request.pager = pager func = None # locate the controller method diff --git a/addons/portal/controllers/portal.py b/addons/portal/controllers/portal.py index 1e7d97f7eb8..1fd7c9ee759 100644 --- a/addons/portal/controllers/portal.py +++ b/addons/portal/controllers/portal.py @@ -1,9 +1,76 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +import math + +from werkzeug import urls + from odoo.http import Controller, request, route +# -------------------------------------------------- +# Misc tools +# -------------------------------------------------- + +def pager(url, total, page=1, step=30, scope=5, url_args=None): + """ Generate a dict with required value to render `website.pager` template. This method compute + url, page range to display, ... in the pager. + :param url : base url of the page link + :param total : number total of item to be splitted into pages + :param page : current page + :param step : item per page + :param scope : number of page to display on pager + :param url_args : additionnal parameters to add as query params to page url + :type url_args : dict + :returns dict + """ + # Compute Pager + page_count = int(math.ceil(float(total) / step)) + + page = max(1, min(int(page if str(page).isdigit() else 1), page_count)) + scope -= 1 + + pmin = max(page - int(math.floor(scope/2)), 1) + pmax = min(pmin + scope, page_count) + + if pmax - pmin < scope: + pmin = pmax - scope if pmax - scope > 0 else 1 + + def get_url(page): + _url = "%s/page/%s" % (url, page) if page > 1 else url + if url_args: + _url = "%s?%s" % (_url, urls.url_encode(url_args)) + return _url + + return { + "page_count": page_count, + "offset": (page - 1) * step, + "page": { + 'url': get_url(page), + 'num': page + }, + "page_start": { + 'url': get_url(pmin), + 'num': pmin + }, + "page_previous": { + 'url': get_url(max(pmin, page - 1)), + 'num': max(pmin, page - 1) + }, + "page_next": { + 'url': get_url(min(pmax, page + 1)), + 'num': min(pmax, page + 1) + }, + "page_end": { + 'url': get_url(pmax), + 'num': pmax + }, + "pages": [ + {'url': get_url(page_num), 'num': page_num} for page_num in range(pmin, pmax+1) + ] + } + + class CustomerPortal(Controller): def _prepare_portal_layout_values(self): diff --git a/addons/portal/views/portal_templates.xml b/addons/portal/views/portal_templates.xml index 715cb3edc57..bd89945c81f 100644 --- a/addons/portal/views/portal_templates.xml +++ b/addons/portal/views/portal_templates.xml @@ -69,4 +69,18 @@ + + diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 45a733f7d5e..bfd5e3e5fc5 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -3,7 +3,6 @@ import inspect import logging -import math import hashlib import re @@ -12,6 +11,7 @@ from werkzeug.exceptions import NotFound from odoo import api, fields, models, tools from odoo.addons.http_routing.models.ir_http import slugify +from odoo.addons.portal.controllers.portal import pager from odoo.tools import pycompat from odoo.http import request from odoo.tools.translate import _ @@ -316,62 +316,7 @@ class Website(models.Model): @api.model def pager(self, url, total, page=1, step=30, scope=5, url_args=None): - """ Generate a dict with required value to render `website.pager` template. This method compute - url, page range to display, ... in the pager. - :param url : base url of the page link - :param total : number total of item to be splitted into pages - :param page : current page - :param step : item per page - :param scope : number of page to display on pager - :param url_args : additionnal parameters to add as query params to page url - :type url_args : dict - :returns dict - """ - # Compute Pager - page_count = int(math.ceil(float(total) / step)) - - page = max(1, min(int(page if str(page).isdigit() else 1), page_count)) - scope -= 1 - - pmin = max(page - int(math.floor(scope/2)), 1) - pmax = min(pmin + scope, page_count) - - if pmax - pmin < scope: - pmin = pmax - scope if pmax - scope > 0 else 1 - - def get_url(page): - _url = "%s/page/%s" % (url, page) if page > 1 else url - if url_args: - _url = "%s?%s" % (_url, urls.url_encode(url_args)) - return _url - - return { - "page_count": page_count, - "offset": (page - 1) * step, - "page": { - 'url': get_url(page), - 'num': page - }, - "page_start": { - 'url': get_url(pmin), - 'num': pmin - }, - "page_previous": { - 'url': get_url(max(pmin, page - 1)), - 'num': max(pmin, page - 1) - }, - "page_next": { - 'url': get_url(min(pmax, page + 1)), - 'num': min(pmax, page + 1) - }, - "page_end": { - 'url': get_url(pmax), - 'num': pmax - }, - "pages": [ - {'url': get_url(page), 'num': page} for page in range(pmin, pmax+1) - ] - } + return pager(url, total, page=page, step=step, scope=scope, url_args=url_args) def rule_is_enumerable(self, rule): """ Checks that it is possible to generate sensible GET queries for diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 417b0e4017a..732cfb44db3 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -379,18 +379,7 @@ -