api: add filter-internal-id filter in /list endpoints (#59827)

This commit is contained in:
Lauréline Guérin 2021-12-17 11:41:39 +01:00
parent 3977675ee0
commit 3a1420eb29
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 52 additions and 1 deletions

View File

@ -793,6 +793,40 @@ def test_api_list_formdata_date_filter(pub, local_user):
assert len(resp.json) == 1
def test_api_list_formdata_internal_id_filter(pub, local_user):
pub.role_class.wipe()
role = pub.role_class(name='test')
role.store()
local_user.roles = [role.id]
local_user.store()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'test'
formdef.workflow_roles = {'_receiver': role.id}
formdef.fields = []
formdef.store()
data_class = formdef.data_class()
data_class.wipe()
for i in range(2):
formdata = data_class()
formdata.data = {}
formdata.user_id = local_user.id
formdata.just_created()
formdata.jump_status('new')
formdata.store()
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-internal-id=1', user=local_user))
assert len(resp.json) == 1
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-internal-id=2', user=local_user))
assert len(resp.json) == 1
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-internal-id=42', user=local_user))
assert len(resp.json) == 0
def test_api_list_formdata_block_field_filter(pub, local_user):
if not pub.is_using_postgresql():
pytest.skip('this requires SQL')

View File

@ -1002,7 +1002,17 @@ class FormPage(Directory):
)
def get_filterable_field_types(self):
types = ['string', 'email', 'item', 'bool', 'items', 'period-date', 'user-id', 'submission-agent-id']
types = [
'string',
'email',
'item',
'bool',
'items',
'internal-id',
'period-date',
'user-id',
'submission-agent-id',
]
if get_publisher().is_using_postgresql():
types.append('date')
return types
@ -1619,6 +1629,7 @@ class FormPage(Directory):
from wcs import sql
fake_fields = [
FakeField('internal-id', 'internal-id', _('Identifier')),
FakeField('start', 'period-date', _('Start')),
FakeField('end', 'period-date', _('End')),
FakeField('start-mtime', 'period-date', _('Start (modification time)')),
@ -1663,6 +1674,10 @@ class FormPage(Directory):
if filters_dict.get('filter-%s' % filter_field.contextual_varname):
filter_field_key = 'filter-%s' % filter_field.contextual_varname
if filter_field.type == 'internal-id' and filters_dict.get('filter-internal-id'):
# varname is 'internal_id' and not 'internal-id', fill filter-internal-id-value
filters_dict['filter-internal-id-value'] = filters_dict['filter-internal-id']
if filter_field.type == 'user-id':
# convert uuid based filter into local id filter
name_id = filters_dict.get('filter-user-uuid')
@ -1738,6 +1753,8 @@ class FormPage(Directory):
parent_field=filter_field.block_field,
)
)
elif filter_field.type == 'internal-id':
criterias.append(Equal('id', str(filter_field_value)))
elif filter_field.type == 'period-date':
try:
filter_date_value = misc.get_as_datetime(filter_field_value).timetuple()