forms: remove extraneous empty table rows (#11045)

This commit is contained in:
Frédéric Péters 2016-05-25 16:34:53 +02:00
parent 3438972bac
commit 53420efd4b
2 changed files with 48 additions and 0 deletions

View File

@ -841,6 +841,42 @@ def test_form_multi_page_post_conditions(pub):
resp = resp.forms[0].submit('submit')
assert 'Check values then click submit.' in resp.body
def test_form_multi_page_table_with_rows(pub):
formdef = create_formdef()
formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
fields.PageField(id='2', label='2nd page', type='page'),
fields.TableRowsField(id='1', label='table', columns=['a', 'b'])
]
formdef.store()
page = get_app(pub).get('/test/')
formdef.data_class().wipe()
page = page.form.submit('submit')
page.form['f1$element0$col0'] = 'bar1'
page.form['f1$element1$col0'] = 'bar2'
page.form['f1$element2$col0'] = 'bar3'
page.form['f1$element3$col0'] = 'bar4'
page.form['f1$element4$col0'] = 'bar5'
page = page.form.submit('f1$add_element')
assert not 'Check values then click submit.' in page.body
page.form['f1$element5$col0'] = 'bar6'
page = page.form.submit('f1$add_element')
assert not 'Check values then click submit.' in page.body
page.form['f1$element6$col0'] = 'bar7'
page = page.form.submit('submit')
assert 'Check values then click submit.' in page.body
page = page.forms[0].submit('previous')
page = page.forms[0].submit('submit')
assert 'Check values then click submit.' in page.body
assert not 'f1$element7$col0' in page.body
page = page.forms[0].submit('submit')
assert page.status_int == 302
page = page.follow()
assert 'The form has been recorded' in page.body
assert formdef.data_class().count() == 1
data_id = formdef.data_class().select()[0].id
data = formdef.data_class().get(data_id)
assert data.data == {'1': [['bar%s' % x, ''] for x in range(1, 8)]}
def test_form_submit_with_user(pub, emails):
create_user(pub)
formdef = create_formdef()

View File

@ -1604,6 +1604,18 @@ class TableListRowsWidget(WidgetListAsTable):
self.set_value(value)
# WidgetList.__init__ added as many extra rows as what there is in
# name$added_elements, but this is on top of the existing rows,
# making it quite an unnecessary number of empty rows.
# fixup this so that we don't have more than one empty row.
if value:
for i, element_name in enumerate(self.element_names[:]):
if i < len(value):
continue
self.element_names.remove(element_name)
self.widgets.remove(self.get_widget(element_name))
del self._names[element_name]
def parse(self, request=None):
WidgetListAsTable.parse(self, request=request)
if request is None: