From f27f98c7696850e77c9ae4b6030d2d534f024dd3 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 21 Sep 2016 23:03:55 +0200 Subject: [PATCH] Banktransfer: Do not allow concurrent import jobs --- .../static/pretixplugins/banktransfer/ui.js | 6 +-- .../banktransfer/import_form.html | 50 +++++++++++-------- .../banktransfer/job_detail.html | 2 +- src/pretix/plugins/banktransfer/views.py | 17 +++++++ 4 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js b/src/pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js index 5326552953..db8490754e 100644 --- a/src/pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js +++ b/src/pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js @@ -112,14 +112,14 @@ var bankimport_transactionlist = { } if ($("[data-job-waiting]").length) { - window.setInterval(bankimport_transactionlist.check_state, 750); + window.setTimeout(bankimport_transactionlist.check_state, 750); } }, check_state: function () { - $.getJSON(location.pathname + '?ajax=1', function (data) { + $.getJSON($("[data-job-waiting-url]").attr("data-job-waiting-url"), function (data) { if (data.state == 'running' || data.state == 'pending') { - window.setInterval(check_state, 750); + window.setTimeout(bankimport_transactionlist.check_state, 750); } else { location.reload(); } diff --git a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html index 4575160f53..e46cbb3933 100644 --- a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html +++ b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html @@ -13,16 +13,23 @@

{% blocktrans trimmed %} Currently, this feature supports .csv files and files in the MT940 format. {% endblocktrans %}

-
- {% csrf_token %} -
- + {% if job_running %} +
+ + {% trans "An import is currently being processed, please try again in a few minutes." %}
-
- - + {% else %} +
+ {% csrf_token %} +
+ +
+
+ +
+ {% endif %}
{% if transactions_unhandled|length > 0 %} @@ -32,19 +39,20 @@

-

- + + +
+ + {% if not request.GET.search %} +
+ {% csrf_token %} +
- - {% if not request.GET.search %} -
- {% csrf_token %} - -
- {% endif %} + {% endif %}

{% include "pretixcontrol/pagination.html" %} diff --git a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/job_detail.html b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/job_detail.html index 4494cb9f20..a62d36e541 100644 --- a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/job_detail.html +++ b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/job_detail.html @@ -3,7 +3,7 @@ {% block inner %}

{% trans "Import result" %}

{% if job.state == "running" or job.state == "pending" %} -
+

diff --git a/src/pretix/plugins/banktransfer/views.py b/src/pretix/plugins/banktransfer/views.py index fa55c05593..df8e787130 100644 --- a/src/pretix/plugins/banktransfer/views.py +++ b/src/pretix/plugins/banktransfer/views.py @@ -1,6 +1,7 @@ import csv import json import logging +from datetime import timedelta from locale import format as lformat from django.contrib import messages @@ -9,6 +10,7 @@ from django.db.models import Q from django.http import JsonResponse from django.shortcuts import get_object_or_404, redirect, render from django.utils.functional import cached_property +from django.utils.timezone import now from django.utils.translation import ugettext as _ from django.views.generic import DetailView, ListView, TemplateView, View @@ -303,6 +305,13 @@ class ImportView(EventPermissionRequiredMixin, ListView): 'rows': parsed }) + @cached_property + def job_running(self): + return BankImportJob.objects.filter( + event=self.request.event, state=BankImportJob.STATE_RUNNING, + created__lte=now() - timedelta(minutes=30) # safety timeout + ).first() + def redirect_back(self): return redirect(reverse('plugins:banktransfer:import', kwargs={ 'event': self.request.event.slug, @@ -310,6 +319,9 @@ class ImportView(EventPermissionRequiredMixin, ListView): })) def start_processing(self, parsed): + if self.job_running: + messages.error(self.request, _('An import is currently being processed, please try again in a few minutes.')) + return self.redirect_back() job = BankImportJob.objects.create(event=self.request.event) process_banktransfers.apply_async(kwargs={ 'event': self.request.event.pk, @@ -321,3 +333,8 @@ class ImportView(EventPermissionRequiredMixin, ListView): 'organizer': self.request.event.organizer.slug, 'job': job.pk })) + + def get_context_data(self, **kwargs): + ctx = super().get_context_data() + ctx['job_running'] = self.job_running + return ctx