blocks: don't fail on creating a prefill block with unknown card (#88027)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2024-03-12 07:05:52 +01:00
parent f6e228b438
commit 4ba3ebf6b4
2 changed files with 92 additions and 1 deletions

View File

@ -2652,6 +2652,92 @@ def test_block_prefill_full_block_email(pub):
}
def test_block_prefill_full_block_card_item(pub):
FormDef.wipe()
BlockDef.wipe()
CardDef.wipe()
create_user(pub)
carddef = CardDef()
carddef.name = 'Test'
carddef.fields = [
fields.StringField(id='0', label='blah', varname='blah'),
]
carddef.digest_templates = {'default': '{{ form_var_blah|upper }}'}
carddef.store()
carddef.data_class().wipe()
carddata1 = carddef.data_class()()
carddata1.data = {'0': 'bar'}
carddata1.just_created()
carddata1.store()
block = BlockDef()
block.name = 'foobar'
block.fields = [
fields.ItemField(
id='123',
required=False,
hint='-----',
label='Test',
varname='plop',
data_source={'type': 'carddef:test'},
),
]
block.digest_template = '{{block_var_plop}}'
block.store()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.PageField(id='2', label='2nd page'),
fields.BlockField(
id='1',
label='test',
block_slug='foobar',
max_items=5,
prefill={
'type': 'string',
'value': '{% block_value plop="1" %}',
},
),
]
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
login(app, username='foo', password='foo')
resp = app.get(formdef.get_url())
resp = resp.form.submit('submit') # -> page 2
assert resp.form['f1$element0$f123'].value == '1'
resp = resp.form.submit('submit') # validation
resp = resp.form.submit('submit') # done
assert formdef.data_class().select()[0].data == {
'1': {
'data': [
{'123': '1', '123_display': 'BAR', '123_structured': {'blah': 'bar', 'id': 1, 'text': 'BAR'}}
],
'schema': {'123': 'item'},
},
'1_display': 'BAR',
}
# prefill with unknown value
pub.loggederror_class.wipe()
formdef.fields[2].prefill['value'] = '{% block_value plop="123" %}'
formdef.store()
formdef.data_class().wipe()
resp = app.get(formdef.get_url())
resp = resp.form.submit('submit') # -> page 2
assert not resp.form['f1$element0$f123'].value
assert pub.loggederror_class.count() == 1
assert (
pub.loggederror_class.select()[0].summary
== 'invalid value when creating block: unknown card value (\'123\')'
)
def test_block_titles_and_empty_block_on_summary_page(pub, emails):
FormDef.wipe()
BlockDef.wipe()

View File

@ -28,6 +28,7 @@ from wcs.qommon.ods import NS as OD_NS
from wcs.qommon.ods import clean_text as od_clean_text
from .base import SetValueError, WidgetField
from .item import UnknownCardValueError
class MissingBlockFieldError(Exception):
@ -67,7 +68,11 @@ class BlockRowValue:
sub_field.set_value(row_data, sub_value)
return row_data
row_data = make_row_data(self.attributes)
try:
row_data = make_row_data(self.attributes)
except UnknownCardValueError as e:
get_publisher().record_error(_('invalid value when creating block: %s') % str(e), exception=e)
return None
current_block_value = data.get(field.id)
if not self.check_current_value(current_block_value):