blocks: reset block errors when subwidget is prefilled (#48453)

This commit is contained in:
Frédéric Péters 2021-01-19 10:20:50 +01:00
parent eb60d7b514
commit 1db7d01f40
3 changed files with 16 additions and 0 deletions

View File

@ -412,6 +412,7 @@ def test_block_string_prefill(pub, blocks_feature):
resp = app.get(formdef.get_url())
resp.form['f1'] = 'Hello'
resp = resp.form.submit('submit') # -> 2nd page
assert not resp.pyquery('#form_error_f3') # not marked as error
assert resp.form['f3$element0$f123'].value == 'Hello World'
resp = resp.form.submit('submit') # -> validation page
resp = resp.form.submit('submit') # -> end page

View File

@ -284,6 +284,11 @@ class BlockWidget(WidgetList):
# database in JSON.
self.value['schema'] = {x.id: x.key for x in self.block.fields}
def unparse(self):
self._parsed = False
for widget in self.widgets:
widget._parsed = False
def parse(self, request=None):
if not self._parsed:
self._parsed = True

View File

@ -384,15 +384,25 @@ class FormPage(Directory, FormTemplateMixin):
v = field.convert_value_to_str(v)
widget.set_value(v)
widget.transfer_form_value(req)
if block:
# reset parent block if subwidget has changed; this
# prevents "required field" to be displayed on fields that
# have just been prefilled.
form.get_widget('f%s' % block.id).unparse()
form.get_widget('f%s' % block.id).clear_error()
if field.type == 'item' and v and widget.value != v:
# mark field as invalid if the value was not accepted
# (this is required by quixote>=3 as the value would
# not be evaluated in the initial GET request of the
# page).
widget.set_error(get_selection_error_text())
if locked:
widget.readonly = 'readonly'
widget.attrs['readonly'] = 'readonly'
had_prefill = True
return had_prefill