@@ -49,28 +49,32 @@ class StringSetting(Setting):
4949class EnumStringSetting(Setting):
5050 """Setting of a value which can only come from the given choices"""
5151
52+ def _validate_selection(self, selection):
53+ if selection not in self.choices:
54+ raise ValidationException('Invalid value: "{0}"'.format(selection))
55+
5256 def _post_init(self):
5357 if not hasattr(self, 'choices'):
5458 raise MissingArgumentException('Missing argument: choices')
55−
56− if self.value != '' and self.value not in self.choices:
57− raise ValidationException('Invalid default value: {0}'.format(self.value))
59+ self._validate_selection(self.value)
5860
5961 def parse(self, data):
60− if data not in self.choices and data != self.value:
61− raise ValidationException('Invalid choice: {0}'.format(data))
62+ self._validate_selection(data)
6263 self.value = data
6364
6465
6566class MultipleChoiceSetting(EnumStringSetting):
6667 """Setting of values which can only come from the given choices"""
6768
69+ def _validate_selections(self, selections):
70+ for item in selections:
71+ if item not in self.choices:
72+ raise ValidationException('Invalid value: "{0}"'.format(selections))
73+
6874 def _post_init(self):
6975 if not hasattr(self, 'choices'):
7076 raise MissingArgumentException('Missing argument: choices')
71− for item in self.value:
72− if item not in self.choices:
73− raise ValidationException('Invalid default value: {0}'.format(self.value))
77+ self._validate_selections(self.value)
7478
7579 def parse(self, data):
7680 if data == '':
@@ -78,9 +82,7 @@ class MultipleChoiceSetting(EnumStringSetting):
7882 return
7983
8084 elements = data.split(',')
81− for item in elements:
82− if item not in self.choices:
83− raise ValidationException('Invalid choice: {0}'.format(item))
85+ self._validate_selections(elements)
8486 self.value = elements
8587
8688 def parse_form(self, data):
@@ -216,7 +218,7 @@ class Preferences(object):
216218 self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories),
217219 'language': EnumStringSetting('all', choices=LANGUAGE_CODES),
218220 'locale': EnumStringSetting(settings['ui']['default_locale'],
219− choices=settings['locales'].keys()),
221+ choices=settings['locales'].keys() + ['']),
220222 'autocomplete': EnumStringSetting(settings['search']['autocomplete'],
221223 choices=autocomplete.backends.keys() + ['']),
222224 'image_proxy': MapSetting(settings['server']['image_proxy'],