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.

Reply via email to