fields: record_error if computed field value has a bad type (#59786)
gitea-wip/wcs/pipeline/head Build started... Details

This commit is contained in:
Lauréline Guérin 2021-12-16 14:31:36 +01:00
parent 73237402b8
commit 76090c6863
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 90 additions and 2 deletions

View File

@ -688,7 +688,83 @@ def test_computed_field_with_bad_objects_filter_in_prefill(pub):
resp = get_app(pub).get('/test/')
assert 'XY' in resp.text
if pub.is_using_postgresql():
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert pub.loggederror_class.count() == 2
logged_error = pub.loggederror_class.select(order_by='id')[0]
assert logged_error.summary == 'wcs.carddef.CardDefDoesNotExist: unknown'
assert logged_error.formdef_id == formdef.id
logged_error = pub.loggederror_class.select(order_by='id')[1]
assert (
logged_error.summary
== 'Invalid value "{{ cards|objects:"unknown"|first|get:"form_number_raw"|default:"" }}" for field "computed"'
)
assert logged_error.formdef_id == formdef.id
def test_computed_field_with_bad_value_type_in_prefill(pub):
if pub.is_using_postgresql():
pub.loggederror_class.wipe()
CardDef.wipe()
FormDef.wipe()
carddef = CardDef()
carddef.name = 'items'
carddef.digest_templates = {'default': '{{form_var_name}}'}
carddef.fields = [
fields.StringField(id='0', label='string', varname='string'),
fields.BoolField(id='1', label='bool', varname='bool'),
]
carddef.store()
carddata = carddef.data_class().wipe()
carddata = carddef.data_class()()
carddata.data = {
'0': 'foo',
'1': True,
}
carddata.just_created()
carddata.store()
ds = {'type': 'carddef:%s' % carddef.url_name}
formdef = FormDef()
formdef.name = 'test'
formdef.fields = [
fields.ComputedField(
id='1',
label='computed',
varname='computed',
value_template='{{ cards|objects:"%s"|first|get:"form_number_raw"|default:"" }}'
% carddef.url_name,
freeze_on_initial_value=True,
data_source=ds,
),
fields.CommentField(id='2', label='X{{ form_var_computed_live_var_string }}Y', type='comment'),
]
formdef.store()
formdef.data_class().wipe()
resp = get_app(pub).get('/test/')
assert 'XfooY' in resp.text
formdef.fields[0].value_template = (
'{{ cards|objects:"%s"|first|get:"form_var_string"|default:"" }}' % carddef.url_name
)
formdef.store()
resp = get_app(pub).get('/test/')
assert 'XY' in resp.text
if pub.is_using_postgresql():
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == 'Invalid value "foo" for field "computed"'
assert logged_error.formdef_id == formdef.id
formdef.fields[0].value_template = (
'{{ cards|objects:"%s"|first|get:"form_var_bool"|default:"" }}' % carddef.url_name
)
formdef.store()
resp = get_app(pub).get('/test/')
assert 'XY' in resp.text
if pub.is_using_postgresql():
assert pub.loggederror_class.count() == 2
logged_error = pub.loggederror_class.select(order_by='id')[1]
assert logged_error.summary == 'Invalid value "True" for field "computed"'
assert logged_error.formdef_id == formdef.id

View File

@ -669,6 +669,18 @@ class FormPage(Directory, FormTemplateMixin):
continue
else:
value = get_publisher().get_cached_complex_data(value)
if (
field.data_source
and field.data_source.get('type')
and field.data_source['type'].startswith('carddef:')
):
try:
int(str(value))
except (TypeError, ValueError):
get_publisher().record_error(
_('Invalid value "%s" for field "%s"') % (value, field.varname),
)
computed_values[field.id] = value
mapped_computed_values['form_var_%s' % field.varname] = LazyFieldVarComputed(
{str(field.id): computed_values[field.id]}, field=field