backoffice: add support code for paginating listings

This commit is contained in:
Frédéric Péters 2012-08-22 17:17:53 +02:00
parent b1e529be50
commit 2a0b111427
2 changed files with 32 additions and 12 deletions

View File

@ -250,8 +250,12 @@ class FormPage(Directory):
' <li><a href="stats">%s</a></li>' % _('Statistics')
'</ul>'
def get_fields_sidebar [html] (self, selected_filter, fields):
def get_fields_sidebar [html] (self, selected_filter, fields, offset=None, count=None):
'<form>'
if offset:
'<input type="hidden" name="offset" value="%s"/>' % offset
if count:
'<input type="hidden" name="count" value="%s"/>' % count
waitpoint_status = self.formdef.workflow.get_waitpoint_status()
if waitpoint_status:
'<h3>%s</h3>' % _('Filters')
@ -326,6 +330,10 @@ class FormPage(Directory):
fields = self.get_fields_from_query()
selected_filter = self.get_filter_from_query()
count = get_request().form.get('count', 0)
offset = get_request().form.get('offset', 0)
qs = ''
if get_request().get_query():
qs = '?' + get_request().get_query()
@ -333,10 +341,11 @@ class FormPage(Directory):
html_top('forms', '%s - %s' % (_('Listing'), self.formdef.name))
'<h2>%s - %s</h2>' % (self.formdef.name, _('Listing'))
FormDefUI(self.formdef).listing(fields=fields,
selected_filter=selected_filter, include_form=True)
selected_filter=selected_filter, include_form=True,
count=int(count), offset=int(offset))
get_response().filter['sidebar'] = self.get_formdata_sidebar(qs) + \
self.get_fields_sidebar(selected_filter, fields)
self.get_fields_sidebar(selected_filter, fields, count=count, offset=offset)
def pending [html] (self):
get_logger().info('backoffice - form %s - pending' % self.formdef.name)

View File

@ -25,7 +25,8 @@ class FormDefUI:
def __init__(self, formdef):
self.formdef = formdef
def listing [html] (self, fields, selected_filter='all', url_action=None, include_form=False, items=None):
def listing [html] (self, fields, selected_filter='all', url_action=None,
include_form=False, items=None, offset=0, count=-1):
get_response().add_javascript(['jquery.js',
'tablesorter/jquery.tablesorter.min.js'])
get_response().add_javascript_code(
@ -76,14 +77,16 @@ class FormDefUI:
'</thead>'
'<tbody>'
self.tbody(fields=fields, selected_filter=selected_filter, items=items, url_action=url_action)
self.tbody(fields=fields, selected_filter=selected_filter, items=items,
url_action=url_action, offset=offset, count=count)
'</tbody>'
"</table>"
def tbody [html] (self, fields=None, selected_filter='all', items=None, url_action=None):
def tbody [html] (self, fields=None, selected_filter='all', items=None,
url_action=None, offset=None, count=None):
if items is None:
if selected_filter == 'all':
items = self.formdef.data_class().select(order_by='-receipt_time')
item_ids = self.formdef.data_class().keys()
else:
applied_filters = []
if selected_filter == 'pending':
@ -94,13 +97,21 @@ class FormDefUI:
self.formdef.workflow.get_endpoint_status()]
else:
applied_filters = ['wf-%s' % selected_filter]
items = []
item_ids = []
for status_id in applied_filters:
items.extend(self.formdef.data_class().get_with_indexed_value(
item_ids.extend(self.formdef.data_class().get_ids_with_indexed_value(
str('status'), status_id))
items.sort(lambda x,y: cmp(getattr(x, str('receipt_time')),
getattr(y, str('receipt_time'))))
items.reverse()
if offset and not count:
count = 20
item_ids.sort(lambda x,y: cmp(int(x), int(y)))
item_ids.reverse()
if offset and count:
items = [self.formdef.data_class().get(x) for x in item_ids[offset:offset+count]]
else:
items = [self.formdef.data_class().get(x) for x in item_ids]
if url_action:
pass