Add SQL migration 100_user_weight_profiles_default_seed.sql with system presets Эконом/Комфорт/Бизнес (user_id='__system__'). Migration is idempotent via ON CONFLICT DO UPDATE. Backend: - weight_profiles.py: add SYSTEM_USER_ID constant + list_profiles_with_system() - admin_weight_profiles.py: add include_system query param to GET list endpoint Tests: 3 new tests covering include_system flag and service sentinel behaviour.
90 lines
3.2 KiB
PL/PgSQL
90 lines
3.2 KiB
PL/PgSQL
-- 100_user_weight_profiles_default_seed.sql
|
|
-- Системные preset-профили весов POI для Site Finder.
|
|
-- Per #114 (Макс feedback): садики и Мегамарт должны иметь разные веса.
|
|
--
|
|
-- Apply order: после 90_user_weight_profiles.sql (таблица уже существует)
|
|
-- Dependencies: user_weight_profiles table
|
|
--
|
|
-- Sentinel owner: '__system__' — не является реальным user_id,
|
|
-- используется только для системных presets.
|
|
-- UI: dropdown показывает system presets всем пользователям через
|
|
-- GET /api/v1/admin/site-finder/weight-profiles?user_id=__system__
|
|
-- или include_system=true (добавлен в #114 seed PR).
|
|
--
|
|
-- Idempotent: ON CONFLICT (user_id, profile_name) DO UPDATE — обновляет
|
|
-- веса если preset уже существует (safe re-apply на prod).
|
|
|
|
BEGIN;
|
|
|
|
INSERT INTO user_weight_profiles
|
|
(user_id, profile_name, weights, is_default, description)
|
|
VALUES
|
|
(
|
|
'__system__',
|
|
'Эконом',
|
|
'{
|
|
"school": 1.2,
|
|
"kindergarten": 1.0,
|
|
"pharmacy": 0.8,
|
|
"hospital": 0.5,
|
|
"shop_mall": 0.8,
|
|
"shop_supermarket": 1.5,
|
|
"shop_small": 1.0,
|
|
"park": 1.2,
|
|
"bus_stop": 1.0,
|
|
"metro_stop": 0.8,
|
|
"tram_stop": 0.5
|
|
}'::jsonb,
|
|
FALSE,
|
|
'Эконом-класс: доступность магазинов и транспорта важнее премиальной инфраструктуры'
|
|
),
|
|
(
|
|
'__system__',
|
|
'Комфорт',
|
|
'{
|
|
"school": 1.5,
|
|
"kindergarten": 1.8,
|
|
"pharmacy": 0.8,
|
|
"hospital": 0.6,
|
|
"shop_mall": 1.0,
|
|
"shop_supermarket": 1.2,
|
|
"shop_small": 0.5,
|
|
"park": 1.8,
|
|
"bus_stop": 0.5,
|
|
"metro_stop": 1.2,
|
|
"tram_stop": -0.3
|
|
}'::jsonb,
|
|
FALSE,
|
|
'Комфорт-класс: парки, детсады и школы в приоритете — семейная аудитория'
|
|
),
|
|
(
|
|
'__system__',
|
|
'Бизнес',
|
|
'{
|
|
"school": 1.0,
|
|
"kindergarten": 0.8,
|
|
"pharmacy": 0.6,
|
|
"hospital": 0.5,
|
|
"shop_mall": 2.0,
|
|
"shop_supermarket": 0.8,
|
|
"shop_small": 0.3,
|
|
"park": 2.0,
|
|
"bus_stop": 0.2,
|
|
"metro_stop": 2.5,
|
|
"tram_stop": -0.5
|
|
}'::jsonb,
|
|
FALSE,
|
|
'Бизнес-класс: метро, ТЦ и парки в приоритете — платёжеспособная аудитория'
|
|
)
|
|
ON CONFLICT (user_id, profile_name)
|
|
DO UPDATE SET
|
|
weights = EXCLUDED.weights,
|
|
description = EXCLUDED.description,
|
|
updated_at = NOW();
|
|
|
|
COMMENT ON TABLE user_weight_profiles IS
|
|
'POI weight profiles для site_finder. Per #114 (Макс feedback). '
|
|
'weights = {"school": 1.5, "kindergarten": 1.5, "shop_mall": 1.2, ...}. '
|
|
'Системные presets: user_id = ''__system__'' (3 preset: Эконом/Комфорт/Бизнес).';
|
|
|
|
COMMIT;
|