group.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. """Pydantic schemas for Group CRUD operations."""
  2. from datetime import datetime
  3. from pydantic import BaseModel
  4. class GroupBrief(BaseModel):
  5. """Brief group info for embedding in other responses."""
  6. id: int
  7. name: str
  8. class Config:
  9. from_attributes = True
  10. class GroupCreate(BaseModel):
  11. """Schema for creating a new group."""
  12. name: str
  13. description: str | None = None
  14. permissions: list[str] = []
  15. # Printer scope (#1727): when set, members only see these printers
  16. restrict_printers: bool = False
  17. printer_ids: list[int] = []
  18. class GroupUpdate(BaseModel):
  19. """Schema for updating a group."""
  20. name: str | None = None
  21. description: str | None = None
  22. permissions: list[str] | None = None
  23. restrict_printers: bool | None = None
  24. printer_ids: list[int] | None = None
  25. class GroupResponse(BaseModel):
  26. """Schema for group response."""
  27. id: int
  28. name: str
  29. description: str | None
  30. permissions: list[str]
  31. is_system: bool
  32. restrict_printers: bool = False
  33. printer_ids: list[int] = []
  34. user_count: int = 0
  35. created_at: datetime
  36. updated_at: datetime
  37. class Config:
  38. from_attributes = True
  39. class GroupDetailResponse(GroupResponse):
  40. """Schema for detailed group response including users."""
  41. users: list["UserBrief"] = []
  42. class UserBrief(BaseModel):
  43. """Brief user info for embedding in group response."""
  44. id: int
  45. username: str
  46. is_active: bool
  47. class Config:
  48. from_attributes = True
  49. class PermissionInfo(BaseModel):
  50. """Schema for permission information."""
  51. value: str
  52. label: str
  53. class PermissionCategory(BaseModel):
  54. """Schema for a category of permissions."""
  55. name: str
  56. permissions: list[PermissionInfo]
  57. class PermissionsListResponse(BaseModel):
  58. """Schema for listing all permissions by category."""
  59. categories: list[PermissionCategory]
  60. all_permissions: list[str]
  61. # Update forward references
  62. GroupDetailResponse.model_rebuild()