Skip to content

Instantly share code, notes, and snippets.

@rochacbruno
Created September 9, 2011 17:19
Show Gist options
  • Save rochacbruno/1206790 to your computer and use it in GitHub Desktop.
Save rochacbruno/1206790 to your computer and use it in GitHub Desktop.
modules/plugin_paginator.py - including anchor & extra_vars to _URL
# -*- coding: utf-8 -*-
# This plugins is licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
# Authors: Kenji Hosoda <hosoda@s-cubism.jp>
# original by http://groups.google.com/group/web2py/browse_frm/thread/d1ec3ded48839071#
from gluon import *
class Paginator(DIV):
def __init__(self, pagenate=10, records=100,
renderstyle=False, page_var='page',anchor="",extra_vars={}, **attributes):
DIV.__init__(self, **attributes)
self.attributes['_class'] = 'paginator'
self.pagenate, self.records, self.page_var, self.anchor, self.extra_vars = (
pagenate, records, page_var, anchor, extra_vars
)
self.page = int(current.request.get_vars.get(self.page_var) or 1)
if renderstyle:
_url = URL('static','plugin_paginator/paginator.css')
if _url not in current.response.files:
current.response.files.append(_url)
def _url(self, page):
vars = current.request.get_vars.copy()
vars[self.page_var] = page
vars.update(self.extra_vars)
return URL(args=current.request.args, vars=vars, anchor=self.anchor)
def limitby(self):
return (self.pagenate*(self.page-1), self.pagenate*self.page)
def xml(self):
pages = (self.records - 1) / self.pagenate + 1
if (self.records > self.pagenate and
pages == 1 and pages * self.pagenate != self.records):
pages = 2
elif pages == 0 and self.records != 0:
pages = 1
if pages > 1:
def _get_page_el(page):
if self.page == page:
return EM(page)
else:
return A(page, _title=page,
_href=self._url(page),
)
if self.page != 1:
self.append(
A(current.T('Prev') , _href=self._url(self.page - 1),
_title=(self.page - 1), _class='previous_page'))
_pad_prev = 2
_pad_next = 3 if self.page>3 else 7-self.page
if self.page-_pad_prev > 1:
self.append(_get_page_el(1))
if self.page - _pad_prev > 2:
self.append(SPAN('... '))
elif self.page - _pad_prev == 1:
self.append(_get_page_el(2))
for page in range(max(self.page - _pad_prev, 1),
min(self.page + _pad_next, pages + 1)):
self.append(_get_page_el(page))
if self.page+_pad_next <= pages:
if self.page+_pad_next <= pages - 2:
self.append(SPAN('... '))
elif self.page+_pad_next == pages - 1:
self.append(_get_page_el(pages - 1))
self.append(_get_page_el(pages))
if pages > self.page:
self.append(
A(current.T('Next') , _href=self._url(self.page + 1),
_title=(self.page + 1), _class='next_page'))
return DIV.xml(self)
class PagenateSelector(SPAN):
def __init__(self, pagenates=(10, 25, 50, 100),
pagenate_var='pagenate', page_var='page', anchor=None, **attributes):
SPAN.__init__(self, **attributes)
self.attributes['_class'] = 'pagenate_selector'
self.pagenates, self.pagenate_var, self.page_var, self.anchor = (
pagenates, pagenate_var, page_var, anchor
)
self.pagenate = int(current.request.get_vars.get(self.pagenate_var, pagenates[0]))
def _url(self, pagenate):
vars = current.request.get_vars.copy()
vars[self.page_var] = 1
vars[self.pagenate_var] = pagenate
return URL(args=current.request.args, vars=vars, anchor=self.anchor)
def xml(self):
def _get_pagenate_link(_pagenate):
if _pagenate == self.pagenate:
return str(_pagenate)
else:
return A(_pagenate, _href=self._url(_pagenate)).xml()
inner = XML(current.T('Paginate: ') +
', '.join([_get_pagenate_link(_pagenate) for _pagenate in self.pagenates]))
return SPAN(inner, **self.attributes).xml()
class PaginateInfo(SPAN):
def __init__(self, page, pagenate, records, **attributes):
SPAN.__init__(self, **attributes)
self.attributes['_class'] = 'pagenate_info'
self.page, self.pagenate, self.records = (
page, pagenate, records
)
def xml(self):
inner = XML(current.T('Display: <b>%(start)s - %(end)s</b> of <b>%(total)s</b>') %
dict(start=(self.page - 1)*self.pagenate + 1, end=self.page*self.pagenate,
total=self.records))
return SPAN(inner, **self.attributes).xml()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment