diff --git a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html
index c35908324..6137cc9e3 100644
--- a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html
+++ b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html
@@ -47,22 +47,30 @@
- {% for row in rows %}
+ {% for row in rows|slice:":100" %}
{% with forloop.counter0 as rowid %}
|
{% for col in row %}
- {{ col }} |
+ {{ col }} |
{% endfor %}
{% endwith %}
{% endfor %}
+ {% if rows|length > 100 %}
+
+ |
+ {% trans "More data was uploaded but is not shown here. It will still be processed" %}
+ |
+
+ {% endif %}
-
-
-
+
+
+
{% endblock %}
diff --git a/src/pretix/plugins/banktransfer/views.py b/src/pretix/plugins/banktransfer/views.py
index 87b070a03..3ceebf5c3 100644
--- a/src/pretix/plugins/banktransfer/views.py
+++ b/src/pretix/plugins/banktransfer/views.py
@@ -347,14 +347,12 @@ class ImportView(ListView):
return self.assign_view(data)
def process_csv_hint(self):
- data = []
- for i in range(int(self.request.POST.get('rows'))):
- data.append(
- [
- self.request.POST.get('col[%d][%d]' % (i, j))
- for j in range(int(self.request.POST.get('cols')))
- ]
- )
+ try:
+ data = json.loads(self.request.POST.get('data').strip())
+ except ValueError:
+ messages.error(self.request, _('Invalid input data.'))
+ return self.get(self.request, *self.args, **self.kwargs)
+
if 'reference' not in self.request.POST:
messages.error(self.request, _('You need to select the column containing the payment reference.'))
return self.assign_view(data)
@@ -382,7 +380,10 @@ class ImportView(ListView):
return super().get(self.request)
def assign_view(self, parsed):
- ctx = {'rows': parsed}
+ ctx = {
+ 'json': json.dumps(parsed),
+ 'rows': parsed,
+ }
if 'event' in self.kwargs:
ctx['basetpl'] = 'pretixplugins/banktransfer/import_base.html'
else:
diff --git a/src/pretix/static/pretixcontrol/scss/main.scss b/src/pretix/static/pretixcontrol/scss/main.scss
index 3932dd697..6b4fae160 100644
--- a/src/pretix/static/pretixcontrol/scss/main.scss
+++ b/src/pretix/static/pretixcontrol/scss/main.scss
@@ -124,6 +124,9 @@ h1 .btn-sm {
.helper-display-inline {
display: inline !important;
}
+.helper-display-none {
+ display: none !important;
+}
.helper-width-auto {
width: auto;
}
diff --git a/src/tests/plugins/banktransfer/test_import.py b/src/tests/plugins/banktransfer/test_import.py
index 863d58145..bb31b9edf 100644
--- a/src/tests/plugins/banktransfer/test_import.py
+++ b/src/tests/plugins/banktransfer/test_import.py
@@ -81,6 +81,8 @@ Buchungstag;Valuta;Buchungstext;Auftraggeber / Empfänger;Verwendungszweck;Betra
}
for inp in doc.select("input[type=hidden]"):
data[inp.attrs['name']] = inp.attrs['value']
+ for inp in doc.select("textarea"):
+ data[inp.attrs['name']] = inp.text
r = client.post('/control/event/dummy/dummy/banktransfer/import/', data)
assert '/job/' in r['Location']
@@ -233,3 +235,43 @@ def test_wrong_event_organizer(env, orga_job):
}])
env[2].refresh_from_db()
assert env[2].status == Order.STATUS_PENDING
+
+
+@pytest.mark.django_db
+def test_import_very_long_csv_file(client, env):
+ client.login(email='dummy@dummy.dummy', password='dummy')
+ r = client.get('/control/event/dummy/dummy/banktransfer/import/')
+ assert r.status_code == 200
+
+ payload = """
+Buchungstag;Valuta;Buchungstext;Auftraggeber / Empfänger;Verwendungszweck;Betrag in EUR;
+09.04.2015;09.04.2015;SEPA-Überweisung;Karl Kunde;Bestellung 2015ABCDE;23,00;
+09.04.2015;09.04.2015;SEPA-Überweisung;Karla Kundin;Bestellung DUMMYFGHIJ;42,00;
+09.04.2015;09.04.2015;SEPA-Überweisung;Karla Kundin;Bestellung DUMMY1234S;42,00;
+09.04.2015;09.04.2015;SEPA-Überweisung;Karla Kundin;Bestellung DUMMY1234S;23,00;
+09.04.2015;09.04.2015;SEPA-Überweisung;Karla Kundin;Bestellung DUMMY6789Z;23,00;
+09.04.2015;09.04.2015;SEPA-Überweisung;Karla Kundin;Bestellung DUMMY6789Z;23,00;
+"""
+ payload += "09.04.2015;09.04.2015;SEPA-Überweisung;Karla Kundin;Bestellung DUMMY6789Z;23,00;\n" * 1000
+
+ file = SimpleUploadedFile('file.csv', payload.encode("utf-8"), content_type="text/csv")
+
+ r = client.post('/control/event/dummy/dummy/banktransfer/import/', {
+ 'file': file
+ })
+ doc = BeautifulSoup(r.content, "lxml")
+ assert r.status_code == 200
+ assert len(doc.select("input[name=date]")) > 0
+ data = {
+ 'payer': [3],
+ 'reference': [4],
+ 'date': 1,
+ 'amount': 5,
+ 'cols': 7
+ }
+ for inp in doc.select("input[type=hidden]"):
+ data[inp.attrs['name']] = inp.attrs['value']
+ for inp in doc.select("textarea"):
+ data[inp.attrs['name']] = inp.text
+ r = client.post('/control/event/dummy/dummy/banktransfer/import/', data)
+ assert '/job/' in r['Location']