Skip to content

Commit 98e846f

Browse files
committed
fixes caller
1 parent fd2c736 commit 98e846f

File tree

3 files changed

+85
-47
lines changed

3 files changed

+85
-47
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ async def update_organization(
138138
return await _groups_db.update_user_group(
139139
app,
140140
user_id=user_id,
141-
gid=group_id,
141+
group_id=group_id,
142142
update=update,
143143
)
144144

@@ -151,7 +151,7 @@ async def delete_organization(
151151
raises GroupNotFoundError
152152
raises UserInsufficientRightsError
153153
"""
154-
return await _groups_db.delete_user_group(app, user_id=user_id, gid=group_id)
154+
return await _groups_db.delete_user_group(app, user_id=user_id, group_id=group_id)
155155

156156

157157
#
@@ -162,7 +162,7 @@ async def delete_organization(
162162
async def list_users_in_group(
163163
app: web.Application, user_id: UserID, gid: GroupID
164164
) -> list[GroupMember]:
165-
return await _groups_db.list_users_in_group(app, user_id=user_id, gid=gid)
165+
return await _groups_db.list_users_in_group(app, user_id=user_id, group_id=gid)
166166

167167

168168
async def get_user_in_group(
@@ -173,7 +173,7 @@ async def get_user_in_group(
173173
) -> GroupMember:
174174

175175
return await _groups_db.get_user_in_group(
176-
app, user_id=user_id, gid=gid, the_user_id_in_group=the_user_id_in_group
176+
app, user_id=user_id, group_id=gid, the_user_id_in_group=the_user_id_in_group
177177
)
178178

179179

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

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,10 @@ async def create_user_group(
268268
) -> tuple[Group, AccessRightsDict]:
269269

270270
async with transaction_context(get_asyncpg_engine(app), connection) as conn:
271-
result = await conn.stream(
271+
user = await conn.scalar(
272272
sa.select(users.c.primary_gid).where(users.c.id == user_id)
273273
)
274-
if not await result.scalar_one_or_none():
274+
if not user:
275275
raise UserNotFoundError(uid=user_id)
276276

277277
result = await conn.stream(
@@ -304,18 +304,18 @@ async def update_user_group(
304304
connection: AsyncConnection | None = None,
305305
*,
306306
user_id: UserID,
307-
gid: GroupID,
307+
group_id: GroupID,
308308
update: OrganizationUpdate,
309309
) -> tuple[Group, AccessRightsDict]:
310310

311311
values = update.model_dump(mode="json", exclude_unset=True)
312312

313313
async with transaction_context(get_asyncpg_engine(app), connection) as conn:
314314
row = await _get_group_and_access_rights_or_raise(
315-
conn, user_id=user_id, gid=gid
315+
conn, user_id=user_id, gid=group_id
316316
)
317-
assert row.gid == gid # nosec
318-
_check_group_permissions(row, user_id, gid, "write")
317+
assert row.gid == group_id # nosec
318+
_check_group_permissions(row, user_id, group_id, "write")
319319
access_rights = AccessRightsDict(**row.access_rights) # type: ignore[typeddict-item]
320320

321321
result = await conn.stream(
@@ -337,13 +337,13 @@ async def delete_user_group(
337337
connection: AsyncConnection | None = None,
338338
*,
339339
user_id: UserID,
340-
gid: GroupID,
340+
group_id: GroupID,
341341
) -> None:
342342
async with transaction_context(get_asyncpg_engine(app), connection) as conn:
343343
group = await _get_group_and_access_rights_or_raise(
344-
conn, user_id=user_id, gid=gid
344+
conn, user_id=user_id, gid=group_id
345345
)
346-
_check_group_permissions(group, user_id, gid, "delete")
346+
_check_group_permissions(group, user_id, group_id, "delete")
347347

348348
await conn.execute(
349349
# pylint: disable=no-value-for-parameter
@@ -356,41 +356,52 @@ async def delete_user_group(
356356
#
357357

358358

359-
def _group_user_cols(user_id: int):
359+
def _group_user_cols(caller_user_id: int):
360360
return (
361361
users.c.id,
362362
users.c.name,
363363
# privacy settings
364364
sa.case(
365-
(users.c.privacy_hide_email.is_(True) and users.c.id != user_id, None),
365+
(
366+
users.c.privacy_hide_email.is_(True) & (users.c.id != caller_user_id),
367+
None,
368+
),
366369
else_=users.c.email,
367370
).label("email"),
368371
sa.case(
369-
(users.c.privacy_hide_fullname.is_(True) and users.c.id != user_id, None),
372+
(
373+
users.c.privacy_hide_fullname.is_(True)
374+
& (users.c.id != caller_user_id),
375+
None,
376+
),
370377
else_=users.c.first_name,
371378
).label("first_name"),
372379
sa.case(
373-
(users.c.privacy_hide_fullname.is_(True) and users.c.id != user_id, None),
380+
(
381+
users.c.privacy_hide_fullname.is_(True)
382+
& (users.c.id != caller_user_id),
383+
None,
384+
),
374385
else_=users.c.last_name,
375386
).label("last_name"),
376387
users.c.primary_gid,
377388
)
378389

379390

380-
async def _get_user_in_group_permissions(
381-
conn: AsyncConnection, *, gid: GroupID, user_id: int
391+
async def _get_user_in_group(
392+
conn: AsyncConnection, *, caller_user_id, group_id: GroupID, user_id: int
382393
) -> Row:
383394
# now get the user
384395
result = await conn.stream(
385-
sa.select(*_group_user_cols(user_id), user_to_groups.c.access_rights)
396+
sa.select(*_group_user_cols(caller_user_id), user_to_groups.c.access_rights)
386397
.select_from(
387398
users.join(user_to_groups, users.c.id == user_to_groups.c.uid),
388399
)
389-
.where(and_(user_to_groups.c.gid == gid, users.c.id == user_id))
400+
.where(and_(user_to_groups.c.gid == group_id, users.c.id == user_id))
390401
)
391402
row = await result.fetchone()
392403
if not row:
393-
raise UserInGroupNotFoundError(uid=user_id, gid=gid)
404+
raise UserInGroupNotFoundError(uid=user_id, gid=group_id)
394405
return row
395406

396407

@@ -399,14 +410,14 @@ async def list_users_in_group(
399410
connection: AsyncConnection | None = None,
400411
*,
401412
user_id: UserID,
402-
gid: GroupID,
413+
group_id: GroupID,
403414
) -> list[GroupMember]:
404415
async with pass_or_acquire_connection(get_asyncpg_engine(app), connection) as conn:
405416
# first check if the group exists
406417
group = await _get_group_and_access_rights_or_raise(
407-
conn, user_id=user_id, gid=gid
418+
conn, user_id=user_id, gid=group_id
408419
)
409-
_check_group_permissions(group, user_id, gid, "read")
420+
_check_group_permissions(group, user_id, group_id, "read")
410421

411422
# now get the list
412423
query = (
@@ -415,7 +426,7 @@ async def list_users_in_group(
415426
user_to_groups.c.access_rights,
416427
)
417428
.select_from(users.join(user_to_groups))
418-
.where(user_to_groups.c.gid == gid)
429+
.where(user_to_groups.c.gid == group_id)
419430
)
420431

421432
result = await conn.stream(query)
@@ -427,19 +438,22 @@ async def get_user_in_group(
427438
connection: AsyncConnection | None = None,
428439
*,
429440
user_id: UserID,
430-
gid: GroupID,
441+
group_id: GroupID,
431442
the_user_id_in_group: int,
432443
) -> GroupMember:
433444
async with pass_or_acquire_connection(get_asyncpg_engine(app), connection) as conn:
434445
# first check if the group exists
435446
group = await _get_group_and_access_rights_or_raise(
436-
conn, user_id=user_id, gid=gid
447+
conn, user_id=user_id, gid=group_id
437448
)
438-
_check_group_permissions(group, user_id, gid, "read")
449+
_check_group_permissions(group, user_id, group_id, "read")
439450

440451
# get the user with its permissions
441-
the_user = await _get_user_in_group_permissions(
442-
conn, gid=gid, user_id=the_user_id_in_group
452+
the_user = await _get_user_in_group(
453+
conn,
454+
caller_user_id=user_id,
455+
group_id=group_id,
456+
user_id=the_user_id_in_group,
443457
)
444458
return GroupMember.model_validate(the_user)
445459

@@ -466,8 +480,8 @@ async def update_user_in_group(
466480
_check_group_permissions(group, user_id, gid, "write")
467481

468482
# now check the user exists
469-
the_user = await _get_user_in_group_permissions(
470-
conn, gid=gid, user_id=the_user_id_in_group
483+
the_user = await _get_user_in_group(
484+
conn, caller_user_id=user_id, group_id=gid, user_id=the_user_id_in_group
471485
)
472486

473487
# modify the user access rights
@@ -504,8 +518,8 @@ async def delete_user_from_group(
504518
_check_group_permissions(group, user_id, gid, "write")
505519

506520
# check the user exists
507-
await _get_user_in_group_permissions(
508-
conn, gid=gid, user_id=the_user_id_in_group
521+
await _get_user_in_group(
522+
conn, caller_user_id=user_id, group_id=gid, user_id=the_user_id_in_group
509523
)
510524

511525
# delete him/her

services/web/server/tests/unit/with_dbs/01/groups/test_groups_handlers_users.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def _assert__group_user(
4141
expected_user: UserInfoDict,
4242
expected_access_rights: AccessRightsDict,
4343
actual_user: dict,
44+
group_owner_id: int,
4445
):
4546
user = GroupUserGet.model_validate(actual_user)
4647

@@ -49,20 +50,24 @@ def _assert__group_user(
4950

5051
# identifiers
5152
assert actual_user["userName"] == expected_user["name"]
52-
5353
assert "id" in actual_user
5454
assert int(user.id) == expected_user["id"]
5555

5656
assert "gid" in actual_user
5757
assert int(user.gid) == expected_user.get("primary_gid")
5858

59-
# privacy
60-
# assert "first_name" in actual_user
61-
# assert actual_user["first_name"] == expected_user.get("first_name")
62-
# assert "last_name" in actual_user
63-
# assert actual_user["last_name"] == expected_user.get("last_name")
64-
# assert "login" in actual_user
65-
# assert actual_user["login"] == expected_user["email"]
59+
# private profile
60+
is_private = group_owner_id != actual_user["id"]
61+
assert "first_name" in actual_user
62+
assert actual_user["first_name"] == (
63+
None if is_private else expected_user.get("first_name")
64+
)
65+
assert "last_name" in actual_user
66+
assert actual_user["last_name"] == (
67+
None if is_private else expected_user.get("last_name")
68+
)
69+
assert "login" in actual_user
70+
assert actual_user["login"] == (None if is_private else expected_user["email"])
6671

6772
# access-rights
6873
assert "accessRights" in actual_user
@@ -127,7 +132,12 @@ async def test_add_remove_users_from_group(
127132
list_of_users = data
128133
assert len(list_of_users) == 1
129134
the_owner = list_of_users[0]
130-
_assert__group_user(logged_user, _DEFAULT_GROUP_OWNER_ACCESS_RIGHTS, the_owner)
135+
_assert__group_user(
136+
logged_user,
137+
_DEFAULT_GROUP_OWNER_ACCESS_RIGHTS,
138+
the_owner,
139+
group_owner_id=the_owner["id"],
140+
)
131141

132142
# create a random number of users and put them in the group
133143
add_group_user_url = client.app.router["add_group_user"].url_for(
@@ -165,7 +175,10 @@ async def test_add_remove_users_from_group(
165175
data, error = await assert_status(resp, expected.ok)
166176
if not error:
167177
_assert__group_user(
168-
created_users_list[i], _DEFAULT_GROUP_READ_ACCESS_RIGHTS, data
178+
created_users_list[i],
179+
_DEFAULT_GROUP_READ_ACCESS_RIGHTS,
180+
data,
181+
group_owner_id=the_owner["id"],
169182
)
170183
# check list is correct
171184
resp = await client.get(f"{get_group_users_url}")
@@ -195,6 +208,7 @@ async def test_add_remove_users_from_group(
195208
expected_user,
196209
expected_access_rigths,
197210
actual_user,
211+
group_owner_id=the_owner["id"],
198212
)
199213
all_created_users.remove(expected_users_list[0])
200214

@@ -213,15 +227,25 @@ async def test_add_remove_users_from_group(
213227
)
214228
data, error = await assert_status(resp, expected.ok)
215229
if not error:
216-
_assert__group_user(created_users_list[i], MANAGER_ACCESS_RIGHTS, data)
230+
_assert__group_user(
231+
created_users_list[i],
232+
MANAGER_ACCESS_RIGHTS,
233+
data,
234+
group_owner_id=the_owner["id"],
235+
)
217236
# check it is there
218237
get_group_user_url = client.app.router["get_group_user"].url_for(
219238
gid=f"{assigned_group['gid']}", uid=f"{created_users_list[i]['id']}"
220239
)
221240
resp = await client.get(f"{get_group_user_url}")
222241
data, error = await assert_status(resp, expected.ok)
223242
if not error:
224-
_assert__group_user(created_users_list[i], MANAGER_ACCESS_RIGHTS, data)
243+
_assert__group_user(
244+
created_users_list[i],
245+
MANAGER_ACCESS_RIGHTS,
246+
data,
247+
group_owner_id=the_owner["id"],
248+
)
225249
# remove the user from the group
226250
delete_group_user_url = client.app.router["delete_group_user"].url_for(
227251
gid=f"{assigned_group['gid']}", uid=f"{created_users_list[i]['id']}"

0 commit comments

Comments
 (0)