Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions docs_src/source/melnikova.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
Melnikova_Alisa
=========

Start
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Данный код реализует систему валидации данных для маркетплейса с использованием **Pydantic v2**.
Модели обеспечивают строгую типизацию, валидацию бизнес-правил и автоматическую документацию.


UserSpec
~~~~~~~~~~
Базовая модель пользователя маркетплейса.

**Атрибуты:**
- ``user_id``: Уникальный идентификатор пользователя (int)
- ``username``: Имя пользователя на русском языке (RussianStr)
- ``surname``: Фамилия пользователя на русском языке (RussianStr)
- ``second_name``: Отчество пользователя, опционально (RussianStr)
- ``email``: Email в валидном формате (EmailStr)
- ``status``: Статус пользователя - "active" или "non-active" (Literal)

**Конфигурация:**
- Запрещены дополнительные поля (``extra="forbid"``)

ProfileSpec
~~~~~~~~~~

Расширенная модель профиля пользователя, наследуется от UserSpec.

**Дополнительные атрибуты:**
- ``bio``: Биография пользователя на русском языке (RussianStr)
- ``url``: URL страницы профиля в валидном формате (HttpUrl)

ItemSpec
~~~~~~~~~~

Модель товара в маркетплейсе.

**Атрибуты:**
- ``item_id``: Уникальный идентификатор товара (int)
- ``name``: Название товара на русском языке (RussianStr)
- ``desc``: Описание товара на русском языке (RussianStr)
- ``price``: Цена товара, должна быть > 0 (float)

ServiceSpec
~~~~~~~~~~

Модель услуги в маркетплейсе.

**Атрибуты:**
- ``service_id``: Уникальный идентификатор услуги (int)
- ``name``: Название услуги на русском языке (RussianStr)
- ``desc``: Описание услуги на русском языке (RussianStr)
- ``price``: Цена услуги, должна быть > 0 (float)

OrderLineSpec
~~~~~~~~~~

Модель строки заказа, содержащей товар или услугу.

**Атрибуты:**
- ``order_id``: Идентификатор заказа (int)
- ``order_line_id``: Идентификатор строки заказа (int)
- ``item_line``: Товар или услуга (Union[ItemSpec, ServiceSpec])
- ``quantity``: Количество, должно быть > 0 (float)
- ``line_price``: Стоимость строки, должна быть > 0 (float)

**Валидатор:**
- ``check_line_price()`` - проверяет соответствие ``line_price`` произведению цены на количество

OrderSpec
~~~~~~~~~~

Модель полного заказа.

**Атрибуты:**
- ``order_id``: Уникальный идентификатор заказа (int)
- ``user_info``: Информация о пользователе (ProfileSpec)
- ``items_line``: Список строк заказа (List[OrderLineSpec])

**Валидатор:**
- ``check_unique_order_lines()`` - проверяет уникальность ``order_line_id`` в рамках заказа

**OrdersSpec**

Коллекция всех заказов маркетплейса.

**Атрибуты:**
- ``market_place_orders``: Список всех заказов (List[OrderSpec])

**Валидатор:**
- ``check_global_uniques()`` - проверяет глобальную уникальность всех идентификаторов

Дополнительно
~~~~~~~~~~

**RussianStr**

Аннотированный тип для русскоязычных строк:

.. code-block:: python

RussianStr = Annotated[str, Field(pattern=r'^[А-Яа-яЁё\s\-]+$')]

**Проверяет:**
- Только русские буквы (А-Я, а-я, Ёё)
- Пробелы и дефисы
- Запрещает латинские буквы, цифры, специальные символы

**Функции**

load_orders_from_yaml()


Загружает и валидирует заказы из YAML файла.

**Параметры:**
- ``file_path``: Путь к YAML файлу

**Возвращает:**
- ``OrdersSpec``: Валидированные данные заказов
- ``None``: В случае ошибки

**Исключения:**
- ``FileNotFoundError``: Если файл не найден
- ``yaml.YAMLError``: При ошибках парсинга YAML
- ``ValidationError``: При ошибках валидации Pydantic


Документация сгенерирована автоматически с использованием Sphinx и доступна в HTML формате.
52 changes: 52 additions & 0 deletions students_folder/melnikova/lab2.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@


class UserSpec(BaseModel):
"""
Базовая модель пользователя.

Attributes:
user_id: Уникальный идентификатор пользователя
username: Имя пользователя
surname: Фамилия
second_name: Отчество (опционально)
email: Email адрес
status: Статус пользователя ('active' или 'non-active')
"""
user_id: int
username: str
surname: str
Expand All @@ -24,6 +35,13 @@ class UserSpec(BaseModel):


class ProfileSpec(UserSpec):
"""
Расширенный профиль пользователя.

Наследует все поля UserSpec и добавляет:
bio: Краткая биография пользователя
url: Валидный URL адрес профиля
"""
bio: str
url: HttpUrl

Expand All @@ -37,6 +55,15 @@ class ProfileSpec(UserSpec):
model_config = ConfigDict(extra='forbid')

class ItemSpec(BaseModel):
"""
Модель товара/продукта.

Attributes:
item_id: Уникальный идентификатор товара
name: Название товара (только русские буквы)
desc: Описание товара (только русские буквы)
price: Цена товара (должна быть больше 0)
"""
item_id: int
name: str = Field(..., pattern=RUS_RE)
desc: str = Field(..., pattern=RUS_RE)
Expand All @@ -53,6 +80,20 @@ class ItemSpec(BaseModel):


class ServiceSpec(BaseModel):
"""
Модель услуги/сервиса.

Attributes:
service_id: Уникальный идентификатор услуги
name: Название услуги
desc: Описание услуги
price: Стоимость услуги
order_id: ID заказа
order_line_id: ID строки заказа
item_line: Связанный товар
quantity: Количество
line_price: Итоговая цена строки (автоматически рассчитывается)
"""
service_id: int
name: str = Field(..., pattern=RUS_RE)
desc: str = Field(..., pattern=RUS_RE)
Expand All @@ -78,6 +119,17 @@ class ServiceSpec(BaseModel):


class OrdersSpec(BaseModel):
"""
Модель заказов.

Attributes:
market_place_orders: Список услуг/сервисов в заказе

Validators:
Проверяет, что список не пустой
Проверяет уникальность order_line_id
Проверяет соответствие order_id
"""
market_place_orders: List[ServiceSpec]
model_config = ConfigDict(extra='forbid')

Expand Down