258 lines
11 KiB
Plaintext
258 lines
11 KiB
Plaintext
|
Metadata-Version: 2.1
|
||
|
Name: paginate
|
||
|
Version: 0.5.7
|
||
|
Summary: Divides large result sets into pages for easier browsing
|
||
|
Home-page: https://github.com/Signum/paginate
|
||
|
Author: Christoph Haas
|
||
|
Author-email: email@christoph-haas.de
|
||
|
License: MIT
|
||
|
Keywords: pagination paginate pages
|
||
|
Classifier: Programming Language :: Python
|
||
|
Classifier: Development Status :: 4 - Beta
|
||
|
Classifier: Intended Audience :: Developers
|
||
|
Classifier: License :: OSI Approved :: MIT License
|
||
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
||
|
Classifier: Framework :: Pyramid
|
||
|
Classifier: Framework :: Flask
|
||
|
Classifier: Framework :: Pylons
|
||
|
Classifier: Framework :: Django
|
||
|
Description-Content-Type: text/markdown
|
||
|
License-File: LICENSE
|
||
|
Provides-Extra: dev
|
||
|
Requires-Dist: pytest; extra == "dev"
|
||
|
Requires-Dist: tox; extra == "dev"
|
||
|
Provides-Extra: lint
|
||
|
Requires-Dist: black; extra == "lint"
|
||
|
|
||
|
What is pagination?
|
||
|
---------------------
|
||
|
This module helps dividing large lists of items into pages. The user is shown one page at a time and
|
||
|
can navigate to other pages. Imagine you are offering a company phonebook and let the user search
|
||
|
the entries. If the search result contains 23 entries but you may want to display no more than 10
|
||
|
entries at once. The first page contains entries 1-10, the second 11-20 and the third 21-23. See the
|
||
|
documentation of the "Page" class for more information.
|
||
|
|
||
|
How do I use this module?
|
||
|
---------------------------
|
||
|
The paginate module contains extensive in-line documentation with examples.
|
||
|
|
||
|
Concerning WebHelpers
|
||
|
-----------------------
|
||
|
This is a standalone module. Former versions were included in the WebHelpers Python module as
|
||
|
webhelpers.paginate and were tightly coupled with the WebHelpers and the Pylons web framework. This
|
||
|
version aims to be useful independent of any web framework.
|
||
|
|
||
|
Subclassing Page()
|
||
|
------------------
|
||
|
This module supports pagination through list-like objects. To paginate though other types of objects
|
||
|
you can subclass the paginate.Page() class and provide a wrapper class that defines how to access
|
||
|
elements of that special collection.
|
||
|
|
||
|
You can find examples in other paginate_* modules like paginate_sqlalchemy. Basically you would have
|
||
|
to provide a class that implements the __init__, __getitem__ and __len__ methods.
|
||
|
|
||
|
It is trivial to make pagination for other datastores like Elasticsearch/Solr extending the base class.
|
||
|
|
||
|
Example::
|
||
|
|
||
|
class SqlalchemyOrmWrapper(object):
|
||
|
"""Wrapper class to access elements of a collection."""
|
||
|
def __init__(self, obj):
|
||
|
self.obj = obj
|
||
|
|
||
|
def __getitem__(self, range):
|
||
|
# Return a range of objects of an sqlalchemy.orm.query.Query object
|
||
|
return self.obj[range]
|
||
|
|
||
|
def __len__(self):
|
||
|
# Count the number of objects in an sqlalchemy.orm.query.Query object
|
||
|
return self.obj.count()
|
||
|
|
||
|
Then you can create your own Page class that uses the above wrapper class::
|
||
|
|
||
|
class SqlalchemyOrmPage(paginate.Page):
|
||
|
"""A pagination page that deals with SQLAlchemy ORM objects."""
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super(SqlalchemyOrmPage, self).__init__(*args, wrapper_class=SqlalchemyOrmWrapper, **kwargs)
|
||
|
|
||
|
As you can see it does not do much. It basically calls paginate.Page.__init__ and adds
|
||
|
wrapper_class=SqlalchemyOrmWrapper as an argument. The paginate.Page instance will use that wrapper
|
||
|
class to access the elements.
|
||
|
|
||
|
|
||
|
Generating HTML code for current page
|
||
|
-------------------------------------
|
||
|
|
||
|
Example::
|
||
|
|
||
|
p = paginate.Page([], page=15, items_per_page=15, item_count=1010)
|
||
|
# item_count is optional, but we pass a dummy empty resultset for this example
|
||
|
pattern = '$link_first $link_previous ~4~ $link_next $link_last (Page $page our of $page_count - total $item_count)'
|
||
|
p.pager(pattern, url='http://foo.com?x=$page', dotdot_attr={'x':5}, link_attr={'y':6}, curpage_attr={'z':77})
|
||
|
# *_attr arguments are optional and can be used to attach additional classes/attrs to tags
|
||
|
|
||
|
|
||
|
Results in::
|
||
|
|
||
|
'<a class="L" href="URL?x=1"><<</a> <a class="L" href="URL?x=14"><</a> <a class="L" href="URL?x=1">1</a> <span class="D">..</span> <a class="L" href="URL?x=11">11</a> <a class="L" href="URL?x=12">12</a> <a class="L" href="URL?x=13">13</a> <a class="L" href="URL?x=14">14</a> <span class="C">15</span> <a class="L" href="URL?x=16">16</a> <a class="L" href="URL?x=17">17</a> <a class="L" href="URL?x=18">18</a> <a class="L" href="URL?x=19">19</a> <span class="D">..</span> <a class="L" href="URL?x=68">68</a> <a class="L" href="URL?x=16">></a> <a class="L" href="URL?x=68">>></a> (Page 15 our of 68 - total items 1010)'
|
||
|
|
||
|
Using url maker to generate links to specific result ranges
|
||
|
-----------------------------------------------------------
|
||
|
|
||
|
You can pass `url_maker` Callback to generate the URL of other pages, given its numbers.
|
||
|
Must accept one int parameter and return a URI string.
|
||
|
|
||
|
Example::
|
||
|
|
||
|
def url_maker(page_number):
|
||
|
return str('foo/%s' % page_number)
|
||
|
page = paginate.Page(range(100), page=1, url_maker=url_maker)
|
||
|
eq_(page.pager(), '1 <a href="foo/2">2</a> <a href="foo/3">3</a> .. <a href="foo/5">5</a>')
|
||
|
|
||
|
|
||
|
|
||
|
Alternatively if you will not pass the link builder function, the pager() method can also accept `url` argument that contains URL that page links will point to.
|
||
|
Make sure it contains the string $page which will be replaced by the actual page number.
|
||
|
Must be given unless a url_maker is specified to __init__, in which case this parameter is ignored.
|
||
|
|
||
|
Using link information for custom paginator templates
|
||
|
-----------------------------------------------------
|
||
|
|
||
|
If you do not like the default HTML format produced by paginator you can use link_map() function to generate
|
||
|
a dictionary of links you can use in your own template.
|
||
|
|
||
|
Example::
|
||
|
|
||
|
p.link_map('$link_first $link_previous ~4~ $link_next $link_last (Page $page our of $page_count - total items $item_count)',url='URL?x=$page',dotdot_attr={'class':'D'}, link_attr={'class':"L"}, curpage_attr={'class':"C"})
|
||
|
|
||
|
Returns something like::
|
||
|
|
||
|
{'current_page': {'attrs': {'class': 'C'}, 'href': 'URL?x=15', 'value': 15},
|
||
|
'first_page': {'attrs': {'class': 'L'}, 'href': 'URL?x=1', 'type': 'first_page', 'value': 1},
|
||
|
'last_page': {'attrs': {'class': 'L'}, 'href': 'URL?x=68', 'type': 'last_page', 'value': 68},
|
||
|
'next_page': {'attrs': {'class': 'L'}, 'href': 'URL?x=16', 'type': 'next_page', 'value': 16},
|
||
|
'previous_page': {'attrs': {'class': 'L'}, 'href': 'URL?x=14', 'type': 'previous_page', 'value': 14},
|
||
|
'range_pages': [{'attrs': {'class': 'D'}, 'href': '', 'type': 'span', 'value': '..'},
|
||
|
{'attrs': {'class': 'L'}, 'href': 'URL?x=11', 'type': 'page', 'value': '11'},
|
||
|
{'attrs': {'class': 'L'}, 'href': 'URL?x=12', 'type': 'page', 'value': '12'},
|
||
|
{'attrs': {'class': 'L'}, 'href': 'URL?x=13', 'type': 'page', 'value': '13'},
|
||
|
{'attrs': {'class': 'L'}, 'href': 'URL?x=14', 'type': 'page', 'value': '14'},
|
||
|
{'attrs': {'class': 'C'}, 'href': 'URL?x=15', 'type': 'current_page', 'value': 15},
|
||
|
{'attrs': {'class': 'L'}, 'href': 'URL?x=16', 'type': 'page', 'value': '16'},
|
||
|
{'attrs': {'class': 'L'}, 'href': 'URL?x=17', 'type': 'page', 'value': '17'},
|
||
|
{'attrs': {'class': 'L'}, 'href': 'URL?x=18', 'type': 'page', 'value': '18'},
|
||
|
{'attrs': {'class': 'L'}, 'href': 'URL?x=19', 'type': 'page', 'value': '19'},
|
||
|
{'attrs': {'class': 'D'}, 'href': '', 'type': 'span', 'value': '..'}],
|
||
|
'radius': 4}
|
||
|
|
||
|
|
||
|
Using link_tag callable to generate custom link markup
|
||
|
------------------------------------------------------
|
||
|
|
||
|
In case you want to generate custom link markup for your project - for example for use with bootstrap,
|
||
|
`pager()` accepts `link_tag` argument that expects a callable that can be used to easily override the way links are
|
||
|
generated.
|
||
|
|
||
|
|
||
|
Example::
|
||
|
|
||
|
from paginate import Page, make_html_tag
|
||
|
|
||
|
def paginate_link_tag(item):
|
||
|
"""
|
||
|
Create an A-HREF tag that points to another page usable in paginate.
|
||
|
"""
|
||
|
a_tag = Page.default_link_tag(item)
|
||
|
if item['type'] == 'current_page':
|
||
|
return make_html_tag('li', a_tag, **{'class':'active'})
|
||
|
return make_html_tag('li', a_tag)
|
||
|
|
||
|
paginator.pager(
|
||
|
curpage_attr={'class':'current_page'},
|
||
|
dotdot_attr={'class':'spacer'},
|
||
|
symbol_first='<i class="fa fa-chevron-circle-left"></i>',
|
||
|
symbol_last='<i class="fa fa-chevron-circle-right"></i>',
|
||
|
symbol_previous='<i class="fa fa-chevron-left"></i>',
|
||
|
symbol_next='<i class="fa fa-chevron-right"></i>',
|
||
|
link_tag=paginate_link_tag)
|
||
|
|
||
|
|
||
|
|
||
|
Version 0.5.6 - 2016-11-22
|
||
|
--------------------------
|
||
|
Changes:
|
||
|
- Fixed metadata for pypi
|
||
|
|
||
|
Version 0.5.5 - 2016-11-22
|
||
|
--------------------------
|
||
|
Changes:
|
||
|
- Python 2.7/3.4+ compatibility improvements
|
||
|
|
||
|
Version 0.5.4 - 2016-04-25
|
||
|
--------------------------
|
||
|
Changes:
|
||
|
- Added radius size config option
|
||
|
|
||
|
|
||
|
Version 0.5.3 - 2016-03-09
|
||
|
--------------------------
|
||
|
Changes:
|
||
|
- Unocode related fixes
|
||
|
|
||
|
Version 0.5.2 - 2015-08-29
|
||
|
--------------------------
|
||
|
Changes:
|
||
|
- Handle the slice prior to handling the length - for better experience with
|
||
|
various databases that include item count in results
|
||
|
- bugfixes
|
||
|
|
||
|
Version 0.5.1 - 2015-10-22
|
||
|
--------------------------
|
||
|
Changes:
|
||
|
- bugfixes
|
||
|
|
||
|
|
||
|
Version 0.5.0 - 2015-08-29
|
||
|
--------------------------
|
||
|
Changes:
|
||
|
- link_tag callable can now be passed to generate custom link markup
|
||
|
- page object now has link_map() method that returns a mapping of information useful for generating
|
||
|
custom markup based on paginator data
|
||
|
|
||
|
Version 0.4.0 - 2012-12-06
|
||
|
--------------------------
|
||
|
Paginate has prior been maintained as webhelpers.paginate in the _webhelpers_ packages.
|
||
|
This version is a standalone version that should be useful outside of the webhelpers'
|
||
|
context.
|
||
|
|
||
|
Changes:
|
||
|
- Python 3 compatibility.
|
||
|
- SQLAlchemyObject and SQLAlchemyQuery collections are not automatically detected any more.
|
||
|
Instead you can use the respective Page class from the paginate_sqlalchemy module also
|
||
|
available on PyPi.
|
||
|
- presliced_list parameter no longer supported
|
||
|
- 'page_nr' and 'current_page' had been deprecated already and are now removed. Please use 'page'
|
||
|
instead.
|
||
|
- No automatic URL generation. You need to pass a 'url' argument to the Page.pager() method
|
||
|
containing a $page placeholder where you want the page number to be put in. Beware that the URL
|
||
|
is not quote-escaped any further.
|
||
|
- The Page.pager() does not automatically add CSS classes any more. If you want the old
|
||
|
behavior you need to pass these parameters explicitly:
|
||
|
link_attr={'class':'pager_link'}
|
||
|
curpage_attr={'class':'pager_curpage'}
|
||
|
dotdot_attr={'class':'pager_dotdot'}
|
||
|
- The partial_param parameter from Page.pager() is gone. You should use your own URLs for
|
||
|
AJAX/partial updates in the 'url' parameter.
|
||
|
- The page_param parameter from Page.pager() is also gone as URL generation has been severely
|
||
|
simplified.
|
||
|
- The string returned from Page.pager() consists of escaped HTML already. So you need to tell
|
||
|
your web framework to use the string verbatim and without further escaping.
|
||
|
The parameters symbol_first, symbol_last, symbol_previous and symbol_next use
|
||
|
< and > instead of "<" and ">" now.
|
||
|
- Page.__repr__ now returns a brief representation. E.g. <paginate.Page: 1 of 1>
|
||
|
Page.__str__ returns the verbose view you may be used to.
|
||
|
|
||
|
Version 0.3.2 - 2008-01-31
|
||
|
--------------------------
|
||
|
Public release on PyPi
|