66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
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="", join_credentials=False)
|
|
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, join_credentials=False)
|
|
)
|
|
|
|
_all = assigned_to + assign_to
|
|
|
|
async with ClusterLock(["users", "credentials"], current_app):
|
|
for user in _all:
|
|
user_dict = user.model_dump(mode="json")
|
|
if request_data.name in user_dict["groups"]:
|
|
user_dict["groups"].remove(request_data.name)
|
|
|
|
if (
|
|
request_data.new_name not in user_dict["groups"]
|
|
and user in assign_to
|
|
):
|
|
user_dict["groups"].append(request_data.new_name)
|
|
|
|
await components.users.patch(user_id=user.id, data=user_dict)
|
|
|
|
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={})
|