schema.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from fastapi import Query
  2. from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
  3. from app.common.enums import QueueEnum
  4. from app.core.base_schema import BaseSchema
  5. from app.core.validator import DateTimeStr
  6. class TenantCreateSchema(BaseModel):
  7. """新增租户"""
  8. name: str = Field(..., max_length=100, description="租户名称")
  9. code: str = Field(..., max_length=100, description="租户编码")
  10. status: str = Field(default="0", description="状态(0:正常 1:禁用)")
  11. description: str | None = Field(default=None, max_length=255, description="描述")
  12. start_time: DateTimeStr | None = Field(default=None, description="开始时间")
  13. end_time: DateTimeStr | None = Field(default=None, description="结束时间")
  14. @field_validator("name")
  15. @classmethod
  16. def _validate_name(cls, v: str) -> str:
  17. v = v.strip()
  18. if not v:
  19. raise ValueError("名称不能为空")
  20. return v
  21. @field_validator("code")
  22. @classmethod
  23. def _validate_code(cls, v: str) -> str:
  24. v = v.strip()
  25. if not v:
  26. raise ValueError("编码不能为空")
  27. if not v.isalnum():
  28. raise ValueError("编码只能包含字母和数字")
  29. return v
  30. @model_validator(mode="after")
  31. def _validate_time_range(self):
  32. if self.start_time and self.end_time and self.start_time > self.end_time:
  33. raise ValueError("结束时间不能早于开始时间")
  34. return self
  35. class TenantUpdateSchema(BaseModel):
  36. """更新租户"""
  37. name: str | None = Field(default=None, max_length=100, description="租户名称")
  38. code: str | None = Field(default=None, max_length=100, description="租户编码")
  39. status: str | None = Field(default=None, description="状态(0:正常 1:禁用)")
  40. description: str | None = Field(default=None, max_length=255, description="描述")
  41. start_time: DateTimeStr | None = Field(default=None, description="开始时间")
  42. end_time: DateTimeStr | None = Field(default=None, description="结束时间")
  43. @field_validator("code")
  44. @classmethod
  45. def _validate_code(cls, v: str | None) -> str | None:
  46. if v is None:
  47. return v
  48. v = v.strip()
  49. if not v.isalnum():
  50. raise ValueError("编码只能包含字母和数字")
  51. return v
  52. @model_validator(mode="after")
  53. def _validate_time_range(self):
  54. if self.start_time and self.end_time and self.start_time > self.end_time:
  55. raise ValueError("结束时间不能早于开始时间")
  56. return self
  57. class TenantOutSchema(TenantCreateSchema, BaseSchema):
  58. """租户响应"""
  59. model_config = ConfigDict(from_attributes=True)
  60. class TenantQueryParam:
  61. """租户查询参数"""
  62. def __init__(
  63. self,
  64. name: str | None = Query(None, description="租户名称"),
  65. code: str | None = Query(None, description="租户编码"),
  66. status: str | None = Query(None, description="状态"),
  67. created_time: list[DateTimeStr] | None = Query(
  68. None,
  69. description="创建时间范围",
  70. examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"],
  71. ),
  72. ) -> None:
  73. if name:
  74. self.name = (QueueEnum.like.value, name)
  75. if code:
  76. self.code = (QueueEnum.like.value, code)
  77. if status:
  78. self.status = (QueueEnum.eq.value, status)
  79. if created_time and len(created_time) == 2:
  80. self.created_time = (QueueEnum.between.value, (created_time[0], created_time[1]))