schema.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. from fastapi import Query
  2. from pydantic import (
  3. BaseModel,
  4. ConfigDict,
  5. Field,
  6. field_validator,
  7. model_validator,
  8. )
  9. from app.api.v1.module_system.dept.schema import DeptOutSchema
  10. from app.api.v1.module_system.menu.schema import MenuOutSchema
  11. from app.common.enums import QueueEnum
  12. from app.core.base_schema import BaseSchema
  13. from app.core.validator import (
  14. DateTimeStr,
  15. role_permission_request_validator,
  16. validate_required_code,
  17. )
  18. class RoleCreateSchema(BaseModel):
  19. """角色创建模型"""
  20. name: str = Field(..., max_length=64, description="角色名称")
  21. code: str = Field(..., max_length=16, description="角色编码")
  22. order: int | None = Field(default=1, ge=1, description="显示排序")
  23. data_scope: int | None = Field(
  24. default=1,
  25. description="数据权限范围(1:仅本人 2:本部门 3:本部门及以下 4:全部 5:自定义)",
  26. )
  27. status: str = Field(default="0", description="是否启用")
  28. description: str | None = Field(default=None, max_length=255, description="描述")
  29. @field_validator("code")
  30. @classmethod
  31. def validate_code(cls, value: str):
  32. """
  33. 校验角色编码(与部门编码规则一致,见 `validate_required_code`)。
  34. 参数:
  35. - value (str): 角色编码。
  36. 返回:
  37. - str: 校验后的角色编码。
  38. 异常:
  39. - ValueError: 不满足编码规则时抛出。
  40. """
  41. return validate_required_code(value)
  42. class RolePermissionSettingSchema(BaseModel):
  43. """角色权限配置模型"""
  44. data_scope: int = Field(
  45. default=1,
  46. description="数据权限范围(1:仅本人 2:本部门 3:本部门及以下 4:全部 5:自定义)",
  47. )
  48. role_ids: list[int] = Field(default_factory=list, description="角色ID列表")
  49. menu_ids: list[int] = Field(default_factory=list, description="菜单ID列表")
  50. dept_ids: list[int] = Field(default_factory=list, description="部门ID列表")
  51. @model_validator(mode="after")
  52. def validate_fields(self):
  53. """
  54. 校验角色权限配置字段(数据范围与关联 ID 等)。
  55. 参数:
  56. - self: 当前模型实例(校验后状态)。
  57. 返回:
  58. - RolePermissionSettingSchema: 通过 `role_permission_request_validator` 校验后的同一实例。
  59. 异常:
  60. - CustomException: 不满足权限配置约束时抛出。
  61. """
  62. return role_permission_request_validator(self)
  63. class RoleUpdateSchema(RoleCreateSchema):
  64. """角色更新模型"""
  65. class RoleOutSchema(RoleCreateSchema, BaseSchema):
  66. """角色信息响应模型"""
  67. model_config = ConfigDict(from_attributes=True)
  68. menus: list[MenuOutSchema] = Field(default_factory=list, description="角色菜单列表")
  69. depts: list[DeptOutSchema] = Field(default_factory=list, description="角色部门列表")
  70. class RoleQueryParam:
  71. """角色管理查询参数"""
  72. def __init__(
  73. self,
  74. name: str | None = Query(None, description="角色名称"),
  75. description: str | None = Query(None, description="描述"),
  76. status: str | None = Query(None, description="是否启用"),
  77. created_time: list[DateTimeStr] | None = Query(
  78. None,
  79. description="创建时间范围",
  80. examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"],
  81. ),
  82. updated_time: list[DateTimeStr] | None = Query(
  83. None,
  84. description="更新时间范围",
  85. examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"],
  86. ),
  87. ) -> None:
  88. # 模糊查询字段
  89. self.name = (QueueEnum.like.value, name)
  90. if description:
  91. self.description = (QueueEnum.like.value, description)
  92. # 精确查询字段
  93. if status:
  94. self.status = (QueueEnum.eq.value, status)
  95. # 时间范围查询
  96. if created_time and len(created_time) == 2:
  97. self.created_time = (QueueEnum.between.value, (created_time[0], created_time[1]))
  98. if updated_time and len(updated_time) == 2:
  99. self.updated_time = (QueueEnum.between.value, (updated_time[0], updated_time[1]))