mirror of
https://github.com/pretix/pretix.git
synced 2026-05-07 15:34:02 +00:00
Banktransfer: Added experimental HBCI support
This commit is contained in:
@@ -2,27 +2,48 @@ import csv
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
from decimal import Decimal
|
||||
|
||||
from django import forms
|
||||
from django.contrib import messages
|
||||
from django.shortcuts import redirect, render
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.views.decorators.debug import sensitive_post_parameters
|
||||
from django.views.generic import TemplateView
|
||||
from pip.utils import cached_property
|
||||
|
||||
from pretix.base.models import Order, Quota
|
||||
from pretix.base.services.orders import mark_order_paid
|
||||
from pretix.base.settings import SettingsSandbox
|
||||
from pretix.control.permissions import EventPermissionRequiredMixin
|
||||
from pretix.plugins.banktransfer import csvimport, mt940import
|
||||
from pretix.plugins.banktransfer import csvimport, hbci, mt940import
|
||||
|
||||
logger = logging.getLogger('pretix.plugins.banktransfer')
|
||||
|
||||
|
||||
class HbciForm(forms.Form):
|
||||
hbci_blz = forms.CharField(label=_("Bank code"))
|
||||
hbci_userid = forms.CharField(label=_("User ID"))
|
||||
hbci_customerid = forms.CharField(label=_("Customer ID"), required=False)
|
||||
hbci_tokentype = forms.CharField(label=_("Token type"), initial='pintan')
|
||||
hbci_tokenname = forms.CharField(label=_("Token name"), required=False)
|
||||
hbci_server = forms.URLField(label=_("Server URL"))
|
||||
hbci_version = forms.IntegerField(label=_("HBCI version"), required=False, initial=220)
|
||||
pin = forms.CharField(label=_("PIN"), widget=forms.PasswordInput)
|
||||
|
||||
|
||||
class ImportView(EventPermissionRequiredMixin, TemplateView):
|
||||
template_name = 'pretixplugins/banktransfer/import_form.html'
|
||||
permission = 'can_change_orders'
|
||||
|
||||
def post(self, *args, **kwargs):
|
||||
if 'hbci_server' in self.request.POST:
|
||||
return self.process_hbci()
|
||||
|
||||
if ('file' in self.request.FILES and 'csv' in self.request.FILES.get('file').name.lower()) \
|
||||
or 'amount' in self.request.POST:
|
||||
# Process CSV
|
||||
@@ -59,9 +80,44 @@ class ImportView(EventPermissionRequiredMixin, TemplateView):
|
||||
'contact support for help.'))
|
||||
return self.redirect_back()
|
||||
|
||||
@cached_property
|
||||
def settings(self):
|
||||
return SettingsSandbox('payment', 'banktransfer', self.request.event)
|
||||
|
||||
def process_hbci(self):
|
||||
form = HbciForm(data=self.request.POST if self.request.method == "POST" else None,
|
||||
initial=self.settings)
|
||||
if form.is_valid():
|
||||
for key, value in form.cleaned_data.items():
|
||||
if key.startswith('hbci_'):
|
||||
self.settings.set(key, value)
|
||||
data, log = hbci.hbci_transactions(self.request.event, form.cleaned_data)
|
||||
if data:
|
||||
return self.confirm_view(data)
|
||||
return render(self.request, 'pretixplugins/banktransfer/hbci_log.html', {
|
||||
'log': log
|
||||
})
|
||||
else:
|
||||
return self.get(*self.args, **self.kwargs)
|
||||
|
||||
def process_mt940(self):
|
||||
return self.confirm_view(mt940import.parse(self.request.FILES.get('file')))
|
||||
|
||||
@cached_property
|
||||
def hbci_form(self):
|
||||
return HbciForm(data=self.request.POST if self.request.method == "POST" else None,
|
||||
initial=self.settings)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
ctx = super().get_context_data(**kwargs)
|
||||
if sys.version_info[:2] >= (3, 3):
|
||||
ctx['hbci_available'] = shutil.which('aqbanking-cli') and shutil.which('aqhbci-tool4')
|
||||
if ctx['hbci_available']:
|
||||
ctx['hbci_form'] = self.hbci_form
|
||||
else:
|
||||
ctx['hbci_available'] = False
|
||||
return ctx
|
||||
|
||||
def process_csv_file(self):
|
||||
try:
|
||||
data = csvimport.get_rows_from_file(self.request.FILES['file'])
|
||||
@@ -89,10 +145,12 @@ class ImportView(EventPermissionRequiredMixin, TemplateView):
|
||||
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')))
|
||||
])
|
||||
data.append(
|
||||
[
|
||||
self.request.POST.get('col[%d][%d]' % (i, j))
|
||||
for j in range(int(self.request.POST.get('cols')))
|
||||
]
|
||||
)
|
||||
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)
|
||||
@@ -174,3 +232,7 @@ class ImportView(EventPermissionRequiredMixin, TemplateView):
|
||||
row['class'] = 'warning'
|
||||
row['message'] = _('Order has been refunded')
|
||||
return data
|
||||
|
||||
@method_decorator(sensitive_post_parameters)
|
||||
def dispatch(self, *args, **kwargs):
|
||||
return super().dispatch(*args, **kwargs)
|
||||
|
||||
Reference in New Issue
Block a user