In the end I solved with two simple classes, without using cache, but with
two queries, one counting total items and one limited by limitby. Also I
have looked in slices and I found some pagination plugins.
Anyway here the basic code:
class PageThread(object):
def __init__(self, query, items_per_page=10):
self.query = query
self.items_count = db(self.query).count()
self.items_per_page = items_per_page
self.__set_number_of_pages()
def __set_number_of_pages(self):
self.number_of_pages = self.items_count/self.items_per_page + 1 if
self.items_count % self.items_per_page else
self.items_count/self.items_per_page
def serve_page(self, page_id):
page_items =
db(self.query).select(limitby=((page_id-1)*self.items_per_page,
page_id*self.items_per_page))
p = Page(page_id, page_items)
p.previous_pages = [n for n in range(1, page_id)]
p.next_pages = [n for n in range(page_id+1, self.number_of_pages+1)]
return p
class Page(object):
def __init__(self, id, items):
# id is the unique number of the page in the PageThread
self.id = id
self.items = items
def __str__(self):
return 'Page n.{}, {} items: {}'.format(self.id, len(self.items),
self.items)
def get_page_navigation_div(self, **request_vars):
request_vars.update({'items_per_page': len(self.items)})
previous_pages_subdiv = DIV(_class='previous-pages-subdiv')
next_pages_subdiv = DIV(_class='next-pages-subdiv')
if self.previous_pages:
request_vars.update({'page': self.id-1})
previous_pages_subdiv.append( A('<<< previous',
_class='nav-previous-link', _href=URL(vars=request_vars)) )
for n in self.previous_pages:
request_vars.update({'page': n})
previous_pages_subdiv.append( A(' %s' % n,
_class='nav-previous-pages', _href=URL(vars=request_vars)) )
for n in self.next_pages:
request_vars.update({'page': n})
next_pages_subdiv.append( A(' %s' % n, _class='nav-next-pages',
_href=URL(vars=request_vars)) )
if self.next_pages:
request_vars.update({'page': self.id+1})
next_pages_subdiv.append( A(' next >>>',
_class='nav-next-link', _href=URL(vars=request_vars)) )
return DIV(previous_pages_subdiv, next_pages_subdiv,
_class='page-navigation-div')
def get_style(self):
style = STYLE("""\
.page-navigation-div {
width: 1170px;
}
.page-navigation-div div {
display: inline;
}
.page-navigation-div .next-pages-subdiv{
float: right;
}
""")
return style
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.