diff --git a/newdle/export.py b/newdle/export.py index 2b50d7a0..1a7b0ca4 100644 --- a/newdle/export.py +++ b/newdle/export.py @@ -1,5 +1,7 @@ +import csv import datetime -from io import BytesIO +from contextlib import contextmanager +from io import BytesIO, TextIOWrapper from xlsxwriter import Workbook @@ -25,12 +27,24 @@ def _generate_answers_for_export(newdle): return rows +@contextmanager +def csv_text_io_wrapper(buf): + """IO wrapper to use the csv reader/writer on a byte stream.""" + w = TextIOWrapper(buf, encoding='utf-8-sig', newline='') + try: + yield w + finally: + w.detach() + + def export_answers_to_csv(newdle): rows = _generate_answers_for_export(newdle) - csv = '\n'.join([','.join(row) for row in rows]) buffer = BytesIO() - buffer.write(csv.encode('utf-8-sig')) + with csv_text_io_wrapper(buffer) as csvbuf: + writer = csv.writer(csvbuf, dialect='unix', quoting=csv.QUOTE_MINIMAL) + writer.writerows(rows) buffer.seek(0) + return buffer diff --git a/tests/api_test.py b/tests/api_test.py index bb632243..b4ed989b 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -1374,13 +1374,13 @@ def test_answer_export(snapshot, monkeypatch, flask_client, dummy_uid): snapshot.snapshot_dir = Path(__file__).parent / 'export' p1 = Participant.query.filter_by(code='part1').first() p1.answers = {datetime(2019, 9, 11, 14, 0): Availability.available} - p1.comment = 'Available comment' + p1.comment = 'Hello, world' Participant.query.filter_by(code='part2').first().answers = { datetime(2019, 9, 11, 14, 0): Availability.unavailable } p3 = Participant.query.filter_by(code='part3').first() p3.answers = {datetime(2019, 9, 11, 14, 0): Availability.ifneedbe} - p3.comment = 'Comment' + p3.comment = 'Hello world' resp = flask_client.get( url_for('api.export_participants', code='dummy', format='csv'), diff --git a/tests/export/answers.csv b/tests/export/answers.csv index 94aedb57..e8d02088 100644 --- a/tests/export/answers.csv +++ b/tests/export/answers.csv @@ -1,4 +1,4 @@ Participant name,2019-09-11T13:00,2019-09-11T14:00,2019-09-12T13:00,2019-09-12T13:30,Comment Albert Einstein,,unavailable,,, -Guinea Pig,,ifneedbe,,,Comment -Tony Stark,,available,,,Available comment \ No newline at end of file +Guinea Pig,,ifneedbe,,,Hello world +Tony Stark,,available,,,"Hello, world" diff --git a/tests/export/answers.xlsx b/tests/export/answers.xlsx index f7a43dcf..a9789008 100644 Binary files a/tests/export/answers.xlsx and b/tests/export/answers.xlsx differ