From 27ec65a00217b4a60b94df12038dd1efd3636085 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 29 Jul 2021 11:28:04 +1000 Subject: [PATCH] Add 'settings.js' which provides all settings (global and user) as a dynamic javascript file - Minimal database hits required --- InvenTree/InvenTree/urls.py | 1 + InvenTree/common/models.py | 40 ++++++++++++++++++- .../part/templatetags/inventree_extras.py | 18 +++++++++ InvenTree/templates/base.html | 7 +++- InvenTree/templates/js/dynamic/settings.js | 17 ++++++++ 5 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 InvenTree/templates/js/dynamic/settings.js diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 7d398c6e4f..d3f144800d 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -96,6 +96,7 @@ settings_urls = [ # These javascript files are served "dynamically" - i.e. rendered on demand dynamic_javascript_urls = [ url(r'^inventree.js', DynamicJsView.as_view(template_name='js/dynamic/inventree.js'), name='inventree.js'), + url(r'^settings.js', DynamicJsView.as_view(template_name='js/dynamic/settings.js'), name='settings.js'), ] # These javascript files are pased through the Django translation layer diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 72e8cf8060..5131248db4 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -38,6 +38,45 @@ class BaseInvenTreeSetting(models.Model): class Meta: abstract = True + @classmethod + def allValues(cls, user=None): + """ + Return a dict of "all" defined global settings. + + This performs a single database lookup, + and then any settings which are not *in* the database + are assigned their default values + """ + + keys = set() + settings = [] + + results = cls.objects.all() + + if user is not None: + results = results.filter(user=user) + + # Query the database + for setting in results: + settings.append({ + "key": setting.key.upper(), + "value": setting.value + }) + + keys.add(setting.key.upper()) + + # Specify any "default" values which are not in the database + for key in cls.GLOBAL_SETTINGS.keys(): + + if key.upper() not in keys: + + settings.append({ + "key": key.upper(), + "value": cls.get_setting_default(key) + }) + + return settings + @classmethod def get_setting_name(cls, key): """ @@ -739,7 +778,6 @@ class InvenTreeSetting(BaseInvenTreeSetting): help_text=_('Settings key (must be unique - case insensitive'), ) - class InvenTreeUserSetting(BaseInvenTreeSetting): """ An InvenTreeSetting object with a usercontext diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index f930fa4467..5ebc939305 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -207,6 +207,24 @@ def settings_value(key, *args, **kwargs): return InvenTreeSetting.get_setting(key) +@register.simple_tag() +def user_settings(user, *args, **kwargs): + """ + Return all USER settings as a key:value dict + """ + + return InvenTreeUserSetting.allValues(user=user) + + +@register.simple_tag() +def global_settings(*args, **kwargs): + """ + Return all GLOBAL InvenTree settings as a key:value dict + """ + + return InvenTreeSetting.allValues() + + @register.simple_tag() def get_color_theme_css(username): try: diff --git a/InvenTree/templates/base.html b/InvenTree/templates/base.html index 72f20404aa..22955e208b 100644 --- a/InvenTree/templates/base.html +++ b/InvenTree/templates/base.html @@ -145,8 +145,11 @@ - - + + + + + diff --git a/InvenTree/templates/js/dynamic/settings.js b/InvenTree/templates/js/dynamic/settings.js new file mode 100644 index 0000000000..ad4e297c4a --- /dev/null +++ b/InvenTree/templates/js/dynamic/settings.js @@ -0,0 +1,17 @@ +{% load inventree_extras %} +// InvenTree settings + +{% user_settings request.user as USER_SETTINGS %} +{% global_settings as GLOBAL_SETTINGS %} + +var user_settings = { + {% for setting in USER_SETTINGS %} + {{ setting.key }}: {{ setting.value }}, + {% endfor %} +}; + +var global_settings = { + {% for setting in GLOBAL_SETTINGS %} + {{ setting.key }}: {{ setting.value }}, + {% endfor %} +}; \ No newline at end of file