0001-api-backoffice-add-exact-filters-on-string-email-and.patch
tests/test_api.py | ||
---|---|---|
1665 | 1665 |
formdef.name = 'test' |
1666 | 1666 |
formdef.workflow_roles = {'_receiver': role.id} |
1667 | 1667 |
formdef.fields = [ |
1668 |
fields.StringField(id='0', label='foobar', varname='foobar'), |
|
1668 |
fields.StringField(id='0', label='foobar', varname='foobar', type='string'),
|
|
1669 | 1669 |
fields.ItemField(id='1', label='foobar3', varname='foobar3', type='item', |
1670 | 1670 |
items=['foo', 'bar', 'baz']), |
1671 |
fields.FileField(id='2', label='foobar4', varname='file'), |
|
1671 |
fields.FileField(id='2', label='foobar4', varname='file', type='file'),
|
|
1672 | 1672 |
] |
1673 | 1673 |
formdef.store() |
1674 | 1674 | |
... | ... | |
1747 | 1747 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar3=baz', user=local_user)) |
1748 | 1748 |
assert len(resp.json) == 14 |
1749 | 1749 | |
1750 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar=FOO BAR 3', user=local_user)) |
|
1751 |
assert len(resp.json) == 1 |
|
1752 | ||
1750 | 1753 |
# check filter on status |
1751 | 1754 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter=pending', user=local_user)) |
1752 | 1755 |
assert len(resp.json) == 20 |
tests/test_backoffice_pages.py | ||
---|---|---|
1011 | 1011 |
assert resp.text.count('data-link') == 0 # no rows |
1012 | 1012 | |
1013 | 1013 | |
1014 |
def test_backoffice_string_filter(pub): |
|
1015 |
create_superuser(pub) |
|
1016 |
create_environment(pub) |
|
1017 |
formdef = FormDef.get_by_urlname('form-title') |
|
1018 |
formdef.fields.append(fields.StringField(id='4', label='4th field', |
|
1019 |
type='string', |
|
1020 |
display_locations=['validation', 'summary', 'listings'])) |
|
1021 |
formdef.store() |
|
1022 | ||
1023 |
for i, formdata in enumerate(formdef.data_class().select()): |
|
1024 |
formdata.data['4'] = 'a' if bool(i % 2) else 'b' |
|
1025 |
formdata.store() |
|
1026 | ||
1027 |
app = login(get_app(pub)) |
|
1028 |
resp = app.get('/backoffice/management/form-title/') |
|
1029 |
resp.forms['listing-settings']['filter-4'].checked = True |
|
1030 |
resp = resp.forms['listing-settings'].submit() |
|
1031 | ||
1032 |
assert resp.forms['listing-settings']['filter-4-value'].value == '' |
|
1033 | ||
1034 |
resp.forms['listing-settings']['filter-4-value'].value = 'a' |
|
1035 |
resp = resp.forms['listing-settings'].submit() |
|
1036 |
assert resp.text.count('<td>a</td>') > 0 |
|
1037 |
assert resp.text.count('<td>b</td>') == 0 |
|
1038 | ||
1039 |
resp.forms['listing-settings']['filter-4-value'].value = 'b' |
|
1040 |
resp = resp.forms['listing-settings'].submit() |
|
1041 |
assert resp.text.count('<td>a</td>') == 0 |
|
1042 |
assert resp.text.count('<td>b</td>') > 0 |
|
1043 | ||
1044 | ||
1045 |
def test_backoffice_email_filter(pub): |
|
1046 |
create_superuser(pub) |
|
1047 |
create_environment(pub) |
|
1048 |
formdef = FormDef.get_by_urlname('form-title') |
|
1049 |
formdef.fields.append(fields.EmailField(id='4', label='4th field', |
|
1050 |
type='email', |
|
1051 |
display_locations=['validation', 'summary', 'listings'])) |
|
1052 |
formdef.store() |
|
1053 | ||
1054 |
for i, formdata in enumerate(formdef.data_class().select()): |
|
1055 |
formdata.data['4'] = 'a@localhost' if bool(i % 2) else 'b@localhost' |
|
1056 |
formdata.store() |
|
1057 | ||
1058 |
app = login(get_app(pub)) |
|
1059 |
resp = app.get('/backoffice/management/form-title/') |
|
1060 |
resp.forms['listing-settings']['filter-4'].checked = True |
|
1061 |
resp = resp.forms['listing-settings'].submit() |
|
1062 | ||
1063 |
assert resp.forms['listing-settings']['filter-4-value'].value == '' |
|
1064 | ||
1065 |
resp.forms['listing-settings']['filter-4-value'].value = 'a@localhost' |
|
1066 |
resp = resp.forms['listing-settings'].submit() |
|
1067 |
assert resp.text.count('>a@localhost</') > 0 |
|
1068 |
assert resp.text.count('>b@localhost</') == 0 |
|
1069 | ||
1070 |
resp.forms['listing-settings']['filter-4-value'].value = 'b@localhost' |
|
1071 |
resp = resp.forms['listing-settings'].submit() |
|
1072 |
assert resp.text.count('>a@localhost</') == 0 |
|
1073 |
assert resp.text.count('>b@localhost</') > 0 |
|
1074 | ||
1075 | ||
1076 |
def test_backoffice_date_filter(pub): |
|
1077 |
if not pub.is_using_postgresql(): |
|
1078 |
pytest.skip('this requires SQL') |
|
1079 |
return |
|
1080 |
create_superuser(pub) |
|
1081 |
create_environment(pub) |
|
1082 |
formdef = FormDef.get_by_urlname('form-title') |
|
1083 |
formdef.fields.append(fields.DateField(id='4', label='4th field', |
|
1084 |
type='date', |
|
1085 |
display_locations=['validation', 'summary', 'listings'])) |
|
1086 |
formdef.store() |
|
1087 | ||
1088 |
for i, formdata in enumerate(formdef.data_class().select()): |
|
1089 |
formdata.data['4'] = time.strptime('2020-04-24' if bool(i % 2) else '2015-05-12', '%Y-%m-%d') |
|
1090 |
formdata.store() |
|
1091 | ||
1092 |
app = login(get_app(pub)) |
|
1093 |
resp = app.get('/backoffice/management/form-title/') |
|
1094 |
resp.forms['listing-settings']['filter-4'].checked = True |
|
1095 |
resp = resp.forms['listing-settings'].submit() |
|
1096 | ||
1097 |
assert resp.forms['listing-settings']['filter-4-value'].value == '' |
|
1098 | ||
1099 |
resp.forms['listing-settings']['filter-4-value'].value = '2020-04-24' |
|
1100 |
resp = resp.forms['listing-settings'].submit() |
|
1101 |
assert resp.text.count('<td>2020-04-24</td>') > 0 |
|
1102 |
assert resp.text.count('<td>2015-05-12</td>') == 0 |
|
1103 | ||
1104 |
resp.forms['listing-settings']['filter-4-value'].value = '2015-05-12' |
|
1105 |
resp = resp.forms['listing-settings'].submit() |
|
1106 |
assert resp.text.count('<td>2020-04-24</td>') == 0 |
|
1107 |
assert resp.text.count('<td>2015-05-12</td>') > 0 |
|
1108 | ||
1109 |
# date in a different format |
|
1110 |
resp.forms['listing-settings']['filter-4-value'].value = '12/05/2015' |
|
1111 |
resp = resp.forms['listing-settings'].submit() |
|
1112 |
assert resp.text.count('<td>2020-04-24</td>') == 0 |
|
1113 |
assert resp.text.count('<td>2015-05-12</td>') > 0 |
|
1114 | ||
1115 | ||
1014 | 1116 |
def test_backoffice_csv(pub): |
1015 | 1117 |
create_superuser(pub) |
1016 | 1118 |
create_environment(pub) |
wcs/backoffice/management.py | ||
---|---|---|
1155 | 1155 |
return json.dumps({'err': 0, 'data': [{'id': x[0], 'text': x[1]} for x in options]}, |
1156 | 1156 |
cls=misc.JSONEncoder) |
1157 | 1157 | |
1158 |
def get_filterable_field_types(self): |
|
1159 |
types = ['string', 'email', 'date', 'item', 'bool', 'items', 'period-date'] |
|
1160 |
if get_publisher().is_using_postgresql(): |
|
1161 |
types.append('date') |
|
1162 |
return types |
|
1163 | ||
1158 | 1164 |
def get_filter_sidebar(self, selected_filter=None, mode='listing', query=None, criterias=None): |
1159 | 1165 |
r = TemplateIO(html=True) |
1160 | 1166 | |
... | ... | |
1168 | 1174 |
filter_fields = [] |
1169 | 1175 |
for field in period_fake_fields + self.get_formdef_fields(): |
1170 | 1176 |
field.enabled = False |
1171 |
if field.type not in ('item', 'bool', 'items', 'period-date', 'status'):
|
|
1177 |
if field.type not in self.get_filterable_field_types() + ['status']:
|
|
1172 | 1178 |
continue |
1173 | 1179 |
if field.type == 'status' and not waitpoint_status: |
1174 | 1180 |
continue |
1175 | 1181 |
filter_fields.append(field) |
1176 | 1182 | |
1177 | 1183 |
if get_request().form: |
1178 |
field.enabled = 'filter-%s' % field.id in get_request().form |
|
1184 |
field.enabled = ('filter-%s' % field.id in get_request().form) or ( |
|
1185 |
'filter-%s' % field.varname in get_request().form) |
|
1179 | 1186 |
else: |
1180 | 1187 |
field.enabled = (field.id in default_filters) |
1181 | 1188 |
if not self.view and field.type in ('item', 'items'): |
... | ... | |
1288 | 1295 |
options=options, value=filter_field_value, |
1289 | 1296 |
render_br=False).render() |
1290 | 1297 | |
1298 |
elif filter_field.type in ('string', 'email'): |
|
1299 |
r += StringWidget(filter_field_key, title=filter_field.label, |
|
1300 |
value=filter_field_value, render_br=False).render() |
|
1301 | ||
1302 |
elif filter_field.type == 'date': |
|
1303 |
r += DateWidget(filter_field_key, title=filter_field.label, |
|
1304 |
value=filter_field_value, render_br=False).render() |
|
1305 | ||
1291 | 1306 |
# field filter dialog content |
1292 | 1307 |
r += htmltext('<div style="display: none;">') |
1293 | 1308 |
r += htmltext('<ul id="field-filter">') |
... | ... | |
1526 | 1541 |
filters_dict.update(get_request().form) |
1527 | 1542 | |
1528 | 1543 |
for filter_field in period_fake_fields + self.get_formdef_fields(): |
1529 |
if filter_field.type not in ('item', 'bool', 'items', 'period-date'):
|
|
1544 |
if filter_field.type not in self.get_filterable_field_types():
|
|
1530 | 1545 |
continue |
1531 | 1546 | |
1532 | 1547 |
filter_field_key = None |
... | ... | |
1581 | 1596 |
criterias.append(Equal('f%s' % filter_field.id, True)) |
1582 | 1597 |
elif filter_field_value == 'false': |
1583 | 1598 |
criterias.append(Equal('f%s' % filter_field.id, False)) |
1599 |
elif filter_field.type in ('string', 'email') and filter_field_value not in (None, 'None'): |
|
1600 |
criterias.append(Equal('f%s' % filter_field.id, filter_field_value)) |
|
1601 |
elif filter_field.type == 'date' and filter_field_value not in (None, 'None'): |
|
1602 |
criterias.append(Equal('f%s' % filter_field.id, filter_field_value)) |
|
1584 | 1603 | |
1585 | 1604 |
return criterias |
1586 | 1605 |
wcs/qommon/static/js/wcs.listing.js | ||
---|---|---|
314 | 314 |
return false; |
315 | 315 |
}); |
316 | 316 | |
317 |
/* automatically refresh on filter change */
|
|
318 |
$('form#listing-settings select').change(function() { |
|
317 |
/* automatically refresh onfilter change */ |
|
318 |
$('form#listing-settings input[type=date], form#listing-settings input[type=text], form#listing-settings select').change(function() {
|
|
319 | 319 |
$('form#listing-settings').submit(); |
320 | 320 |
}); |
321 | 321 |
/* partial table refresh */ |
322 |
- |