From ed4c8b3f02b5c06c433bce9ff0dc1462b7b977f5 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Fri, 29 May 2026 16:07:02 +0000 Subject: [PATCH] feat(tradein): configurable estimate quota + new exhausted-quota copy (#658) (#671) Co-authored-by: bot-backend Co-committed-by: bot-backend --- tradein-mvp/backend/app/core/config.py | 4 ++++ tradein-mvp/backend/app/services/account_quota.py | 13 +++++++++---- tradein-mvp/backend/tests/test_account_quota.py | 3 ++- .../src/components/trade-in/EstimateForm.tsx | 3 ++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/tradein-mvp/backend/app/core/config.py b/tradein-mvp/backend/app/core/config.py index 2a772e01..f0d0792d 100644 --- a/tradein-mvp/backend/app/core/config.py +++ b/tradein-mvp/backend/app/core/config.py @@ -54,5 +54,9 @@ class Settings(BaseSettings): dadata_api_token: str | None = None dadata_api_secret: str | None = None + # Лимит успешных оценок trade-in за календарный месяц на аккаунт (#658). + # Конфигурируется через env ESTIMATE_QUOTA_LIMIT. Default 15. + estimate_quota_limit: int = 15 + settings = Settings() diff --git a/tradein-mvp/backend/app/services/account_quota.py b/tradein-mvp/backend/app/services/account_quota.py index 4b51f5d7..70354e2e 100644 --- a/tradein-mvp/backend/app/services/account_quota.py +++ b/tradein-mvp/backend/app/services/account_quota.py @@ -1,7 +1,8 @@ -"""Сервис квоты оценок trade-in — 15 успешных оценок в месяц на аккаунт. +"""Сервис квоты оценок trade-in — N успешных оценок в месяц на аккаунт. Правила: -- Лимит = 15 успешных оценок за календарный месяц (UTC, период 'YYYY-MM'). +- Лимит = settings.estimate_quota_limit успешных оценок за календарный месяц + (UTC, период 'YYYY-MM'); конфигурируется через env ESTIMATE_QUOTA_LIMIT, default 15. - Без лимита (unlimited): роль admin ИЛИ username == 'kopylov'. - Учитываются ТОЛЬКО успешные оценки (инкремент ПОСЛЕ estimate_quality). - Если заголовок X-Authenticated-User отсутствует (dev без Caddy) → unlimited, @@ -19,12 +20,16 @@ from sqlalchemy import text from sqlalchemy.orm import Session from app.core.auth import get_role +from app.core.config import settings logger = logging.getLogger(__name__) -MONTHLY_LIMIT = 15 +# Лимит успешных оценок за календарный месяц — конфигурируется через +# env ESTIMATE_QUOTA_LIMIT (core.config.Settings), default 15 (#658). +MONTHLY_LIMIT = settings.estimate_quota_limit LIMIT_EXHAUSTED_MESSAGE = ( - "Лимит из 15 оценок в этом месяце исчерпан. Свяжитесь с Артёмом Копыловым." + f"Лимит из {MONTHLY_LIMIT} оценок в этом месяце исчерпан. " + "За полной версией обращайтесь к Копылову." ) diff --git a/tradein-mvp/backend/tests/test_account_quota.py b/tradein-mvp/backend/tests/test_account_quota.py index 5c55b4b3..732adda0 100644 --- a/tradein-mvp/backend/tests/test_account_quota.py +++ b/tradein-mvp/backend/tests/test_account_quota.py @@ -147,7 +147,8 @@ def test_check_and_raise_pilot_blocked_exact_detail() -> None: with pytest.raises(HTTPException) as exc_info: check_and_raise(db, "user3") assert exc_info.value.detail == ( - "Лимит из 15 оценок в этом месяце исчерпан. Свяжитесь с Артёмом Копыловым." + f"Лимит из {MONTHLY_LIMIT} оценок в этом месяце исчерпан. " + "За полной версией обращайтесь к Копылову." ) diff --git a/tradein-mvp/frontend/src/components/trade-in/EstimateForm.tsx b/tradein-mvp/frontend/src/components/trade-in/EstimateForm.tsx index f369c0e8..84abec2d 100644 --- a/tradein-mvp/frontend/src/components/trade-in/EstimateForm.tsx +++ b/tradein-mvp/frontend/src/components/trade-in/EstimateForm.tsx @@ -429,7 +429,8 @@ export function EstimateForm({ marginBottom: 8, }} > - Лимит из 15 оценок в этом месяце исчерпан. Свяжитесь с Артёмом Копыловым. + Лимит из {limit ?? 15} оценок в этом месяце исчерпан. За полной версией + обращайтесь к Копылову. ) : ( <>