Skip to content

Commit 020cc77

Browse files
committed
Add route for removing a single user from a group
1 parent e2d28b6 commit 020cc77

File tree

2 files changed

+43
-8
lines changed

2 files changed

+43
-8
lines changed

pydatalab/src/pydatalab/routes/v0_1/admin.py

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -452,13 +452,38 @@ def add_user_to_group(group_immutable_id: str):
452452
{"$addToSet": {"groups": {"immutable_id": ObjectId(group_immutable_id)}}},
453453
)
454454

455-
if update_user.modified_count == 1:
456-
return jsonify({"status": "success", "message": "User added to group."}), 200
455+
if update_user.matched_count == 0:
456+
raise BadRequest("Unable to add user to group: user does not exist.")
457457

458-
if not update_user.modified_count == 1:
459-
if update_user.matched_count == 0:
460-
raise BadRequest("Unable to add user to group: user does not exist.")
461-
if update_user.matched_count == 1:
462-
return jsonify({"status": "success", "message": "User already in group."}), 304
458+
if update_user.modified_count == 0:
459+
return jsonify({"status": "success", "message": "User already in group."}), 304
463460

464-
raise BadRequest("Unable to add user to group.")
461+
return jsonify({"status": "success", "message": "User added to group."}), 200
462+
463+
464+
@ADMIN.route("/groups/<group_immutable_id>/members/<user_id>", methods=["DELETE"])
465+
def remove_user_from_group(group_immutable_id: str, user_id: str):
466+
group_exists = flask_mongo.db.groups.find_one(
467+
{"_id": ObjectId(group_immutable_id)},
468+
)
469+
if not group_exists:
470+
raise NotFound("Group does not exist.")
471+
472+
update_user = flask_mongo.db.users.update_one(
473+
{"_id": ObjectId(user_id)},
474+
{"$pull": {"groups": {"immutable_id": ObjectId(group_immutable_id)}}},
475+
)
476+
477+
if update_user.matched_count == 0:
478+
raise BadRequest("Unable to remove user from group: user does not exist.")
479+
480+
# Also remove user from group's managers list if they are a manager
481+
flask_mongo.db.groups.update_one(
482+
{"_id": ObjectId(group_immutable_id)},
483+
{"$pull": {"managers": ObjectId(user_id)}},
484+
)
485+
486+
if update_user.modified_count == 0:
487+
return jsonify({"status": "success", "message": "User was not in group."}), 304
488+
489+
return jsonify({"status": "success", "message": "User removed from group."}), 200

pydatalab/tests/server/test_users.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,13 @@ def test_groups(
221221
resp = admin_client.patch(f"/groups/{group_immutable_id}", json=new_details)
222222
assert resp.status_code == 200
223223
assert database.groups.find_one({"group_id": new_details["group_id"]}) is not None
224+
225+
# Now remove the user from the group and make sure they are also removed from the managers list
226+
resp = admin_client.delete(f"/groups/{group_immutable_id}/members/{another_user_id}")
227+
228+
assert resp.status_code == 200
229+
user_groups = database.users.find_one({"_id": ObjectId(another_user_id)})["groups"]
230+
assert len(user_groups) == 1
231+
232+
managers = database.groups.find_one({"_id": group_immutable_id})["managers"]
233+
assert ObjectId(another_user_id) not in managers

0 commit comments

Comments
 (0)