backoffice: add filtering on submission agent id (#45081)

This commit is contained in:
Frédéric Péters 2020-07-13 19:55:27 +02:00
parent 1e83b2b629
commit fe9176bb91
2 changed files with 65 additions and 1 deletions

View File

@ -1174,6 +1174,55 @@ def test_backoffice_user_filter(pub):
assert resp.text.count('>userB<') == 0
def test_backoffice_submission_agent_filter(pub):
pub.user_class.wipe()
user = create_superuser(pub)
create_environment(pub)
formdef = FormDef.get_by_urlname('form-title')
formdef.backoffice_submission_roles = user.roles
formdef.store()
user1 = pub.user_class(name='userA')
user1.store()
user2 = pub.user_class(name='userB')
user2.store()
for i, formdata in enumerate(formdef.data_class().select()):
formdata.submission_agent_id = str(user1.id if i < 10 else user2.id)
formdata.status = 'wf-new'
formdata.store()
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/?limit=100')
# enable submission-agent column
resp.forms['listing-settings']['submission_agent'].checked = True
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA<') > 0
assert resp.text.count('>userB<') > 0
# check the filter is hidden
assert resp.pyquery.find('li[hidden] input[name=filter-submission-agent]')
base_url = resp.request.url
resp = app.get(base_url + '&filter-submission-agent=on&filter-submission-agent-value=%s' % user1.id)
assert resp.text.count('>userA<') > 0
assert resp.text.count('>userB<') == 0
assert resp.text.count('<tr') == 11
assert resp.pyquery.find('input[value=userA]') # displayed in sidebar
# check it persits on filter changes
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA<') > 0
assert resp.text.count('>userB<') == 0
assert resp.text.count('<tr') == 11
resp = app.get(base_url + '&filter-submission-agent=on&filter-submission-agent-value=%s' % user2.id)
assert resp.text.count('>userA<') == 0
assert resp.text.count('>userB<') > 0
assert resp.text.count('<tr') == 42
resp = app.get('/backoffice/management/form-title/?limit=100&filter-submission-agent=on&filter-submission-agent-value=%s' % user2.id)
assert resp.text.count('<tr') == 42
def test_backoffice_csv(pub):
create_superuser(pub)
create_environment(pub)

View File

@ -1171,7 +1171,8 @@ class FormPage(Directory):
cls=misc.JSONEncoder)
def get_filterable_field_types(self):
types = ['string', 'email', 'item', 'bool', 'items', 'period-date', 'user-id']
types = ['string', 'email', 'item', 'bool', 'items', 'period-date',
'user-id', 'submission-agent-id']
if get_publisher().is_using_postgresql():
types.append('date')
return types
@ -1184,6 +1185,7 @@ class FormPage(Directory):
FakeField('start', 'period-date', _('Start')),
FakeField('end', 'period-date', _('End')),
FakeField('user', 'user-id', _('User'), addable=False),
FakeField('submission-agent', 'submission-agent-id', _('Submission Agent'), addable=False),
]
default_filters = self.get_default_filters(mode)
@ -1281,6 +1283,16 @@ class FormPage(Directory):
widget._parsed = True # make sure value is not replaced by request query
r += widget.render()
elif filter_field.type == 'submission-agent-id':
r += HiddenWidget(filter_field_key, value=filter_field_value).render()
if filter_field_value:
filtered_user = get_publisher().user_class.get(filter_field_value, ignore_errors=True)
widget = StringWidget('_' + filter_field_key, title=filter_field.label,
value=filtered_user.display_name if filtered_user else _('Unknown'),
readonly=True, render_br=False)
widget._parsed = True # make sure value is not replaced by request query
r += widget.render()
elif filter_field.type in ('item', 'items'):
filter_field.required = False
@ -1571,6 +1583,7 @@ class FormPage(Directory):
FakeField('start-mtime', 'period-date', _('Start (modification time)')),
FakeField('end-mtime', 'period-date', _('End (modification time)')),
FakeField('user', 'user-id', _('User')),
FakeField('submission-agent', 'submission-agent-id', _('Submission Agent')),
]
criterias = []
@ -1633,6 +1646,8 @@ class FormPage(Directory):
criterias[-1]._label = '%s: %s' % (filter_field.label, filter_field_value)
elif filter_field.type == 'user-id':
criterias.append(Equal('user_id', filter_field_value))
elif filter_field.type == 'submission-agent-id':
criterias.append(Equal('submission_agent_id', filter_field_value))
elif filter_field.type in ('item', 'items') and filter_field_value not in (None, 'None'):
if filter_field.type == 'item':
criterias.append(Equal('f%s' % filter_field.id, filter_field_value))