Projet

Général

Profil

0001-custom-views-filter-by-current-user-50460.patch

Lauréline Guérin, 16 mars 2021 11:13

Télécharger (12,8 ko)

Voir les différences:

Subject: [PATCH] custom views: filter by current user (#50460)

 tests/backoffice_pages/test_all.py         |   6 +-
 tests/backoffice_pages/test_custom_view.py | 148 +++++++++++++++++++++
 wcs/backoffice/management.py               |  42 +++---
 3 files changed, 177 insertions(+), 19 deletions(-)
tests/backoffice_pages/test_all.py
1375 1375

  
1376 1376
    app = login(get_app(pub))
1377 1377
    resp = app.get('/backoffice/management/form-title/')
1378
    # check the filter is hidden
1379
    assert resp.pyquery.find('li[hidden] input[name=filter-user]')
1380 1378

  
1381 1379
    resp = app.get('/backoffice/management/form-title/?filter-user=on&filter-user-value=%s' % user1.id)
1382 1380
    assert resp.text.count('>userA<') > 0
1383 1381
    assert resp.text.count('>userB<') == 0
1384
    assert resp.pyquery.find('input[value=userA]')  # displayed in sidebar
1382
    assert '<option value="%s" selected="selected">userA</option>' % user1.id in resp
1385 1383
    # check it persits on filter changes
1386 1384
    resp = resp.forms['listing-settings'].submit()
1387 1385
    assert resp.text.count('>userA<') > 0
......
1397 1395
    resp = app.get('/backoffice/management/form-title/?filter-user-uuid=0123456789')
1398 1396
    assert resp.text.count('>userA<') > 0
1399 1397
    assert resp.text.count('>userB<') == 0
1400
    assert resp.pyquery.find('input[value=userA]')  # displayed in sidebar
1398
    assert '<option value="%s" selected="selected">userA</option>' % user1.id in resp
1401 1399
    # check it persists on filter changes
1402 1400
    resp = resp.forms['listing-settings'].submit()
1403 1401
    assert resp.text.count('>userA<') > 0
tests/backoffice_pages/test_custom_view.py
138 138
    assert 'Views must have at least one column.' in resp.text
139 139

  
140 140

  
141
def test_backoffice_custom_view_user_filter(pub):
142
    superuser = create_superuser(pub)
143

  
144
    FormDef.wipe()
145
    pub.custom_view_class.wipe()
146
    formdef = FormDef()
147
    formdef.name = 'form title'
148
    formdef.fields = [
149
        fields.ItemField(
150
            id='1',
151
            label='field',
152
            type='item',
153
            items=['foo', 'bar', 'baz'],
154
            display_locations=['validation', 'summary', 'listings'],
155
        ),
156
    ]
157
    formdef.workflow_roles = {'_receiver': 1}
158
    formdef.store()
159

  
160
    user1 = pub.user_class(name='userA')
161
    user1.store()
162
    user2 = pub.user_class(name='userB')
163
    user2.store()
164

  
165
    formdef.data_class().wipe()
166
    for i in range(10):
167
        formdata = formdef.data_class()()
168
        formdata.data = {'1': 'foo', '1_display': 'foo'}
169
        if i < 1:
170
            formdata.user_id = user1.id
171
        elif i < 3:
172
            formdata.user_id = user2.id
173
        else:
174
            formdata.user_id = superuser.id
175
        formdata.jump_status('new')
176
        formdata.store()
177

  
178
    app = login(get_app(pub))
179
    resp = app.get('/backoffice/management/form-title/')
180
    assert resp.text.count('<tr') == 10 + 1
181

  
182
    # No value selected, no filtering
183
    resp.forms['listing-settings']['filter-user'].checked = True
184
    resp = resp.forms['listing-settings'].submit()
185
    resp.forms['listing-settings']['filter-user-value'] = ''
186
    resp = resp.forms['listing-settings'].submit()
187
    assert resp.text.count('<tr') == 10 + 1
188
    assert resp.text.count('"cell-user">userA<') == 1
189
    assert resp.text.count('"cell-user">userB<') == 2
190
    assert resp.text.count('"cell-user">admin<') == 7
191
    resp.forms['save-custom-view']['title'] = 'custom test view'
192
    resp = resp.forms['save-custom-view'].submit().follow()
193
    assert resp.text.count('<tr') == 10 + 1
194
    assert resp.text.count('"cell-user">userA<') == 1
195
    assert resp.text.count('"cell-user">userB<') == 2
196
    assert resp.text.count('"cell-user">admin<') == 7
197

  
198
    # filter on current user
199
    resp.forms['listing-settings']['filter-user-value'] = '__current__'
200
    resp = resp.forms['listing-settings'].submit()
201
    assert resp.text.count('<tr') == 7 + 1
202
    assert resp.text.count('"cell-user">userA<') == 0
203
    assert resp.text.count('"cell-user">userB<') == 0
204
    assert resp.text.count('"cell-user">admin<') == 7
205
    resp = resp.forms['save-custom-view'].submit().follow()
206
    assert resp.text.count('<tr') == 7 + 1
207
    assert resp.text.count('"cell-user">userA<') == 0
208
    assert resp.text.count('"cell-user">userB<') == 0
209
    assert resp.text.count('"cell-user">admin<') == 7
210

  
211
    # filter on userA
212
    resp = app.get(
213
        '/backoffice/management/form-title/user-custom-test-view/?filter-user=on&filter-user-value=%s'
214
        % user1.id
215
    )
216
    assert resp.text.count('<tr') == 1 + 1
217
    assert resp.text.count('"cell-user">userA<') == 1
218
    assert resp.text.count('"cell-user">userB<') == 0
219
    assert resp.text.count('"cell-user">admin<') == 0
220
    assert '<option value="%s" selected="selected">userA</option>' % user1.id in resp
221
    resp = resp.forms['listing-settings'].submit()
222
    resp = resp.forms['save-custom-view'].submit().follow()
223
    assert resp.text.count('<tr') == 1 + 1
224
    assert resp.text.count('"cell-user">userA<') == 1
225
    assert resp.text.count('"cell-user">userB<') == 0
226
    assert resp.text.count('"cell-user">admin<') == 0
227

  
228
    # filter on unknown
229
    resp = app.get(
230
        '/backoffice/management/form-title/user-custom-test-view/?filter-user=on&filter-user-value=unknown'
231
    )
232
    assert resp.text.count('<tr') == 0 + 1
233
    assert resp.text.count('"cell-user">userA<') == 0
234
    assert resp.text.count('"cell-user">userB<') == 0
235
    assert resp.text.count('"cell-user">admin<') == 0
236
    assert '<option value="unknown" selected="selected">Unknown</option>' in resp
237
    resp = resp.forms['listing-settings'].submit()
238
    resp = resp.forms['save-custom-view'].submit().follow()
239
    assert resp.text.count('<tr') == 0 + 1
240
    assert resp.text.count('"cell-user">userA<') == 0
241
    assert resp.text.count('"cell-user">userB<') == 0
242
    assert resp.text.count('"cell-user">admin<') == 0
243

  
244
    # filter on uuid - userB
245
    user2.name_identifiers = ['0123456789']
246
    user2.store()
247
    resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-user-uuid=0123456789')
248
    assert resp.text.count('<tr') == 2 + 1
249
    assert resp.text.count('"cell-user">userA<') == 0
250
    assert resp.text.count('"cell-user">userB<') == 2
251
    assert resp.text.count('"cell-user">admin<') == 0
252
    assert '<option value="%s" selected="selected">userB</option>' % user2.id in resp
253
    resp = resp.forms['listing-settings'].submit()
254
    resp = resp.forms['save-custom-view'].submit().follow()
255
    assert resp.text.count('<tr') == 2 + 1
256
    assert resp.text.count('"cell-user">userA<') == 0
257
    assert resp.text.count('"cell-user">userB<') == 2
258
    assert resp.text.count('"cell-user">admin<') == 0
259

  
260
    # filter on uuid - current
261
    resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-user-uuid=__current__')
262
    assert resp.text.count('<tr') == 7 + 1
263
    assert resp.text.count('"cell-user">userA<') == 0
264
    assert resp.text.count('"cell-user">userB<') == 0
265
    assert resp.text.count('"cell-user">admin<') == 7
266
    assert '<option value="__current__" selected="selected">Current user</option>' in resp
267
    resp = resp.forms['listing-settings'].submit()
268
    resp = resp.forms['save-custom-view'].submit().follow()
269
    assert resp.text.count('<tr') == 7 + 1
270
    assert resp.text.count('"cell-user">userA<') == 0
271
    assert resp.text.count('"cell-user">userB<') == 0
272
    assert resp.text.count('"cell-user">admin<') == 7
273

  
274
    # filter on uuid - unknown
275
    resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-user-uuid=unknown')
276
    assert resp.text.count('<tr') == 0 + 1
277
    assert resp.text.count('"cell-user">userA<') == 0
278
    assert resp.text.count('"cell-user">userB<') == 0
279
    assert resp.text.count('"cell-user">admin<') == 0
280
    assert '<option value="-1" selected="selected">Unknown</option>' in resp
281
    resp = resp.forms['listing-settings'].submit()
282
    resp = resp.forms['save-custom-view'].submit().follow()
283
    assert resp.text.count('<tr') == 0 + 1
284
    assert resp.text.count('"cell-user">userA<') == 0
285
    assert resp.text.count('"cell-user">userB<') == 0
286
    assert resp.text.count('"cell-user">admin<') == 0
287

  
288

  
141 289
def test_backoffice_custom_view_delete(pub):
142 290
    create_superuser(pub)
143 291

  
wcs/backoffice/management.py
1274 1274
        fake_fields = [
1275 1275
            FakeField('start', 'period-date', _('Start')),
1276 1276
            FakeField('end', 'period-date', _('End')),
1277
            FakeField('user', 'user-id', _('User'), addable=False),
1277
            FakeField('user', 'user-id', _('User')),
1278 1278
            FakeField('submission-agent', 'submission-agent-id', _('Submission Agent'), addable=False),
1279 1279
        ]
1280 1280
        default_filters = self.get_default_filters(mode)
......
1374 1374
                ).render()
1375 1375

  
1376 1376
            elif filter_field.type == 'user-id':
1377
                r += HiddenWidget(filter_field_key, value=filter_field_value).render()
1378
                if filter_field_value:
1379
                    filtered_user = get_publisher().user_class.get(filter_field_value, ignore_errors=True)
1380
                    widget = StringWidget(
1381
                        '_' + filter_field_key,
1382
                        title=filter_field.label,
1383
                        value=filtered_user.display_name if filtered_user else _('Unknown'),
1384
                        readonly=True,
1385
                        render_br=False,
1386
                    )
1387
                    widget._parsed = True  # make sure value is not replaced by request query
1388
                    r += widget.render()
1377
                options = [
1378
                    ('', _('None'), ''),
1379
                    ('__current__', _('Current user'), '__current__'),
1380
                ]
1381
                if filter_field_value and filter_field_value != '__current__':
1382
                    try:
1383
                        filtered_user = get_publisher().user_class.get(filter_field_value)
1384
                    except KeyError:
1385
                        filtered_user = None
1386
                    filtered_user_value = filtered_user.display_name if filtered_user else _('Unknown')
1387
                    options += [(filter_field_value, filtered_user_value, filter_field_value)]
1388
                r += SingleSelectWidget(
1389
                    filter_field_key,
1390
                    title=filter_field.label,
1391
                    options=options,
1392
                    value=filter_field_value,
1393
                    render_br=False,
1394
                ).render()
1389 1395

  
1390 1396
            elif filter_field.type == 'submission-agent-id':
1391 1397
                r += HiddenWidget(filter_field_key, value=filter_field_value).render()
......
1858 1864
                        filters_dict['filter-user-value'] = str(nameid_users[0].id)
1859 1865
                        request_form['filter-user-value'] = filters_dict['filter-user-value']
1860 1866
                    else:
1861
                        filters_dict['filter-user-value'] = '-1'
1862
                        request_form['filter-user-value'] = '-1'
1867
                        filters_dict['filter-user-value'] = (
1868
                            '__current__' if name_id == '__current__' else '-1'
1869
                        )
1870
                        request_form['filter-user-value'] = (
1871
                            '__current__' if name_id == '__current__' else '-1'
1872
                        )
1863 1873

  
1864 1874
            if filter_field.type == 'submission-agent-id':
1865 1875
                # convert uuid based filter into local id filter
......
1904 1914
                    criterias.append(LessOrEqual('last_update_time', filter_date_value))
1905 1915
                criterias[-1]._label = '%s: %s' % (filter_field.label, filter_field_value)
1906 1916
            elif filter_field.type == 'user-id':
1917
                if filter_field_value == '__current__' and get_request().user:
1918
                    filter_field_value = str(get_request().user.id)
1907 1919
                criterias.append(Equal('user_id', filter_field_value))
1908 1920
            elif filter_field.type == 'submission-agent-id':
1909 1921
                criterias.append(Equal('submission_agent_id', filter_field_value))
1910
-