diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index 8cc422bc20..8095bfe765 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,13 +1,16 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 310 +INVENTREE_API_VERSION = 311 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v311 - 2025-02-14 : https://github.com/inventree/InvenTree/pull/9076 + - Adds "model_filters" attribute to settings API + v310 - 2025-02-14 : https://github.com/inventree/InvenTree/pull/9077 - Adds 'is_variant' filter to the Part list API diff --git a/src/backend/InvenTree/common/models.py b/src/backend/InvenTree/common/models.py index ed55332d09..8e6890441a 100644 --- a/src/backend/InvenTree/common/models.py +++ b/src/backend/InvenTree/common/models.py @@ -893,7 +893,7 @@ class BaseInvenTreeSetting(models.Model): """Check if this setting references a model instance in the database.""" return self.model_name() is not None - def model_name(self): + def model_name(self) -> str: """Return the model name associated with this setting.""" setting = self.get_setting_definition( self.key, **self.get_filters_for_instance() @@ -901,6 +901,19 @@ class BaseInvenTreeSetting(models.Model): return setting.get('model', None) + def model_filters(self) -> dict: + """Return the model filters associated with this setting.""" + setting = self.get_setting_definition( + self.key, **self.get_filters_for_instance() + ) + + filters = setting.get('model_filters', None) + + if filters is not None and type(filters) is not dict: + filters = None + + return filters + def model_class(self): """Return the model class associated with this setting. diff --git a/src/backend/InvenTree/common/serializers.py b/src/backend/InvenTree/common/serializers.py index 4811ffa2ed..407097388b 100644 --- a/src/backend/InvenTree/common/serializers.py +++ b/src/backend/InvenTree/common/serializers.py @@ -71,6 +71,8 @@ class SettingsSerializer(InvenTreeModelSerializer): model_name = serializers.CharField(read_only=True) + model_filters = serializers.DictField(read_only=True) + api_url = serializers.CharField(read_only=True) value = SettingsValueField(allow_null=True) @@ -185,6 +187,7 @@ class GenericReferencedSettingSerializer(SettingsSerializer): 'type', 'choices', 'model_name', + 'model_filters', 'api_url', 'typ', 'required', diff --git a/src/frontend/src/components/settings/SettingList.tsx b/src/frontend/src/components/settings/SettingList.tsx index d212329e85..951c619e8e 100644 --- a/src/frontend/src/components/settings/SettingList.tsx +++ b/src/frontend/src/components/settings/SettingList.tsx @@ -62,9 +62,11 @@ export function SettingList({ return 'string'; }, [setting]); + const key: string = useMemo(() => setting?.key ?? '', [setting]); + const editSettingModal = useEditApiFormModal({ url: settingsState.endpoint, - pk: setting?.key, + pk: key, pathParams: settingsState.pathParams, title: t`Edit Setting`, fields: { @@ -75,10 +77,11 @@ export function SettingList({ description: setting?.description, api_url: setting?.api_url ?? '', model: (setting?.model_name?.split('.')[1] as ModelType) ?? null, + filters: setting?.model_filters || undefined, choices: setting?.choices ?? undefined } }, - successMessage: t`Setting ${setting?.key} updated successfully`, + successMessage: t`Setting ${key} updated successfully`, onFormSuccess: () => { settingsState.fetchSettings(); onChange?.(); diff --git a/src/frontend/src/states/states.tsx b/src/frontend/src/states/states.tsx index e381428528..fe1bbee675 100644 --- a/src/frontend/src/states/states.tsx +++ b/src/frontend/src/states/states.tsx @@ -85,6 +85,7 @@ export interface Setting { units: string; choices: SettingChoice[]; model_name: string | null; + model_filters: Record | null; api_url: string | null; typ: SettingTyp; plugin?: string;