add filtering (on status) to listing view

This commit is contained in:
Frédéric Péters 2012-08-13 11:25:07 +02:00
parent aecacef348
commit 5af1f48b56
2 changed files with 51 additions and 9 deletions

View File

@ -256,9 +256,25 @@ class FormPage(Directory):
' <li><a href="stats">%s</a></li>' % _('Statistics')
'</ul>'
def get_fields_sidebar [html] (self, fields):
'<h3>%s</h3>' % _('Fields to display')
def get_fields_sidebar [html] (self, selected_filter, fields):
'<form>'
if self.formdef.workflow.possible_status:
'<h3>%s</h3>' % _('Filters')
'<ul>'
filters = [('all', _('All')), ('pending', _('Pending'))]
for status in self.formdef.workflow.possible_status:
filters.append((status.id, status.name))
for filter_id, filter_label in filters:
if filter_id == selected_filter:
checked = ' checked="checked"'
else:
checked = ''
'<li><label><input type="radio" name="filter" value="%s"%s/>%s</label></li>' % (
filter_id, checked, filter_label)
'</ul>'
'<input type="submit" value="%s"/>' % _('Refresh')
'<h3>%s</h3>' % _('Fields to display')
'<ul>'
for field in self.get_formdef_fields():
if not hasattr(field, str('get_view_value')):
@ -270,7 +286,7 @@ class FormPage(Directory):
'<label for="%s">%s</label>' % (field.id, field.label)
'</li>'
'</ul>'
'<input type="submit" value="%s"/>' % _('Reload')
'<input type="submit" value="%s"/>' % _('Refresh')
'</form>'
def get_formdef_fields(self):
@ -303,10 +319,18 @@ class FormPage(Directory):
return fields
def get_filter_from_query(self):
if 'filter' in get_request().form:
return get_request().form['filter']
if self.formdef.workflow.possible_status:
return 'pending'
return 'all'
def _q_index [html] (self):
get_logger().info('backoffice - form %s - listing' % self.formdef.name)
fields = self.get_fields_from_query()
selected_filter = self.get_filter_from_query()
qs = ''
if get_request().get_query():
qs = '?' + get_request().get_query()
@ -314,9 +338,11 @@ class FormPage(Directory):
get_response().breadcrumb.append( ('listing', _('Listing')) )
html_top('forms', '%s - %s' % (_('Listing'), self.formdef.name))
'<h2>%s - %s</h2>' % (self.formdef.name, _('Listing'))
FormDefUI(self.formdef).listing(fields=fields, include_form=True)
FormDefUI(self.formdef).listing(fields=fields,
selected_filter=selected_filter, include_form=True)
get_response().filter['sidebar'] = self.get_formdata_sidebar(qs) + self.get_fields_sidebar(fields)
get_response().filter['sidebar'] = self.get_formdata_sidebar(qs) + \
self.get_fields_sidebar(selected_filter, fields)
def pending [html] (self):
get_logger().info('backoffice - form %s - pending' % self.formdef.name)

View File

@ -25,7 +25,7 @@ class FormDefUI:
def __init__(self, formdef):
self.formdef = formdef
def listing [html] (self, fields, url_action=None, include_form=False, items=None):
def listing [html] (self, fields, selected_filter='all', url_action=None, include_form=False, items=None):
get_response().add_javascript(['jquery.js',
'tablesorter/jquery.tablesorter.min.js'])
get_response().add_javascript_code(
@ -76,13 +76,29 @@ class FormDefUI:
'</thead>'
'<tbody>'
self.tbody(fields = fields, items = items, url_action = url_action)
self.tbody(fields=fields, selected_filter=selected_filter, items=items, url_action=url_action)
'</tbody>'
"</table>"
def tbody [html] (self, fields=None, items=None, url_action=None):
def tbody [html] (self, fields=None, selected_filter='all', items=None, url_action=None):
if items is None:
items = self.formdef.data_class().select(order_by = '-receipt_time')
if selected_filter == 'all':
items = self.formdef.data_class().select(order_by='-receipt_time')
else:
applied_filters = []
if selected_filter == 'pending':
applied_filters = ['wf-%s' % x.id for x in \
self.formdef.workflow.get_not_endpoint_status()]
else:
applied_filters = ['wf-%s' % selected_filter]
items = []
for status_id in applied_filters:
items.extend(self.formdef.data_class().get_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 url_action:
pass
#url_action = '/' + url_action