class PageThread(object):
def __init__(self, items, items_per_page=10):
self.items = items
self.items_count = len(self.items)
self.items_per_page = items_per_page
self.__set_number_of_pages()
self.__load_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 __load_pages(self):
self.pages = [Page(p_id, self.items[(p_id-1)*self.items_per_page: p_id*self.items_per_page]) for p_id in range(1, self.number_of_pages+1)]
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)class Page(object):
def __init__(self, page, items_per_page=10):
self.id = int(page)
self.items_per_page = items_per_page
# range gives you an item more in order to check if there is a next page
self.range = ((self.id-1)*self.items_per_page, self.id*self.items_per_page+1)
def load_items(self, rows):
# where rows are those returned from a select query to the db
if len(rows) > self.items_per_page :
self.has_next = True
self.items = rows[:-1]
else:
self.has_next = False
self.items = rows
def get_page_navigation_div(self, **request_vars):
contents = []
request_vars.update({'items_per_page': self.n_items})
if self.has_previous:
request_vars.update({'page': self.id-1})
contents.append( A('<<< previous', _class='nav-previous', _href=URL(vars=request_vars)) )
for n in range(1, self.id):
request_vars.update({'page': n})
contents.append( A(' %s' % n, _class='nav-page', _href=URL(vars=request_vars)) )
if self.has_next:
request_vars.update({'page': self.id+1})
contents.append( A('next >>>', _class='nav-next', _href=URL(vars=request_vars)) )
return DIV(*contents, _id='page_navigation')page = Page(request.vars.page, 10)
page.load_items(db(your_query).select(limitby=page.range))
#do stuff
return dict(page=page)
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 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 styleWell, the 10 rows for 30 p was just an example for understanding :)
The idea of the was in order to do only 1 query but definitely you are right, it wasn't worth of!
--
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 a topic in the Google Groups "web2py-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/web2py/-awUNbuI_t8/unsubscribe.
To unsubscribe from this group and all its topics, send an email to web2py+un...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.