From 1244bb5a74e945361c172cd5302ee48838000803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 25 May 2016 16:34:53 +0200 Subject: [PATCH] forms: remove extraneous empty table rows (#11045) --- tests/test_form_pages.py | 36 ++++++++++++++++++++++++++++++++++++ wcs/qommon/form.py | 12 ++++++++++++ 2 files changed, 48 insertions(+) diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index 5a522716..ae20f604 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -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() diff --git a/wcs/qommon/form.py b/wcs/qommon/form.py index 5795f1e1..277c84e0 100644 --- a/wcs/qommon/form.py +++ b/wcs/qommon/form.py @@ -1677,6 +1677,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: -- 2.11.0