Projet

Général

Profil

0001-api-backoffice-add-exact-filters-on-string-email-and.patch

Frédéric Péters, 24 avril 2020 15:39

Télécharger (10,2 ko)

Voir les différences:

Subject: [PATCH] api/backoffice: add (exact) filters on string, email and date
 fields (#41910)

 tests/test_api.py                   |   7 +-
 tests/test_backoffice_pages.py      | 102 ++++++++++++++++++++++++++++
 wcs/backoffice/management.py        |  25 ++++++-
 wcs/qommon/static/js/wcs.listing.js |   4 +-
 4 files changed, 131 insertions(+), 7 deletions(-)
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
-