From 35f608663555da6b3bac913440bcd95207db3d80 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 6 Mar 2015 00:32:52 +0100 Subject: [PATCH] Basic payment provider settings form API --- src/pretix/base/payment.py | 30 ++++++++- .../pretixcontrol/event/payment.html | 35 ++++++++++ .../pretixcontrol/event/settings_base.html | 21 ++++-- src/pretix/control/urls.py | 1 + src/pretix/control/views/event.py | 64 ++++++++++++++++++- src/pretix/plugins/banktransfer/payment.py | 7 +- 6 files changed, 147 insertions(+), 11 deletions(-) create mode 100644 src/pretix/control/templates/pretixcontrol/event/payment.html 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 %} +
+ {% csrf_token %} +
+ {% trans "Payment settings" %} + {% if "success" in request.GET %} +
+ {% trans "Your changes have been saved." %} +
+ {% endif %} + {% for provider in providers %} +
+
+
+
+

{{ provider.verbose_name }}

+
+
+
+
+ {% bootstrap_form provider.form layout='horizontal' %} +
+
+ {% endfor %} +
+
+ +
+
+{% 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 = { + + }