Skip to content

Commit 96245e6

Browse files
Jeny SadadiaJenySadadia
authored andcommitted
api.models: define different user schema models
Define and use different user models for API endpoint and fastapi-users router, i.e. different models as request schema for API request model and schema for request to `fastapi-users` router. For create user request, user needs to send `UserCreateRequest` schema as API router request and the router will use `UserCreate` schema to send the request to `fastapi-users` router. This is due to we intend to have a list of user group name strings as API router request and `UserGroup` instance as `fastapi-users` router request as `user.groups` field value. Signed-off-by: Jeny Sadadia <[email protected]>
1 parent eebe581 commit 96245e6

File tree

1 file changed

+33
-4
lines changed

1 file changed

+33
-4
lines changed

api/models.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ def validate_groups(cls, groups): # pylint: disable=no-self-argument
121121
return groups
122122

123123

124-
class UserCreate(schemas.BaseUserCreate):
125-
"""Schema for creating a user"""
124+
class UserCreateRequest(schemas.BaseUserCreate):
125+
"""Create user request schema for API router"""
126126
username: Annotated[str, Indexed(unique=True)]
127127
groups: List[str] = Field(default=[])
128128

@@ -135,8 +135,22 @@ def validate_groups(cls, groups): # pylint: disable=no-self-argument
135135
return groups
136136

137137

138-
class UserUpdate(schemas.BaseUserUpdate):
139-
"""Schema for updating a user"""
138+
class UserCreate(schemas.BaseUserCreate):
139+
"""Schema used for sending create user request to 'fastapi-users' router"""
140+
username: Annotated[str, Indexed(unique=True)]
141+
groups: List[UserGroup] = Field(default=[])
142+
143+
@field_validator('groups')
144+
def validate_groups(cls, groups): # pylint: disable=no-self-argument
145+
"""Unique group constraint"""
146+
unique_names = {group.name for group in groups}
147+
if len(unique_names) != len(groups):
148+
raise ValueError("Groups must have unique names.")
149+
return groups
150+
151+
152+
class UserUpdateRequest(schemas.BaseUserUpdate):
153+
"""Update user request schema for API router"""
140154
username: Annotated[Optional[str], Indexed(unique=True),
141155
Field(default=None)]
142156
groups: List[str] = Field(default=[])
@@ -150,6 +164,21 @@ def validate_groups(cls, groups): # pylint: disable=no-self-argument
150164
return groups
151165

152166

167+
class UserUpdate(schemas.BaseUserUpdate):
168+
"""Schema used for sending update user request to 'fastapi-users' router"""
169+
username: Annotated[Optional[str], Indexed(unique=True),
170+
Field(default=None)]
171+
groups: List[UserGroup] = Field(default=[])
172+
173+
@field_validator('groups')
174+
def validate_groups(cls, groups): # pylint: disable=no-self-argument
175+
"""Unique group constraint"""
176+
unique_names = {group.name for group in groups}
177+
if len(unique_names) != len(groups):
178+
raise ValueError("Groups must have unique names.")
179+
return groups
180+
181+
153182
# Pagination models
154183

155184
class CustomLimitOffsetParams(LimitOffsetParams):

0 commit comments

Comments
 (0)