From 080edc870f9b9aeb1fa7d9b13e8061aaa8623f48 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 1 Apr 2026 16:18:55 +1100 Subject: [PATCH] Better ordering for plugin settings (#11646) * Better ordering for plugin settings - Followup to https://github.com/inventree/InvenTree/pull/11643 - Use order as provided by plugin * Bug fix --- src/backend/InvenTree/common/models.py | 17 ++++++++++++----- src/backend/InvenTree/machine/api.py | 6 +----- src/backend/InvenTree/plugin/api.py | 12 ++---------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/backend/InvenTree/common/models.py b/src/backend/InvenTree/common/models.py index 42bd00f119..7829180460 100644 --- a/src/backend/InvenTree/common/models.py +++ b/src/backend/InvenTree/common/models.py @@ -10,6 +10,7 @@ import json import math import os import uuid +from collections import OrderedDict from datetime import timedelta, timezone from email.utils import make_msgid from enum import Enum @@ -363,9 +364,15 @@ class BaseInvenTreeSetting(models.Model): # Specify any "default" values which are not in the database settings_definition = settings_definition or cls.SETTINGS + + all_settings = OrderedDict() + for key, setting in settings_definition.items(): - if key.upper() not in settings: - settings[key.upper()] = cls( + # If the setting is already in the database, use that value + if key.upper() in settings: + all_settings[key] = settings[key.upper()] + else: + all_settings[key.upper()] = cls( key=key.upper(), value=cls.get_setting_default(key, **filters), **filters, @@ -373,10 +380,10 @@ class BaseInvenTreeSetting(models.Model): # remove any hidden settings if exclude_hidden and setting.get('hidden', False): - del settings[key.upper()] + del all_settings[key.upper()] # format settings values and remove protected - for key, setting in settings.items(): + for key, setting in all_settings.items(): validator = cls.get_setting_validator(key, **filters) if cls.is_protected(key, **filters) and setting.value != '': @@ -389,7 +396,7 @@ class BaseInvenTreeSetting(models.Model): except ValueError: setting.value = cls.get_setting_default(key, **filters) - return settings + return all_settings @classmethod def allValues( diff --git a/src/backend/InvenTree/machine/api.py b/src/backend/InvenTree/machine/api.py index 76d9d80be3..0092622ed7 100644 --- a/src/backend/InvenTree/machine/api.py +++ b/src/backend/InvenTree/machine/api.py @@ -97,12 +97,8 @@ class MachineSettingList(APIView): ) all_settings.extend(list(settings_dict.values())) - # Sort settings by the 'key' field before returning, - # to ensure a deterministic order in the API response - all_settings = sorted(all_settings, key=lambda x: x.key) - results = MachineSerializers.MachineSettingSerializer( - all_settings, many=True + list(all_settings), many=True ).data return Response(results) diff --git a/src/backend/InvenTree/plugin/api.py b/src/backend/InvenTree/plugin/api.py index b87bcdd070..91580062b3 100644 --- a/src/backend/InvenTree/plugin/api.py +++ b/src/backend/InvenTree/plugin/api.py @@ -380,12 +380,8 @@ class PluginAllSettingList(APIView): settings_definition=settings, plugin=plugin.plugin_config() ) - # Sort settings by the 'key' field before returning, - # to ensure a deterministic order in the API response - settings_values = sorted(settings_dict.values(), key=lambda x: x.key) - results = PluginSerializers.PluginSettingSerializer( - settings_values, many=True + list(settings_dict.values()), many=True ).data return Response(results) @@ -448,12 +444,8 @@ class PluginUserSettingList(APIView): user=request.user, ) - # Sort settings by the 'key' field before returning, - # to ensure a deterministic order in the API response - settings_values = sorted(settings_dict.values(), key=lambda x: x.key) - results = PluginSerializers.PluginUserSettingSerializer( - settings_values, many=True + list(settings_dict.values()), many=True ).data return Response(results)