Skip to content

Commit 419b5a3

Browse files
committed
Add admin endpoints for group listing and tweak user listing
1 parent 34d5719 commit 419b5a3

File tree

3 files changed

+42
-4
lines changed

3 files changed

+42
-4
lines changed

pydatalab/src/pydatalab/models/people.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from pydantic import EmailStr as PydanticEmailStr
88

99
from pydatalab.models.entries import Entry
10-
from pydatalab.models.utils import HumanReadableIdentifier, PyObjectId
10+
from pydatalab.models.utils import HumanReadableIdentifier, PyObjectId, UserRole
1111

1212

1313
class IdentityType(str, Enum):
@@ -196,3 +196,7 @@ def new_user_from_identity(
196196
contact_email=contact_email,
197197
account_status=account_status,
198198
)
199+
200+
201+
class User(Person):
202+
role: UserRole

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
from flask_login import current_user
44

55
from pydatalab.config import CONFIG
6+
from pydatalab.models.people import Group, User
67
from pydatalab.mongo import flask_mongo
7-
from pydatalab.permissions import admin_only, get_default_permissions
8+
from pydatalab.permissions import admin_only
89

910
ADMIN = Blueprint("admins", __name__)
1011

@@ -18,7 +19,6 @@ def _(): ...
1819
def get_users():
1920
users = flask_mongo.db.users.aggregate(
2021
[
21-
{"$match": get_default_permissions(user_only=True)},
2222
{
2323
"$lookup": {
2424
"from": "roles",
@@ -27,6 +27,19 @@ def get_users():
2727
"as": "role",
2828
}
2929
},
30+
{
31+
"$lookup": {
32+
"from": "groups",
33+
"let": {"group_ids": "$group_ids"},
34+
"pipeline": [
35+
{"$match": {"$expr": {"$in": ["$_id", {"$ifNull": ["$$group_ids", []]}]}}},
36+
{"$addFields": {"__order": {"$indexOfArray": ["$$group_ids", "$_id"]}}},
37+
{"$sort": {"__order": 1}},
38+
{"$project": {"_id": 1, "display_name": 1}},
39+
],
40+
"as": "groups",
41+
},
42+
},
3043
{
3144
"$addFields": {
3245
"role": {
@@ -41,7 +54,7 @@ def get_users():
4154
]
4255
)
4356

44-
return jsonify({"status": "success", "data": list(users)})
57+
return jsonify({"status": "success", "data": list(User(**u).json() for u in users)})
4558

4659

4760
@ADMIN.route("/roles/<user_id>", methods=["PATCH"])
@@ -93,3 +106,10 @@ def save_role(user_id):
93106
)
94107

95108
return (jsonify({"status": "success"}), 200)
109+
110+
111+
@ADMIN.route("/groups", methods=["GET"])
112+
def get_groups():
113+
return jsonify(
114+
{"status": "success", "data": [Group(**d).json() for d in flask_mongo.db.groups.find()]}
115+
), 200

pydatalab/tests/server/test_users.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,20 @@ def test_role_update_by_user(client, real_mongo_client, user_id):
4242
assert user["role"] == "manager"
4343

4444

45+
def test_list_users(admin_client, client):
46+
resp = admin_client.get("/users")
47+
assert resp.status_code == 200
48+
resp = client.get("/users")
49+
assert resp.status_code == 403
50+
51+
52+
def test_list_groups(admin_client, client):
53+
resp = admin_client.get("/groups")
54+
assert resp.status_code == 200
55+
resp = client.get("/groups")
56+
assert resp.status_code == 403
57+
58+
4559
def test_user_update(client, unauthenticated_client, real_mongo_client, user_id, admin_user_id):
4660
endpoint = f"/users/{str(user_id)}"
4761
# Test display name update

0 commit comments

Comments
 (0)