nex_docus/backend/app/schemas/project.py

93 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
项目相关的 Pydantic Schema
"""
from pydantic import BaseModel, Field, field_validator
from typing import Optional
from datetime import datetime
class ProjectBase(BaseModel):
"""项目基础 Schema"""
name: str = Field(..., min_length=1, max_length=100, description="项目名称")
description: Optional[str] = Field(None, max_length=500, description="项目描述")
is_public: int = Field(0, description="是否公开0-私有 1-公开")
class ProjectCreate(ProjectBase):
"""创建项目 Schema"""
pass
class ProjectUpdate(BaseModel):
"""更新项目 Schema"""
name: Optional[str] = Field(None, min_length=1, max_length=100)
description: Optional[str] = None
is_public: Optional[int] = None
cover_image: Optional[str] = None
status: Optional[int] = None
class ProjectResponse(ProjectBase):
"""项目响应 Schema"""
id: int
storage_key: str
owner_id: int
is_template: int
status: int
cover_image: Optional[str] = None
visit_count: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class ProjectMemberAdd(BaseModel):
"""添加项目成员 Schema"""
user_id: int = Field(..., description="用户ID")
role: str = Field("viewer", description="项目角色: admin/editor/viewer")
@field_validator('role')
@classmethod
def validate_role(cls, v):
if v not in ['admin', 'editor', 'viewer']:
raise ValueError('role must be one of: admin, editor, viewer')
return v
class ProjectMemberUpdate(BaseModel):
"""更新项目成员 Schema"""
role: str = Field(..., description="项目角色: admin/editor/viewer")
@field_validator('role')
@classmethod
def validate_role(cls, v):
if v not in ['admin', 'editor', 'viewer']:
raise ValueError('role must be one of: admin, editor, viewer')
return v
class ProjectMemberResponse(BaseModel):
"""项目成员响应 Schema"""
id: int
project_id: int
user_id: int
role: str
joined_at: datetime
class Config:
from_attributes = True
class ProjectShareSettings(BaseModel):
"""项目分享设置 Schema"""
access_pass: Optional[str] = Field(None, max_length=100, description="访问密码None表示取消密码")
class ProjectShareInfo(BaseModel):
"""项目分享信息响应 Schema"""
share_url: str = Field(..., description="分享链接")
has_password: bool = Field(..., description="是否设置了访问密码")
access_pass: Optional[str] = Field(None, description="访问密码(仅项目所有者可见)")