0007-api-allow-formdata-sorting-on-varname-60706.patch
tests/api/test_formdata.py | ||
---|---|---|
627 | 627 |
formdata = data_class() |
628 | 628 |
upload = PicklableUpload('test.txt', 'text/plain', 'ascii') |
629 | 629 |
upload.receive([b'base64me']) |
630 |
formdata.data = {'0': 'FOO BAR %d' % i, '2': upload} |
|
630 |
formdata.data = {'0': 'FOO BAR %02d' % i, '2': upload}
|
|
631 | 631 |
formdata.user_id = local_user.id |
632 | 632 |
if i % 4 == 0: |
633 | 633 |
formdata.data['1'] = 'foo' |
... | ... | |
683 | 683 |
assert resp.json[0]['evolution'][0]['who']['id'] == local_user.id |
684 | 684 | |
685 | 685 |
assert all('status' in x['workflow'] for x in resp.json) |
686 |
assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 0'][0]['submission'][ |
|
686 |
assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 00'][0]['submission'][
|
|
687 | 687 |
'backoffice' |
688 | 688 |
] is True |
689 |
assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 0'][0]['submission'][ |
|
689 |
assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 00'][0]['submission'][
|
|
690 | 690 |
'channel' |
691 | 691 |
] == 'mail' |
692 |
assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 1'][0]['submission'][ |
|
692 |
assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 01'][0]['submission'][
|
|
693 | 693 |
'backoffice' |
694 | 694 |
] is False |
695 |
assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 1'][0]['submission']['channel'] == 'web' |
|
695 |
assert [x for x in resp.json if x['fields']['foobar'] == 'FOO BAR 01'][0]['submission'][ |
|
696 |
'channel' |
|
697 |
] == 'web' |
|
696 | 698 | |
697 | 699 |
# check filtered results |
698 | 700 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar3=foo', user=local_user)) |
... | ... | |
702 | 704 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar3=baz', user=local_user)) |
703 | 705 |
assert len(resp.json) == 14 |
704 | 706 | |
705 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar=FOO BAR 3', user=local_user)) |
|
707 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar=FOO BAR 03', user=local_user))
|
|
706 | 708 |
assert len(resp.json) == 1 |
707 | 709 | |
708 | 710 |
# check filter on status |
... | ... | |
765 | 767 |
get_app(pub).get(sign_uri('/api/forms/test/list?filter=all&offset=plop', user=local_user), status=400) |
766 | 768 |
get_app(pub).get(sign_uri('/api/forms/test/list?filter=all&limit=plop', user=local_user), status=400) |
767 | 769 | |
770 |
if pub.is_using_postgresql(): |
|
771 |
# just check ordering |
|
772 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=f0', user=local_user)) |
|
773 |
assert [d['fields']['foobar'] for d in resp.json] == ['FOO BAR %02d' % i for i in range(0, 30)] |
|
774 | ||
775 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=-f0', user=local_user)) |
|
776 |
assert [d['fields']['foobar'] for d in resp.json] == ['FOO BAR %02d' % i for i in range(29, -1, -1)] |
|
777 | ||
778 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=foobar', user=local_user)) |
|
779 |
assert [d['fields']['foobar'] for d in resp.json] == ['FOO BAR %02d' % i for i in range(0, 30)] |
|
780 | ||
781 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=-foobar', user=local_user)) |
|
782 |
assert [d['fields']['foobar'] for d in resp.json] == ['FOO BAR %02d' % i for i in range(29, -1, -1)] |
|
783 | ||
768 | 784 | |
769 | 785 |
def test_api_list_formdata_date_filter(pub, local_user): |
770 | 786 |
if not pub.is_using_postgresql(): |
... | ... | |
993 | 1009 |
) |
994 | 1010 |
assert len(resp.json) == 1 |
995 | 1011 | |
1012 |
# just check ordering |
|
1013 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=f0-1', user=local_user)) |
|
1014 |
assert [d['fields']['blockdata_raw'][0]['string'] for d in resp.json] == [ |
|
1015 |
'plop%s' % i for i in range(0, 10) |
|
1016 |
] |
|
1017 | ||
1018 |
resp = get_app(pub).get(sign_uri('/api/forms/test/list?full=on&order_by=-f0-1', user=local_user)) |
|
1019 |
assert [d['fields']['blockdata_raw'][0]['string'] for d in resp.json] == [ |
|
1020 |
'plop%s' % i for i in range(9, -1, -1) |
|
1021 |
] |
|
1022 | ||
1023 |
resp = get_app(pub).get( |
|
1024 |
sign_uri('/api/forms/test/list?full=on&order_by=blockdata_string', user=local_user) |
|
1025 |
) |
|
1026 |
assert [d['fields']['blockdata_raw'][0]['string'] for d in resp.json] == [ |
|
1027 |
'plop%s' % i for i in range(0, 10) |
|
1028 |
] |
|
1029 | ||
1030 |
resp = get_app(pub).get( |
|
1031 |
sign_uri('/api/forms/test/list?full=on&order_by=-blockdata_string', user=local_user) |
|
1032 |
) |
|
1033 |
assert [d['fields']['blockdata_raw'][0]['string'] for d in resp.json] == [ |
|
1034 |
'plop%s' % i for i in range(9, -1, -1) |
|
1035 |
] |
|
1036 | ||
996 | 1037 | |
997 | 1038 |
def test_api_anonymized_formdata(pub, local_user, admin_user): |
998 | 1039 |
pub.role_class.wipe() |
tests/backoffice_pages/test_sort.py | ||
---|---|---|
232 | 232 |
assert resp.text.index(formdata1_str) > resp.text.index(formdata4_str) |
233 | 233 | |
234 | 234 | |
235 |
def test_backoffice_varname_order(pub): |
|
236 |
pub.user_class.wipe() |
|
237 |
create_superuser(pub) |
|
238 |
pub.role_class.wipe() |
|
239 |
role = pub.role_class(name='test') |
|
240 |
role.store() |
|
241 | ||
242 |
FormDef.wipe() |
|
243 |
formdef = FormDef() |
|
244 |
formdef.name = 'form-title' |
|
245 |
formdef.fields = [ |
|
246 |
fields.StringField(id='1', label='Foo', type='string', varname='foo'), |
|
247 |
] |
|
248 |
formdef.workflow_roles = {'_receiver': role.id} |
|
249 |
formdef.store() |
|
250 | ||
251 |
data_class = formdef.data_class() |
|
252 |
data_class.wipe() |
|
253 | ||
254 |
formdata_ids = [] |
|
255 |
for i in range(0, 2): |
|
256 |
formdata = data_class() |
|
257 |
formdata.data = {'1': 'Bar %s' % i} |
|
258 |
formdata.just_created() |
|
259 |
formdata.jump_status('new') |
|
260 |
formdata.store() |
|
261 |
formdata_ids.append(formdata.id) |
|
262 | ||
263 |
app = login(get_app(pub)) |
|
264 |
resp = app.get('/backoffice/management/form-title/?order_by=f1') |
|
265 |
ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)] |
|
266 |
assert ids == formdata_ids |
|
267 | ||
268 |
resp = app.get('/backoffice/management/form-title/?order_by=-f1') |
|
269 |
ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)] |
|
270 |
assert ids == list(reversed(formdata_ids)) |
|
271 | ||
272 |
resp = app.get('/backoffice/management/form-title/?order_by=foo') |
|
273 |
ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)] |
|
274 |
assert ids == formdata_ids |
|
275 | ||
276 |
resp = app.get('/backoffice/management/form-title/?order_by=-foo') |
|
277 |
ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)] |
|
278 |
assert ids == list(reversed(formdata_ids)) |
|
279 | ||
280 | ||
235 | 281 |
def test_backoffice_block_columns_order(pub): |
236 | 282 |
pub.user_class.wipe() |
237 | 283 |
create_superuser(pub) |
... | ... | |
267 | 313 |
block.name = 'foobar' |
268 | 314 |
block.fields = [ |
269 | 315 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
270 |
fields.ItemField(id='456', label='card field', type='item', data_source={'type': 'carddef:foo'}), |
|
316 |
fields.ItemField( |
|
317 |
id='456', label='card field', type='item', data_source={'type': 'carddef:foo'}, varname='item' |
|
318 |
), |
|
271 | 319 |
] |
272 | 320 |
block.store() |
273 | 321 | |
... | ... | |
328 | 376 |
resp = app.get('/backoffice/management/form-title/?order_by=-f8-456') |
329 | 377 |
ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)] |
330 | 378 |
assert ids == [formdata3.id, formdata2.id, formdata1.id] |
379 | ||
380 |
resp = app.get('/backoffice/management/form-title/?order_by=data_item') |
|
381 |
ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)] |
|
382 |
assert ids == [formdata1.id, formdata2.id, formdata3.id] |
|
383 | ||
384 |
resp = app.get('/backoffice/management/form-title/?order_by=-data_item') |
|
385 |
ids = [int(x.strip('/')) for x in re.findall(r'data-link="(.*?)"', resp.text)] |
|
386 |
assert ids == [formdata3.id, formdata2.id, formdata1.id] |
wcs/forms/backoffice.py | ||
---|---|---|
220 | 220 |
def iter_fields(fields, block_field=None): |
221 | 221 |
for field in fields: |
222 | 222 |
field.contextual_id = field.id |
223 |
field.contextual_varname = None |
|
223 | 224 |
if block_field: |
224 | 225 |
if field.key == 'items': |
225 | 226 |
# not yet |
226 | 227 |
continue |
227 | 228 |
field.block_field = block_field |
228 | 229 |
field.contextual_id = '%s-%s' % (field.block_field.id, field.id) |
230 |
if field.varname and field.block_field.varname: |
|
231 |
field.contextual_varname = '%s_%s' % ( |
|
232 |
field.block_field.varname, |
|
233 |
field.varname, |
|
234 |
) |
|
235 |
else: |
|
236 |
field.contextual_varname = field.varname |
|
229 | 237 |
yield field |
230 | 238 |
if field.key == 'block': |
231 | 239 |
yield from iter_fields(field.block.fields, block_field=field) |
... | ... | |
236 | 244 |
if order_by.startswith('-'): |
237 | 245 |
order_by = order_by[1:] |
238 | 246 |
direction = '-' |
247 |
field_found = False |
|
239 | 248 |
for field in iter_fields(self.formdef.get_all_fields()): |
249 |
if order_by in [field.contextual_varname, 'f%s' % field.contextual_id]: |
|
250 |
field_found = True |
|
251 |
if field.contextual_varname == order_by: |
|
252 |
order_by = "f%s" % field.contextual_id |
|
240 | 253 |
if getattr(field, 'block_field', None) and 'f%s' % field.contextual_id == order_by: |
241 | 254 |
# field of block field, sort on the first element |
242 | 255 |
order_by = "f%s->'data'->0->>'%s'" % (field.block_field.id, field.id) |
256 |
if field_found: |
|
257 |
break |
|
243 | 258 |
order_by = '%s%s' % (direction, order_by) |
244 | 259 |
ordered_ids = formdata_class.get_sorted_ids(order_by, clause=criterias) |
245 | 260 |
item_ids_dict = {x: True for x in item_ids} |
246 |
- |