From 1c1ef06e291837b67dd0170c4f1c01281e568bfb Mon Sep 17 00:00:00 2001 From: 3252a8 <3252a8@proton.me> Date: Thu, 28 May 2026 22:48:48 +0300 Subject: [PATCH] fix: Fix trial settings persistence --- backend/bot/app/web/admin_settings_manifest.py | 12 +++++++++++- frontend/src/admin/sections/TariffsSection.svelte | 7 ++++++- tests/test_admin_settings_manifest_i18n.py | 11 +++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/backend/bot/app/web/admin_settings_manifest.py b/backend/bot/app/web/admin_settings_manifest.py index de1d1fe..686a6ea 100644 --- a/backend/bot/app/web/admin_settings_manifest.py +++ b/backend/bot/app/web/admin_settings_manifest.py @@ -283,12 +283,20 @@ SETTINGS_MANIFEST: List[SettingField] = [ subsection="common", ), # ─── Trial ───────────────────────────────────────────────────── - SettingField("TRIAL_ENABLED", "bool", "pricing", "Триал включён", subsection="trial"), + SettingField( + "TRIAL_ENABLED", + "bool", + "pricing", + "Триал включён", + optional=False, + subsection="trial", + ), SettingField( "TRIAL_DURATION_DAYS", "int", "pricing", "Длительность триала (дней)", + optional=False, min=0, subsection="trial", ), @@ -297,6 +305,7 @@ SETTINGS_MANIFEST: List[SettingField] = [ "float", "pricing", "Лимит трафика триала (ГБ)", + optional=False, min=0, subsection="trial", ), @@ -305,6 +314,7 @@ SETTINGS_MANIFEST: List[SettingField] = [ "string", "pricing", "Стратегия сброса трафика триала", + optional=False, subsection="trial", ), SettingField( diff --git a/frontend/src/admin/sections/TariffsSection.svelte b/frontend/src/admin/sections/TariffsSection.svelte index 48734be..291f69c 100644 --- a/frontend/src/admin/sections/TariffsSection.svelte +++ b/frontend/src/admin/sections/TariffsSection.svelte @@ -120,10 +120,15 @@ } function boolValue(key, dirty = settingsDirty, fieldMap = settingsFieldMap) { - return Boolean(valueForKey(key, dirty, fieldMap)); + const value = valueForKey(key, dirty, fieldMap); + if (typeof value === "string") { + return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase()); + } + return Boolean(value); } function setSetting(key, value) { + if (!settingsFieldMap.has(key)) return; settingsStore.markDirty(key, value); } diff --git a/tests/test_admin_settings_manifest_i18n.py b/tests/test_admin_settings_manifest_i18n.py index d1f9ea0..48635eb 100644 --- a/tests/test_admin_settings_manifest_i18n.py +++ b/tests/test_admin_settings_manifest_i18n.py @@ -207,6 +207,17 @@ def test_backup_required_numeric_settings_reject_empty_values(): coerce_value(get_field_by_key("BACKUP_INTERVAL_SECONDS"), "") +def test_trial_required_settings_reject_empty_values(): + for key in ( + "TRIAL_ENABLED", + "TRIAL_DURATION_DAYS", + "TRIAL_TRAFFIC_LIMIT_GB", + "TRIAL_TRAFFIC_STRATEGY", + ): + with pytest.raises(ValueError): + coerce_value(get_field_by_key(key), "") + + def test_payment_provider_settings_include_webhook_metadata(): manifest = _manifest_by_key()