backoffice: extend submission agent filter (#57779)
gitea/wcs/pipeline/head Build queued... Details

This commit is contained in:
Frédéric Péters 2024-04-10 14:12:23 +02:00
parent 9f59c1277d
commit b924ee5744
3 changed files with 117 additions and 53 deletions

View File

@ -1428,50 +1428,100 @@ def test_backoffice_submission_agent_filter(pub):
# 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]')
assert resp.text.count('>userA</td>') > 0
assert resp.text.count('>userB</td>') > 0
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') == 2
assert resp.pyquery.find('input[value=userA]') # displayed in sidebar
# check it persits on filter changes
# enable submission-agent filter
resp.forms['listing-settings']['filter-submission-agent'].checked = True
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA<') > 0
assert resp.text.count('>userB<') == 0
assert resp.text.count('<tr') == 2
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') == 2
# check everything is still displayed
assert resp.forms['listing-settings']['filter-submission-agent-value'].value == ''
assert resp.text.count('>userA</td>') > 0
assert resp.text.count('>userB</td>') > 0
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') == 2
# check available filter values
assert [x.text for x in resp.pyquery('select[name="filter-submission-agent-value"] option')] == [
None,
'Current user',
'admin',
]
# add userA and userB to role for backoffice submission
user1.roles = user.roles
user1.store()
user2.roles = user.roles
user2.store()
# refresh
resp = resp.forms['listing-settings'].submit()
assert [x.text for x in resp.pyquery('select[name="filter-submission-agent-value"] option')] == [
None,
'Current user',
'admin',
'userA',
'userB',
]
resp.forms['listing-settings']['filter-submission-agent-value'].value = str(user1.id)
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA</td>') > 0
assert resp.text.count('>userB</td>') == 0
assert resp.pyquery('tbody tr').length == 1
# check it persists on filter changes
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA</td>') > 0
assert resp.text.count('>userB</td>') == 0
assert resp.pyquery('tbody tr').length == 1
resp.forms['listing-settings']['filter-submission-agent-value'].value = str(user2.id)
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA</td>') == 0
assert resp.text.count('>userB</td>') > 0
assert resp.pyquery('tbody tr').length == 1
# filter on current user
resp.forms['listing-settings']['filter-submission-agent-value'].value = '__current__'
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA</td>') == 0
assert resp.text.count('>userB</td>') == 0
assert resp.pyquery('tbody tr').length == 0
old_formdata_agent_id, formdata.submission_agent_id = formdata.submission_agent_id, user.id
formdata.store()
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA</td>') == 0
assert resp.text.count('>admin</td>') == 1
assert resp.pyquery('tbody tr').length == 1
# restore second formadata user
formdata.submission_agent_id = old_formdata_agent_id
formdata.store()
# filter on uuid
user1.name_identifiers = ['0123456789']
user1.store()
resp = app.get(base_url + '&filter-submission-agent-uuid=0123456789')
assert resp.text.count('>userA<') > 0
assert resp.text.count('>userB<') == 0
assert resp.pyquery.find('input[value=userA]') # displayed in sidebar
resp = app.get(
'/backoffice/management/form-title/?filter-submission-agent-uuid=0123456789&submission-agent=on'
)
assert resp.forms['listing-settings']['filter-submission-agent-value'].value == str(user1.id)
assert resp.text.count('>userA</td>') > 0
assert resp.text.count('>userB</td>') == 0
# check it persists 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('>userA</td>') > 0
assert resp.text.count('>userB</td>') == 0
# check with unknown uuid
resp = app.get(base_url + '&filter-submission-agent-uuid=XXX')
assert resp.text.count('>userA<') == 0
assert resp.text.count('>userB<') == 0
resp = app.get('/backoffice/management/form-title/?filter-submission-agent-uuid=XXX&submission-agent=on')
assert resp.forms['listing-settings']['filter-submission-agent-value'].value == '-1'
assert resp.text.count('>userA</td>') == 0
assert resp.text.count('>userB</td>') == 0
# check it persists on submits
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('>userA</td>') == 0
assert resp.text.count('>userB</td>') == 0
def test_workflow_function_filter(pub):

View File

@ -21,7 +21,8 @@ from quixote import get_publisher
from quixote.html import TemplateIO, htmltext
from wcs.qommon import _, misc, pgettext_lazy
from wcs.qommon.form import DateWidget, HiddenWidget, SingleSelectWidget, StringWidget
from wcs.qommon.form import DateWidget, SingleSelectWidget, StringWidget
from wcs.sql_criterias import ArrayContains, Or
def render_filter_widget(filter_widget, operators, filter_field_operator_key, filter_field_operator):
@ -398,25 +399,38 @@ class SubmissionAgentFilterField(FilterField):
id = 'submission-agent'
key = 'submission-agent'
label = _('Submission Agent')
available_for_filter = True
addable = False
@property
def available_for_filter(self):
return bool(self.formdef.backoffice_submission_roles)
def get_filter_widget(self, **kwargs):
r = TemplateIO(html=True)
filter_field_value = self.get_filter_field_value()
r += HiddenWidget(self.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(
'_' + self.filter_field_key,
title=self.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()
return r.getvalue()
options = [
('', '', ''),
('__current__', _('Current user'), '__current__'),
]
if filter_field_value == '-1':
# this happens when ?filter-submission-agent-uuid is given with an unknown uuid,
# an option for "invalid user" is added so refreshs or new filters won't reset
# this filter.
options.append(('-1', _('Invalid user'), '-1'))
options.extend(
[
(str(x.id), x.display_name, str(x.id))
for x in get_publisher().user_class.select(
[Or([ArrayContains('roles', [str(y)]) for y in self.formdef.backoffice_submission_roles])]
)
]
)
widget = SingleSelectWidget(
self.filter_field_key,
title=self.label,
options=options,
value=filter_field_value,
render_br=False,
)
return self.render_filter_widget(widget)
class SubmissionChannelFilterField(FilterField):

View File

@ -2133,7 +2133,7 @@ class FormPage(Directory, TempfileDirectoryMixin):
elif filter_field.id == 'end-mtime':
criterias.append(LessOrEqual('last_update_time', filter_date_value))
criterias[-1]._label = '%s: %s' % (filter_field.label, filter_field_value)
elif filter_field.key == 'user-id':
elif filter_field.key in ('submission-agent', 'user-id'):
if filter_field_value == '__current__':
context_vars = get_publisher().substitutions.get_context_variables(mode='lazy')
if request and request.is_in_backoffice() and context_vars.get('form'):
@ -2148,10 +2148,10 @@ class FormPage(Directory, TempfileDirectoryMixin):
filter_field_value = None
if filter_field_value in ('__current__', None):
criterias.append(Nothing())
else:
elif filter_field.key == 'user-id':
criterias.append(Equal('user_id', filter_field_value))
elif filter_field.key == 'submission-agent':
criterias.append(Equal('submission_agent_id', filter_field_value))
elif filter_field.key == 'submission-agent':
criterias.append(Equal('submission_agent_id', filter_field_value))
elif filter_field.key == 'user-function':
user_object = None
if ':' in filter_field_value: