|
| 1 | +import json |
| 2 | + |
| 3 | +import pymongo.errors |
1 | 4 | from bson import ObjectId
|
2 | 5 | from flask import Blueprint, jsonify, request
|
3 | 6 | from flask_login import current_user
|
4 | 7 |
|
5 | 8 | from pydatalab.config import CONFIG
|
6 | 9 | from pydatalab.models.people import Group, User
|
7 |
| -from pydatalab.mongo import flask_mongo |
| 10 | +from pydatalab.mongo import _get_active_mongo_client, flask_mongo |
8 | 11 | from pydatalab.permissions import admin_only
|
9 | 12 |
|
10 | 13 | ADMIN = Blueprint("admins", __name__)
|
@@ -54,7 +57,7 @@ def get_users():
|
54 | 57 | ]
|
55 | 58 | )
|
56 | 59 |
|
57 |
| - return jsonify({"status": "success", "data": list(User(**u).json() for u in users)}) |
| 60 | + return jsonify({"status": "success", "data": list(json.loads(User(**u).json()) for u in users)}) |
58 | 61 |
|
59 | 62 |
|
60 | 63 | @ADMIN.route("/roles/<user_id>", methods=["PATCH"])
|
@@ -111,5 +114,80 @@ def save_role(user_id):
|
111 | 114 | @ADMIN.route("/groups", methods=["GET"])
|
112 | 115 | def get_groups():
|
113 | 116 | return jsonify(
|
114 |
| - {"status": "success", "data": [Group(**d).json() for d in flask_mongo.db.groups.find()]} |
| 117 | + { |
| 118 | + "status": "success", |
| 119 | + "data": [json.loads(Group(**d).json()) for d in flask_mongo.db.groups.find()], |
| 120 | + } |
115 | 121 | ), 200
|
| 122 | + |
| 123 | + |
| 124 | +@ADMIN.route("/groups", methods=["PUT"]) |
| 125 | +@admin_only |
| 126 | +def create_group(): |
| 127 | + request_json = request.get_json() |
| 128 | + |
| 129 | + group_json = { |
| 130 | + "group_id": request_json.get("group_id"), |
| 131 | + "display_name": request_json.get("display_name"), |
| 132 | + "description": request_json.get("description"), |
| 133 | + "group_admins": request_json.get("group_admins"), |
| 134 | + } |
| 135 | + try: |
| 136 | + group = Group(**group_json) |
| 137 | + except Exception as e: |
| 138 | + return jsonify({"status": "error", "message": f"Invalid group data: {str(e)}"}), 400 |
| 139 | + |
| 140 | + try: |
| 141 | + group_immutable_id = flask_mongo.db.groups.insert_one(group.dict()).inserted_id |
| 142 | + except pymongo.errors.DuplicateKeyError: |
| 143 | + return jsonify( |
| 144 | + {"status": "error", "message": f"Group ID {group.group_id} already exists."} |
| 145 | + ), 400 |
| 146 | + |
| 147 | + if group_immutable_id: |
| 148 | + return jsonify({"status": "success", "group_immutable_id": str(group_immutable_id)}), 200 |
| 149 | + |
| 150 | + return jsonify({"status": "error", "message": "Unable to create group."}), 400 |
| 151 | + |
| 152 | + |
| 153 | +@ADMIN.route("/groups", methods=["DELETE"]) |
| 154 | +def delete_group(): |
| 155 | + request_json = request.get_json() |
| 156 | + |
| 157 | + group_id = request_json.get("immutable_id") |
| 158 | + if group_id is not None: |
| 159 | + result = flask_mongo.db.groups.delete_one({"_id": ObjectId(group_id)}) |
| 160 | + |
| 161 | + if result.deleted_count == 1: |
| 162 | + return jsonify({"status": "success"}), 200 |
| 163 | + |
| 164 | + return jsonify({"status": "error", "message": "Unable to delete group."}), 400 |
| 165 | + |
| 166 | + |
| 167 | +@ADMIN.route("/groups/<group_immutable_id>", methods=["PATCH"]) |
| 168 | +def add_user_to_group(group_immutable_id): |
| 169 | + request_json = request.get_json() |
| 170 | + |
| 171 | + user_id = request_json.get("user_id") |
| 172 | + |
| 173 | + if not user_id: |
| 174 | + return jsonify({"status": "error", "message": "No user ID provided."}), 400 |
| 175 | + |
| 176 | + client = _get_active_mongo_client() |
| 177 | + with client.start_session(causal_consistency=True) as session: |
| 178 | + group_exists = flask_mongo.db.groups.find_one( |
| 179 | + {"_id": ObjectId(group_immutable_id)}, session=session |
| 180 | + ) |
| 181 | + if not group_exists: |
| 182 | + return jsonify({"status": "error", "message": "Group does not exist."}), 400 |
| 183 | + |
| 184 | + update_user = flask_mongo.db.users.update_one( |
| 185 | + {"_id": ObjectId(user_id)}, |
| 186 | + {"$addToSet": {"groups": group_immutable_id}}, |
| 187 | + session=session, |
| 188 | + ) |
| 189 | + |
| 190 | + if not update_user.modified_count == 1: |
| 191 | + return jsonify({"status": "error", "message": "Unable to add user to group."}), 400 |
| 192 | + |
| 193 | + return jsonify({"status": "error", "message": "Unable to add user to group."}), 400 |
0 commit comments