This commit is contained in:
2025-07-19 01:04:04 +03:00
parent fe1a022609
commit 0259289ee9
6 changed files with 107 additions and 57 deletions

View File

@@ -6,10 +6,14 @@
# </DESIGN_NOTE>
# <IMPORTS>
import logging
from pydantic import BaseModel, Field, HttpUrl
from pydantic.functional_validators import model_validator
from datetime import datetime
from typing import List
from typing import List, Optional
import uuid
logger = logging.getLogger(__name__)
# </IMPORTS>
# <MAIN_CONTRACT for="ProductVariant">
@@ -19,8 +23,18 @@ import uuid
class ProductVariant(BaseModel):
# <STATE name="product_variant_fields">
name: str = Field(..., description="Название продукта.")
volume: str = Field(..., description="Объем или вариант продукта (например, '50мл', '10 капсул').")
price: int = Field(..., gt=0, description="Цена продукта в числовом формате, должна быть положительной.")
volume: Optional[str] = Field(None, description="Объем или вариант продукта (например, '50мл', '10 капсул'). Может быть пустым, если не применимо.")
price: int = Field(..., description="Цена продукта в числовом формате. Должна быть положительной, если товар в наличии, иначе может быть 0.")
is_in_stock: bool = Field(..., description="Наличие товара.")
@model_validator(mode='after')
def validate_price_based_on_stock(self) -> 'ProductVariant':
if not self.is_in_stock and self.price != 0:
logger.warning(f"[CONTRACT_VIOLATION] Product '{self.name}' (URL: {self.url}) is out of stock but has a non-zero price ({self.price}). Setting price to 0.")
self.price = 0
elif self.is_in_stock and self.price <= 0:
raise ValueError("Price must be greater than 0 for in-stock products.")
return self
url: HttpUrl = Field(..., description="Полный URL страницы варианта продукта.")
is_in_stock: bool = Field(..., description="Наличие товара.")
# </STATE>