yandex-api-manager/src/YandexApiManager/data_models.py

285 lines
No EOL
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import re
from enum import Enum
from pydantic import BaseModel, Field, validator
from typing import Optional, Dict, Any
class CallSide(str, Enum):
DRIVER = "driver"
BOT = "bot"
class CallStatus(str, Enum):
PENDING = "PENDING"
RUNNING = "RUNNING"
COMPLETED = "COMPLETED"
ALL_MISSED = "ALL_MISSED"
FAILED = "FAILED"
class CheckType(str, Enum):
period = "period"
specifically = "specifically"
class Operations(Enum):
eq = "==",
gt = ">",
gte = ">=",
lt = "<",
lte = "<="
class AccessResponse(BaseModel):
success: bool
token: str
class Registration(BaseModel):
auth_key: str
class User(BaseModel):
id: Optional[int] = Field(description="Идентификатор (автоматический)", default=None)
username: str = Field(max_length=150, description="Пользовательское имя", example="john_doe")
#password: str = Field(max_length=255, description="Пароль", example="secret123")
email: Optional[str] = Field(max_length=254, default="", description="Электронная почта", example="john@example.com")
first_name: Optional[str] = Field(max_length=150, default="", description="Имя", example="John")
last_name: Optional[str] = Field(max_length=150, default="", description="Фамилия", example="Doe")
#is_staff: bool = Field(default=False, description="Статус администратора")
#is_active: bool = Field(default=False, description="Активен")
#is_superuser: bool = Field(default=False, description="Суперпользователь")
#date_joined: str = Field(description="Дата создания", example="2024-01-01T12:00:00")
#last_login: Optional[str] = Field(null=True, default=None, description="Последний вход")
class Config:
extra = "ignore"
from_attributes = True
class BasicModel(BaseModel):
id: Optional[int] = Field(description="Идентификатор (автоматический)", default=None)
created_at: Optional[str] = Field(description="Дата создания", example="2024-01-01T12:00:00")
updated_at: Optional[str] = Field(description="Дата обновления", example="2024-01-01T12:00:00")
class Config:
extra = "ignore"
from_attributes = True
class UUIDModel(BaseModel):
unique_id: str = Field(description="Уникальный идентификатор", example="00000000-0000-0000-0000-000000000000")
class CallPrompt(BasicModel):
owner: Optional[User] = Field(description="Владелец")
name: str = Field(max_length=255, description="Название промпта", example="Приветствие клиенту")
content: str = Field(description="Содержание промпта", example="Добро пожаловать в службу поддержки")
speak_first: bool = Field(default=True, description="Говорить первым")
can_interrupt_greeting: bool = Field(default=False, description="Может прерывать приветствие")
class Config:
extra = "ignore"
from_attributes = True
class YandexFleet(BasicModel):
owner: Optional[User] = Field(description="Владелец")
name: str = Field(max_length=255, description="Название флота", example="Флот такси")
park_id: str = Field(max_length=255, description="ID флота в Yandex", example="park-12345")
timezone: str = Field(
max_length=255,
default="Europe/Moscow",
description="Часовой пояс",
example="Europe/Moscow"
)
class Config:
extra = "ignore"
from_attributes = True
class YandexFleetApiKey(UUIDModel, BasicModel):
yandex_fleet: YandexFleet
api_key: str
class Driver(BasicModel):
yandex_fleet: Optional[YandexFleet] = Field(description="ID или название флота Yandex", example="fleet-123")
driver_id: str = Field(max_length=64, description="ID драйвера в Yandex", example="drv-abc123")
created_at: Optional[str] = Field(description="Дата создания", example="2024-01-01T12:00:00")
updated_at: Optional[str] = Field(description="Дата обновления", example="2024-01-01T12:00:00")
class Config:
extra = "ignore"
from_attributes = True
class DriversGroup(BasicModel, UUIDModel):
owner: User = Field(description="Владелец группы")
drivers: Optional[List[Driver]] = Field(description="Список водителей в группе", default=[])
name: str = Field(
...,
max_length=255,
description="Название группы"
)
class Call(UUIDModel, BasicModel):
owner: Optional[User] = Field(description="Владелец", default=None)
call_datetime: Optional[str] = Field(description="Время последнего звонка (по МСК)", example="2024-01-01T12:00:00", default=None)
prompt: Optional[CallPrompt] = Field(description="Промпт", default=None)
driver: Optional[Driver] = Field(description="Водитель")
status: Optional[CallStatus] = Field(default=CallStatus.PENDING, description="Статус звонка")
data: Optional[Dict[str, Any]] = Field(description="Дополнительные данные", nullable=True, default=None)
channel_id: Optional[str] = Field(description="ID канала", example=" tweak-456", default=None)
audio_file: Optional[str] = Field(description="Путь к аудио", example="/audio/call-123.mp3", default=None)
class Config:
extra = "ignore"
from_attributes = True
class CallIn(BaseModel):
owner_id: int = Field(description="Владелец")
call_datetime: Optional[str] = Field(description="Время последнего звонка (по МСК)", example="2024-01-01T12:00:00", default=None)
prompt_id: int = Field(description="Промпт",)
driver_id: int = Field(description="Водитель")
status: CallStatus = Field(default=CallStatus.PENDING, description="Статус звонка")
data: Optional[Dict[str, Any]] = Field(description="Дополнительные данные", nullable=True, default=None)
channel_id: Optional[str] = Field(description="ID канала", example=" tweak-456", null=True, default=None)
audio_file: Optional[str] = Field(description="Путь к аудио", example="/audio/call-123.mp3", null=True, default=None)
class Config:
extra = "ignore"
from_attributes = True
class InspectionWorkTime(BasicModel, UUIDModel):
owner: User = Field(description="Владелец", example={"id": 1, "username": "admin"})
is_public: Optional[bool] = Field(default=False, description="Открыт для всех")
check_from: Optional[str] = Field(
default="08:00:00",
description="Время начала проверки",
pattern=r"^(2[0-3]|[01]\d):([0-5]\d):([0-5]\d)$"
)
check_to: Optional[str] = Field(
default="22:00:00",
description="Время окончания проверки",
pattern=r"^(2[0-3]|[01]\d):([0-5]\d):([0-5]\d)$"
)
monday: Optional[bool] = Field(default=False, description="Понедельник")
tuesday: Optional[bool] = Field(default=False, description="Вторник")
wednesday: Optional[bool] = Field(default=False, description="Среда")
thursday: Optional[bool] = Field(default=False, description="Четверг")
friday: Optional[bool] = Field(default=False, description="Пятница")
saturday: Optional[bool] = Field(default=False, description="Суббота")
sunday: Optional[bool] = Field(default=False, description="Воскресенье")
class Config:
extra = "ignore"
from_attributes = True
class CallDriver(BasicModel, UUIDModel):
owner: Optional[User] = Field(default=None, description="Владелец (пользователь)")
prompt: Optional[CallPrompt] = Field(default=None, description="Промпт для звонка")
class Config:
extra = "ignore"
from_attributes = True
class SupplyHoursCondition(BasicModel, UUIDModel):
for_days: Optional[int] = Field(default=0, description="Дни", ge=-2147483648, le=2147483647)
for_hours: Optional[int] = Field(default=0, description="Часы", ge=-2147483648, le=2147483647)
for_minutes: Optional[int] = Field(default=0, description="Минуты", ge=-2147483648, le=2147483647)
target_time: int = Field(description="Целевой временной интервал", ge=-2147483648, le=2147483647)
operator: Operations = Field(description="Оператор", default=Operations.gte)
class Config:
extra = "ignore"
from_attributes = True
class Action(BasicModel, UUIDModel):
owner: Optional[User] = Field(..., description="Владелец объекта", default=None)
call_driver_action: Optional[CallDriver] = Field(
default=None,
description="Действие по вызову водителя",
)
class Condition(BasicModel, UUIDModel):
owner: Optional[User] = Field(..., description="Владелец условия", default=None)
supply_hours_condition: Optional[SupplyHoursCondition] = Field(..., description="Условие по часам поставки")
class ConditionalExpression(BasicModel, UUIDModel):
owner: Optional[User] = Field(..., description="Владелец условия", default=None)
condition: Optional[Condition] = Field(
default=None,
description="Условие (например, `SupplyHoursCondition`)",
)
true_action: Optional[Action] = Field(
default=None,
description="Действие, если условие истинно",
)
false_action: Optional[Action] = Field(
default=None,
description="Действие, если условие ложно",
)
class Check(BasicModel, UUIDModel):
owner: Optional[User] = Field(
...,
description="Владелец проверки",
default=None
)
check_type: CheckType = Field(
...,
description="Тип проверки",
default=CheckType.period
)
time: Optional[str] = Field(
default="12:00:00",
description="Время проверки (в формате hh:mm:ss)",
format="time"
)
class BaseInspectionModel(UUIDModel):
owner: Optional[User] = Field(..., description="Владелец проверки", default=None)
name : str = Field(..., description="Название проверки")
work_time: Optional[InspectionWorkTime] = Field(None, description="Рабочее время")
class BaseInspectionsCheckModel(UUIDModel):
owner: Optional[User] = Field(..., description="Владелец проверки", default=None)
check_obj: Optional[Check] = Field(..., description="Проверка", default=None)
conditional_expression: Optional[ConditionalExpression] = Field(..., description="Условное выражение", default=None)
last_check: Optional[str] = Field(default=None, description="Последняя проверка", format="date-time")
class YandexFleetInspection(BaseInspectionModel, BasicModel):
yandex_fleet: YandexFleet = Field(..., description="Флот")
class GroupInspection(BaseInspectionModel, BasicModel):
group: DriversGroup = Field(..., description="Группа")
class DriverInspection(BaseInspectionModel, BasicModel):
driver: Driver = Field(..., description="Водитель")
class YandexFleetInspectionCheeks(BaseInspectionsCheckModel, BasicModel):
yandex_fleet_inspection: YandexFleetInspection = Field(..., description="Инспекция флота")
class GroupInspectionCheek(BaseInspectionsCheckModel, BasicModel):
group_inspection: GroupInspection = Field(..., description="Инспекция группы")
class DriverInspectionCheek(BaseInspectionsCheckModel, BasicModel):
driver_inspection: DriverInspection = Field(..., description="Инспекция водителя")