fields: fix length calculation when production rst tables (#23072)

This commit is contained in:
Frédéric Péters 2018-04-10 17:00:26 +02:00
parent 5af4dd6d5e
commit aaf3a232db
2 changed files with 42 additions and 11 deletions

View File

@ -2000,7 +2000,7 @@ def test_form_file_field_submit_wrong_mimetype(pub):
assert resp.content_type == 'application/pdf'
assert resp.body == '%PDF-1.4 ...'
def test_form_table_field_submit(pub):
def test_form_table_field_submit(pub, emails):
formdef = create_formdef()
formdef.fields = [fields.TableField(id='0', label='table', type='table',
rows=['a', 'b'], columns=['c', 'd', 'e'], required=False)]
@ -2034,7 +2034,23 @@ def test_form_table_field_submit(pub):
assert 'The form has been recorded' in resp.body
assert formdef.data_class().select()[0].data == {'0': [['a', 'c', 'e'], ['b', 'd', '']]}
def test_form_table_rows_field_submit(pub):
# check table is present in received email (via form_details).
user = create_user(pub)
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
resp.form['f0$c-0-0'] = 'àà' # would trigger column length bug (#23072)
resp.form['f0$c-1-0'] = 'bb'
resp.form['f0$c-0-1'] = 'cc'
resp.form['f0$c-1-1'] = 'dd'
resp.form['f0$c-0-2'] = 'ee'
resp = resp.form.submit('submit')
assert 'Check values then click submit.' in resp.body
resp = resp.form.submit('submit')
resp = resp.follow()
assert 'The form has been recorded' in resp.body
# check rst2html didn't fail
assert 'ee' in emails.emails['New form (test)']['msg'].get_payload()[1].get_payload()
def test_form_table_rows_field_submit(pub, emails):
formdef = create_formdef()
formdef.fields = [fields.TableRowsField(id='0', label='table', type='tablerows',
columns=['a', 'b'], required=False)]
@ -2086,6 +2102,20 @@ def test_form_table_rows_field_submit(pub):
assert 'The form has been recorded' in resp.body
assert '37.00' in resp.body
# check table is present in received email (via form_details).
user = create_user(pub)
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
resp.form['f0$element0$col0'] = 'àà'
resp.form['f0$element0$col1'] = '14'
resp.form['f0$element1$col0'] = 'ee'
resp.form['f0$element1$col1'] = '23'
resp = resp.form.submit('submit')
assert 'Check values then click submit.' in resp.body
resp = resp.form.submit('submit')
resp = resp.follow()
assert 'The form has been recorded' in resp.body
assert 'ee' in emails.emails['New form (test)']['msg'].get_payload()[1].get_payload()
def test_formdata_attachment_download(pub):
create_user(pub)
wf = Workflow(name='status')

View File

@ -27,6 +27,7 @@ from HTMLParser import HTMLParser
from quixote import get_request, get_publisher
from quixote.html import htmltext, TemplateIO
from django.utils.encoding import smart_text
from django.utils.formats import date_format as django_date_format
from qommon import _
@ -1684,14 +1685,14 @@ class TableField(WidgetField):
r = []
max_width = 0
for column in self.columns:
max_width = max(max_width, len(column))
max_width = max(max_width, len(smart_text(column)))
for i, row in enumerate(value):
value[i] = [x or '' for x in row]
def get_value(i, j):
try:
return value[i][j]
return smart_text(value[i][j])
except IndexError:
return '-'
@ -1701,13 +1702,13 @@ class TableField(WidgetField):
max_width = max(max_width, len(get_value(i, j)))
r.append(' '.join(['='*max_width]*(len(self.columns)+1)))
r.append(' '.join([column.center(max_width) for column in ['/']+self.columns]))
r.append(' '.join([smart_text(column).center(max_width) for column in ['/']+self.columns]))
r.append(' '.join(['='*max_width]*(len(self.columns)+1)))
for i, row in enumerate(self.rows):
r.append(' '.join([cell.center(max_width) for cell in [row] +
[get_value(i, x) for x in range(len(self.columns))]]))
r.append(' '.join(['='*max_width]*(len(self.columns)+1)))
return '\n'.join([indent + x for x in r])
return misc.site_encode('\n'.join([indent + x for x in r]))
def get_csv_heading(self):
if not self.columns:
@ -1881,7 +1882,7 @@ class TableRowsField(WidgetField):
r = []
max_width = 0
for column in self.columns:
max_width = max(max_width, len(column))
max_width = max(max_width, len(smart_text(column)))
for i, row in enumerate(value):
value[i] = [x or '' for x in row]
@ -1889,7 +1890,7 @@ class TableRowsField(WidgetField):
for i, row_value in enumerate(value):
for j, column in enumerate(self.columns):
try:
max_width = max(max_width, len(row_value[j]))
max_width = max(max_width, len(smart_text(row_value[j])))
except IndexError:
# ignore errors for shorter than expected rows, this is
# typical of the field gaining new columns after some forms
@ -1897,13 +1898,13 @@ class TableRowsField(WidgetField):
pass
r.append(' '.join(['='*max_width]*(len(self.columns))))
r.append(' '.join([column.center(max_width) for column in self.columns]))
r.append(' '.join([smart_text(column).center(max_width) for column in self.columns]))
r.append(' '.join(['='*max_width]*(len(self.columns))))
for i, row_value in enumerate(value):
r.append(' '.join([cell.center(max_width) for cell in
[row_value[x] for x in range(len(self.columns))]]))
[smart_text(row_value[x]) for x in range(len(self.columns))]]))
r.append(' '.join(['='*max_width]*(len(self.columns))))
return '\n'.join([indent + x for x in r])
return misc.site_encode('\n'.join([indent + x for x in r]))
def get_csv_value(self, element, **kwargs):
return [_('unimplemented')] # XXX