コード例 #1
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)
コード例 #2
0
ファイル: test_ui.py プロジェクト: Deepwalker/django-setman
    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)
コード例 #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
コード例 #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, ''
コード例 #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, ''
コード例 #6
0
ファイル: views.py プロジェクト: rblack/django-setman
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)
コード例 #7
0
ファイル: lazy.py プロジェクト: rblack/django-setman
    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)
コード例 #8
0
ファイル: lazy.py プロジェクト: Deepwalker/django-setman
    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)
コード例 #9
0
ファイル: views.py プロジェクト: CrypticStudios/django-setman
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)
コード例 #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
コード例 #11
0
ファイル: test_ui.py プロジェクト: Deepwalker/django-setman
    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)
コード例 #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)
コード例 #13
0
ファイル: test_ui.py プロジェクト: Deepwalker/django-setman
    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)
コード例 #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)
コード例 #15
0
ファイル: test_settings.py プロジェクト: rblack/django-setman
        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)
コード例 #16
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)
コード例 #17
0
ファイル: fields.py プロジェクト: Deepwalker/django-setman
    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
コード例 #18
0
ファイル: fields.py プロジェクト: aldarund/django-setman
    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
コード例 #19
0
ファイル: test_settings.py プロジェクト: rblack/django-setman
    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)
コード例 #20
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)
コード例 #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
コード例 #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
コード例 #23
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)
コード例 #24
0
ファイル: test_settings.py プロジェクト: rblack/django-setman
    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)
コード例 #25
0
ファイル: fields.py プロジェクト: Deepwalker/django-setman
    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
コード例 #26
0
ファイル: fields.py プロジェクト: aldarund/django-setman
    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
コード例 #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
コード例 #28
0
ファイル: models.py プロジェクト: rblack/django-setman
    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
コード例 #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
コード例 #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)