backoffice: extend global status filter to waiting/open/done/all (#15003)

This commit is contained in:
Frédéric Péters 2017-03-04 18:09:41 +01:00
parent 81cfa1bfd3
commit b177c79e3f
2 changed files with 33 additions and 5 deletions

View File

@ -2166,6 +2166,20 @@ def test_global_listing(pub):
resp = resp.forms['listing-settings'].submit()
assert resp.body[resp.body.index('<tbody'):].count('<tr') == 17
resp = app.get('/backoffice/management/listing?limit=500')
resp.forms['listing-settings']['status'] = 'waiting'
resp = resp.forms['listing-settings'].submit()
assert resp.body[resp.body.index('<tbody'):].count('<tr') == 37
resp.forms['listing-settings']['status'] = 'open'
resp = resp.forms['listing-settings'].submit()
assert resp.body[resp.body.index('<tbody'):].count('<tr') == 37
resp.forms['listing-settings']['status'] = 'all'
resp = resp.forms['listing-settings'].submit()
assert resp.body[resp.body.index('<tbody'):].count('<tr') == 70
resp.forms['listing-settings']['status'] = 'done'
resp = resp.forms['listing-settings'].submit()
assert resp.body[resp.body.index('<tbody'):].count('<tr') == 33
def test_global_listing_with_no_formdefs(pub):
if not pub.is_using_postgresql():
pytest.skip('this requires SQL')

View File

@ -524,8 +524,12 @@ class ManagementDirectory(Directory):
get_response().add_javascript(['jquery.js'])
DateWidget.prepare_javascript()
form = Form(use_tokens=False, id='listing-settings')
form.add(CheckboxWidget, 'waiting', title=_('Waiting for an action'),
value=True)
form.add(SingleSelectWidget, 'status', title=_('Status'),
options=[
('waiting', _('Waiting for an action'), 'waiting'),
('open', C_('formdata|Open'), 'open'),
('done', _('Done'), 'done'),
('all', _('All'), 'all')])
form.add(DateWidget, 'start', title=_('Start Date'))
form.add(DateWidget, 'end', title=_('End Date'))
@ -703,13 +707,23 @@ class ManagementDirectory(Directory):
parsed_values = {}
user_roles = [logged_users_role().id] + (get_request().user.roles or [])
criterias = get_global_criteria(get_request(), parsed_values)
criterias.append(Equal('is_at_endpoint', False))
query_parameters = (get_request().form or {}).copy()
query_parameters.pop('callback', None) # when using jsonp
if not query_parameters or get_request().form.get('waiting') == 'yes':
status = query_parameters.get('status', 'waiting')
if query_parameters.get('waiting') == 'yes':
# compatibility with ?waiting=yes|no parameter, still used in
# the /count endpoint used for indicators
status = 'waiting'
elif query_parameters.get('waiting') == 'no':
status = 'open'
if status == 'waiting':
criterias.append(Equal('is_at_endpoint', False))
criterias.append(Intersects('actions_roles_array', user_roles))
else:
elif status == 'open':
criterias.append(Equal('is_at_endpoint', False))
criterias.append(Intersects('concerned_roles_array', user_roles))
elif status == 'done':
criterias.append(Equal('is_at_endpoint', True))
if get_request().form.get('submission_channel'):
if get_request().form.get('submission_channel') == 'web':
criterias.append(Null('submission_channel'))