csvdatasource: validate CSV file in clean() (#39971)

This commit is contained in:
Benjamin Dauvergne 2020-02-18 11:33:47 +01:00
parent fab1bc4c17
commit d3051b50d7
2 changed files with 15 additions and 0 deletions

View File

@ -149,6 +149,10 @@ class CsvDataSource(BaseResource):
self._detect_dialect_options()
except Exception as e:
raise ValidationError(_('Could not detect CSV dialect: %s') % e)
try:
self.get_rows()
except Exception as e:
raise ValidationError(_('Invalid CSV file: %s') % e)
return super(CsvDataSource, self).clean(*args, **kwargs)
def _detect_dialect_options(self):

View File

@ -751,6 +751,17 @@ def test_csv_sniffer(admin_user, app):
assert 'Could not detect CSV dialect' in resp
def test_csv_validation(admin_user, app):
app = login(app)
resp = app.get('/manage/csvdatasource/add')
form = resp.form
form.set('title', 'Title')
form.set('description', 'Description')
form.set('csv_file', webtest.Upload('test.csv', b'a,b,c\n1,2\0,3\n4,5,6', 'application/octet-stream'))
resp = form.submit()
assert 'Invalid CSV file: line contains NUL' in resp
def test_change_csv_command(setup):
csv, url = setup(data=StringIO(data))
call_command('change-csv', 'test', os.path.join(TEST_BASE_DIR, 'data-empty.ods'))