69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
|
|
"""Role Pydantic schemas."""
|
||
|
|
|
||
|
|
from typing import Optional, List
|
||
|
|
from pydantic import BaseModel, Field, field_validator
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
class RoleBase(BaseModel):
|
||
|
|
"""角色基础模式."""
|
||
|
|
name: str = Field(..., min_length=1, max_length=100, description="角色名称")
|
||
|
|
code: str = Field(..., min_length=1, max_length=50, description="角色代码")
|
||
|
|
description: Optional[str] = Field(None, max_length=500, description="角色描述")
|
||
|
|
sort_order: Optional[int] = Field(0, ge=0, description="排序")
|
||
|
|
is_active: bool = Field(True, description="是否激活")
|
||
|
|
|
||
|
|
class RoleCreate(RoleBase):
|
||
|
|
"""创建角色模式."""
|
||
|
|
|
||
|
|
@field_validator('code')
|
||
|
|
@classmethod
|
||
|
|
def validate_code(cls, v: str) -> str:
|
||
|
|
if not v.replace('_', '').replace('-', '').isalnum():
|
||
|
|
raise ValueError('角色代码只能包含字母、数字、下划线和连字符')
|
||
|
|
return v.upper()
|
||
|
|
|
||
|
|
class RoleUpdate(BaseModel):
|
||
|
|
"""更新角色模式."""
|
||
|
|
name: Optional[str] = Field(None, min_length=1, max_length=100, description="角色名称")
|
||
|
|
code: Optional[str] = Field(None, min_length=1, max_length=50, description="角色代码")
|
||
|
|
description: Optional[str] = Field(None, max_length=500, description="角色描述")
|
||
|
|
sort_order: Optional[int] = Field(None, ge=0, description="排序")
|
||
|
|
is_active: Optional[bool] = Field(None, description="是否激活")
|
||
|
|
|
||
|
|
@field_validator('code')
|
||
|
|
@classmethod
|
||
|
|
def validate_code(cls, v: Optional[str]) -> Optional[str]:
|
||
|
|
if v is not None and not v.replace('_', '').replace('-', '').isalnum():
|
||
|
|
raise ValueError('角色代码只能包含字母、数字、下划线和连字符')
|
||
|
|
return v.upper() if v else v
|
||
|
|
|
||
|
|
|
||
|
|
class RoleResponse(RoleBase):
|
||
|
|
"""角色响应模式."""
|
||
|
|
id: int
|
||
|
|
created_at: datetime
|
||
|
|
updated_at: Optional[datetime] = None
|
||
|
|
created_by: Optional[int] = None
|
||
|
|
updated_by: Optional[int] = None
|
||
|
|
|
||
|
|
# 关联信息
|
||
|
|
user_count: Optional[int] = 0
|
||
|
|
|
||
|
|
model_config = {
|
||
|
|
"from_attributes": True
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
class UserRoleAssign(BaseModel):
|
||
|
|
"""用户角色分配模式."""
|
||
|
|
user_id: int = Field(..., description="用户ID")
|
||
|
|
role_ids: List[int] = Field(..., description="角色ID列表")
|
||
|
|
|
||
|
|
@field_validator('role_ids')
|
||
|
|
@classmethod
|
||
|
|
def validate_role_ids(cls, v: List[int]) -> List[int]:
|
||
|
|
if not v:
|
||
|
|
raise ValueError('角色ID列表不能为空')
|
||
|
|
if len(v) != len(set(v)):
|
||
|
|
raise ValueError('角色ID列表不能包含重复项')
|
||
|
|
return v
|