mirror of
https://github.com/markbeep/AudioBookRequest.git
synced 2026-04-27 11:59:38 -05:00
change user's groups in settings
This commit is contained in:
+52
-11
@@ -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"},
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user