Banktransfer: Added experimental HBCI support

This commit is contained in:
Raphael Michel
2015-08-20 21:53:10 +02:00
parent e2606cb456
commit b55b02f4b8
7 changed files with 227 additions and 13 deletions

View File

@@ -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)