Add version attribute to namespaces

Also dump the version of all the namespaces as
children of SMART_SETTINGS_NAMESPACES.

Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-10-31 13:40:01 -04:00
parent 1ca91e7ec5
commit 9d883e455e
2 changed files with 34 additions and 5 deletions

View File

@@ -33,6 +33,8 @@
- Backport Docker composer makefile targets.
- Add PermissionTestCaseMixin and SmartSettingTestCaseMixin to better
organize cache invalidation of both apps for tests.
- Add a version attribute to setting namespace. These are dumped
as SMART_SETTINGS_NAMESPACES.
3.2.8 (2019-10-01)
==================

View File

@@ -22,6 +22,7 @@ from django.utils.encoding import (
)
logger = logging.getLogger(__name__)
SMART_SETTINGS_NAMESPACES_NAME = 'SMART_SETTINGS_NAMESPACES'
@python_2_unicode_compatible
@@ -40,26 +41,35 @@ class Namespace(object):
exception
)
@classmethod
def get(cls, name):
return cls._registry[name]
@classmethod
def get_all(cls):
return sorted(cls._registry.values(), key=lambda x: x.label)
@classmethod
def get(cls, name):
return cls._registry[name]
def get_namespace_config(cls, name):
return cls.get_namespaces_config().get(name, {})
@classmethod
def get_namespaces_config(cls):
return getattr(settings, SMART_SETTINGS_NAMESPACES_NAME, {})
@classmethod
def invalidate_cache_all(cls):
for namespace in cls.get_all():
namespace.invalidate_cache()
def __init__(self, name, label):
def __init__(self, name, label, version='0001'):
if name in self.__class__._registry:
raise Exception(
'Namespace names must be unique; "%s" already exists.' % name
)
self.name = name
self.label = label
self.version = version
self.__class__._registry[name] = self
self._settings = []
@@ -69,6 +79,9 @@ class Namespace(object):
def add_setting(self, **kwargs):
return Setting(namespace=self, **kwargs)
def get_config_version(self):
return Namespace.get_namespace_config(name=self.name).get('version', None)
def invalidate_cache(self):
for setting in self._settings:
setting.invalidate_cache()
@@ -123,7 +136,18 @@ class Setting(object):
def dump_data(cls, filter_term=None, namespace=None):
dictionary = {}
if not namespace:
namespace_dictionary = {}
for _namespace in Namespace.get_all():
namespace_dictionary[_namespace.name] = {
'version': _namespace.version
}
dictionary[SMART_SETTINGS_NAMESPACES_NAME] = namespace_dictionary
for setting in cls.get_all():
# If a namespace is specified, filter the list by that namespace
# otherwise return always True to include all (or not None == True)
if (namespace and setting.namespace.name == namespace) or not namespace:
if (filter_term and filter_term.lower() in setting.global_name.lower()) or not filter_term:
dictionary[setting.global_name] = Setting.express_promises(setting.value)
@@ -147,9 +171,12 @@ class Setting(object):
)
@classmethod
def save_configuration(cls, path=settings.CONFIGURATION_FILEPATH):
def save_configuration(cls, path=None):
if not path:
path = settings.CONFIGURATION_FILEPATH
try:
with open(path, 'w') as file_object:
with open(path, mode='w') as file_object:
file_object.write(cls.dump_data())
except IOError as exception:
if exception.errno == errno.ENOENT: