From 31016366f6f51a3c6efc718624b70db56db3060c Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 20 Sep 2018 15:51:31 +0200 Subject: [PATCH] report failure to detect CSV dialect (fixes #26580) --- passerelle/apps/csvdatasource/models.py | 19 ++++++++++++------- tests/test_csv_datasource.py | 13 +++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/passerelle/apps/csvdatasource/models.py b/passerelle/apps/csvdatasource/models.py index 5b7e21b..9e5595d 100644 --- a/passerelle/apps/csvdatasource/models.py +++ b/passerelle/apps/csvdatasource/models.py @@ -124,16 +124,21 @@ class CsvDataSource(BaseResource): file_type = self.csv_file.name.split('.')[-1] if file_type in ('ods', 'xls', 'xlsx') and not self.sheet_name: raise ValidationError(_('You must specify a sheet name')) + if file_type not in ('ods', 'xls', 'xlsx'): + try: + self._detect_dialect_options() + except Exception as e: + raise ValidationError(_('Could not detect CSV dialect: %s') % e) return super(CsvDataSource, self).clean(*args, **kwargs) + def _detect_dialect_options(self): + content = self.get_content_without_bom() + dialect = csv.Sniffer().sniff(content) + self.dialect_options = { + k: v for k, v in vars(dialect).items() if not k.startswith('_') + } + def save(self, *args, **kwargs): - file_type = self.csv_file.name.split('.')[-1] - if file_type not in ('ods', 'xls', 'xlsx'): - content = self.get_content_without_bom() - dialect = csv.Sniffer().sniff(content) - self.dialect_options = { - k: v for k, v in vars(dialect).items() if not k.startswith('_') - } result = super(CsvDataSource, self).save(*args, **kwargs) self.cache_data() return result diff --git a/tests/test_csv_datasource.py b/tests/test_csv_datasource.py index a74d430..6ecec29 100644 --- a/tests/test_csv_datasource.py +++ b/tests/test_csv_datasource.py @@ -13,6 +13,8 @@ from django.test import Client from passerelle.base.models import ApiUser, AccessRight from test_manager import login, admin_user +import webtest + data = """121;69981;DELANOUE;Eliot;H 525;6;DANIEL WILLIAMS;Shanone;F 253;67742;MARTIN;Sandra;F @@ -659,3 +661,14 @@ def test_delete_connector_query(admin_user, app, setup, filetype): resp = resp.form.submit('delete') resp = resp.follow() assert 'No query are defined.' in resp.body + + +def test_csv_sniffer(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', '\n', 'application/octet-stream')) + resp = form.submit() + assert 'Could not detect CSV dialect' in resp -- 2.18.0