backoffice: detect CSV with wrong number of columns in card import (#41194)
This commit is contained in:
parent
531f3804f9
commit
e5848aa78a
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue