import components.users from components.models.users import UserGroups from components.web.utils import * blueprint = Blueprint("groups", __name__, url_prefix="/system/groups") @blueprint.context_processor def load_context(): from components.models.users import UserProfile context = dict() context["schemas"] = {"user_profile": UserProfile.model_json_schema()} return context @blueprint.route("/", methods=["PATCH"]) @acl("system") async def user_group(): try: request_data = UserGroups.parse_obj(request.form_parsed) assigned_to = [ u for u in await components.users.search(name="") if request_data.name in u.groups ] assign_to = [] for user_id in request_data.members: assign_to.append(await components.users.get(user_id=user_id)) _all = assigned_to + assign_to async with ClusterLock("users", current_app): for user in _all: if request_data.name in user.groups: user.groups.remove(request_data.name) if request_data.new_name not in user.groups and user in assign_to: user.groups.append(request_data.new_name) await components.users.patch( user_id=user.id, data=user.model_dump(mode="json") ) return "", 204 except ValidationError as e: return validation_error(e.errors()) except ValueError as e: name, message = e.args return validation_error([{"loc": [name], "msg": message}]) @blueprint.route("/") @acl("system") @formoptions(["users"]) async def get_groups(): return await render_template("system/groups.html", data={})