change user's groups in settings

This commit is contained in:
Markbeep
2025-02-23 13:12:41 +01:00
parent b46eaac25d
commit a1ede9c70b
2 changed files with 94 additions and 24 deletions
+52 -11
View File
@@ -110,7 +110,8 @@ def create_new_user(
request,
admin_user,
{"error": "Invalid username"},
block_name="create_user_messages",
block_name="toast_block",
headers={"HX-Retarget": "#toast-block"},
)
try:
@@ -121,7 +122,8 @@ def create_new_user(
request,
admin_user,
{"error": e.detail},
block_name="create_user_messages",
block_name="toast_block",
headers={"HX-Retarget": "#toast-block"},
)
if group not in GroupEnum.__members__:
@@ -130,7 +132,8 @@ def create_new_user(
request,
admin_user,
{"error": "Invalid group selected"},
block_name="create_user_messages",
block_name="toast_block",
headers={"HX-Retarget": "#toast-block"},
)
group = GroupEnum[group]
@@ -142,7 +145,8 @@ def create_new_user(
request,
admin_user,
{"error": "Username already exists"},
block_name="create_user_messages",
block_name="toast_block",
headers={"HX-Retarget": "#toast-block"},
)
user = create_user(username, password, group)
@@ -155,13 +159,12 @@ def create_new_user(
"settings_page/users.html",
request,
admin_user,
{"users": users},
{"users": users, "success": "Created user"},
block_name="user_block",
headers={"HX-Retarget": "#user-list"},
)
@router.delete("/user")
@router.delete("/user/{username}")
def delete_user(
request: Request,
username: str,
@@ -171,12 +174,14 @@ def delete_user(
],
):
if username == admin_user.username:
users = session.exec(select(User)).all()
return template_response(
"settings_page/users.html",
request,
admin_user,
{"error": "Cannot delete own user"},
block_name="delete_user_messages",
block_name="toast_block",
headers={"HX-Retarget": "#toast-block"},
)
user = session.exec(select(User).where(User.username == username)).one_or_none()
@@ -186,7 +191,8 @@ def delete_user(
request,
admin_user,
{"error": "Cannot delete root user"},
block_name="delete_user_messages",
block_name="toast_block",
headers={"HX-Retarget": "#toast-block"},
)
if user:
@@ -199,9 +205,44 @@ def delete_user(
"settings_page/users.html",
request,
admin_user,
{"users": users},
{"users": users, "success": "Deleted user"},
block_name="user_block",
)
@router.patch("/user/{username}")
def update_user(
request: Request,
username: str,
group: Annotated[GroupEnum, Form()],
session: Annotated[Session, Depends(get_session)],
admin_user: Annotated[
DetailedUser, Depends(get_authenticated_user(GroupEnum.admin))
],
):
user = session.exec(select(User).where(User.username == username)).one_or_none()
if user and user.root:
return template_response(
"settings_page/users.html",
request,
admin_user,
{"error": "Cannot change root user"},
block_name="toast_block",
headers={"HX-Retarget": "#toast-block"},
)
if user:
user.group = group
session.add(user)
session.commit()
users = session.exec(select(User)).all()
return template_response(
"settings_page/users.html",
request,
admin_user,
{"users": users, "success": "Updated user"},
block_name="user_block",
headers={"HX-Retarget": "#user-list"},
)
+42 -13
View File
@@ -1,14 +1,15 @@
{% extends "settings_page/base.html" %} {% block head %}
<title>Settings - Users</title>
{% include 'scripts/toast.html' %}
{% endblock %} {% block content %}
<form
id="create-user-form"
class="flex flex-col gap-2"
hx-post="/settings/user"
hx-target="#create-user-error"
hx-on::after-request="if (event.detail.successful) this.reset()"
hx-target="#user-list"
hx-on::after-request="if (event.detail.successful && event.detail.target?.id === 'user-list') this.reset()"
hx-swap="outerHTML"
hx-disabled-elt="#submit"
>
<h2 class="text-lg">Create user</h2>
<label for="username">Username</label>
@@ -40,19 +41,28 @@
<option value="admin">Admin</option>
</select>
{% block create_user_messages %}
<span id="create-user-error" class="text-red-400">{{ error }}</span>
{% endblock %}
<button id="submit" class="btn btn-primary" type="submit">Create user</button>
</form>
{% block user_block %}
<div id="user-list" class="pt-4 border-t border-base-200">
<h2 class="text-lg">Users</h2>
{% block delete_user_messages %}
<span id="delete-user-messages" class="text-red-400">{{ error }}</span>
{% endblock %}
{% block toast_block %}
<div class="hidden" id="toast-block">
{% if error %}
<script>
toast("{{error|safe}}", "error");
</script>
{% endif %}
{% if success %}
<script>
toast("{{success|safe}}", "success");
</script>
{% endif %}
</div>
{% endblock %}
<div class="max-h-[30rem] overflow-x-auto">
<table class="table table-pin-rows">
<thead>
@@ -68,7 +78,25 @@
<tr>
<th>{{ loop.index }}</th>
<td>{{ u.username }}</td>
<td>{{ u.group.value.capitalize() }}</td>
<td>
<!-- prettier-ignore -->
<select
id="select-group"
name="group"
class="select w-full"
required {% if u.root %}disabled{% endif %}
hx-patch="/settings/user/{{ u.username|quote_plus }}"
hx-trigger="change"
hx-disabled-elt="this"
hx-target="#user-list"
hx-swap="outerHTML"
>
<option value="untrusted" {% if u.group.value.__eq__("untrusted") %}selected{% endif %}>Untrusted</option>
<option value="trusted" {% if u.group.value.__eq__("trusted") %}selected{% endif %}>Trusted</option>
<option value="admin" {% if u.group.value.__eq__("admin") %}selected{% endif %}>Admin</option>
{% if u.root %}<option value="admin" selected>Root Admin</option>{% endif %}
</select>
</td>
<td {% if u.root %}title="Root user" {% endif %}>
<!--prettier-ignore -->
<button
@@ -95,8 +123,9 @@
<button class="btn">Cancel</button>
<button
class="btn bg-primary"
hx-delete="/settings/user?username={{ u.username|quote_plus }}"
hx-target="#delete-user-messages"
hx-delete="/settings/user/{{ u.username|quote_plus }}"
hx-disabled-elt="this"
hx-target="#user-list"
hx-swap="outerHTML"
>
Delete