diff --git a/src/pretix/base/forms.py b/src/pretix/base/forms.py index b5e29a3e9e..c1bc2c93e7 100644 --- a/src/pretix/base/forms.py +++ b/src/pretix/base/forms.py @@ -40,5 +40,7 @@ class SettingsForm(forms.Form): def save(self): for name, field in self.fields.items(): value = self.cleaned_data[name] - if self.obj.settings.get(value, as_type=type(value)) != value: + if value is None: + del self.obj.settings[name] + elif self.obj.settings.get(value, as_type=type(value)) != value: self.obj.settings.set(name, value) diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 5a92a8838c..32960dd3b7 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -1,4 +1,8 @@ import json +import decimal + +from django.db.models import Model +from versions.models import Versionable DEFAULTS = { @@ -33,6 +37,8 @@ class SettingsProxy: def _unserialize(self, value, as_type): if isinstance(value, as_type): return value + elif value is None: + return None elif as_type == int: return int(value) elif as_type == float: @@ -41,15 +47,27 @@ class SettingsProxy: return json.loads(value) elif as_type == bool: return value == 'True' + elif as_type == decimal.Decimal: + return decimal.Decimal(value) + elif issubclass(as_type, Versionable): + return as_type.objects.current.get(identity=value) + elif issubclass(as_type, Model): + return as_type.objects.get(pk=value) return value def _serialize(self, value): if isinstance(value, str): return value - elif isinstance(value, int) or isinstance(value, float) or isinstance(value, bool): + elif isinstance(value, int) or isinstance(value, float) \ + or isinstance(value, bool) or isinstance(value, decimal.Decimal): return str(value) elif isinstance(value, list) or isinstance(value, bool): return json.dumps(value) + elif isinstance(value, Versionable): + return value.identity + elif isinstance(value, Model): + return value.pk + raise TypeError('Unable to serialize %s into a setting.' % str(type(value))) def get(self, key, default=None, as_type=str): diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 2dc3e3d101..f07dd8b062 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -131,17 +131,20 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi [ ('payment_%s__enabled' % provider.identifier, forms.BooleanField( - label=_('Enable payment method') + label=_('Enable payment method'), + required=False )), ('payment_%s__fee_abs' % provider.identifier, forms.DecimalField( label=_('Additional fee'), - help_text=_('Absolute value') + help_text=_('Absolute value'), + required=False )), ('payment_%s__fee_percent' % provider.identifier, forms.DecimalField( label=_('Additional fee'), - help_text=_('Percentage') + help_text=_('Percentage'), + required=False )), ] + [ ('payment_%s_%s' % (provider.identifier, k), v) diff --git a/src/pretix/plugins/banktransfer/payment.py b/src/pretix/plugins/banktransfer/payment.py index a48e1ddc33..06d13fe044 100644 --- a/src/pretix/plugins/banktransfer/payment.py +++ b/src/pretix/plugins/banktransfer/payment.py @@ -12,6 +12,7 @@ class BankTransfer(BasePaymentProvider): ('bank_details', forms.CharField( widget=forms.Textarea, - label=_('Bank account details') + label=_('Bank account details'), + required=False )) ])