custom views: filter by current user (#50460)

This commit is contained in:
Lauréline Guérin 2021-02-11 16:20:02 +01:00
parent b7b61df1ca
commit 85834b9244
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 177 additions and 19 deletions

View File

@ -1379,13 +1379,11 @@ def test_backoffice_user_filter(pub):
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/')
# check the filter is hidden
assert resp.pyquery.find('li[hidden] input[name=filter-user]')
resp = app.get('/backoffice/management/form-title/?filter-user=on&filter-user-value=%s' % user1.id)
assert resp.text.count('>userA<') > 0
assert resp.text.count('>userB<') == 0
assert resp.pyquery.find('input[value=userA]') # displayed in sidebar
assert '<option value="%s" selected="selected">userA</option>' % user1.id in resp
# check it persits on filter changes
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA<') > 0
@ -1401,7 +1399,7 @@ def test_backoffice_user_filter(pub):
resp = app.get('/backoffice/management/form-title/?filter-user-uuid=0123456789')
assert resp.text.count('>userA<') > 0
assert resp.text.count('>userB<') == 0
assert resp.pyquery.find('input[value=userA]') # displayed in sidebar
assert '<option value="%s" selected="selected">userA</option>' % user1.id in resp
# check it persists on filter changes
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA<') > 0

View File

@ -137,6 +137,154 @@ def test_backoffice_custom_view(pub):
assert 'Views must have at least one column.' in resp.text
def test_backoffice_custom_view_user_filter(pub):
superuser = create_superuser(pub)
FormDef.wipe()
pub.custom_view_class.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [
fields.ItemField(
id='1',
label='field',
type='item',
items=['foo', 'bar', 'baz'],
display_locations=['validation', 'summary', 'listings'],
),
]
formdef.workflow_roles = {'_receiver': 1}
formdef.store()
user1 = pub.user_class(name='userA')
user1.store()
user2 = pub.user_class(name='userB')
user2.store()
formdef.data_class().wipe()
for i in range(10):
formdata = formdef.data_class()()
formdata.data = {'1': 'foo', '1_display': 'foo'}
if i < 1:
formdata.user_id = user1.id
elif i < 3:
formdata.user_id = user2.id
else:
formdata.user_id = superuser.id
formdata.jump_status('new')
formdata.store()
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/')
assert resp.text.count('<tr') == 10 + 1
# No value selected, no filtering
resp.forms['listing-settings']['filter-user'].checked = True
resp = resp.forms['listing-settings'].submit()
resp.forms['listing-settings']['filter-user-value'] = ''
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<tr') == 10 + 1
assert resp.text.count('"cell-user">userA<') == 1
assert resp.text.count('"cell-user">userB<') == 2
assert resp.text.count('"cell-user">admin<') == 7
resp.forms['save-custom-view']['title'] = 'custom test view'
resp = resp.forms['save-custom-view'].submit().follow()
assert resp.text.count('<tr') == 10 + 1
assert resp.text.count('"cell-user">userA<') == 1
assert resp.text.count('"cell-user">userB<') == 2
assert resp.text.count('"cell-user">admin<') == 7
# filter on current user
resp.forms['listing-settings']['filter-user-value'] = '__current__'
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<tr') == 7 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 7
resp = resp.forms['save-custom-view'].submit().follow()
assert resp.text.count('<tr') == 7 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 7
# filter on userA
resp = app.get(
'/backoffice/management/form-title/user-custom-test-view/?filter-user=on&filter-user-value=%s'
% user1.id
)
assert resp.text.count('<tr') == 1 + 1
assert resp.text.count('"cell-user">userA<') == 1
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 0
assert '<option value="%s" selected="selected">userA</option>' % user1.id in resp
resp = resp.forms['listing-settings'].submit()
resp = resp.forms['save-custom-view'].submit().follow()
assert resp.text.count('<tr') == 1 + 1
assert resp.text.count('"cell-user">userA<') == 1
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 0
# filter on unknown
resp = app.get(
'/backoffice/management/form-title/user-custom-test-view/?filter-user=on&filter-user-value=unknown'
)
assert resp.text.count('<tr') == 0 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 0
assert '<option value="unknown" selected="selected">Unknown</option>' in resp
resp = resp.forms['listing-settings'].submit()
resp = resp.forms['save-custom-view'].submit().follow()
assert resp.text.count('<tr') == 0 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 0
# filter on uuid - userB
user2.name_identifiers = ['0123456789']
user2.store()
resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-user-uuid=0123456789')
assert resp.text.count('<tr') == 2 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 2
assert resp.text.count('"cell-user">admin<') == 0
assert '<option value="%s" selected="selected">userB</option>' % user2.id in resp
resp = resp.forms['listing-settings'].submit()
resp = resp.forms['save-custom-view'].submit().follow()
assert resp.text.count('<tr') == 2 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 2
assert resp.text.count('"cell-user">admin<') == 0
# filter on uuid - current
resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-user-uuid=__current__')
assert resp.text.count('<tr') == 7 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 7
assert '<option value="__current__" selected="selected">Current user</option>' in resp
resp = resp.forms['listing-settings'].submit()
resp = resp.forms['save-custom-view'].submit().follow()
assert resp.text.count('<tr') == 7 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 7
# filter on uuid - unknown
resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-user-uuid=unknown')
assert resp.text.count('<tr') == 0 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 0
assert '<option value="-1" selected="selected">Unknown</option>' in resp
resp = resp.forms['listing-settings'].submit()
resp = resp.forms['save-custom-view'].submit().follow()
assert resp.text.count('<tr') == 0 + 1
assert resp.text.count('"cell-user">userA<') == 0
assert resp.text.count('"cell-user">userB<') == 0
assert resp.text.count('"cell-user">admin<') == 0
def test_backoffice_custom_view_delete(pub):
create_superuser(pub)

View File

@ -1285,7 +1285,7 @@ class FormPage(Directory):
fake_fields = [
FakeField('start', 'period-date', _('Start')),
FakeField('end', 'period-date', _('End')),
FakeField('user', 'user-id', _('User'), addable=False),
FakeField('user', 'user-id', _('User')),
FakeField('submission-agent', 'submission-agent-id', _('Submission Agent'), addable=False),
]
default_filters = self.get_default_filters(mode)
@ -1385,18 +1385,24 @@ class FormPage(Directory):
).render()
elif filter_field.type == 'user-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()
options = [
('', _('None'), ''),
('__current__', _('Current user'), '__current__'),
]
if filter_field_value and filter_field_value != '__current__':
try:
filtered_user = get_publisher().user_class.get(filter_field_value)
except KeyError:
filtered_user = None
filtered_user_value = filtered_user.display_name if filtered_user else _('Unknown')
options += [(filter_field_value, filtered_user_value, filter_field_value)]
r += SingleSelectWidget(
filter_field_key,
title=filter_field.label,
options=options,
value=filter_field_value,
render_br=False,
).render()
elif filter_field.type == 'submission-agent-id':
r += HiddenWidget(filter_field_key, value=filter_field_value).render()
@ -1869,8 +1875,12 @@ class FormPage(Directory):
filters_dict['filter-user-value'] = str(nameid_users[0].id)
request_form['filter-user-value'] = filters_dict['filter-user-value']
else:
filters_dict['filter-user-value'] = '-1'
request_form['filter-user-value'] = '-1'
filters_dict['filter-user-value'] = (
'__current__' if name_id == '__current__' else '-1'
)
request_form['filter-user-value'] = (
'__current__' if name_id == '__current__' else '-1'
)
if filter_field.type == 'submission-agent-id':
# convert uuid based filter into local id filter
@ -1915,6 +1925,8 @@ class FormPage(Directory):
criterias.append(LessOrEqual('last_update_time', filter_date_value))
criterias[-1]._label = '%s: %s' % (filter_field.label, filter_field_value)
elif filter_field.type == 'user-id':
if filter_field_value == '__current__' and get_request().user:
filter_field_value = str(get_request().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))