diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index c7e8e1fa..5a7d36db 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -1043,6 +1043,7 @@ class ImportEventsForm(forms.Form): try: dialect = csv.Sniffer().sniff(content) + dialect.doublequote = True except csv.Error: dialect = None diff --git a/tests/manager/test_event.py b/tests/manager/test_event.py index 7bf891dc..3fd7d88c 100644 --- a/tests/manager/test_event.py +++ b/tests/manager/test_event.py @@ -995,6 +995,37 @@ def test_import_events(app, admin_user): assert 'Identifier:' in resp.text # verbose_name is shown, not field name ('slug:') +def test_import_event_nested_quotes(app, admin_user): + agenda = Agenda(label='Foo bar') + agenda.save() + app = login(app) + + resp = app.get('/manage/agendas/%s/import-events' % agenda.id, status=200) + resp.form['events_csv_file'] = Upload( + 't.csv', + ','.join( + [ + "2016-09-16", + "18:00", + "10", + "5", + "éléphant", + "elephant", + # the multiline description and final dot + # and new line after ""éléphants"" are needed to trigger the bug. + '''"Animation: + De nombreux ""éléphants"". +"''', + ] + ).encode(), + 'text/csv', + ) + + resp = resp.form.submit(status=302) + assert Event.objects.count() == 1 + assert 'De nombreux "éléphants"' in Event.objects.all()[0].description + + def test_import_events_existing_event(app, admin_user, freezer): agenda = Agenda.objects.create(label='Foo bar') Desk.objects.create(agenda=agenda, slug='_exceptions_holder')