def test_edit_settings_errors(self): client = self.login(TEST_USERNAME) for key, values in WRONG_SETTINGS.items(): old_value = getattr(settings, key) for value in values: data = copy.deepcopy(TEST_SETTINGS) data.update({key: value}) response = client.post(self.edit_settings_url, data) self.assertContains( response, 'Settings cannot be saved cause of validation issues. ' \ 'Check for errors below.' ) self.assertContains(response, '<dd class="errors">') settings._clear() if is_settings_container(old_value): new_value = getattr(settings, key) self.assertTrue(is_settings_container(new_value)) self.assertEqual(old_value._prefix, new_value._prefix) else: self.assertEqual(getattr(settings, key), old_value)
def get_config(name, default=None): """ Helper function to easy fetch ``name`` from database or django settings and return ``default`` value if setting key isn't found. But if not ``default`` value is provided (``None``) the ``AttributeError`` exception can raised if setting key isn't found. If ``name`` is one of available ``app_name`` function raises ``ValueError`` cause cannot to returns config value. For fetching app setting use next definition: ``<app_name>.<setting_name>``. """ app_name = None if '.' in name: app_name, name = name.split('.', 1) values = getattr(settings, app_name) if app_name else settings if default is not None: result = getattr(values, name, default) else: result = getattr(values, name) if is_settings_container(result): raise ValueError('%r is settings container, not setting.' % name) return result
def check_setman(self, verbosity): """ Check setman configuration. """ if verbosity: print >> self.stdout, 'Project settings:' print >> self.stdout, 'Configuration definition file placed at ' \ '%r\n' % AVAILABLE_SETTINGS.path for setting in AVAILABLE_SETTINGS: indent = ' ' * 4 if is_settings_container(setting): print >> self.stdout, '%s%r settings:' % \ (indent, setting.app_name) print >> self.stdout, '%sConfiguration definition file ' \ 'placed at %r' % \ (indent, setting.path) indent *= 2 for subsetting in setting: print >> self.stdout, '%s%r' % (indent, subsetting) print >> self.stdout else: print >> self.stdout, '%s%r' % (indent, setting) print >> self.stdout, ''
def view_settings(request): """ View Configuration Definition File for Test Project. Only logged in users can have access to this page. """ handler = open(AVAILABLE_SETTINGS.path, 'rb') project_settings_content = handler.read() handler.close() apps_settings_contents = SortedDict() for setting in AVAILABLE_SETTINGS: if is_settings_container(setting): handler = open(setting.path, 'rb') apps_settings_contents[setting.app_name] = handler.read() handler.close() filename = getattr(django_settings, 'SETMAN_DEFAULT_VALUES_FILE', None) if filename: handler = open(filename, 'rb') default_values_content = handler.read() handler.close() else: default_values_content = None context = { 'apps_settings_contents': apps_settings_contents, 'default_values_content': default_values_content, 'project_settings_content': project_settings_content } return render(request, 'view_settings.html', context)
def __getattr__(self, name): """ Add support for getting settings keys as instance attribute. For first try, method tries to read settings from database, then from Django settings and if all fails try to return default value of available setting from configuration definition file if any. """ if name.startswith('_'): return self._safe_super_method('__getattr__', name) data, prefix = self._custom.data, self._prefix # Read app setting from database if prefix and prefix in data and name in data[prefix]: return data[prefix][name] # Read project setting from database elif name in data and not isinstance(data[name], dict): return data[name] # Or from Django settings elif hasattr(django_settings, name): return getattr(django_settings, name) # Or read default value from available settings elif hasattr(self._settings, name): mixed = getattr(self._settings, name) if is_settings_container(mixed): return LazySettings(mixed, name, self) return mixed.default # If cannot read setting - raise error raise AttributeError('Settings has not attribute %r' % name)
def __getattr__(self, name): """ Add support for getting settings keys as instance attribute. For first try, method tries to read settings from database, then from Django settings and if all fails try to return default value of available setting from configuration definition file if any. """ if name.startswith('_'): return super(LazySettings, self).__getattr__(name) data, prefix = self._custom.data, self._prefix # Read app setting from database if prefix and prefix in data and name in data[prefix]: return data[prefix][name] # Read project setting from database elif name in data and not isinstance(data[name], dict): return data[name] # Or from Django settings elif hasattr(django_settings, name): return getattr(django_settings, name) # Or read default value from available settings elif hasattr(self._settings, name): mixed = getattr(self._settings, name) if is_settings_container(mixed): return LazySettings(mixed, name, self) return mixed.default # If cannot read setting - raise error raise AttributeError('Settings has not attribute %r' % name)
def view_settings(request): """ View Configuration Definition File for Test Project. Only logged in users can have access to this page. """ handler = open(AVAILABLE_SETTINGS.path, 'rb') project_settings_content = handler.read() handler.close() apps_settings_contents = SortedDict() for setting in AVAILABLE_SETTINGS: if is_settings_container(setting): handler = open(setting.path, 'rb') apps_settings_contents[setting.app_name] = handler.read() handler.close() filename = getattr(django_settings, 'SETMAN_DEFAULT_VALUES_FILE', None) if filename: handler = open(filename, 'rb') default_values_content = handler.read() handler.close() else: default_values_content = None context = {'apps_settings_contents': apps_settings_contents, 'default_values_content': default_values_content, 'project_settings_content': project_settings_content} return render(request, 'view_settings.html', context)
def check_values(self, settings, data): for name, value in data.items(): mixed = getattr(settings, name) if is_settings_container(mixed): self.check_values(mixed, data.get(name)) else: self.assertEqual(mixed, value)
def check_labels(self, response, settings=None): settings = settings or AVAILABLE_SETTINGS for setting in settings: if is_settings_container(setting): self.check_labels(response, setting) else: self.assertContains(response, setting.label) self.assertContains(response, setting.help_text)
def check_values(prefix=None): data = TEST_SETTINGS[prefix] if prefix else TEST_SETTINGS values = getattr(settings, prefix) if prefix else settings for name, value in data.items(): mixed = getattr(values, name) if is_settings_container(mixed): check_values(name) else: self.assertEqual(mixed, value)
def _settings_to_python(self, data, settings=None): settings = settings or AVAILABLE_SETTINGS for key, value in data.items(): if hasattr(settings, key): mixed = getattr(settings, key) if is_settings_container(mixed): data[key] = self._settings_to_python(value, mixed) else: data[key] = mixed.to_python(value) return data
def test_default_values(self, prefix=None): data = TEST_SETTINGS[prefix] if prefix else TEST_SETTINGS values = getattr(settings, prefix) if prefix else settings self.assertEqual(Settings.objects.count(), 1 if prefix else 0) for name, value in data.items(): self.assertTrue(hasattr(values, name)) mixed = getattr(values, name) if is_settings_container(mixed): self.test_default_values(name) else: self.assertEqual(mixed, value)
def store_values(settings, available_settings=None, prefix=None): available_settings = available_settings or AVAILABLE_SETTINGS for setting in available_settings: if is_settings_container(setting): store_values(settings, setting, setting.app_name) elif not prefix: setattr(settings, setting.name, setting.default) else: data = settings.data if not prefix in data: data[prefix] = {} data[prefix][setting.name] = setting.default
def test_app_settings(self): self.assertRaises(AttributeError, getattr, settings, 'auth') self.assertTrue(hasattr(settings, 'core')) self.assertTrue(is_settings_container(settings.core)) self.assertEqual(settings.core.app_setting, None) self.assertEqual(settings.core.setting_to_redefine, 0) settings.core.app_setting = 'string' settings.core.setting_to_redefine = 60 settings.save() settings._clear() cache.clear() self.assertEqual(settings.core.app_setting, 'string') self.assertEqual(settings.core.setting_to_redefine, 60)
def clean(self, value, instance, settings=None): """ Run validation for each setting value. """ data = {} if not value else value settings = settings or AVAILABLE_SETTINGS for name, value in data.items(): if not hasattr(settings, name): continue mixed = getattr(settings, name) if is_settings_container(mixed): data[name] = self.clean(value, instance, mixed) else: data[name] = mixed.to_field(initial=value).clean(value) return data
def revert(self, app_name=None): """ Revert all stored settings to default values. """ data = self.data.get(app_name, {}) if app_name else self.data values = getattr(AVAILABLE_SETTINGS, app_name) if app_name \ else AVAILABLE_SETTINGS for name, value in data.items(): mixed = getattr(values, name, None) # Pass if ``name`` isn't on available settings values if mixed is None: continue if is_settings_container(mixed): self.revert(name) else: data[name] = mixed.default
def build_fields(self, settings=None, fields=None): """ Build only fields from list of availabale settings. """ fields = fields or SortedDict() settings = settings or AVAILABLE_SETTINGS for setting in settings: if is_settings_container(setting): fields = self.build_fields(setting, fields) else: field = setting.to_field() field.app_name = setting.app_name if setting.app_name: name = '.'.join((setting.app_name, setting.name)) else: name = setting.name fields[name] = field return fields
def _get_setting_value(self, name): data, prefix = self._custom.data, self._prefix # Read app setting from database if prefix and prefix in data and name in data[prefix]: return data[prefix][name] # Read project setting from database elif name in data and not isinstance(data[name], dict): return data[name] # Or from Django settings elif hasattr(django_settings, name): return getattr(django_settings, name) # Or read default value from available settings elif hasattr(self._settings, name): mixed = getattr(self._settings, name) if is_settings_container(mixed): return LazySettings(mixed, name, self) return mixed.default # If cannot read setting - raise error raise AttributeError('Settings has not attribute %r' % name)