Projet

Général

Profil

0001-api-backoffice-add-filter-on-user-40050.patch

Frédéric Péters, 25 avril 2020 18:43

Télécharger (9,02 ko)

Voir les différences:

Subject: [PATCH] api/backoffice: add filter on user (#40050)

 tests/test_backoffice_pages.py | 51 ++++++++++++++++++++++++++++++++++
 wcs/backoffice/management.py   | 45 ++++++++++++++++++++++++------
 2 files changed, 88 insertions(+), 8 deletions(-)
tests/test_backoffice_pages.py
1113 1113
    assert resp.text.count('<td>2015-05-12</td>') > 0
1114 1114

  
1115 1115

  
1116
def test_backoffice_user_filter(pub):
1117
    create_superuser(pub)
1118
    create_environment(pub)
1119
    formdef = FormDef.get_by_urlname('form-title')
1120
    formdef.store()
1121

  
1122
    user1 = pub.user_class(name='userA')
1123
    user1.store()
1124
    user2 = pub.user_class(name='userB')
1125
    user2.store()
1126

  
1127
    for i, formdata in enumerate(formdef.data_class().select()):
1128
        formdata.user_id = user1.id if bool(i % 2) else user2.id
1129
        formdata.store()
1130

  
1131
    app = login(get_app(pub))
1132
    resp = app.get('/backoffice/management/form-title/')
1133
    # check the filter is hidden
1134
    assert resp.pyquery.find('li[hidden] input[name=filter-user]')
1135

  
1136
    resp = app.get('/backoffice/management/form-title/?filter-user=on&filter-user-value=%s' % user1.id)
1137
    assert resp.text.count('>userA<') > 0
1138
    assert resp.text.count('>userB<') == 0
1139
    assert resp.pyquery.find('input[value=userA]')  # displayed in sidebar
1140
    # check it persits on filter changes
1141
    resp = resp.forms['listing-settings'].submit()
1142
    assert resp.text.count('>userA<') > 0
1143
    assert resp.text.count('>userB<') == 0
1144

  
1145
    resp = app.get('/backoffice/management/form-title/?filter-user=on&filter-user-value=%s' % user2.id)
1146
    assert resp.text.count('>userA<') == 0
1147
    assert resp.text.count('>userB<') > 0
1148

  
1149
    # filter on uuid
1150
    user1.name_identifiers = ['0123456789']
1151
    user1.store()
1152
    resp = app.get('/backoffice/management/form-title/?filter-user-uuid=0123456789')
1153
    assert resp.text.count('>userA<') > 0
1154
    assert resp.text.count('>userB<') == 0
1155
    assert resp.pyquery.find('input[value=userA]')  # displayed in sidebar
1156
    # check it persists on filter changes
1157
    resp = resp.forms['listing-settings'].submit()
1158
    assert resp.text.count('>userA<') > 0
1159
    assert resp.text.count('>userB<') == 0
1160

  
1161
    # check with unknown uuid
1162
    resp = app.get('/backoffice/management/form-title/?filter-user-uuid=XXX')
1163
    assert resp.text.count('>userA<') == 0
1164
    assert resp.text.count('>userB<') == 0
1165

  
1166

  
1116 1167
def test_backoffice_csv(pub):
1117 1168
    create_superuser(pub)
1118 1169
    create_environment(pub)
wcs/backoffice/management.py
1156 1156
                cls=misc.JSONEncoder)
1157 1157

  
1158 1158
    def get_filterable_field_types(self):
1159
        types = ['string', 'email', 'date', 'item', 'bool', 'items', 'period-date']
1159
        types = ['string', 'email', 'date', 'item', 'bool', 'items', 'period-date', 'user-id']
1160 1160
        if get_publisher().is_using_postgresql():
1161 1161
            types.append('date')
1162 1162
        return types
......
1165 1165
        r = TemplateIO(html=True)
1166 1166

  
1167 1167
        waitpoint_status = self.formdef.workflow.get_waitpoint_status()
1168
        period_fake_fields = [
1168
        fake_fields = [
1169 1169
            FakeField('start', 'period-date', _('Start')),
1170 1170
            FakeField('end', 'period-date', _('End')),
1171
            FakeField('user', 'user-id', _('User'), addable=False),
1171 1172
        ]
1172 1173
        default_filters = self.get_default_filters(mode)
1173 1174

  
1174 1175
        filter_fields = []
1175
        for field in period_fake_fields + self.get_formdef_fields():
1176
        for field in fake_fields + self.get_formdef_fields():
1176 1177
            field.enabled = False
1177 1178
            if field.type not in self.get_filterable_field_types() + ['status']:
1178 1179
                continue
......
1244 1245
                r += DateWidget(filter_field_key, title=filter_field.label,
1245 1246
                        value=filter_field_value, render_br=False).render()
1246 1247

  
1248
            elif filter_field.type == 'user-id':
1249
                r += HiddenWidget(filter_field_key, value=filter_field_value).render()
1250
                if filter_field_value:
1251
                    filtered_user = get_publisher().user_class.get(filter_field_value, ignore_errors=True)
1252
                    widget = StringWidget('_' + filter_field_key, title=filter_field.label,
1253
                            value=filtered_user.display_name if filtered_user else _('Unknown'),
1254
                            readonly=True, render_br=False)
1255
                    widget._parsed = True  # make sure value is not replaced by request query
1256
                    r += widget.render()
1257

  
1247 1258
            elif filter_field.type in ('item', 'items'):
1248 1259
                filter_field.required = False
1249 1260

  
......
1307 1318
        r += htmltext('<div style="display: none;">')
1308 1319
        r += htmltext('<ul id="field-filter">')
1309 1320
        for field in filter_fields:
1310
            r += htmltext('<li><input type="checkbox" name="filter-%s"') % field.id
1321
            addable = getattr(field, 'addable', True)
1322
            r += htmltext('<li %s>') % ('' if addable else 'hidden')
1323
            r += htmltext('<input type="checkbox" name="filter-%s"') % field.id
1311 1324
            if field.enabled:
1312 1325
                r += htmltext(' checked="checked"')
1313 1326
            r += htmltext(' id="fields-filter-%s"') % field.id
......
1526 1539
        return 'all'
1527 1540

  
1528 1541
    def get_criterias_from_query(self):
1529
        period_fake_fields = [
1542
        fake_fields = [
1530 1543
            FakeField('start', 'period-date', _('Start')),
1531 1544
            FakeField('end', 'period-date', _('End')),
1532 1545
            FakeField('start-mtime', 'period-date', _('Start (modification time)')),
1533 1546
            FakeField('end-mtime', 'period-date', _('End (modification time)')),
1547
            FakeField('user', 'user-id', _('User')),
1534 1548
        ]
1535
        filter_fields = []
1536 1549
        criterias = []
1537 1550

  
1538 1551
        filters_dict = {}
......
1540 1553
            filters_dict.update(self.view.get_filters_dict())
1541 1554
        filters_dict.update(get_request().form)
1542 1555

  
1543
        for filter_field in period_fake_fields + self.get_formdef_fields():
1556
        for filter_field in fake_fields + self.get_formdef_fields():
1544 1557
            if filter_field.type not in self.get_filterable_field_types():
1545 1558
                continue
1546 1559

  
......
1552 1565
                if filters_dict.get('filter-%s' % filter_field.varname):
1553 1566
                    filter_field_key = 'filter-%s' % filter_field.varname
1554 1567

  
1568
            if filter_field.type == 'user-id':
1569
                # convert uuid based filter into local id filter
1570
                name_id = filters_dict.get('filter-user-uuid')
1571
                if name_id:
1572
                    nameid_users = get_publisher().user_class.get_users_with_name_identifier(name_id)
1573
                    get_request().form['filter-user'] = filters_dict['filter-user'] = 'on'
1574
                    if nameid_users:
1575
                        filters_dict['filter-user-value'] = str(nameid_users[0].id)
1576
                        get_request().form['filter-user-value'] = filters_dict['filter-user-value']
1577
                    else:
1578
                        filters_dict['filter-user-value'] = '-1'
1579
                        get_request().form['filter-user-value'] = '-1'
1580

  
1555 1581
            if filters_dict.get('filter-%s' % filter_field.id):
1556 1582
                # if there's a filter-%(id)s, it is used to enable the actual
1557 1583
                # filter, and the value will be found in filter-%s-value.
......
1579 1605
                elif filter_field.id == 'end-mtime':
1580 1606
                    criterias.append(LessOrEqual('last_update_time', filter_date_value))
1581 1607
                criterias[-1]._label = '%s: %s' % (filter_field.label, filter_field_value)
1608
            elif filter_field.type == 'user-id':
1609
                criterias.append(Equal('user_id', filter_field_value))
1582 1610
            elif filter_field.type in ('item', 'items') and filter_field_value not in (None, 'None'):
1583 1611
                if filter_field.type == 'item':
1584 1612
                    criterias.append(Equal('f%s' % filter_field.id, filter_field_value))
......
2928 2956

  
2929 2957

  
2930 2958
class FakeField(object):
2931
    def __init__(self, id, type_, label):
2959
    def __init__(self, id, type_, label, addable=True):
2932 2960
        self.id = id
2933 2961
        self.type = type_
2934 2962
        self.label = label
2935 2963
        self.fake = True
2936 2964
        self.varname = id.replace('-', '_')
2937 2965
        self.store_display_value = None
2966
        self.addable = addable
2938 2967

  
2939 2968
    def get_view_value(self, value):
2940 2969
        # just here to quack like a duck
2941
-