general: convert date passed as query filter to expected format (#54428)

This commit is contained in:
Frédéric Péters 2021-06-15 09:25:57 +02:00
parent 7b25253cf9
commit 41edb59393
3 changed files with 48 additions and 2 deletions

View File

@ -683,6 +683,45 @@ def test_api_list_formdata(pub, local_user):
get_app(pub).get(sign_uri('/api/forms/test/list?filter=all&limit=plop', user=local_user), status=400)
def test_api_list_formdata_date_filter(pub, local_user):
if not pub.is_using_postgresql():
pytest.skip('this requires SQL')
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 = [
fields.DateField(id='0', label='foobar', varname='foobar', type='date'),
]
formdef.store()
data_class = formdef.data_class()
data_class.wipe()
for i in range(30):
formdata = data_class()
formdata.data = {'0': time.strptime('2021-06-%02d' % (i + 1), '%Y-%m-%d')}
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-foobar=2021-06-12', user=local_user))
assert len(resp.json) == 1
# alternate date format
resp = get_app(pub).get(sign_uri('/api/forms/test/list?filter-foobar=12/06/2021', user=local_user))
assert len(resp.json) == 1
def test_api_anonymized_formdata(pub, local_user, admin_user):
pub.role_class.wipe()
role = pub.role_class(name='test')

View File

@ -1982,7 +1982,12 @@ class FormPage(Directory):
elif filter_field.type in ('string', 'email') and filter_field_value is not None:
criterias.append(Equal('f%s' % filter_field.id, filter_field_value))
elif filter_field.type == 'date' and filter_field_value is not None:
criterias.append(Equal('f%s' % filter_field.id, filter_field_value))
try:
filter_field_value = misc.get_as_datetime(filter_field_value).date()
except ValueError:
pass
else:
criterias.append(Equal('f%s' % filter_field.id, filter_field_value))
return criterias

View File

@ -104,7 +104,9 @@ class Criteria(qommon.storage.Criteria):
return '%s %s %%(c%s)s' % (self.attribute, self.sql_op, id(self.value))
def as_sql_param(self):
if isinstance(self.value, time.struct_time):
if isinstance(self.value, datetime.date):
value = self.value.strftime('%Y-%m-%d')
elif isinstance(self.value, time.struct_time):
value = datetime.datetime.fromtimestamp(time.mktime(self.value))
else:
value = self.value