64 lines
3.3 KiB
Python
64 lines
3.3 KiB
Python
# [FILE] src/core/models.py
|
||
# ANCHOR: Core_Models_Module
|
||
# Семантика: Определяет Pydantic-модели для структурированного представления данных
|
||
# в приложении (продукты, логи).
|
||
# [CONTRACT]: Все модели наследуются от `BaseModel` и обеспечивают типизацию и валидацию.
|
||
# [COHERENCE]: Согласованы со схемами данных, используемыми в БД и экспортах.
|
||
|
||
from pydantic import BaseModel, Field, HttpUrl, ValidationError
|
||
from datetime import datetime
|
||
from typing import Optional
|
||
|
||
class ProductVariant(BaseModel):
|
||
"""
|
||
[CONTRACT]
|
||
@description: Модель данных для варианта продукта.
|
||
@invariant: `name`, `price`, `url` являются обязательными. `price` всегда `int`.
|
||
"""
|
||
name: str = Field(..., description="Название продукта.")
|
||
volume: str = Field(..., description="Объем или вариант продукта (например, '50мл', '10 капсул').")
|
||
price: int = Field(..., description="Цена продукта в числовом формате.")
|
||
url: HttpUrl = Field(..., description="Полный URL страницы варианта продукта.", examples=["https://elixirpeptide.ru/product/?product=123"])
|
||
|
||
# [VALIDATOR] Пример пост-валидации, если нужно.
|
||
# @validator('price')
|
||
# def price_must_be_positive(cls, v):
|
||
# if v < 0:
|
||
# raise ValueError('Price must be a positive integer')
|
||
# return v
|
||
|
||
class Config:
|
||
json_schema_extra = {
|
||
"example": {
|
||
"name": "Peptide X",
|
||
"volume": "30ml",
|
||
"price": 1500,
|
||
"url": "https://elixirpeptide.ru/catalog/peptide-x/?product=variant1"
|
||
}
|
||
}
|
||
|
||
class LogRecordModel(BaseModel):
|
||
"""
|
||
[CONTRACT]
|
||
@description: Модель данных для записи лога, используемая при сохранении логов в БД.
|
||
@invariant: Все поля являются обязательными. `timestamp` хранится как ISO-строка.
|
||
"""
|
||
run_id: str = Field(..., description="Уникальный идентификатор текущего запуска парсера.")
|
||
timestamp: datetime = Field(..., description="Время создания лог-записи.")
|
||
level: str = Field(..., description="Уровень логирования (e.g., INFO, ERROR, DEBUG).")
|
||
message: str = Field(..., description="Текст лог-сообщения.")
|
||
|
||
# Pydantic автоматически обработает datetime в JSON и другие форматы.
|
||
# Для SQLite, timestamp будет храниться как TEXT в ISO-формате.
|
||
|
||
class Config:
|
||
json_schema_extra = {
|
||
"example": {
|
||
"run_id": "20231027-123456",
|
||
"timestamp": "2023-10-27T12:34:56.789Z",
|
||
"level": "INFO",
|
||
"message": "Парсинг начат."
|
||
}
|
||
}
|
||
|
||
# [COHERENCE_CHECK_PASSED] Все основные модели данных определены и типизированы. |