group.py 2.2 KB

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