Proper support for required fields in payment provider settings

Closes #22
This commit is contained in:
Raphael Michel
2015-04-06 13:30:08 +02:00
parent 150150b9b0
commit 320fd78a62
5 changed files with 34 additions and 7 deletions

View File

@@ -91,6 +91,9 @@ class BasePaymentProvider:
))
]
)
.. WARNING:: It is highly discouraged to alter the ``_enabled`` field of the default
implementation.
"""
return OrderedDict([
('_enabled',

View File

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

View File

@@ -19,7 +19,6 @@ class BankTransfer(BasePaymentProvider):
forms.CharField(
widget=forms.Textarea,
label=_('Bank account details'),
required=False
))
]
)

View File

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

View File

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