diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 4543b873bd..96b7da140d 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -320,6 +320,7 @@ TEMPLATES = [ 'django.template.context_processors.i18n', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + # Custom InvenTree context processors 'InvenTree.context.health_status', 'InvenTree.context.status_codes', 'InvenTree.context.user_roles', diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 3924a516f3..cf5e44595a 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -20,7 +20,6 @@ from djmoney.contrib.exchange.models import convert_money from djmoney.contrib.exchange.exceptions import MissingRate from django.utils.translation import ugettext_lazy as _ -from django.utils.html import format_html from django.core.validators import MinValueValidator, URLValidator from django.core.exceptions import ValidationError @@ -49,55 +48,37 @@ class BaseInvenTreeSetting(models.Model): 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 + settings = {} + for setting in results: if setting.key: - settings.append({ - "key": setting.key.upper(), - "value": setting.value - }) - - keys.add(setting.key.upper()) + settings[setting.key.upper()] = setting.value # Specify any "default" values which are not in the database for key in cls.GLOBAL_SETTINGS.keys(): - if key.upper() not in keys: + if key.upper() not in settings: - settings.append({ - "key": key.upper(), - "value": cls.get_setting_default(key) - }) - - # Enforce javascript formatting - for idx, setting in enumerate(settings): - - key = setting['key'] - value = setting['value'] + settings[key.upper()] = cls.get_setting_default(key) + for key, value in settings.items(): validator = cls.get_setting_validator(key) - # Convert to javascript compatible booleans if cls.validator_is_bool(validator): - value = str(value).lower() - - # Numerical values remain the same + value = InvenTree.helpers.str2bool(value) elif cls.validator_is_int(validator): - pass + try: + value = int(value) + except ValueError: + value = cls.get_setting_default(key) - # Wrap strings with quotes - else: - value = format_html("'{}'", value) - - setting["value"] = value + settings[key] = value return settings diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index b12a59f136..3b88deb504 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -6,6 +6,7 @@ over and above the built-in Django tags. import os import sys +from django.utils.html import format_html from django.utils.translation import ugettext_lazy as _ from django.conf import settings as djangosettings @@ -262,6 +263,26 @@ def get_available_themes(*args, **kwargs): return themes +@register.simple_tag() +def primitive_to_javascript(primitive): + """ + Convert a python primitive to a javascript primitive. + + e.g. True -> true + 'hello' -> '"hello"' + """ + + if type(primitive) is bool: + return str(primitive).lower() + + elif type(primitive) in [int, float]: + return primitive + + else: + # Wrap with quotes + return format_html("'{}'", primitive) + + @register.filter def keyvalue(dict, key): """ diff --git a/InvenTree/templates/js/dynamic/settings.js b/InvenTree/templates/js/dynamic/settings.js index ad4e297c4a..60172ead64 100644 --- a/InvenTree/templates/js/dynamic/settings.js +++ b/InvenTree/templates/js/dynamic/settings.js @@ -2,16 +2,17 @@ // 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 }}, + {% for key, value in USER_SETTINGS.items %} + {{ key }}: {% primitive_to_javascript value %}, {% endfor %} }; +{% global_settings as GLOBAL_SETTINGS %} + var global_settings = { - {% for setting in GLOBAL_SETTINGS %} - {{ setting.key }}: {{ setting.value }}, + {% for key, value in GLOBAL_SETTINGS.items %} + {{ key }}: {% primitive_to_javascript value %}, {% endfor %} }; \ No newline at end of file