From e630858a35edda88f517082c09b26d52018bd22a Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 6 Mar 2015 22:20:04 +0100 Subject: [PATCH] Allow payment providers to define custom form fields / templates --- src/pretix/base/payment.py | 41 ++++++++++++++++++- .../pretixcontrol/event/payment.html | 2 + src/pretix/plugins/banktransfer/payment.py | 7 ++++ .../banktransfer/checkout_payment_form.html | 10 +++++ src/pretix/plugins/stripe/payment.py | 7 ++++ .../pretixpresale/event/checkout_payment.html | 1 + .../event/checkout_payment_form_default.html | 2 + src/pretix/presale/views/checkout.py | 1 + 8 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html create mode 100644 src/pretix/presale/templates/pretixpresale/event/checkout_payment_form_default.html diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index be9af95a1..d19901489 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -1,5 +1,9 @@ from decimal import Decimal +from django.forms import Form +from django.template import Context +from django.template.loader import get_template + from pretix.base.settings import SettingsSandbox @@ -50,6 +54,41 @@ class BasePaymentProvider: def settings_form_fields(self) -> dict: """ A dictionary. The keys should be (unprefixed) EventSetting keys, - the values should be corresponding django form fields + the values should be corresponding django form fields. + + We suggest returning a collections.OrderedDict object instead of a dict. """ raise NotImplementedError() + + @property + def checkout_form_fields(self) -> dict: + """ + A dictionary. The keys should be unprefixed field names, + the values should be corresponding django form fields. + + We suggest returning a collections.OrderedDict object instead of a dict. + """ + # TODO: Proper handling of required=True fields in HTML + return {} + + def checkout_form(self, request) -> Form: + """ + Returns the Form object of the form that should be displayed when the + user selects this provider as his payment method. + """ + form = Form( + data=(request.POST if request.method == 'POST' else None), + prefix='payment_%s' % self.identifier + ) + form.fields = self.checkout_form_fields + return form + + def checkout_form_render(self, request) -> str: + """ + Returns the HTML of the form that should be displayed when the user + selects this provider as his payment method. + """ + form = self.checkout_form(request) + template = get_template('pretixpresale/event/checkout_payment_form_default.html') + ctx = Context({'request': request, 'form': form}) + return template.render(ctx) diff --git a/src/pretix/control/templates/pretixcontrol/event/payment.html b/src/pretix/control/templates/pretixcontrol/event/payment.html index c965ace7f..dec5bf91b 100644 --- a/src/pretix/control/templates/pretixcontrol/event/payment.html +++ b/src/pretix/control/templates/pretixcontrol/event/payment.html @@ -24,6 +24,8 @@ {% bootstrap_form provider.form layout='horizontal' %} + {% empty %} + {% trans "There are no payment providers available. Please go to the plugin settings and activate one or more payment plugins." %} {% endfor %}
diff --git a/src/pretix/plugins/banktransfer/payment.py b/src/pretix/plugins/banktransfer/payment.py index 06d13fe04..5206b5eca 100644 --- a/src/pretix/plugins/banktransfer/payment.py +++ b/src/pretix/plugins/banktransfer/payment.py @@ -1,4 +1,6 @@ from collections import OrderedDict +from django.template import Context +from django.template.loader import get_template from django.utils.translation import ugettext_lazy as _ from django import forms @@ -16,3 +18,8 @@ class BankTransfer(BasePaymentProvider): required=False )) ]) + + def checkout_form_render(self, request) -> str: + template = get_template('pretixplugins/banktransfer/checkout_payment_form.html') + ctx = Context({'request': request, 'event': self.event, 'settings': self.settings}) + return template.render(ctx) diff --git a/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html new file mode 100644 index 000000000..9cdfa83da --- /dev/null +++ b/src/pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html @@ -0,0 +1,10 @@ +{% load i18n %} + +

{% blocktrans trimmed %} + After completing your purchase, we will ask you to transfer the money to the following + bank account, using a personal reference code. +{% endblocktrans %}

+ +
+ {{ settings.bank_details|linebreaksbr }} +
\ No newline at end of file diff --git a/src/pretix/plugins/stripe/payment.py b/src/pretix/plugins/stripe/payment.py index da996d5bc..a8ca31c05 100644 --- a/src/pretix/plugins/stripe/payment.py +++ b/src/pretix/plugins/stripe/payment.py @@ -10,3 +10,10 @@ class Stripe(BasePaymentProvider): verbose_name = _('Credit Card via Stripe') settings_form_fields = OrderedDict([ ]) + checkout_form_fields = OrderedDict([ + ('cc_number', + forms.CharField( + label=_('Credit card number'), + required=False + )) + ]) diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html b/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html index 9a51a68e4..4d3a5952f 100644 --- a/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_payment.html @@ -23,6 +23,7 @@
+ {{ p.form }}
diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_payment_form_default.html b/src/pretix/presale/templates/pretixpresale/event/checkout_payment_form_default.html new file mode 100644 index 000000000..c087bce04 --- /dev/null +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_payment_form_default.html @@ -0,0 +1,2 @@ +{% load bootstrap3 %} +{% bootstrap_form form layout='horizontal' %} diff --git a/src/pretix/presale/views/checkout.py b/src/pretix/presale/views/checkout.py index 4cc8f26fa..f45a38d99 100644 --- a/src/pretix/presale/views/checkout.py +++ b/src/pretix/presale/views/checkout.py @@ -218,6 +218,7 @@ class PaymentDetails(EventViewMixin, CartDisplayMixin, EventLoginRequiredMixin, providers.append({ 'provider': provider, 'fee': fee, + 'form': provider.checkout_form_render(self.request), }) return providers