Provide global_settings and user_settings as context objects

- Adds a new context middleware
- Refactor the way that settings are provided to the javascript layer
This commit is contained in:
Oliver 2021-08-15 11:57:05 +10:00
parent 6c17e330c4
commit faab1f2464
5 changed files with 60 additions and 55 deletions

View File

@ -10,6 +10,8 @@ from InvenTree.status_codes import StockHistoryCode
import InvenTree.status
import common.models
from users.models import RuleSet
@ -70,6 +72,26 @@ def status_codes(request):
}
def inventree_settings(request):
"""
Adds two context objects to the request:
user_settings - A key:value dict of all user InvenTree settings for the current user
global_settings - A key:value dict of all global InvenTree settings
Providing a single context object for all settings should reduce the number of db hits
"""
ctx = {}
if request.user:
ctx["user_settings"] = common.models.InvenTreeUserSetting.allValues(user=request.user)
ctx["global_settings"] = common.models.InvenTreeSetting.allValues()
return ctx
def user_roles(request):
"""
Return a map of the current roles assigned to the user.

View File

@ -320,9 +320,11 @@ 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',
'InvenTree.context.inventree_settings',
],
},
},

View File

@ -49,55 +49,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

View File

@ -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
@ -208,24 +209,6 @@ 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:
@ -262,6 +245,25 @@ 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):
"""

View File

@ -1,17 +1,14 @@
{% 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 }},
{% for key, value in user_settings.items %}
{{ key }}: {% primitive_to_javascript value %},
{% endfor %}
};
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 %}
};