account.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import json
  2. from pydantic import BaseModel, field_validator
  3. from typing import Optional, Dict, Any, Literal
  4. from datetime import datetime
  5. class AccountBase(BaseModel):
  6. pool_name: str
  7. username: str
  8. password: Optional[str] = None
  9. extra_data: Optional[Dict[str, Any]] = None
  10. status: Optional[Literal['active','disable']] = None
  11. next_use_time: Optional[datetime] = None
  12. @field_validator("extra_data", mode="before")
  13. def normalize_json_field(cls, v):
  14. if v is None:
  15. return None
  16. if isinstance(v, str):
  17. try:
  18. return json.loads(v)
  19. except Exception:
  20. return {}
  21. return v
  22. # --- 4. 请求/响应 Schema (Pydantic) ---
  23. class AccountCreate(AccountBase):
  24. pass
  25. class AccountUpdate(AccountBase):
  26. """
  27. 更新代理 Payload
  28. 注意:因为是更新,前端可能只传部分字段,所以这里全部重新定义为 Optional
  29. """
  30. pool_name: Optional[str] = None
  31. username: Optional[str] = None
  32. password: Optional[str] = None
  33. extra_data: Optional[Dict[str, Any]] = None
  34. next_use_time: Optional[datetime] = None
  35. status: Optional[str] = None
  36. class AccountOut(AccountBase):
  37. id: int
  38. created_at: datetime
  39. updated_at: datetime
  40. model_config = {
  41. "from_attributes": True
  42. }
  43. class GetNextAccountPayload(BaseModel):
  44. """获取下个IP的请求参数"""
  45. pool_name: str
  46. account_cd: int