diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py
index 129dd87c2d..c573ca8d20 100644
--- a/src/pretix/base/payment.py
+++ b/src/pretix/base/payment.py
@@ -1,10 +1,36 @@
+from pretix.base.settings import SettingsSandbox
+
+
class BasePaymentProvider:
"""
This is the base class for all payment providers.
"""
- def get_identifier(self) -> str:
+ def __init__(self, event):
+ self.event = event
+ self.settings = SettingsSandbox('payment', self.identifier, event)
+
+ def __str__(self):
+ return self.identifier
+
+ @property
+ def verbose_name(self) -> str:
"""
- Return a unique identifier for this payment provider
+ A human-readable name for this payment provider
+ """
+ raise NotImplementedError
+
+ @property
+ def identifier(self) -> str:
+ """
+ A unique identifier for this payment provider
+ """
+ raise NotImplementedError()
+
+ @property
+ def settings_form_fields(self) -> dict:
+ """
+ A dictionary. The keys should be (unprefixed) EventSetting keys,
+ the values should be corresponding django form fields
"""
raise NotImplementedError()
diff --git a/src/pretix/control/templates/pretixcontrol/event/payment.html b/src/pretix/control/templates/pretixcontrol/event/payment.html
new file mode 100644
index 0000000000..c965ace7fe
--- /dev/null
+++ b/src/pretix/control/templates/pretixcontrol/event/payment.html
@@ -0,0 +1,35 @@
+{% extends "pretixcontrol/event/settings_base.html" %}
+{% load i18n %}
+{% load bootstrap3 %}
+{% block inside %}
+
+{% endblock %}
diff --git a/src/pretix/control/templates/pretixcontrol/event/settings_base.html b/src/pretix/control/templates/pretixcontrol/event/settings_base.html
index e753a15083..6eefdac01d 100644
--- a/src/pretix/control/templates/pretixcontrol/event/settings_base.html
+++ b/src/pretix/control/templates/pretixcontrol/event/settings_base.html
@@ -3,11 +3,18 @@
{% load bootstrap3 %}
{% block title %}{{ request.event.name }}{% endblock %}
{% block content %}
- {% trans "Settings" %}
-
- {% block inside %}
- {% endblock %}
+ {% trans "Settings" %}
+
+ {% block inside %}
+ {% endblock %}
{% endblock %}
diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py
index 257a830e40..a260a89f51 100644
--- a/src/pretix/control/urls.py
+++ b/src/pretix/control/urls.py
@@ -20,6 +20,7 @@ urlpatterns += patterns(
url(r'^$', 'event.index', name='event.index'),
url(r'^settings/$', event.EventUpdate.as_view(), name='event.settings'),
url(r'^settings/plugins$', event.EventPlugins.as_view(), name='event.settings.plugins'),
+ url(r'^settings/payment$', event.PaymentSettings.as_view(), name='event.settings.payment'),
url(r'^items/$', item.ItemList.as_view(), name='event.items'),
url(r'^items/add$', item.ItemCreate.as_view(), name='event.items.add'),
url(r'^items/(?P- [0-9a-f-]+)/$', item.ItemUpdateGeneral.as_view(), name='event.item'),
diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py
index 1b04bc0f7c..6674c12a97 100644
--- a/src/pretix/control/views/event.py
+++ b/src/pretix/control/views/event.py
@@ -1,4 +1,5 @@
from django.shortcuts import render, redirect
+from django.utils.functional import cached_property
from django.views.generic.edit import UpdateView
from django.views.generic.base import TemplateView
from django.views.generic.detail import SingleObjectMixin
@@ -7,9 +8,10 @@ from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from pytz import common_timezones
-from pretix.base.forms import VersionedModelForm
+from pretix.base.forms import VersionedModelForm, SettingsForm
from pretix.base.models import Event
+from pretix.base.signals import register_payment_providers
from pretix.control.permissions import EventPermissionRequiredMixin
@@ -106,5 +108,65 @@ class EventPlugins(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin
}) + '?success=true'
+class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin):
+
+ model = Event
+ context_object_name = 'event'
+ permission = 'can_change_settings'
+ template_name = 'pretixcontrol/event/payment.html'
+
+ def get_object(self, queryset=None) -> Event:
+ return self.request.event
+
+ @cached_property
+ def provider_forms(self) -> list:
+ providers = []
+ responses = register_payment_providers.send(self.request.event)
+ for receiver, response in responses:
+ provider = response(self.request.event)
+ provider.form = SettingsForm(
+ obj=self.request.event,
+ data=(self.request.POST if self.request.method == 'POST' else None)
+ )
+ provider.form.fields = {
+ 'payment_%s_%s' % (provider.identifier, k): v
+ for k, v in provider.settings_form_fields.items()
+ }
+ provider.form.fields['payment_%s' % provider.identifier] = forms.BooleanField(
+ label=_('Enable payment method')
+ )
+ providers.append(provider)
+ return providers
+
+ def get_context_data(self, *args, **kwargs) -> dict:
+ context = super().get_context_data(*args, **kwargs)
+ return context
+
+ def get(self, request, *args, **kwargs):
+ self.object = self.get_object()
+ context = self.get_context_data(object=self.object)
+ context['providers'] = self.provider_forms
+ return self.render_to_response(context)
+
+ def post(self, request, *args, **kwargs):
+ self.object = self.get_object()
+ success = True
+ for provider in self.provider_forms:
+ if provider.form.is_valid():
+ provider.form.save()
+ else:
+ success = False
+ if success:
+ return redirect(self.get_success_url())
+ else:
+ return self.get(request)
+
+ def get_success_url(self) -> str:
+ return reverse('control:event.settings.payment', kwargs={
+ 'organizer': self.get_object().organizer.slug,
+ 'event': self.get_object().slug,
+ }) + '?success=true'
+
+
def index(request, organizer, event):
return render(request, 'pretixcontrol/event/index.html', {})
diff --git a/src/pretix/plugins/banktransfer/payment.py b/src/pretix/plugins/banktransfer/payment.py
index 33302517ac..700e892e3f 100644
--- a/src/pretix/plugins/banktransfer/payment.py
+++ b/src/pretix/plugins/banktransfer/payment.py
@@ -1,5 +1,10 @@
from pretix.base.payment import BasePaymentProvider
+from django.utils.translation import ugettext_lazy as _
class BankTransfer(BasePaymentProvider):
- pass
+ identifier = 'banktransfer'
+ verbose_name = _('Bank transfer')
+ settings_form_fields = {
+
+ }