diff --git a/InvenTree/common/admin.py b/InvenTree/common/admin.py index 4df2499177..c5950a0c0a 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/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 diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index a0098d3a0f..51b4bfd00d 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -63,13 +63,15 @@ class BaseInvenTreeSetting(models.Model): Enforce validation and clean before saving """ + self.key = str(self.key).upper() + self.clean() self.validate_unique() 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 +96,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) @@ -545,6 +553,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 +582,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 +963,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): """ diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index dd98eb8c65..42c66cf78e 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/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 %}
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 %},