From e04db432bf4606aa345120790d98350555395a9d Mon Sep 17 00:00:00 2001 From: lix Date: Thu, 28 Mar 2024 14:09:31 +0800 Subject: [PATCH] add option 1. add show_first_page_number to show page or not for page 1 link 2. some parameters got from config, almost have PAGINATION_ prefix --- docs/conf.py | 4 +- docs/index.rst | 13 ++++++- example/app.cfg.example | 12 ++++-- example/app.py | 42 ++++---------------- flask_paginate/__init__.py | 78 ++++++++++++++++++++++++-------------- 5 files changed, 80 insertions(+), 69 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index e0ad79a..ceb8357 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -60,9 +60,9 @@ # built documents. # # The short X.Y version. -version = "2023.10.24" +version = "2024.3.28" # The full version, including alpha/beta/rc tags. -release = "2023.10.24" +release = "2024.3.28" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/index.rst b/docs/index.rst index e087809..d8b3e7a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,12 +5,14 @@ flask-paginate |release| documentation Overview --------- -Latest version: **2023.10.24** +Latest version: **2024.03.28** **flask-paginate** is a simple paginate extension for `flask`_ which is reference to `will_paginate`_, and supports several css frameworks. +**2024.03.28 update**: **show_first_page_number** parameters was added, some parameters got from config + **2023.10.24 update**: **rel** parameters was added **2021.10.26 update**: **bootstrap5** is now supported @@ -240,6 +242,9 @@ Below are the parameters for **Pagination.__init__()**. You can change the setti **next_rel**: rel of next page + **show_first_page_number**: show first page number or not + + API ------------------ @@ -273,6 +278,12 @@ Contributors Changelog --------- +Version 2024.03.28 +------------- + +- add show_first_page_number `issue 111 ` +- some parameters got from config + Version 2023.10.24 ------------- diff --git a/example/app.cfg.example b/example/app.cfg.example index 219d484..ce49f21 100644 --- a/example/app.cfg.example +++ b/example/app.cfg.example @@ -1,6 +1,12 @@ PER_PAGE = 10 -CSS_FRAMEWORK = "bootstrap5" -LINK_SIZE = "sm" +PAGINATION_CSS_FRAMEWORK = "boostrap5" +PAGINATION_LINK_SIZE = "sm" # decide whether or not a single page returns pagination -SHOW_SINGLE_PAGE = False +PAGINATION_SHOW_SINGLE_PAGE = False +PAGINATION_SHOW_FIRST_PAGE_NUMBER = False +PAGINATION_PREV_REL = "prev" +PAGINATION_NEXT_REL = "next prefetch" +PAGINATION_RECORD_NAME = "records +PAGINATION_FORMAT_TOTAL = True +PAGINATION_FORMAT_NUMBER = True diff --git a/example/app.py b/example/app.py index a0a9390..fba2ba2 100644 --- a/example/app.py +++ b/example/app.py @@ -7,7 +7,7 @@ import click from flask import Flask, current_app, g, render_template, request -from flask_paginate import Pagination, get_page_args +from flask_paginate import Pagination, get_page_args, get_parameter click.disable_unicode_literals_warning = True @@ -32,9 +32,7 @@ def teardown(error): def index(): g.cur.execute("select count(*) from users") total = g.cur.fetchone()[0] - page, per_page, offset = get_page_args( - page_parameter="p", per_page_parameter="pp", pp=20 - ) + page, per_page, offset = get_page_args() if per_page: sql = "select name from users order by name limit {}, {}".format( offset, per_page @@ -44,15 +42,12 @@ def index(): g.cur.execute(sql) users = g.cur.fetchall() + page_name = get_parameter() + per_page_name = get_parameter(default="per_page") pagination = get_pagination( - p=page, - pp=per_page, total=total, record_name="users", - format_total=True, - format_number=True, - page_parameter="p", - per_page_parameter="pp", + **{page_name: page, per_page_name: per_page}, ) return render_template( "index.html", @@ -66,7 +61,7 @@ def index(): def users(page): g.cur.execute("select count(*) from users") total = g.cur.fetchone()[0] - page, per_page, offset = get_page_args(per_page_parameter="pp", pp=20) + page, per_page, offset = get_page_args(per_page_parameter="pp", pp=15) if per_page: sql = "select name from users order by name limit {}, {}".format( offset, per_page @@ -81,8 +76,6 @@ def users(page): per_page=per_page, total=total, record_name="users", - format_total=True, - format_number=True, ) return render_template( "index.html", @@ -127,29 +120,8 @@ def get_css_framework(): return current_app.config.get("CSS_FRAMEWORK", "bootstrap4") -def get_link_size(): - return current_app.config.get("LINK_SIZE", "") - - -def get_alignment(): - return current_app.config.get("LINK_ALIGNMENT", "") - - -def show_single_page_or_not(): - return current_app.config.get("SHOW_SINGLE_PAGE", False) - - def get_pagination(**kwargs): - kwargs.setdefault("record_name", "records") - return Pagination( - css_framework=get_css_framework(), - link_size=get_link_size(), - alignment=get_alignment(), - show_single_page=show_single_page_or_not(), - prev_rel="prev", - next_rel="next prefetch", - **kwargs - ) + return Pagination(css_framework=get_css_framework(), **kwargs) @click.command() diff --git a/flask_paginate/__init__.py b/flask_paginate/__init__.py index fae1278..0fd79d7 100644 --- a/flask_paginate/__init__.py +++ b/flask_paginate/__init__.py @@ -2,13 +2,13 @@ # -*- coding: utf-8 -*- """ - flask_paginate - ~~~~~~~~~~~~~~~~~~ +flask_paginate +~~~~~~~~~~~~~~~~~~ - Adds pagination support to your flask application. +Adds pagination support to your flask application. - :copyright: (c) 2012 by Lix Xu. - :license: BSD, see LICENSE for more details +:copyright: (c) 2012 by Lix Xu. +:license: BSD, see LICENSE for more details """ from __future__ import unicode_literals @@ -18,7 +18,7 @@ from flask import current_app, request, url_for from markupsafe import Markup -__version__ = "2023.10.24" +__version__ = "2024.03.28" PY2 = sys.version_info[0] == 2 @@ -270,7 +270,7 @@ def get_page_args( page = int(args.get(page_name, 1, type=int)) per_page = args.get(per_page_name, type=int) if not per_page: - per_page = int(current_app.config.get(per_page_name.upper(), 10)) + per_page = int(current_app.config.get("PER_PAGE", 10)) else: per_page = int(per_page) @@ -278,6 +278,16 @@ def get_page_args( return page, per_page, offset +def get_param_value(name, kwargs={}, default=None, cfg_name="", prefix="pagination"): + """Get parameter value from kwargs or config""" + config_name = cfg_name or name + if prefix: + config_name = "{}_{}".format(prefix, config_name) + + cfg_value = current_app.config.get(config_name.upper(), default) + return kwargs.get(name, cfg_value) + + class Pagination(object): """A simple pagination extension for flask.""" @@ -346,6 +356,8 @@ def __init__(self, found=0, **kwargs): **next_rel**: rel of next page + **show_first_page_number**: show first page number or not + """ self.found = found page_parameter = kwargs.get("page_parameter") @@ -363,22 +375,26 @@ def __init__(self, found=0, **kwargs): per_page_param = get_per_page_parameter() self.per_page_parameter = per_page_param - self.per_page = int(kwargs.get(per_page_param, 10)) + self.per_page = int( + get_param_value(per_page_param, kwargs, 10, cfg_name="per_page", prefix="") + ) self.is_disabled = self.per_page < 1 self.skip = (self.page - 1) * self.per_page - self.inner_window = kwargs.get("inner_window", 2) - self.outer_window = kwargs.get("outer_window", 1) - self.prev_label = kwargs.get("prev_label") or PREV_LABEL - self.next_label = kwargs.get("next_label") or NEXT_LABEL + self.inner_window = int(get_param_value("inner_window", kwargs, 2)) + self.outer_window = int(get_param_value("outer_window", kwargs, 1)) + self.prev_label = get_param_value("prev_label", kwargs, PREV_LABEL) + self.next_label = get_param_value("next_label", kwargs, NEXT_LABEL) self.search = kwargs.get("search", False) self.total = kwargs.get("total", 0) - self.format_total = kwargs.get("format_total", False) - self.format_number = kwargs.get("format_number", False) - self.url_coding = kwargs.get("url_coding", "utf-8") - self.display_msg = kwargs.get("display_msg") or DISPLAY_MSG - self.search_msg = kwargs.get("search_msg") or SEARCH_MSG - self.record_name = kwargs.get("record_name") or RECORD_NAME - self.css_framework = kwargs.get("css_framework", "bootstrap4").lower() + self.format_total = get_param_value("format_total", kwargs, False) + self.format_number = get_param_value("format_number", kwargs, False) + self.url_coding = get_param_value("url_coding", kwargs, "utf-8") + self.display_msg = get_param_value("display_msg", kwargs, DISPLAY_MSG) + self.search_msg = get_param_value("search_msg", kwargs, SEARCH_MSG) + self.record_name = get_param_value("record_name", kwargs, RECORD_NAME) + self.css_framework = get_param_value( + "css_framework", kwargs, "bootstrap4" + ).lower() if self.css_framework not in CURRENT_PAGES: self.css_framework = "bootstrap4" @@ -389,7 +405,7 @@ def __init__(self, found=0, **kwargs): elif bs_version: self.bs_version = bs_version else: - self.bs_version = kwargs.get("bs_version", 4) + self.bs_version = get_param_value("bs_version", kwargs, 4) if self.bs_version in (2, "2"): self.css_framework = "bootstrap" elif self.bs_version in (3, "3"): @@ -407,7 +423,7 @@ def __init__(self, found=0, **kwargs): else: self.bs_version = float(self.bs_version) - self.link_size = kwargs.get("link_size", "") + self.link_size = get_param_value("link_size", kwargs, "") if self.link_size: if self.css_framework == "foundation": self.link_size = "" @@ -416,19 +432,19 @@ def __init__(self, found=0, **kwargs): else: self.link_size = " pagination-{0}".format(self.link_size) - self.bulma_style = kwargs.get("bulma_style", "") + self.bulma_style = get_param_value("bulma_style", kwargs, "") if self.bulma_style: self.bulma_style = " is-{0}".format(self.bulma_style) - self.prev_rel = kwargs.get("prev_rel", "") + self.prev_rel = get_param_value("prev_rel", kwargs, "") if self.prev_rel: self.prev_rel = ' rel="{}"'.format(self.prev_rel) - self.next_rel = kwargs.get("next_rel", "") + self.next_rel = get_param_value("next_rel", kwargs, "") if self.next_rel: self.next_rel = ' rel="{}"'.format(self.next_rel) - self.alignment = kwargs.get("alignment", "") + self.alignment = get_param_value("alignment", kwargs, "") if self.alignment and self.css_framework.startswith("bootstrap"): if self.css_framework in ("bootstrap4", "bootstrap5"): if self.alignment == "center": @@ -446,9 +462,9 @@ def __init__(self, found=0, **kwargs): if self.alignment and self.css_framework == "bulma": self.alignment = " is-{0}".format(self.alignment) - self.href = kwargs.get("href", None) - self.anchor = kwargs.get("anchor", None) - self.show_single_page = kwargs.get("show_single_page", False) + self.href = kwargs.get("href") + self.anchor = kwargs.get("anchor") + self.show_single_page = get_param_value("show_single_page", kwargs, False) self.link = LINK if self.css_framework == "bootstrap4": @@ -470,6 +486,9 @@ def __init__(self, found=0, **kwargs): self.prev_page_fmt = PREV_PAGES[self.css_framework] self.next_page_fmt = NEXT_PAGES[self.css_framework] self.css_end_fmt = CSS_LINKS_END[self.css_framework] + self.show_first_page_number = get_param_value( + "show_first_page_number", kwargs, False + ) self.init_values() def page_href(self, page): @@ -541,6 +560,9 @@ def next_page(self): def first_page(self): # current page is first page if self.has_prev: + if self.show_first_page_number: + return self.link.format(self.page_href(1), 1) + return self.link.format(self.page_href(None), 1) return self.current_page_fmt.format(1)