From 26c78b68146c0a1e247f1481ef3cdc60182af13a Mon Sep 17 00:00:00 2001 From: Egor Date: Sat, 17 Jan 2026 05:04:01 +0300 Subject: [PATCH] Update campaigns.py --- app/webapi/schemas/campaigns.py | 43 ++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/app/webapi/schemas/campaigns.py b/app/webapi/schemas/campaigns.py index f23c22b9..88b45eb1 100644 --- a/app/webapi/schemas/campaigns.py +++ b/app/webapi/schemas/campaigns.py @@ -5,7 +5,10 @@ from typing import Annotated, Literal, Optional from pydantic import BaseModel, Field, validator -CampaignBonusType = Annotated[Literal["balance", "subscription"], Field(description="Тип бонуса кампании")] +CampaignBonusType = Annotated[ + Literal["balance", "subscription", "none", "tariff"], + Field(description="Тип бонуса кампании: balance (баланс), subscription (пробная подписка), none (без награды), tariff (тариф)") +] class CampaignBase(BaseModel): @@ -17,6 +20,9 @@ class CampaignBase(BaseModel): subscription_traffic_gb: Optional[int] = Field(None, ge=0) subscription_device_limit: Optional[int] = Field(None, ge=0) subscription_squads: list[str] = Field(default_factory=list) + # Поля для типа "tariff" + tariff_id: Optional[int] = Field(None, ge=1, description="ID тарифа для выдачи") + tariff_duration_days: Optional[int] = Field(None, ge=1, description="Длительность тарифа в днях") @validator("name", "start_parameter") def strip_strings(cls, value: str) -> str: # noqa: D401,B902 @@ -39,6 +45,20 @@ class CampaignCreateRequest(CampaignBase): raise ValueError("subscription_duration_days must be positive for subscription bonus") return value + @validator("tariff_id") + def validate_tariff_id(cls, value: Optional[int], values: dict): # noqa: D401,B902 + if values.get("bonus_type") == "tariff": + if value is None or value <= 0: + raise ValueError("tariff_id must be specified for tariff bonus") + return value + + @validator("tariff_duration_days") + def validate_tariff_duration(cls, value: Optional[int], values: dict): # noqa: D401,B902 + if values.get("bonus_type") == "tariff": + if value is None or value <= 0: + raise ValueError("tariff_duration_days must be positive for tariff bonus") + return value + class CampaignResponse(BaseModel): id: int @@ -51,6 +71,10 @@ class CampaignResponse(BaseModel): subscription_traffic_gb: Optional[int] = None subscription_device_limit: Optional[int] = None subscription_squads: list[str] = Field(default_factory=list) + # Поля для типа "tariff" + tariff_id: Optional[int] = None + tariff_duration_days: Optional[int] = None + tariff_name: Optional[str] = None # Для отображения названия тарифа is_active: bool created_by: Optional[int] = None created_at: datetime @@ -74,6 +98,9 @@ class CampaignUpdateRequest(BaseModel): subscription_traffic_gb: Optional[int] = Field(None, ge=0) subscription_device_limit: Optional[int] = Field(None, ge=0) subscription_squads: Optional[list[str]] = None + # Поля для типа "tariff" + tariff_id: Optional[int] = Field(None, ge=1) + tariff_duration_days: Optional[int] = Field(None, ge=1) is_active: Optional[bool] = None @validator("name", "start_parameter", pre=True) @@ -95,3 +122,17 @@ class CampaignUpdateRequest(BaseModel): if bonus_type == "subscription" and value is not None and value <= 0: raise ValueError("subscription_duration_days must be positive for subscription bonus") return value + + @validator("tariff_id") + def validate_tariff_id(cls, value: Optional[int], values: dict): # noqa: D401,B902 + bonus_type = values.get("bonus_type") + if bonus_type == "tariff" and value is not None and value <= 0: + raise ValueError("tariff_id must be positive for tariff bonus") + return value + + @validator("tariff_duration_days") + def validate_tariff_duration(cls, value: Optional[int], values: dict): # noqa: D401,B902 + bonus_type = values.get("bonus_type") + if bonus_type == "tariff" and value is not None and value <= 0: + raise ValueError("tariff_duration_days must be positive for tariff bonus") + return value