misc: use None as empty checkboxes value (#75160) #1139

Merged
fpeters merged 1 commits from wip/75160-use-none-as-empty-checkboxes-value into main 2024-02-15 09:56:46 +01:00
3 changed files with 54 additions and 2 deletions

View File

@ -715,6 +715,58 @@ def test_block_multi_string_modify_prefill(pub):
assert resp.form['f3$element2$f123'].value == 'Bye World' # updated
def test_block_string_prefill_and_items(pub):
FormDef.wipe()
BlockDef.wipe()
block = BlockDef()
block.name = 'foobar'
block.fields = [
fields.StringField(
id='123',
required=True,
label='Test',
prefill={'type': 'string', 'value': '{{ form_var_foo }} World'},
),
fields.ItemsField(
id='234',
required=False,
label='Items',
items=['Pomme', 'Poire', 'Pêche', 'Abricot'],
),
]
block.store()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.StringField(id='1', label='string', varname='foo'),
fields.PageField(id='2', label='2nd page'),
fields.BlockField(id='3', label='test', block_slug='foobar', max_items=5),
]
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get(formdef.get_url())
resp.form['f1'] = 'Hello'
resp = resp.form.submit('submit') # -> 2nd page
assert resp.form['f3$element0$f123'].value == 'Hello World'
resp = resp.form.submit('f3$add_element') # add second row
assert resp.form['f3$element1$f123'].value == 'Hello World'
resp = resp.form.submit('f3$add_element') # add third row
assert resp.form['f3$element2$f123'].value == 'Hello World'
resp = resp.form.submit('submit') # -> validation page
resp = resp.form.submit('submit') # -> end page
resp = resp.follow()
formdata = formdef.data_class().select()[0]
assert formdata.data['3']['data'][0]['123'] == 'Hello World'
assert formdata.data['3']['data'][1]['123'] == 'Hello World'
assert formdata.data['3']['data'][2]['123'] == 'Hello World'
def test_workflow_form_block_prefill(pub):
FormDef.wipe()
BlockDef.wipe()

View File

@ -974,7 +974,7 @@ class WidgetField(Field):
)
def check_admin_form(self, form):
display_locations = form.get_widget('display_locations').parse()
display_locations = form.get_widget('display_locations').parse() or []
varname = form.get_widget('varname').parse()
if 'statistics' in display_locations and not varname:
form.set_error(

View File

@ -1871,7 +1871,7 @@ class CheckboxesWidget(Widget):
name = option['name']
if name in request.form and not request.form[name] in (False, '', 'False'):
values.append(option['value'])
self.value = values
self.value = values or None
if self.required and not self.value:
self.set_error(self.REQUIRED_ERROR)
if self.value and self.min_choices and len(self.value) < self.min_choices: