license.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from pydantic import BaseModel
  2. from typing import Optional
  3. from datetime import datetime
  4. class LicenseCreate(BaseModel):
  5. """创建/更新 License 请求"""
  6. super_admin_id: int
  7. license_key: str
  8. expires_at: str # ISO 8601 string
  9. max_tenants: Optional[int] = None
  10. max_users_per_tenant: Optional[int] = None
  11. remark: Optional[str] = None
  12. class LicenseResponse(BaseModel):
  13. """单个 License 响应"""
  14. id: int
  15. super_admin_id: int
  16. super_admin_name: str
  17. license_key: str
  18. expires_at: str
  19. status: str
  20. max_tenants: Optional[int] = None
  21. max_users_per_tenant: Optional[int] = None
  22. remark: Optional[str] = None
  23. created_at: Optional[str] = None
  24. updated_at: Optional[str] = None
  25. domain: Optional[str] = None
  26. contact: Optional[dict] = None
  27. class LicenseStatusResponse(BaseModel):
  28. """License 状态查询响应"""
  29. id: int
  30. super_admin_id: int
  31. super_admin_name: str
  32. license_key: str
  33. expires_at: str
  34. status: str
  35. days_left: int
  36. max_tenants: Optional[int] = None
  37. max_users_per_tenant: Optional[int] = None
  38. remark: Optional[str] = None
  39. class SuperAdminOption(BaseModel):
  40. """超级管理员下拉选项"""
  41. id: int
  42. username: str
  43. nickname: Optional[str] = None
  44. remark: Optional[str] = None
  45. class LicenseListResponse(BaseModel):
  46. """License 列表响应"""
  47. total: int
  48. items: list[LicenseResponse]
  49. class LicenseUpdate(BaseModel):
  50. """更新 License 请求(仅更新指定字段)"""
  51. license_key: Optional[str] = None
  52. expires_at: Optional[str] = None