group.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 plus
  16. # every printer in these locations
  17. restrict_printers: bool = False
  18. printer_ids: list[int] = []
  19. locations: list[str] = []
  20. class GroupUpdate(BaseModel):
  21. """Schema for updating a group."""
  22. name: str | None = None
  23. description: str | None = None
  24. permissions: list[str] | None = None
  25. restrict_printers: bool | None = None
  26. printer_ids: list[int] | None = None
  27. locations: list[str] | None = None
  28. class GroupResponse(BaseModel):
  29. """Schema for group response."""
  30. id: int
  31. name: str
  32. description: str | None
  33. permissions: list[str]
  34. is_system: bool
  35. restrict_printers: bool = False
  36. printer_ids: list[int] = []
  37. locations: list[str] = []
  38. user_count: int = 0
  39. created_at: datetime
  40. updated_at: datetime
  41. class Config:
  42. from_attributes = True
  43. class GroupDetailResponse(GroupResponse):
  44. """Schema for detailed group response including users."""
  45. users: list["UserBrief"] = []
  46. class UserBrief(BaseModel):
  47. """Brief user info for embedding in group response."""
  48. id: int
  49. username: str
  50. is_active: bool
  51. class Config:
  52. from_attributes = True
  53. class PermissionInfo(BaseModel):
  54. """Schema for permission information."""
  55. value: str
  56. label: str
  57. class PermissionCategory(BaseModel):
  58. """Schema for a category of permissions."""
  59. name: str
  60. permissions: list[PermissionInfo]
  61. class PermissionsListResponse(BaseModel):
  62. """Schema for listing all permissions by category."""
  63. categories: list[PermissionCategory]
  64. all_permissions: list[str]
  65. # Update forward references
  66. GroupDetailResponse.model_rebuild()