diff --git a/backend/appsettings/serializers.py b/backend/appsettings/serializers.py index 27115cd4..4ac45f93 100644 --- a/backend/appsettings/serializers.py +++ b/backend/appsettings/serializers.py @@ -64,7 +64,7 @@ class AppConfigAppSerializer( enable_snapshot = serializers.BooleanField() -class AppConfigSerializer(serializers.Serializer): +class AppConfigSerializer(ValidateUnknownFieldsMixin, serializers.Serializer): """serialize appconfig""" subscriptions = AppConfigSubSerializer(required=False) diff --git a/backend/appsettings/views.py b/backend/appsettings/views.py index ccddd378..31978b61 100644 --- a/backend/appsettings/views.py +++ b/backend/appsettings/views.py @@ -177,8 +177,8 @@ class AppConfigApiView(ApiBaseView): }, ) def post(request): - """update config values, partial""" - serializer = AppConfigSerializer(data=request.data) + """update config values, allows partial update""" + serializer = AppConfigSerializer(data=request.data, partial=True) serializer.is_valid(raise_exception=True) validated_data = serializer.validated_data updated_config = AppConfig().update_config(validated_data) diff --git a/backend/user/serializers.py b/backend/user/serializers.py index 4db2603a..1b8f0fca 100644 --- a/backend/user/serializers.py +++ b/backend/user/serializers.py @@ -48,13 +48,6 @@ class UserMeConfigSerializer(serializers.Serializer): show_subed_only = serializers.BooleanField() show_help_text = serializers.BooleanField() - def __init__(self, *args, required=True, **kwargs): - super().__init__(*args, **kwargs) - - # Override 'required' for all fields if provided - for field in self.fields.values(): - field.required = required - class LoginSerializer(serializers.Serializer): """serialize login""" diff --git a/backend/user/views.py b/backend/user/views.py index 2ef5ce33..8bac0877 100644 --- a/backend/user/views.py +++ b/backend/user/views.py @@ -61,7 +61,7 @@ class UserConfigView(ApiBaseView): """update config, allows partial update""" data_serializer = UserMeConfigSerializer( - data=request.data, required=False + data=request.data, partial=True ) data_serializer.is_valid(raise_exception=True) validated_data = data_serializer.validated_data diff --git a/frontend/src/api/actions/updateAppsettingsConfig.ts b/frontend/src/api/actions/updateAppsettingsConfig.ts index 462ca3ed..174dcf19 100644 --- a/frontend/src/api/actions/updateAppsettingsConfig.ts +++ b/frontend/src/api/actions/updateAppsettingsConfig.ts @@ -1,12 +1,10 @@ import APIClient from '../../functions/APIClient'; +import { AppSettingsConfigType } from '../loader/loadAppsettingsConfig'; -const updateAppsettingsConfig = async ( - configKey: string, - configValue: string | boolean | number | null, -) => { +const updateAppsettingsConfig = async (updatedConfig: Partial) => { return APIClient('/api/appsettings/config/', { method: 'POST', - body: { [configKey]: configValue }, + body: updatedConfig, }); }; diff --git a/frontend/src/pages/SettingsApplication.tsx b/frontend/src/pages/SettingsApplication.tsx index 7ed9f9d8..103b20d5 100644 --- a/frontend/src/pages/SettingsApplication.tsx +++ b/frontend/src/pages/SettingsApplication.tsx @@ -151,7 +151,9 @@ const SettingsApplication = () => { configKey: string, configValue: string | boolean | number | null, ) => { - await updateAppsettingsConfig(configKey, configValue); + const [group, key] = configKey.split('.'); + const updatedConfig = { [group]: { [key]: configValue } } as Partial; + await updateAppsettingsConfig(updatedConfig); setRefresh(true); };