From 42b418970385d5bf077c8e43df51db729b79ee44 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 1 Apr 2015 11:14:52 +0200 Subject: [PATCH] Automatic deserialization of known settings --- src/pretix/base/settings.py | 65 ++++++++++++++++++++++++++++----- src/tests/base/test_settings.py | 5 ++- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index d18c0795e4..8d6bf9b969 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -9,14 +9,54 @@ from versions.models import Versionable DEFAULTS = { - 'user_mail_required': 'False', - 'max_items_per_order': '10', - 'attendee_names_asked': 'True', - 'attendee_names_required': 'False', - 'reservation_time': '30', - 'ticket_download': 'True', - 'last_order_modification_date': None, - 'mail_from': settings.MAIL_FROM, + 'user_mail_required': { + 'default': 'False', + 'type': bool + }, + 'max_items_per_order': { + 'default': '10', + 'type': int + }, + 'attendee_names_asked': { + 'default': 'True', + 'type': bool + }, + 'attendee_names_required': { + 'default': 'False', + 'type': bool + }, + 'reservation_time': { + 'default': '30', + 'type': int + }, + 'payment_term_days': { + 'default': '14', + 'type': int + }, + 'payment_term_last': { + 'default': None, + 'type': datetime, + }, + 'show_date_to': { + 'default': 'True', + 'type': bool + }, + 'show_times': { + 'default': 'True', + 'type': bool + }, + 'ticket_download': { + 'default': 'True', + 'type': bool + }, + 'last_order_modification_date': { + 'default': 'None', + 'type': datetime + }, + 'mail_from': { + 'default': settings.MAIL_FROM, + 'type': str + } } @@ -84,19 +124,24 @@ class SettingsProxy: 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=None): """ Get a setting specified by key 'key'. Normally, settings are strings, but if you put non-strings into the settings object, you can request unserialization by specifying 'as_type' """ + 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) value = None if self._parent: value = self._parent.settings.get(key) if value is None and key in DEFAULTS: - return self._unserialize(DEFAULTS[key], as_type) + return self._unserialize(DEFAULTS[key]['default'], as_type) if value is None and default is not None: return self._unserialize(default, as_type) return self._unserialize(value, as_type) diff --git a/src/tests/base/test_settings.py b/src/tests/base/test_settings.py index 8763d4ca59..cb06ee7081 100644 --- a/src/tests/base/test_settings.py +++ b/src/tests/base/test_settings.py @@ -11,7 +11,10 @@ from pretix.base.settings import SettingsSandbox class SettingsTestCase(TestCase): def setUp(self): - settings.DEFAULTS['test_default'] = 'def' + settings.DEFAULTS['test_default'] = { + 'default': 'def', + 'type': str + } self.organizer = Organizer.objects.create(name='Dummy', slug='dummy') self.event = Event.objects.create( organizer=self.organizer, name='Dummy', slug='dummy',