user.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from typing import Optional, List
  2. from pydantic import BaseModel, ConfigDict, field_validator, model_validator
  3. from pydantic.alias_generators import to_camel
  4. from app.schemas.common import DatetimeToStr
  5. class UserCreate(BaseModel):
  6. model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
  7. username: str
  8. real_name: str
  9. phone: Optional[str] = None
  10. email: Optional[str] = None
  11. status: int = 1
  12. password: str
  13. role_ids: Optional[List[int]] = None
  14. class UserUpdate(BaseModel):
  15. model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
  16. username: Optional[str] = None
  17. real_name: Optional[str] = None
  18. phone: Optional[str] = None
  19. email: Optional[str] = None
  20. status: Optional[int] = None
  21. password: Optional[str] = None
  22. role_ids: Optional[List[int]] = None
  23. class RoleBrief(BaseModel):
  24. model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel)
  25. id: int
  26. role_name: str
  27. role_code: str
  28. class UserOut(BaseModel):
  29. model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel)
  30. id: int
  31. username: str
  32. real_name: Optional[str] = None
  33. phone: Optional[str] = None
  34. email: Optional[str] = None
  35. status: int
  36. roles: str = ""
  37. role_list: List[RoleBrief] = []
  38. create_time: DatetimeToStr
  39. @model_validator(mode="before")
  40. @classmethod
  41. def extract_roles(cls, values):
  42. if isinstance(values, dict):
  43. return values
  44. raw_roles = getattr(values, "roles", None)
  45. role_list_data = []
  46. names = []
  47. if raw_roles is not None and hasattr(raw_roles, "__iter__"):
  48. for r in raw_roles:
  49. role_list_data.append({"id": r.id, "role_name": r.role_name, "role_code": r.role_code})
  50. names.append(r.role_name)
  51. data = {
  52. "id": values.id,
  53. "username": values.username,
  54. "real_name": values.real_name,
  55. "phone": values.phone,
  56. "email": values.email,
  57. "status": values.status,
  58. "roles": ",".join(names) if names else "",
  59. "role_list": role_list_data,
  60. "create_time": values.create_time,
  61. }
  62. return data
  63. class UserLogin(BaseModel):
  64. username: str
  65. password: str
  66. class UserBriefOut(BaseModel):
  67. model_config = ConfigDict(from_attributes=True, populate_by_name=True, alias_generator=to_camel)
  68. id: int
  69. username: str
  70. real_name: Optional[str] = None
  71. roles: str = ""
  72. @model_validator(mode="before")
  73. @classmethod
  74. def extract_roles(cls, values):
  75. if isinstance(values, dict):
  76. return values
  77. raw_roles = getattr(values, "roles", None)
  78. names = []
  79. if raw_roles is not None and hasattr(raw_roles, "__iter__"):
  80. names = [r.role_name for r in raw_roles]
  81. return {
  82. "id": values.id,
  83. "username": values.username,
  84. "real_name": values.real_name,
  85. "roles": "、".join(names) if names else "",
  86. }
  87. class UserListOut(UserOut):
  88. pass
  89. class UserStatsSummaryOut(BaseModel):
  90. model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
  91. total_count: int
  92. enabled_count: int
  93. disabled_count: int
  94. admin_count: int