From 6392be15fe7fe18909a6f8fe601ccfd4acdd7aa4 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 16 Jun 2015 01:00:12 +0200 Subject: [PATCH] Added heuristics for deserialization of boolean setting to make checkboxes work in a SettingsForm --- src/pretix/base/settings.py | 10 ++++------ src/tests/base/test_settings.py | 8 ++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index d09cc031b4..3fc3b6a050 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -121,7 +121,7 @@ class SettingsProxy: self._cached_obj = None def _unserialize(self, value, as_type): - if isinstance(value, as_type): + if as_type is not None and isinstance(value, as_type): return value elif value is None: return None @@ -129,7 +129,7 @@ class SettingsProxy: return as_type(value) elif as_type == dict or as_type == list: return json.loads(value) - elif as_type == bool: + elif as_type == bool or value in ('True', 'False'): return value == 'True' elif as_type == datetime: return dateutil.parser.parse(value) @@ -137,9 +137,9 @@ class SettingsProxy: return dateutil.parser.parse(value).date() elif as_type == time: return dateutil.parser.parse(value).time() - elif issubclass(as_type, Versionable): + elif as_type is not None and issubclass(as_type, Versionable): return as_type.objects.current.get(identity=value) - elif issubclass(as_type, Model): + elif as_type is not None and issubclass(as_type, Model): return as_type.objects.get(pk=value) return value @@ -168,8 +168,6 @@ class SettingsProxy: """ if as_type is None and key in DEFAULTS: as_type = DEFAULTS[key]['type'] - elif as_type is None: - as_type = str if key in self._cache(): return self._unserialize(self._cache()[key].value, as_type) diff --git a/src/tests/base/test_settings.py b/src/tests/base/test_settings.py index cb06ee7081..bbbfa411b3 100644 --- a/src/tests/base/test_settings.py +++ b/src/tests/base/test_settings.py @@ -121,6 +121,14 @@ class SettingsTestCase(TestCase): self._test_serialization(True, bool) self._test_serialization(False, bool) + def test_serialize_bool_implicit(self): + self.event.settings.set('test', True) + self.event.settings._flush() + self.assertIs(self.event.settings.get('test', as_type=None), True) + self.event.settings.set('test', False) + self.event.settings._flush() + self.assertIs(self.event.settings.get('test', as_type=None), False) + def test_serialize_versionable(self): self._test_serialization(self.event, Event)