blocks: do not mark with errors required fields of an empty block (#62694) #998

Merged
fpeters merged 1 commits from wip/62694-empty-optional-block-do-no-mark-required into main 2024-01-12 14:54:18 +01:00
3 changed files with 26 additions and 1 deletions

View File

@ -142,6 +142,28 @@ def test_block_required(pub):
resp = resp.form.submit('submit') # -> validation page
assert 'Check values then click submit.' in resp.text
# block not required, one subfield required, error on page
formdef.fields = [
fields.BlockField(id='1', label='test', block_slug='foobar', required=False),
fields.StringField(id='2', label='Foo', required=True),
]
formdef.store()
block.fields = [
fields.StringField(id='123', required=True, label='Test'),
fields.StringField(id='234', required=False, label='Test2'),
]
block.store()
resp = app.get(formdef.get_url())
resp = resp.form.submit('submit') # -> error page
# block was empty, subfield is not marked as required
assert resp.pyquery('.widget-with-error label').text() == 'Foo*'
resp = app.get(formdef.get_url())
resp.form['f1$element0$f234'] = 'bar'
resp = resp.form.submit('submit') # -> error page
# block was not empty, subfield is also marked as required
assert resp.pyquery('.widget-with-error label').text() == 'Test* Foo*'
def test_block_required_previous_page(pub):
FormDef.wipe()

View File

@ -388,7 +388,7 @@ def test_validation_item_field_inside_block(pub):
formdata.data['1'] = {'data': [{'1': None}]}
testdef = TestDef.create_from_formdata(formdef, formdata)
testdef.run(formdef)
assert testdef.missing_required_fields == ['Test']
assert testdef.missing_required_fields == ['foobar']
def test_validation_optional_field_inside_required_block(pub):

View File

@ -431,6 +431,9 @@ class BlockSubWidget(CompositeWidget):
empty = False
if empty and not all_lists and not get_publisher().keep_all_block_rows_mode:
value = None
for widget in self.get_widgets(): # reset "required" errors
if widget.error == self.REQUIRED_ERROR:
widget.clear_error()
self.value = value
def add_media(self):