From 2f3772f3bf3792f8733a3951e8f02c54fa67b67f Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 11 Nov 2021 22:16:28 +1100 Subject: [PATCH 1/6] define "requires_restart" function for global setting --- InvenTree/common/models.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 374cac24af..5b01a43ac9 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -545,6 +545,17 @@ class InvenTreeSetting(BaseInvenTreeSetting): even if that key does not exist. """ + def save(self, *args, **kwargs): + """ + When saving a global setting, check to see if it requires a server restart. + If so, set the "SERVER_RESTART_REQUIRED" setting to True + """ + + super().save() + + if self.requires_restart(): + InvenTreeSetting.set_setting('SERVER_REQUIRES_RESTART', True, None) + """ Dict of all global settings values: @@ -563,6 +574,14 @@ class InvenTreeSetting(BaseInvenTreeSetting): GLOBAL_SETTINGS = { + 'SERVER_RESTART_REQUIRED': { + 'name': _('Restart required'), + 'description': _('A setting has been changed which requires a server restart'), + 'default': False, + 'validator': bool, + 'hidden': True, + }, + 'INVENTREE_INSTANCE': { 'name': _('InvenTree Instance Name'), 'default': 'InvenTree server', @@ -936,6 +955,18 @@ class InvenTreeSetting(BaseInvenTreeSetting): return self.__class__.get_setting(self.key) + def requires_restart(self): + """ + Return True if this setting requires a server restart after changing + """ + + options = InvenTreeSetting.GLOBAL_SETTINGS.get(self.key, None) + + if options: + return options.get('requires_restart', False) + else: + return False + class InvenTreeUserSetting(BaseInvenTreeSetting): """ From 626637a06a546c9a6681900c12044af0b2f6f04e Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 11 Nov 2021 22:16:46 +1100 Subject: [PATCH 2/6] Add "hidden" property to global settings - Allows certain settings to be hidden from the javascript files --- InvenTree/common/models.py | 10 ++++++++-- InvenTree/part/templatetags/inventree_extras.py | 9 +++++++++ InvenTree/templates/js/dynamic/settings.js | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 5b01a43ac9..e6c9923c88 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -69,7 +69,7 @@ class BaseInvenTreeSetting(models.Model): super().save() @classmethod - def allValues(cls, user=None): + def allValues(cls, user=None, exclude_hidden=False): """ Return a dict of "all" defined global settings. @@ -94,9 +94,15 @@ class BaseInvenTreeSetting(models.Model): for key in cls.GLOBAL_SETTINGS.keys(): if key.upper() not in settings: - settings[key.upper()] = cls.get_setting_default(key) + if exclude_hidden: + hidden = cls.GLOBAL_SETTINGS[key].get('hidden', False) + + if hidden: + # Remove hidden items + del settings[key.upper()] + for key, value in settings.items(): validator = cls.get_setting_validator(key) diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index 590ea20a6f..a8b21827c4 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -251,6 +251,15 @@ def global_settings(*args, **kwargs): return InvenTreeSetting.allValues() +@register.simple_tag() +def visible_global_settings(*args, **kwargs): + """ + Return any global settings which are not marked as 'hidden' + """ + + return InvenTreeSetting.allValues(exclude_hidden=True) + + @register.simple_tag() def progress_bar(val, max, *args, **kwargs): """ diff --git a/InvenTree/templates/js/dynamic/settings.js b/InvenTree/templates/js/dynamic/settings.js index 8201dc8374..e19bba6501 100644 --- a/InvenTree/templates/js/dynamic/settings.js +++ b/InvenTree/templates/js/dynamic/settings.js @@ -13,7 +13,7 @@ const user_settings = { {% endfor %} }; -{% global_settings as GLOBAL_SETTINGS %} +{% visible_global_settings as GLOBAL_SETTINGS %} const global_settings = { {% for key, value in GLOBAL_SETTINGS.items %} {{ key }}: {% primitive_to_javascript value %}, From cacc272424d2c58ce513a20c75867e493e4d68e8 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 11 Nov 2021 22:22:39 +1100 Subject: [PATCH 3/6] Display a wanring message if server restart is required --- InvenTree/templates/base.html | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/InvenTree/templates/base.html b/InvenTree/templates/base.html index e6c18b483a..6dc0d7d78a 100644 --- a/InvenTree/templates/base.html +++ b/InvenTree/templates/base.html @@ -5,6 +5,7 @@ {% settings_value 'BARCODE_ENABLE' as barcodes %} {% settings_value 'REPORT_ENABLE_TEST_REPORT' as test_report_enabled %} {% settings_value "REPORT_ENABLE" as report_enabled %} +{% settings_value "SERVER_RESTART_REQUIRED" as server_restart_required %} @@ -86,6 +87,21 @@
+ {% if server_restart_required %} +
+ +
+ {% endif %} + {% block alerts %}
From d4db750d2ff2e18c9fced49fffe7a3073880078b Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 11 Nov 2021 22:26:46 +1100 Subject: [PATCH 4/6] Clear the SERVER_RESTART_REQUIRED flag automatically when the server reloads --- InvenTree/common/apps.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/InvenTree/common/apps.py b/InvenTree/common/apps.py index 34b43fc68b..5f88b3c634 100644 --- a/InvenTree/common/apps.py +++ b/InvenTree/common/apps.py @@ -1,10 +1,30 @@ # -*- coding: utf-8 -*- +import logging + from django.apps import AppConfig +logger = logging.getLogger('inventree') + + class CommonConfig(AppConfig): name = 'common' def ready(self): - pass + + self.clear_restart_flag() + + def clear_restart_flag(self): + """ + Clear the SERVER_RESTART_REQUIRED setting + """ + + try: + import common.models + + if common.models.InvenTreeSetting.get_setting('SERVER_RESTART_REQUIRED'): + logger.info("Clearing SERVER_RESTART_REQUIRED flag") + common.models.InvenTreeSetting.set_setting('SERVER_RESTART_REQUIRED', False, None) + except: + pass From 03aa9bc9b0555ef398a611bc8834d49ae0c08228 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 11 Nov 2021 22:39:31 +1100 Subject: [PATCH 5/6] Tweaks for settings admin views --- InvenTree/common/admin.py | 20 ++++++++++++++++++++ InvenTree/common/models.py | 2 ++ 2 files changed, 22 insertions(+) diff --git a/InvenTree/common/admin.py b/InvenTree/common/admin.py index 4df2499177..43048281b9 100644 --- a/InvenTree/common/admin.py +++ b/InvenTree/common/admin.py @@ -12,11 +12,31 @@ class SettingsAdmin(ImportExportModelAdmin): list_display = ('key', 'value') + def get_readonly_fields(self, request, obj=None): + """ + Prevent the 'key' field being edited once the setting is created + """ + + if obj: + return ['key',] + else: + return [] + class UserSettingsAdmin(ImportExportModelAdmin): list_display = ('key', 'value', 'user', ) + def get_readonly_fields(self, request, obj=None): + """ + Prevent the 'key' field being edited once the setting is created + """ + + if obj: + return ['key',] + else: + return [] + class NotificationEntryAdmin(admin.ModelAdmin): diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index e6c9923c88..1d36d1bd5a 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -63,6 +63,8 @@ class BaseInvenTreeSetting(models.Model): Enforce validation and clean before saving """ + self.key = str(self.key).upper() + self.clean() self.validate_unique() From a470181ac69a00e2e1a251cb48a2cd4ccf70685b Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 12 Nov 2021 15:42:53 +1100 Subject: [PATCH 6/6] Style fixes --- InvenTree/common/admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InvenTree/common/admin.py b/InvenTree/common/admin.py index 43048281b9..c5950a0c0a 100644 --- a/InvenTree/common/admin.py +++ b/InvenTree/common/admin.py @@ -18,7 +18,7 @@ class SettingsAdmin(ImportExportModelAdmin): """ if obj: - return ['key',] + return ['key'] else: return [] @@ -33,7 +33,7 @@ class UserSettingsAdmin(ImportExportModelAdmin): """ if obj: - return ['key',] + return ['key'] else: return []