Skip to content

Commit 5470b44

Browse files
authored
Merge pull request #66 from zezOtik/maa_lab3
lab4 issues
2 parents 621fc92 + ac7542d commit 5470b44

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed

docs_src/source/melnikova.rst

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
Melnikova_Alisa
2+
=========
3+
4+
Start
5+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6+
7+
Данный код реализует систему валидации данных для маркетплейса с использованием **Pydantic v2**.
8+
Модели обеспечивают строгую типизацию, валидацию бизнес-правил и автоматическую документацию.
9+
10+
11+
UserSpec
12+
~~~~~~~~~~
13+
Базовая модель пользователя маркетплейса.
14+
15+
**Атрибуты:**
16+
- ``user_id``: Уникальный идентификатор пользователя (int)
17+
- ``username``: Имя пользователя на русском языке (RussianStr)
18+
- ``surname``: Фамилия пользователя на русском языке (RussianStr)
19+
- ``second_name``: Отчество пользователя, опционально (RussianStr)
20+
- ``email``: Email в валидном формате (EmailStr)
21+
- ``status``: Статус пользователя - "active" или "non-active" (Literal)
22+
23+
**Конфигурация:**
24+
- Запрещены дополнительные поля (``extra="forbid"``)
25+
26+
ProfileSpec
27+
~~~~~~~~~~
28+
29+
Расширенная модель профиля пользователя, наследуется от UserSpec.
30+
31+
**Дополнительные атрибуты:**
32+
- ``bio``: Биография пользователя на русском языке (RussianStr)
33+
- ``url``: URL страницы профиля в валидном формате (HttpUrl)
34+
35+
ItemSpec
36+
~~~~~~~~~~
37+
38+
Модель товара в маркетплейсе.
39+
40+
**Атрибуты:**
41+
- ``item_id``: Уникальный идентификатор товара (int)
42+
- ``name``: Название товара на русском языке (RussianStr)
43+
- ``desc``: Описание товара на русском языке (RussianStr)
44+
- ``price``: Цена товара, должна быть > 0 (float)
45+
46+
ServiceSpec
47+
~~~~~~~~~~
48+
49+
Модель услуги в маркетплейсе.
50+
51+
**Атрибуты:**
52+
- ``service_id``: Уникальный идентификатор услуги (int)
53+
- ``name``: Название услуги на русском языке (RussianStr)
54+
- ``desc``: Описание услуги на русском языке (RussianStr)
55+
- ``price``: Цена услуги, должна быть > 0 (float)
56+
57+
OrderLineSpec
58+
~~~~~~~~~~
59+
60+
Модель строки заказа, содержащей товар или услугу.
61+
62+
**Атрибуты:**
63+
- ``order_id``: Идентификатор заказа (int)
64+
- ``order_line_id``: Идентификатор строки заказа (int)
65+
- ``item_line``: Товар или услуга (Union[ItemSpec, ServiceSpec])
66+
- ``quantity``: Количество, должно быть > 0 (float)
67+
- ``line_price``: Стоимость строки, должна быть > 0 (float)
68+
69+
**Валидатор:**
70+
- ``check_line_price()`` - проверяет соответствие ``line_price`` произведению цены на количество
71+
72+
OrderSpec
73+
~~~~~~~~~~
74+
75+
Модель полного заказа.
76+
77+
**Атрибуты:**
78+
- ``order_id``: Уникальный идентификатор заказа (int)
79+
- ``user_info``: Информация о пользователе (ProfileSpec)
80+
- ``items_line``: Список строк заказа (List[OrderLineSpec])
81+
82+
**Валидатор:**
83+
- ``check_unique_order_lines()`` - проверяет уникальность ``order_line_id`` в рамках заказа
84+
85+
**OrdersSpec**
86+
87+
Коллекция всех заказов маркетплейса.
88+
89+
**Атрибуты:**
90+
- ``market_place_orders``: Список всех заказов (List[OrderSpec])
91+
92+
**Валидатор:**
93+
- ``check_global_uniques()`` - проверяет глобальную уникальность всех идентификаторов
94+
95+
Дополнительно
96+
~~~~~~~~~~
97+
98+
**RussianStr**
99+
100+
Аннотированный тип для русскоязычных строк:
101+
102+
.. code-block:: python
103+
104+
RussianStr = Annotated[str, Field(pattern=r'^[А-Яа-яЁё\s\-]+$')]
105+
106+
**Проверяет:**
107+
- Только русские буквы (А-Я, а-я, Ёё)
108+
- Пробелы и дефисы
109+
- Запрещает латинские буквы, цифры, специальные символы
110+
111+
**Функции**
112+
113+
load_orders_from_yaml()
114+
115+
116+
Загружает и валидирует заказы из YAML файла.
117+
118+
**Параметры:**
119+
- ``file_path``: Путь к YAML файлу
120+
121+
**Возвращает:**
122+
- ``OrdersSpec``: Валидированные данные заказов
123+
- ``None``: В случае ошибки
124+
125+
**Исключения:**
126+
- ``FileNotFoundError``: Если файл не найден
127+
- ``yaml.YAMLError``: При ошибках парсинга YAML
128+
- ``ValidationError``: При ошибках валидации Pydantic
129+
130+
131+
Документация сгенерирована автоматически с использованием Sphinx и доступна в HTML формате.

students_folder/melnikova/lab2.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@
77

88

99
class UserSpec(BaseModel):
10+
"""
11+
Базовая модель пользователя.
12+
13+
Attributes:
14+
user_id: Уникальный идентификатор пользователя
15+
username: Имя пользователя
16+
surname: Фамилия
17+
second_name: Отчество (опционально)
18+
email: Email адрес
19+
status: Статус пользователя ('active' или 'non-active')
20+
"""
1021
user_id: int
1122
username: str
1223
surname: str
@@ -24,6 +35,13 @@ class UserSpec(BaseModel):
2435

2536

2637
class ProfileSpec(UserSpec):
38+
"""
39+
Расширенный профиль пользователя.
40+
41+
Наследует все поля UserSpec и добавляет:
42+
bio: Краткая биография пользователя
43+
url: Валидный URL адрес профиля
44+
"""
2745
bio: str
2846
url: HttpUrl
2947

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

3957
class ItemSpec(BaseModel):
58+
"""
59+
Модель товара/продукта.
60+
61+
Attributes:
62+
item_id: Уникальный идентификатор товара
63+
name: Название товара (только русские буквы)
64+
desc: Описание товара (только русские буквы)
65+
price: Цена товара (должна быть больше 0)
66+
"""
4067
item_id: int
4168
name: str = Field(..., pattern=RUS_RE)
4269
desc: str = Field(..., pattern=RUS_RE)
@@ -53,6 +80,20 @@ class ItemSpec(BaseModel):
5380

5481

5582
class ServiceSpec(BaseModel):
83+
"""
84+
Модель услуги/сервиса.
85+
86+
Attributes:
87+
service_id: Уникальный идентификатор услуги
88+
name: Название услуги
89+
desc: Описание услуги
90+
price: Стоимость услуги
91+
order_id: ID заказа
92+
order_line_id: ID строки заказа
93+
item_line: Связанный товар
94+
quantity: Количество
95+
line_price: Итоговая цена строки (автоматически рассчитывается)
96+
"""
5697
service_id: int
5798
name: str = Field(..., pattern=RUS_RE)
5899
desc: str = Field(..., pattern=RUS_RE)
@@ -78,6 +119,17 @@ class ServiceSpec(BaseModel):
78119

79120

80121
class OrdersSpec(BaseModel):
122+
"""
123+
Модель заказов.
124+
125+
Attributes:
126+
market_place_orders: Список услуг/сервисов в заказе
127+
128+
Validators:
129+
Проверяет, что список не пустой
130+
Проверяет уникальность order_line_id
131+
Проверяет соответствие order_id
132+
"""
81133
market_place_orders: List[ServiceSpec]
82134
model_config = ConfigDict(extra='forbid')
83135

0 commit comments

Comments
 (0)