backoffice: fix filtering on backoffice item/s fields (#38627)

This commit is contained in:
Frédéric Péters 2019-12-18 15:56:58 +01:00
parent 81457aca77
commit 1c93f5325b
2 changed files with 79 additions and 2 deletions

View File

@ -832,6 +832,82 @@ def test_backoffice_item_double_filter(pub):
assert [x[0] for x in resp.form['filter-4-value'].options] == ['', 'a', 'b']
assert [x[0] for x in resp.form['filter-5-value'].options] == ['', 'A', 'B', 'C']
def test_backoffice_bofield_item_filter(pub):
create_superuser(pub)
create_environment(pub)
formdef = FormDef.get_by_urlname('form-title')
workflow = Workflow.get_default_workflow()
workflow.id = '2'
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
fields.ItemField(id='bo0-1', label='4th field', type='item',
items=['â', 'b', 'c', 'd'],
display_locations=['validation', 'summary', 'listings'])
]
workflow.store()
formdef.workflow_id = workflow.id
formdef.store()
for i, formdata in enumerate(formdef.data_class().select()):
if i%4 == 0:
formdata.data['bo0-1'] = 'â'
formdata.data['bo0-1_display'] = 'â'
elif i%4 == 1:
formdata.data['bo0-1'] = 'b'
formdata.data['bo0-1_display'] = 'b'
elif i%4 == 2:
formdata.data['bo0-1'] = 'd'
formdata.data['bo0-1_display'] = 'd'
formdata.store()
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/')
resp.form['filter-bo0-1'].checked = True
resp = resp.form.submit()
assert resp.form['filter-bo0-1-value'].value == ''
resp.form['filter-bo0-1-value'].value = 'â'
resp = resp.form.submit()
assert resp.text.count(u'<td>â</td>') > 0
assert resp.text.count(u'<td>b</td>') == 0
assert resp.text.count(u'<td>d</td>') == 0
resp.form['filter-bo0-1-value'].value = 'b'
resp = resp.form.submit()
assert resp.text.count(u'<td>â</td>') == 0
assert resp.text.count(u'<td>b</td>') > 0
assert resp.text.count(u'<td>d</td>') == 0
if not pub.is_using_postgresql():
# in pickle all options are always displayed
resp.form['filter-bo0-1-value'].value = 'c'
resp = resp.form.submit()
assert resp.text.count(u'<td>â</td>') == 0
assert resp.text.count(u'<td>b</td>') == 0
assert resp.text.count(u'<td>c</td>') == 0
else:
# in postgresql, option 'c' is never used so not even listed
with pytest.raises(ValueError):
resp.form['filter-bo0-1-value'].value = 'c'
# check json view used to fill select filters from javascript
resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=bo0-1&' + resp.request.query_string)
assert [x['id'] for x in resp2.json['data']] == [u'â', u'b', u'd']
resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=bo0-1&_search=d&' + resp.request.query_string)
assert [x['id'] for x in resp2.json['data']] == ['d']
for status in ('all', 'waiting', 'pending', 'done', 'accepted'):
resp.form['filter'] = status
resp = resp.form.submit()
resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=bo0-1&' + resp.request.query_string)
if status == 'accepted':
assert [x['id'] for x in resp2.json['data']] == []
else:
assert [x['id'] for x in resp2.json['data']] == [u'â', u'b', u'd']
def test_backoffice_items_filter(pub):
create_superuser(pub)
create_environment(pub)

View File

@ -1070,9 +1070,10 @@ class FormPage(Directory):
criterias.append(Contains('status', statuses))
else:
criterias.append(Equal('status', 'wf-%s' % selected_filter))
criterias.append(NotNull('f%s' % filter_field.id))
from wcs import sql
criterias.append(NotNull(sql.get_field_id(filter_field)))
options = self.formdef.data_class().select_distinct(
['f%s' % filter_field.id, 'f%s_display' % filter_field.id],
[sql.get_field_id(filter_field), '%s_display' % sql.get_field_id(filter_field)],
clause=criterias)
if filter_field.type == 'items':