Skip to content

Commit 12ad537

Browse files
committed
move adapters to schemas
1 parent 6d03a79 commit 12ad537

File tree

4 files changed

+54
-51
lines changed

4 files changed

+54
-51
lines changed

packages/models-library/src/models_library/api_schemas_webserver/groups.py

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
from ast import TypeVar
21
from contextlib import suppress
3-
from typing import Annotated, Any, Self
2+
from typing import Annotated, Any, Self, TypeVar
43

54
from common_library.basic_types import DEFAULT_FACTORY
65
from pydantic import (
@@ -17,11 +16,23 @@
1716

1817
from ..basic_types import IDStr
1918
from ..emails import LowerCaseEmailStr
20-
from ..groups import AccessRightsDict, Group, OrganizationCreate, OrganizationUpdate
19+
from ..groups import (
20+
AccessRightsDict,
21+
Group,
22+
GroupMember,
23+
OrganizationCreate,
24+
OrganizationUpdate,
25+
)
2126
from ..users import UserID
2227
from ..utils.common_validators import create__check_only_one_is_set__root_validator
2328
from ._base import InputSchema, OutputSchema
2429

30+
S = TypeVar("S", bound=BaseModel)
31+
32+
33+
def _rename_keys(source: dict, name_map: dict[str, str]) -> dict[str, Any]:
34+
return {name_map.get(k, k): v for k, v in source.items()}
35+
2536

2637
class GroupAccessRights(BaseModel):
2738
"""
@@ -63,16 +74,11 @@ class GroupGet(OutputSchema):
6374

6475
@classmethod
6576
def from_model(cls, group: Group, access_rights: AccessRightsDict) -> Self:
66-
# Fuses both dataset into GroupSet
67-
_to = {
68-
"name": "label",
69-
}
70-
77+
# Merges both service models into this schema
7178
return cls.model_validate(
7279
{
73-
**{
74-
_to.get(key, key): value
75-
for key, value in group.model_dump(
80+
**_rename_keys(
81+
group.model_dump(
7682
include={
7783
"gid",
7884
"name",
@@ -82,8 +88,11 @@ def from_model(cls, group: Group, access_rights: AccessRightsDict) -> Self:
8288
},
8389
exclude_unset=True,
8490
by_alias=False,
85-
).items()
86-
},
91+
),
92+
name_map={
93+
"name": "label",
94+
},
95+
),
8796
"access_rights": access_rights,
8897
}
8998
)
@@ -132,25 +141,15 @@ def _sanitize_legacy_data(cls, v):
132141
return None
133142

134143

135-
Sc = TypeVar("Sc", bound=BaseModel)
136-
137-
138-
def _model_dump_with_map(schema: Sc, alias_map: dict[str, str]) -> dict[str, Any]:
139-
return {
140-
alias_map.get(k, k): v
141-
for k, v in schema.model_dump(mode="json", exclude_unset=True).items()
142-
}
143-
144-
145144
class GroupCreate(InputSchema):
146145
label: str
147146
description: str
148147
thumbnail: AnyUrl | None = None
149148

150149
def to_model(self) -> OrganizationCreate:
151-
data = _model_dump_with_map(
152-
self,
153-
alias_map={"label": "name"},
150+
data = _rename_keys(
151+
self.model_dump(mode="json", exclude_unset=True),
152+
name_map={"label": "name"},
154153
)
155154
return OrganizationCreate(**data)
156155

@@ -161,9 +160,9 @@ class GroupUpdate(InputSchema):
161160
thumbnail: AnyUrl | None = None
162161

163162
def to_model(self) -> OrganizationUpdate:
164-
data = _model_dump_with_map(
165-
self,
166-
alias_map={"label": "name"},
163+
data = _rename_keys(
164+
self.model_dump(mode="json", exclude_unset=True),
165+
name_map={"label": "name"},
167166
)
168167
return OrganizationUpdate(**data)
169168

@@ -217,6 +216,7 @@ class MyGroupsGet(OutputSchema):
217216

218217

219218
class GroupUserGet(BaseModel):
219+
# OutputSchema
220220

221221
# Identifiers
222222
id: Annotated[
@@ -265,6 +265,20 @@ class GroupUserGet(BaseModel):
265265
},
266266
)
267267

268+
@classmethod
269+
def from_model(cls, user: GroupMember) -> Self:
270+
return cls.model_validate(
271+
{
272+
"id": user.id,
273+
"user_name": user.name,
274+
"login": user.email,
275+
"first_name": user.first_name,
276+
"last_name": user.last_name,
277+
"gid": user.primary_gid,
278+
"access_rights": user.access_rights,
279+
}
280+
)
281+
268282

269283
class GroupUserAdd(InputSchema):
270284
"""

services/web/server/src/simcore_service_webserver/groups/_groups_api.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
)
1111
from models_library.products import ProductName
1212
from models_library.users import GroupID, UserID
13+
from pydantic import EmailStr
1314

1415
from ..users.api import get_user
1516
from . import _groups_db
@@ -181,7 +182,7 @@ async def update_user_in_group(
181182
user_id: UserID,
182183
gid: GroupID,
183184
the_user_id_in_group: UserID,
184-
access_rights: dict,
185+
access_rights: AccessRightsDict,
185186
) -> GroupMember:
186187
return await _groups_db.update_user_in_group(
187188
app,
@@ -235,7 +236,7 @@ async def add_user_in_group(
235236
gid: GroupID,
236237
*,
237238
new_user_id: UserID | None = None,
238-
new_user_email: str | None = None,
239+
new_user_email: EmailStr | None = None,
239240
access_rights: AccessRightsDict | None = None,
240241
) -> None:
241242
"""Adds new_user (either by id or email) in group (with gid) owned by user_id

services/web/server/src/simcore_service_webserver/groups/_groups_db.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,11 @@ def _row_to_model(group: Row) -> Group:
7676
def _to_group_info_tuple(group: Row) -> GroupInfoTuple:
7777
return (
7878
_row_to_model(group),
79-
AccessRightsDict(**group.access_rights),
79+
AccessRightsDict(
80+
read=group.access_rights["read"],
81+
write=group.access_rights["write"],
82+
delete=group.access_rights["delete"],
83+
),
8084
)
8185

8286

services/web/server/src/simcore_service_webserver/groups/_groups_handlers.py

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
GroupUserUpdate,
1212
MyGroupsGet,
1313
)
14-
from models_library.groups import GroupMember
1514
from servicelib.aiohttp import status
1615
from servicelib.aiohttp.requests_validation import (
1716
parse_request_body_as,
@@ -160,21 +159,6 @@ async def delete_group(request: web.Request):
160159
#
161160

162161

163-
def _to_groupuserget_model(user: GroupMember) -> GroupUserGet:
164-
# Fuses both dataset into GroupSet
165-
return GroupUserGet.model_validate(
166-
{
167-
"id": user.id,
168-
"user_name": user.name,
169-
"login": user.email,
170-
"first_name": user.first_name,
171-
"last_name": user.last_name,
172-
"gid": user.primary_gid,
173-
"access_rights": user.access_rights,
174-
}
175-
)
176-
177-
178162
@routes.get(f"/{API_VTAG}/groups/{{gid}}/users", name="get_all_group_users")
179163
@login_required
180164
@permission_required("groups.*")
@@ -189,7 +173,7 @@ async def get_group_users(request: web.Request):
189173
)
190174

191175
return envelope_json_response(
192-
[_to_groupuserget_model(user) for user in users_in_group]
176+
[GroupUserGet.from_model(user) for user in users_in_group]
193177
)
194178

195179

@@ -228,7 +212,7 @@ async def get_group_user(request: web.Request):
228212
user = await _groups_api.get_user_in_group(
229213
request.app, req_ctx.user_id, path_params.gid, path_params.uid
230214
)
231-
return envelope_json_response(_to_groupuserget_model(user))
215+
return envelope_json_response(GroupUserGet.from_model(user))
232216

233217

234218
@routes.patch(f"/{API_VTAG}/groups/{{gid}}/users/{{uid}}", name="update_group_user")
@@ -247,7 +231,7 @@ async def update_group_user(request: web.Request):
247231
the_user_id_in_group=path_params.uid,
248232
access_rights=update.access_rights.model_dump(),
249233
)
250-
return envelope_json_response(_to_groupuserget_model(user))
234+
return envelope_json_response(GroupUserGet.from_model(user))
251235

252236

253237
@routes.delete(f"/{API_VTAG}/groups/{{gid}}/users/{{uid}}", name="delete_group_user")

0 commit comments

Comments
 (0)