diff --git a/src/pretix/base/modelimport.py b/src/pretix/base/modelimport.py index e274dbe85..348012bad 100644 --- a/src/pretix/base/modelimport.py +++ b/src/pretix/base/modelimport.py @@ -70,6 +70,10 @@ def parse_csv(file, length=None, mode="strict", charset=None): except ImportError: charset = file.charset data = data.decode(charset or "utf-8", mode) + + # remove stray linebreaks from the end of the file + data = data.rstrip("\n") + # If the file was modified on a Mac, it only contains \r as line breaks if '\r' in data and '\n' not in data: data = data.replace('\r', '\n') diff --git a/src/tests/base/test_modelimport_orders.py b/src/tests/base/test_modelimport_orders.py index 2cb57aed6..1c51ab219 100644 --- a/src/tests/base/test_modelimport_orders.py +++ b/src/tests/base/test_modelimport_orders.py @@ -991,3 +991,30 @@ def test_import_mixed_order_size_consistency(user, event, item): ).get() assert ('Inconsistent data in row 2: Column Email address contains value "a2@example.com", but for this order, ' 'the value has already been set to "a1@example.com".') in str(excinfo.value) + + +@pytest.mark.django_db +@scopes_disabled() +def test_import_line_endings_mix(event, item, user): + # Ensures import works with mixed file endings. + # See Ticket#23230806 where a file to import ends with \r\n + settings = dict(DEFAULT_SETTINGS) + settings['item'] = 'static:{}'.format(item.pk) + + cf = inputfile_factory() + file = cf.file + file.seek(0) + data = file.read() + data = data.replace(b'\n', b'\r') + data = data.rstrip(b'\r\r') + data = data + b'\r\n' + + print(data) + cf.file.save("input.csv", ContentFile(data)) + cf.save() + + import_orders.apply( + args=(event.pk, cf.id, settings, 'en', user.pk) + ) + assert event.orders.count() == 3 + assert OrderPosition.objects.count() == 3