Skip to content

Commit

Permalink
add option
Browse files Browse the repository at this point in the history
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
  • Loading branch information
lixxu committed Mar 28, 2024
1 parent 88e2617 commit e04db43
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 69 deletions.
4 changes: 2 additions & 2 deletions docs/conf.py
Expand Up @@ -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.
Expand Down
13 changes: 12 additions & 1 deletion docs/index.rst
Expand Up @@ -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
Expand Down Expand Up @@ -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
------------------

Expand Down Expand Up @@ -273,6 +278,12 @@ Contributors

Changelog
---------
Version 2024.03.28
-------------

- add show_first_page_number `issue 111 <https://github.com/lixxu/flask-paginate/issues/111>`
- some parameters got from config

Version 2023.10.24
-------------

Expand Down
12 changes: 9 additions & 3 deletions 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
42 changes: 7 additions & 35 deletions example/app.py
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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",
Expand All @@ -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
Expand All @@ -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",
Expand Down Expand Up @@ -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()
Expand Down
78 changes: 50 additions & 28 deletions flask_paginate/__init__.py
Expand Up @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -270,14 +270,24 @@ 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)

offset = (page - 1) * per_page
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."""

Expand Down Expand Up @@ -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")
Expand All @@ -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"

Expand All @@ -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"):
Expand All @@ -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 = ""
Expand All @@ -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":
Expand All @@ -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":
Expand All @@ -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):
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit e04db43

Please sign in to comment.