Fields should not be required, serialize more types

This commit is contained in:
Raphael Michel
2015-03-06 11:55:05 +01:00
parent c6e081ca00
commit 98f7f07c2e
4 changed files with 30 additions and 6 deletions

View File

@@ -40,5 +40,7 @@ class SettingsForm(forms.Form):
def save(self): def save(self):
for name, field in self.fields.items(): for name, field in self.fields.items():
value = self.cleaned_data[name] 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) self.obj.settings.set(name, value)

View File

@@ -1,4 +1,8 @@
import json import json
import decimal
from django.db.models import Model
from versions.models import Versionable
DEFAULTS = { DEFAULTS = {
@@ -33,6 +37,8 @@ class SettingsProxy:
def _unserialize(self, value, as_type): def _unserialize(self, value, as_type):
if isinstance(value, as_type): if isinstance(value, as_type):
return value return value
elif value is None:
return None
elif as_type == int: elif as_type == int:
return int(value) return int(value)
elif as_type == float: elif as_type == float:
@@ -41,15 +47,27 @@ class SettingsProxy:
return json.loads(value) return json.loads(value)
elif as_type == bool: elif as_type == bool:
return value == 'True' 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 return value
def _serialize(self, value): def _serialize(self, value):
if isinstance(value, str): if isinstance(value, str):
return value 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) return str(value)
elif isinstance(value, list) or isinstance(value, bool): elif isinstance(value, list) or isinstance(value, bool):
return json.dumps(value) 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))) raise TypeError('Unable to serialize %s into a setting.' % str(type(value)))
def get(self, key, default=None, as_type=str): def get(self, key, default=None, as_type=str):

View File

@@ -131,17 +131,20 @@ class PaymentSettings(EventPermissionRequiredMixin, TemplateView, SingleObjectMi
[ [
('payment_%s__enabled' % provider.identifier, ('payment_%s__enabled' % provider.identifier,
forms.BooleanField( forms.BooleanField(
label=_('Enable payment method') label=_('Enable payment method'),
required=False
)), )),
('payment_%s__fee_abs' % provider.identifier, ('payment_%s__fee_abs' % provider.identifier,
forms.DecimalField( forms.DecimalField(
label=_('Additional fee'), label=_('Additional fee'),
help_text=_('Absolute value') help_text=_('Absolute value'),
required=False
)), )),
('payment_%s__fee_percent' % provider.identifier, ('payment_%s__fee_percent' % provider.identifier,
forms.DecimalField( forms.DecimalField(
label=_('Additional fee'), label=_('Additional fee'),
help_text=_('Percentage') help_text=_('Percentage'),
required=False
)), )),
] + [ ] + [
('payment_%s_%s' % (provider.identifier, k), v) ('payment_%s_%s' % (provider.identifier, k), v)

View File

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