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)
Beispiel #2
0
    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)
Beispiel #3
0
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
Beispiel #4
0
    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, ''
Beispiel #5
0
    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, ''
Beispiel #6
0
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)
Beispiel #7
0
    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)
Beispiel #8
0
    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)
Beispiel #9
0
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)
Beispiel #10
0
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
Beispiel #11
0
    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)
Beispiel #12
0
    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)
Beispiel #13
0
    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)
Beispiel #14
0
    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)
Beispiel #15
0
        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 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)
Beispiel #17
0
    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
Beispiel #18
0
    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
Beispiel #19
0
    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 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)
Beispiel #21
0
        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
Beispiel #22
0
        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)
Beispiel #24
0
    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)
Beispiel #25
0
    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
Beispiel #26
0
    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
Beispiel #27
0
    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
Beispiel #28
0
    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
Beispiel #29
0
    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
Beispiel #30
0
    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)