imetting_backend/app/models/models.py

264 lines
7.2 KiB
Python
Raw Normal View History

2025-08-05 01:46:40 +00:00
from pydantic import BaseModel, EmailStr
from typing import Optional, Union, List
import datetime
class LoginRequest(BaseModel):
username: str
password: str
class LoginResponse(BaseModel):
user_id: int
username: str
caption: str
email: EmailStr
token: str
2025-09-11 05:16:58 +00:00
role_id: int
2025-08-05 01:46:40 +00:00
2025-09-15 03:52:00 +00:00
class RoleInfo(BaseModel):
role_id: int
role_name: str
2025-08-05 01:46:40 +00:00
class UserInfo(BaseModel):
user_id: int
username: str
caption: str
email: EmailStr
created_at: datetime.datetime
meetings_created: int
meetings_attended: int
2025-09-15 03:52:00 +00:00
role_id: int
role_name: str
2025-08-05 01:46:40 +00:00
2025-09-11 05:16:58 +00:00
class UserListResponse(BaseModel):
users: list[UserInfo]
total: int
class CreateUserRequest(BaseModel):
username: str
password: Optional[str] = None
caption: str
email: EmailStr
role_id: int
class UpdateUserRequest(BaseModel):
username: Optional[str] = None
caption: Optional[str] = None
email: Optional[str] = None
role_id: Optional[int] = None
2025-08-05 01:46:40 +00:00
class AttendeeInfo(BaseModel):
user_id: int
caption: str
2025-09-19 08:51:07 +00:00
class Tag(BaseModel):
id: int
name: str
color: str
2025-08-28 08:02:59 +00:00
class TranscriptionTaskStatus(BaseModel):
task_id: str
status: str # 'pending', 'processing', 'completed', 'failed'
progress: int # 0-100
meeting_id: int
created_at: Optional[str] = None
updated_at: Optional[str] = None
completed_at: Optional[str] = None
error_message: Optional[str] = None
2025-08-05 01:46:40 +00:00
class Meeting(BaseModel):
meeting_id: int
title: str
meeting_time: Optional[datetime.datetime]
summary: Optional[str]
created_at: datetime.datetime
attendees: Union[List[str], List[AttendeeInfo]] # Support both formats
creator_id: int
creator_username: str
audio_file_path: Optional[str] = None
2025-08-28 08:02:59 +00:00
transcription_status: Optional[TranscriptionTaskStatus] = None
2025-09-19 08:51:07 +00:00
tags: Optional[List[Tag]] = []
2025-12-16 10:55:31 +00:00
access_password: Optional[str] = None
2025-08-05 01:46:40 +00:00
class TranscriptSegment(BaseModel):
segment_id: int
meeting_id: int
2025-08-25 08:10:29 +00:00
speaker_id: Optional[int] = None # AI解析的原始结果
2025-08-05 01:46:40 +00:00
speaker_tag: str
start_time_ms: int
end_time_ms: int
text_content: str
class CreateMeetingRequest(BaseModel):
user_id: int
2025-08-05 01:46:40 +00:00
title: str
meeting_time: Optional[datetime.datetime]
attendee_ids: list[int]
2025-09-19 08:51:07 +00:00
tags: Optional[str] = None
2025-08-05 01:46:40 +00:00
class UpdateMeetingRequest(BaseModel):
title: str
meeting_time: Optional[datetime.datetime]
summary: Optional[str]
attendee_ids: list[int]
2025-09-19 08:51:07 +00:00
tags: Optional[str] = None
2025-08-25 08:10:29 +00:00
class SpeakerTagUpdateRequest(BaseModel):
speaker_id: int # 使用原始speaker_id整数
new_tag: str
class BatchSpeakerTagUpdateRequest(BaseModel):
updates: List[SpeakerTagUpdateRequest]
2025-08-26 13:57:16 +00:00
class TranscriptUpdateRequest(BaseModel):
segment_id: int
text_content: str
class BatchTranscriptUpdateRequest(BaseModel):
updates: List[TranscriptUpdateRequest]
2025-09-11 05:16:58 +00:00
class PasswordChangeRequest(BaseModel):
old_password: str
2025-10-16 03:09:19 +00:00
new_password: str
class KnowledgeBase(BaseModel):
kb_id: int
title: str
content: Optional[str] = None
creator_id: int
creator_caption: str # To show in the UI
is_shared: bool
source_meeting_ids: Optional[str] = None
2025-10-16 09:15:36 +00:00
user_prompt: Optional[str] = None
2025-10-31 06:54:54 +00:00
tags: Union[Optional[str], Optional[List[Tag]]] = None # 支持字符串或Tag列表
2025-10-16 03:09:19 +00:00
created_at: datetime.datetime
updated_at: datetime.datetime
2025-10-16 09:15:36 +00:00
source_meeting_count: Optional[int] = 0
created_by_name: Optional[str] = None
2025-10-16 03:09:19 +00:00
class KnowledgeBaseTask(BaseModel):
task_id: str
user_id: int
kb_id: int
user_prompt: Optional[str] = None
status: str
progress: int
error_message: Optional[str] = None
created_at: datetime.datetime
updated_at: datetime.datetime
completed_at: Optional[datetime.datetime] = None
class CreateKnowledgeBaseRequest(BaseModel):
title: Optional[str] = None # 改为可选,后台自动生成
is_shared: bool
user_prompt: Optional[str] = None
source_meeting_ids: Optional[str] = None
tags: Optional[str] = None
2025-12-11 08:48:12 +00:00
prompt_id: Optional[int] = None # 提示词模版ID如果不指定则使用默认模版
2025-10-16 03:09:19 +00:00
2025-10-16 09:15:36 +00:00
class UpdateKnowledgeBaseRequest(BaseModel):
title: str
content: Optional[str] = None
tags: Optional[str] = None
2025-10-16 03:09:19 +00:00
class KnowledgeBaseListResponse(BaseModel):
kbs: List[KnowledgeBase]
total: int
2025-10-21 09:28:52 +00:00
# 客户端下载相关模型
class ClientDownload(BaseModel):
id: int
2025-12-18 11:58:38 +00:00
platform_type: Optional[str] = None # 兼容旧版:'mobile', 'desktop', 'terminal'
platform_name: Optional[str] = None # 兼容旧版:'ios', 'android', 'windows', 'mac_intel', 'mac_m', 'linux'
platform_code: str # 新版平台编码,关联 dict_data.dict_code
2025-10-21 09:28:52 +00:00
version: str
version_code: int
download_url: str
file_size: Optional[int] = None
release_notes: Optional[str] = None
is_active: bool
is_latest: bool
min_system_version: Optional[str] = None
created_at: datetime.datetime
updated_at: datetime.datetime
created_by: Optional[int] = None
class CreateClientDownloadRequest(BaseModel):
2025-12-18 11:58:38 +00:00
platform_type: Optional[str] = None # 兼容旧版
platform_name: Optional[str] = None # 兼容旧版
platform_code: str # 必填,关联 dict_data
2025-10-21 09:28:52 +00:00
version: str
version_code: int
download_url: str
file_size: Optional[int] = None
release_notes: Optional[str] = None
is_active: bool = True
is_latest: bool = False
min_system_version: Optional[str] = None
class UpdateClientDownloadRequest(BaseModel):
2025-12-18 11:58:38 +00:00
platform_type: Optional[str] = None
platform_name: Optional[str] = None
platform_code: Optional[str] = None
2025-10-21 09:28:52 +00:00
version: Optional[str] = None
version_code: Optional[int] = None
download_url: Optional[str] = None
file_size: Optional[int] = None
release_notes: Optional[str] = None
is_active: Optional[bool] = None
is_latest: Optional[bool] = None
min_system_version: Optional[str] = None
class ClientDownloadListResponse(BaseModel):
clients: List[ClientDownload]
total: int
2025-10-31 06:54:54 +00:00
# 声纹采集相关模型
class VoiceprintInfo(BaseModel):
vp_id: int
user_id: int
file_path: str
file_size: Optional[int] = None
duration_seconds: Optional[float] = None
collected_at: datetime.datetime
updated_at: datetime.datetime
class VoiceprintStatus(BaseModel):
has_voiceprint: bool
vp_id: Optional[int] = None
file_path: Optional[str] = None
duration_seconds: Optional[float] = None
collected_at: Optional[datetime.datetime] = None
class VoiceprintTemplate(BaseModel):
template_text: str
duration_seconds: int
sample_rate: int
channels: int
2025-12-11 08:48:12 +00:00
# 菜单权限相关模型
class MenuInfo(BaseModel):
menu_id: int
menu_code: str
menu_name: str
menu_icon: Optional[str] = None
menu_url: Optional[str] = None
menu_type: str # 'action', 'link', 'divider'
parent_id: Optional[int] = None
sort_order: int
is_active: bool
description: Optional[str] = None
created_at: datetime.datetime
updated_at: datetime.datetime
class MenuListResponse(BaseModel):
menus: List[MenuInfo]
total: int
class RolePermissionInfo(BaseModel):
role_id: int
role_name: str
menu_ids: List[int]
class UpdateRolePermissionsRequest(BaseModel):
menu_ids: List[int]