pvl/verkko/table.py
changeset 183 8fbaaf0564dc
parent 180 e6bca452ce72
child 204 72304d66ecd1
equal deleted inserted replaced
180:e6bca452ce72 183:8fbaaf0564dc
     1 from pvl.web import html
     1 from pvl.web import html
     2 from pvl.verkko import web, db
     2 from pvl.verkko import web, db
       
     3 
       
     4 import math
     3 
     5 
     4 import logging; log = logging.getLogger('pvl.verkko.table')
     6 import logging; log = logging.getLogger('pvl.verkko.table')
     5 
     7 
     6 class Column (object) :
     8 class Column (object) :
     7     """
     9     """
   131     """
   133     """
   132         Render <table> with Columns from SQLAlchemy ORM model class.
   134         Render <table> with Columns from SQLAlchemy ORM model class.
   133     """
   135     """
   134 
   136 
   135     COLUMNS = ()
   137     COLUMNS = ()
       
   138     ITEMS = None
   136     
   139     
   137     # attr -> column
   140     # attr -> column
   138     ATTRS = dict((col.attr, col) for col in COLUMNS)
   141     ATTRS = dict((col.attr, col) for col in COLUMNS)
   139  
   142  
   140     # items per page
   143     # items per page
   264                 ),
   267                 ),
   265 
   268 
   266                 self.render_row(item, **opts)
   269                 self.render_row(item, **opts)
   267             )
   270             )
   268 
   271 
   269     def render_pagination (self, page, count=None) :
   272     def render_pagination (self, page, count=None, **opts) :
   270         """
   273         """
   271             Render pagination links.
   274             Render pagination links.
   272         """
   275         """
   273 
   276 
   274         if count is not None :
   277         if count is not None :
   275             pages = int(math.ceil(count / self.page))
   278             pages = int(math.ceil(count / self.page))
   276         else :
   279         else :
   277             pages = None
   280             pages = None
   278 
   281 
   279         if page > 0 :
   282         if page > 0 :
   280             yield html.a(href=self.tableurl(page=0))(html("&laquo;&laquo; First"))
   283             yield html.a(href=self.tableurl(page=0, **opts))(html("&laquo;&laquo; First"))
   281             yield html.a(href=self.tableurl(page=(page - 1)))(html("&laquo; Prev"))
   284             yield html.a(href=self.tableurl(page=(page - 1), **opts))(html("&laquo; Prev"))
   282         
   285         
   283         yield html.span("Page {page} of {pages}".format(page=(page + 1), pages=(pages or '???')))
   286         if pages :
   284 
   287             yield html.span("Page {page} of {pages}".format(page=(page + 1), pages=pages))
   285         yield html.a(href=self.tableurl(page=(page + 1)))(html("&raquo; Next"))
   288         else :
   286 
   289             yield html.span("Page {page}".format(page=(page + 1)))
   287     def render_foot (self, query, page) :
   290 
       
   291         yield html.a(href=self.tableurl(page=(page + 1), **opts))(html("&raquo; Next"))
       
   292 
       
   293     def render_foot (self, query, page, **opts) :
   288         """
   294         """
   289             Render pagination/host count in footer.
   295             Render pagination/host count in footer.
   290         """
   296         """
   291 
   297 
   292         # XXX: does separate SELECT count()
   298         # XXX: does separate SELECT count()
   293         count = query.count()
   299         count = query.count()
   294 
   300 
   295         if page :
   301         if page is None :
   296             return self.render_pagination(page, count)
   302             return "{count} {items}".format(count=count, items=self.ITEMS)
   297         else :
   303         else :
   298             return "{count} hosts".format(count=count)
   304             # XXX: count is just the count we got..
       
   305             return self.render_pagination(page, count=None, **opts)
   299 
   306 
   300     def render (self, query, filters=None, sort=None, page=None, hilight=None) :
   307     def render (self, query, filters=None, sort=None, page=None, hilight=None) :
   301         """
   308         """
   302             Return <table> element. Wrapped in <form> if filters.
   309             Return <table> element. Wrapped in <form> if filters.
   303                 query   - filter()'d sort()'d SELECT query()
   310                 query   - filter()'d sort()'d SELECT query()
   324                 )
   331                 )
   325             ),
   332             ),
   326             html.tfoot(
   333             html.tfoot(
   327                 html.tr(
   334                 html.tr(
   328                     html.td(colspan=(1 + len(self.columns)))(
   335                     html.td(colspan=(1 + len(self.columns)))(
   329                         self.render_foot(query, page)
   336                         self.render_foot(query, page, filters=filters, sort=sort)
   330                     )
   337                     )
   331                 )
   338                 )
   332             )
   339             )
   333         )
   340         )
   334         
   341