user_groups.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """Pydantic surface for the User Group API.
  2. Backed by ``principals`` rows where ``kind == GROUP`` and
  3. ``parent_principal_id`` points at the owning ORG-principal. There is
  4. no dedicated ``user_groups`` table — UserGroup is a Pydantic-only DTO
  5. over ``Principal``. Group membership lives in
  6. ``principal_memberships``.
  7. """
  8. from datetime import datetime
  9. from typing import ClassVar, List, Optional
  10. from sqlmodel import Field, SQLModel
  11. from gpustack.schemas.common import ListParams, PaginatedList
  12. from gpustack.schemas.principals import Principal
  13. class UserGroupUpdate(SQLModel):
  14. name: str = Field(nullable=False)
  15. description: Optional[str] = Field(default=None, nullable=True)
  16. class UserGroupCreate(UserGroupUpdate):
  17. pass
  18. class UserGroupListParams(ListParams):
  19. organization_id: Optional[int] = None
  20. sortable_fields: ClassVar[List[str]] = [
  21. "name",
  22. "created_at",
  23. "updated_at",
  24. ]
  25. class UserGroupPublic(SQLModel):
  26. id: int
  27. organization_id: int
  28. name: str
  29. description: Optional[str] = None
  30. created_at: datetime
  31. updated_at: datetime
  32. @classmethod
  33. def from_principal(cls, p: Principal) -> "UserGroupPublic":
  34. return cls(
  35. id=p.id,
  36. organization_id=p.parent_principal_id,
  37. name=p.name,
  38. description=p.description,
  39. created_at=p.created_at,
  40. updated_at=p.updated_at,
  41. )
  42. UserGroupsPublic = PaginatedList[UserGroupPublic]
  43. class UserGroupMembershipPublic(SQLModel):
  44. user_id: int
  45. group_id: int
  46. created_at: datetime
  47. username: Optional[str] = None
  48. full_name: Optional[str] = None