backoffice: detect CSV with wrong number of columns in card import (#41194)

This commit is contained in:
Frédéric Péters 2020-04-05 20:06:22 +02:00
parent 531f3804f9
commit e5848aa78a
2 changed files with 53 additions and 1 deletions

View File

@ -5916,6 +5916,45 @@ def test_backoffice_cards_import_data_from_csv(pub, studio):
assert card2.data['5'].tm_mday == 3
def test_backoffice_cards_import_data_csv_invalid_columns(pub):
user = create_user(pub)
CardDef.wipe()
carddef = CardDef()
carddef.workflow_roles = {'_editor': user.roles[0]}
carddef.backoffice_submission_roles = user.roles
carddef.name = 'test'
carddef.fields = [
fields.StringField(id='1', label='String1'),
fields.StringField(id='2', label='String2'),
fields.TextField(id='3', label='Text'),
]
carddef.store()
app = login(get_app(pub))
resp = app.get(carddef.get_url())
resp = resp.click('Import data from a CSV file')
csv_data = '''String1,String2,Text
1,2,3
4,5,6
7,
8,9,10,11
12,13,14
'''
resp.forms[0]['file'] = Upload('test.csv', csv_data.encode('utf-8'), 'text/csv')
resp = resp.forms[0].submit()
assert 'CSV file contains lines with wrong number of columns.' in resp.text
assert '(line numbers 4, 5, 7)' in resp.text
csv_data += '\n' * 10
resp.forms[0]['file'] = Upload('test.csv', csv_data.encode('utf-8'), 'text/csv')
resp = resp.forms[0].submit()
assert 'CSV file contains lines with wrong number of columns.' in resp.text
assert '(line numbers 4, 5, 7, 8, 9 and more)' in resp.text
def test_backoffice_cards_wscall_failure_display(http_requests, pub, studio):
LoggedError.wipe()
user = create_user(pub)

View File

@ -235,8 +235,13 @@ class CardPage(FormPage):
raise ValueError(_('CSV file contains less columns than card fields.'))
data_lines = []
for csv_line in reader:
incomplete_lines = []
for line_no, csv_line in enumerate(reader):
data_line = {}
if len(csv_line) != len(carddef_fields):
# +2 because header and counting from 1.
incomplete_lines.append(str(line_no + 2))
continue
for i, field in enumerate(carddef_fields):
value = csv_line[i].strip()
# skip empty values
@ -259,6 +264,14 @@ class CardPage(FormPage):
data_line['%s_structured' % field_id] = structured_value
data_lines.append(data_line)
if incomplete_lines:
error_message = _('CSV file contains lines with wrong number of columns.')
if len(incomplete_lines) < 5:
error_message += ' ' + _('(line numbers %s)') % ', '.join(incomplete_lines)
else:
error_message += ' ' + _('(line numbers %s and more)') % ', '.join(incomplete_lines[:5])
raise ValueError(error_message)
class ImportAction:
def __init__(self, data_class, lines):
self.data_class = data_class