Re-work API for payment settings fields

This commit is contained in:
Raphael Michel
2015-03-15 19:02:38 +01:00
parent b6bda537e8
commit 41f816388b
5 changed files with 81 additions and 59 deletions

View File

@@ -1,8 +1,12 @@
from collections import OrderedDict
from decimal import Decimal
from django import forms
from django.forms import Form
from django.template import Context
from django.template.loader import get_template
from django.utils.translation import ugettext_lazy as _
from pretix.base.forms import SettingsForm
from pretix.base.settings import SettingsSandbox
@@ -20,45 +24,74 @@ class BasePaymentProvider:
return self.identifier
@property
def is_enabled(self):
def is_enabled(self) -> bool:
"""
Returns, whether or whether not this payment provider is enabled.
By default, this is determined by the value of a setting.
By default, this is determined by the value of the ``_enabled`` setting.
"""
return self.settings.get('_enabled', as_type=bool)
def calculate_fee(self, price):
def calculate_fee(self, price: Decimal) -> Decimal:
"""
Calculate the fee for this payment provider which will be added to
the final price if the price before fees (but after taxes) is 'price'.
final price before fees (but after taxes). It should include any taxes.
The default implementation makes use of the setting ``_fee_abs`` for an
absolute fee and ``_fee_percent`` for a percentage.
:param price: The total value without the payment method fee, after taxes.
"""
fee_abs = self.settings.get('_fee_abs', as_type=Decimal, default=0)
fee_percent = self.settings.get('_fee_percent', as_type=Decimal, default=0)
return price * fee_percent / 100 + fee_abs
return Decimal(price * fee_percent / 100 + fee_abs)
@property
def verbose_name(self) -> str:
"""
A human-readable name for this payment provider
A human-readable name for this payment provider. This should
be short but self-explaining. Good examples include 'Bank transfer'
and 'Credit card via Stripe'.
"""
raise NotImplementedError() # NOQA
@property
def identifier(self) -> str:
"""
A unique identifier for this payment provider
A short and unique identifier for this payment provider.
This should only contain lowercase letters and in most
cases will be the same as your packagename.
"""
raise NotImplementedError() # NOQA
@property
def settings_form_fields(self) -> dict:
"""
When the event's administrator administrator visits the event configuration
page,
A dictionary. The keys should be (unprefixed) EventSetting keys,
the values should be corresponding django form fields.
We suggest returning a collections.OrderedDict object instead of a dict.
"""
raise NotImplementedError() # NOQA
return OrderedDict([
('_enabled',
forms.ChoiceField(
label=_('Enable payment method'),
required=False,
choices=SettingsForm.BOOL_CHOICES,
)),
('_fee_abs',
forms.DecimalField(
label=_('Additional fee'),
help_text=_('Absolute value'),
required=False
)),
('_fee_percent',
forms.DecimalField(
label=_('Additional fee'),
help_text=_('Percentage'),
required=False
)),
])
@property
def checkout_form_fields(self) -> dict:

View File

@@ -129,25 +129,6 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi
)
provider.form.fields = OrderedDict(
[
('payment_%s__enabled' % provider.identifier,
forms.ChoiceField(
label=_('Enable payment method'),
required=False,
choices=SettingsForm.BOOL_CHOICES,
)),
('payment_%s__fee_abs' % provider.identifier,
forms.DecimalField(
label=_('Additional fee'),
help_text=_('Absolute value'),
required=False
)),
('payment_%s__fee_percent' % provider.identifier,
forms.DecimalField(
label=_('Additional fee'),
help_text=_('Percentage'),
required=False
)),
] + [
('payment_%s_%s' % (provider.identifier, k), v)
for k, v in provider.settings_form_fields.items()
]

View File

@@ -10,14 +10,19 @@ from pretix.base.payment import BasePaymentProvider
class BankTransfer(BasePaymentProvider):
identifier = 'banktransfer'
verbose_name = _('Bank transfer')
settings_form_fields = OrderedDict([
('bank_details',
forms.CharField(
widget=forms.Textarea,
label=_('Bank account details'),
required=False
))
])
@property
def settings_form_fields(self):
return OrderedDict(
list(super().settings_form_fields.items()) + [
('bank_details',
forms.CharField(
widget=forms.Textarea,
label=_('Bank account details'),
required=False
))
]
)
def checkout_form_render(self, request) -> str:
template = get_template('pretixplugins/banktransfer/checkout_payment_form.html')

View File

@@ -22,31 +22,36 @@ class Paypal(BasePaymentProvider):
identifier = 'paypal'
verbose_name = _('PayPal')
settings_form_fields = OrderedDict([
('endpoint',
forms.ChoiceField(
label=_('Endpoint'),
initial='live',
choices=(
('live', 'Live'),
('sandbox', 'Sandbox'),
),
required=False
)),
('client_id',
forms.CharField(
label=_('Client ID'),
required=False
)),
('secret',
forms.CharField(
label=_('Secret'),
required=False
))
])
checkout_form_fields = OrderedDict([
])
@property
def settings_form_fields(self):
return OrderedDict(
list(super().settings_form_fields.items()) + [
('endpoint',
forms.ChoiceField(
label=_('Endpoint'),
initial='live',
choices=(
('live', 'Live'),
('sandbox', 'Sandbox'),
),
required=False
)),
('client_id',
forms.CharField(
label=_('Client ID'),
required=False
)),
('secret',
forms.CharField(
label=_('Secret'),
required=False
))
]
)
def init_api(self):
paypalrestsdk.set_config(
mode="sandbox" if "sandbox" in self.settings.get('endpoint') else 'live',

View File

@@ -8,8 +8,6 @@ from pretix.base.payment import BasePaymentProvider
class Stripe(BasePaymentProvider):
identifier = 'stripe'
verbose_name = _('Credit Card via Stripe')
settings_form_fields = OrderedDict([
])
checkout_form_fields = OrderedDict([
('cc_number',
forms.CharField(