Skip to content

Commit 3342b96

Browse files
author
Ilyas Gasanov
committed
[DOP-19926] Provide guest role when changing group owner
1 parent fad630c commit 3342b96

File tree

4 files changed

+86
-6
lines changed

4 files changed

+86
-6
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Grant read-only rights for the previous group owner when ownership is transferred

syncmaster/db/repositories/group.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,11 @@ async def update(
186186
description: str,
187187
owner_id: int,
188188
) -> Group:
189+
group = await self.read_by_id(group_id=group_id)
190+
previous_owner_id = group.owner_id
189191
args = [Group.id == group_id, Group.is_deleted.is_(False)]
190192
try:
191-
return await self._update(
193+
updated_group = await self._update(
192194
*args,
193195
name=name,
194196
description=description,
@@ -199,6 +201,21 @@ async def update(
199201
except IntegrityError as e:
200202
self._raise_error(e)
201203

204+
if previous_owner_id != owner_id:
205+
previous_user_group = await self._session.get(
206+
UserGroup,
207+
{
208+
"group_id": group_id,
209+
"user_id": previous_owner_id,
210+
},
211+
)
212+
if previous_user_group:
213+
await self.update_member_role(group_id=group_id, user_id=previous_owner_id, role=GroupMemberRole.Guest)
214+
else:
215+
await self.add_user(group_id=group_id, new_user_id=previous_owner_id, role=GroupMemberRole.Guest)
216+
217+
return updated_group
218+
202219
async def get_member_role(self, group_id: int, user_id: int) -> GroupMemberRole:
203220
user_group = await self._session.get(
204221
UserGroup,

tests/test_unit/test_connections/connection_fixtures/group_connections_fixture.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ async def group_connections(
4141
)
4242
elif conn_type in [
4343
ConnectionType.POSTGRES,
44-
ConnectionType.ORACLE,
4544
ConnectionType.CLICKHOUSE,
4645
ConnectionType.MSSQL,
4746
ConnectionType.MYSQL,

tests/test_unit/test_groups/test_update_group_by_id.py

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,24 +192,87 @@ async def test_validation_on_update_group(
192192

193193

194194
async def test_owner_change_group_owner(client: AsyncClient, empty_group: MockGroup, simple_user: MockUser):
195+
# Arrange
196+
previous_owner = empty_group.owner
197+
user = empty_group.get_member_of_role(UserTestRoles.Owner)
195198
# Act
196-
result = await client.patch(
199+
patch_result = await client.patch(
197200
f"v1/groups/{empty_group.id}",
198-
headers={"Authorization": f"Bearer {empty_group.get_member_of_role(UserTestRoles.Owner).token}"},
201+
headers={"Authorization": f"Bearer {user.token}"},
199202
json={
200203
"name": empty_group.name,
201204
"owner_id": simple_user.id,
202205
"description": empty_group.description,
203206
},
204207
)
208+
group_users_result = await client.get(
209+
f"v1/groups/{empty_group.id}/users",
210+
headers={"Authorization": f"Bearer {user.token}"},
211+
)
205212
# Assert
206-
assert result.json() == {
213+
assert patch_result.status_code == 200
214+
assert patch_result.json() == {
207215
"id": empty_group.id,
208216
"name": empty_group.name,
209217
"owner_id": simple_user.id,
210218
"description": empty_group.description,
211219
}
212-
assert result.status_code == 200
220+
assert group_users_result.status_code == 200
221+
assert group_users_result.json()["items"] == [
222+
{
223+
"id": previous_owner.id,
224+
"username": previous_owner.username,
225+
"role": UserTestRoles.Guest,
226+
},
227+
]
228+
229+
230+
async def test_owner_with_existing_role_change_group_owner(
231+
client: AsyncClient,
232+
empty_group: MockGroup,
233+
simple_user: MockUser,
234+
role_maintainer_or_below: UserTestRoles,
235+
):
236+
# Arrange
237+
previous_owner = empty_group.owner
238+
user = empty_group.get_member_of_role(UserTestRoles.Owner)
239+
# Act
240+
await client.post(
241+
f"v1/groups/{empty_group.id}/users/{empty_group.owner_id}",
242+
headers={"Authorization": f"Bearer {user.token}"},
243+
json={
244+
"role": role_maintainer_or_below,
245+
},
246+
)
247+
patch_result = await client.patch(
248+
f"v1/groups/{empty_group.id}",
249+
headers={"Authorization": f"Bearer {user.token}"},
250+
json={
251+
"name": empty_group.name,
252+
"owner_id": simple_user.id,
253+
"description": empty_group.description,
254+
},
255+
)
256+
group_users_result = await client.get(
257+
f"v1/groups/{empty_group.id}/users",
258+
headers={"Authorization": f"Bearer {user.token}"},
259+
)
260+
# Assert
261+
assert patch_result.status_code == 200
262+
assert patch_result.json() == {
263+
"id": empty_group.id,
264+
"name": empty_group.name,
265+
"owner_id": simple_user.id,
266+
"description": empty_group.description,
267+
}
268+
assert group_users_result.status_code == 200
269+
assert group_users_result.json()["items"] == [
270+
{
271+
"id": previous_owner.id,
272+
"username": previous_owner.username,
273+
"role": UserTestRoles.Guest,
274+
},
275+
]
213276

214277

215278
async def test_maintainer_or_below_cannot_change_group_owner(

0 commit comments

Comments
 (0)