From 320fd78a62c118039be0c0f7ec14b9dbeaa3d060 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 6 Apr 2015 13:30:08 +0200 Subject: [PATCH] Proper support for required fields in payment provider settings Closes #22 --- src/pretix/base/payment.py | 3 ++ src/pretix/control/views/event.py | 32 +++++++++++++++++++++- src/pretix/plugins/banktransfer/payment.py | 1 - src/pretix/plugins/paypal/payment.py | 3 -- src/pretix/plugins/stripe/payment.py | 2 -- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/pretix/base/payment.py b/src/pretix/base/payment.py index ce40f2bc64..86edb42a2a 100644 --- a/src/pretix/base/payment.py +++ b/src/pretix/base/payment.py @@ -91,6 +91,9 @@ class BasePaymentProvider: )) ] ) + + .. WARNING:: It is highly discouraged to alter the ``_enabled`` field of the default + implementation. """ return OrderedDict([ ('_enabled', diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index a2b3a3aabf..7a6a385938 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -196,6 +196,34 @@ class EventPlugins(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin }) + '?success=true' +class PaymentMethodForm(SettingsForm): + """ + This is a SettingsForm, but if fields are set to required=True, validation + errors are only raised if the payment method is enabled. + """ + + def __init__(self, *args, **kwargs): + self.settingspref = kwargs.pop('settingspref') + super().__init__(*args, **kwargs) + + def prepare_fields(self): + for k, v in self.fields.items(): + v._required = v.required + v.required = False + v.widget.is_required = False + + def clean(self): + cleaned_data = super().clean() + enabled = cleaned_data.get(self.settingspref + '_enabled') == 'True' + if not enabled: + return + for k, v in self.fields.items(): + val = cleaned_data.get(k) + if v._required and (val is None or val == ""): + print(enabled, k, v) + self.add_error(k, _('This field is required.')) + + class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMixin): model = Event context_object_name = 'event' @@ -211,8 +239,9 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi responses = register_payment_providers.send(self.request.event) for receiver, response in responses: provider = response(self.request.event) - provider.form = SettingsForm( + provider.form = PaymentMethodForm( obj=self.request.event, + settingspref='payment_%s_' % provider.identifier, data=(self.request.POST if self.request.method == 'POST' else None) ) provider.form.fields = OrderedDict( @@ -221,6 +250,7 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi for k, v in provider.settings_form_fields.items() ] ) + provider.form.prepare_fields() providers.append(provider) return providers diff --git a/src/pretix/plugins/banktransfer/payment.py b/src/pretix/plugins/banktransfer/payment.py index 260039b4e5..02ba1485ee 100644 --- a/src/pretix/plugins/banktransfer/payment.py +++ b/src/pretix/plugins/banktransfer/payment.py @@ -19,7 +19,6 @@ class BankTransfer(BasePaymentProvider): forms.CharField( widget=forms.Textarea, label=_('Bank account details'), - required=False )) ] ) diff --git a/src/pretix/plugins/paypal/payment.py b/src/pretix/plugins/paypal/payment.py index 7e5dbe5063..1e70c790c4 100644 --- a/src/pretix/plugins/paypal/payment.py +++ b/src/pretix/plugins/paypal/payment.py @@ -35,17 +35,14 @@ class Paypal(BasePaymentProvider): ('live', 'Live'), ('sandbox', 'Sandbox'), ), - required=False )), ('client_id', forms.CharField( label=_('Client ID'), - required=False )), ('secret', forms.CharField( label=_('Secret'), - required=False )) ] ) diff --git a/src/pretix/plugins/stripe/payment.py b/src/pretix/plugins/stripe/payment.py index ab13941b01..5d9d3f8537 100644 --- a/src/pretix/plugins/stripe/payment.py +++ b/src/pretix/plugins/stripe/payment.py @@ -23,12 +23,10 @@ class Stripe(BasePaymentProvider): ('secret_key', forms.CharField( label=_('Secret key'), - required=False )), ('publishable_key', forms.CharField( label=_('Publishable key'), - required=False )) ] )