mazani uzivatelu

This commit is contained in:
JiriUhlir
2026-06-12 09:58:52 +02:00
parent ddc65322c5
commit 5d12028a97
4 changed files with 56 additions and 3 deletions
+41 -1
View File
@@ -6,7 +6,7 @@ from fastapi.responses import HTMLResponse, RedirectResponse
from app.auth import require_user
from app.db.audit import log_audit_event
from app.db.users import ROLES, count_enabled_admins, get_user, list_users, set_user_enabled, update_user_role
from app.db.users import ROLES, count_enabled_admins, delete_user, get_user, list_users, set_user_enabled, update_user_role
from app.gitea_provisioning import sync_gitea_user
from app.templates.layout import page
@@ -132,6 +132,9 @@ def users_page(request: Request, message: str = "", error: str = "", user=Depend
<form method="post" action="/portal/admin/users/{user_id_html}/sync-gitea" class="inline-form">
<button type="submit" class="btn-secondary">Sync Gitea</button>
</form>
<form method="post" action="/portal/admin/users/{user_id_html}/delete" class="inline-form" onsubmit="return confirm('Delete this user? This removes the portal account.');">
<button type="submit" class="btn-secondary">Delete</button>
</form>
</td>
</tr>
"""
@@ -291,3 +294,40 @@ def sync_gitea_user_action(user_id: int, user=Depends(require_user)):
status_code=303,
)
return RedirectResponse(url="/portal/admin/users?message=" + quote("Gitea synchronized."), status_code=303)
@router.post("/admin/users/{user_id}/delete")
def delete_user_action(user_id: int, user=Depends(require_user)):
require_admin(user)
target = get_user(user_id)
if not target:
raise HTTPException(status_code=404, detail="User not found")
if int(user.get("id")) == user_id:
return RedirectResponse(
url="/portal/admin/users?error=" + quote("Cannot delete your own user account."),
status_code=303,
)
if (target.get("role") or "").lower() == "admin" and count_enabled_admins(excluding_user_id=user_id) == 0:
return RedirectResponse(
url="/portal/admin/users?error=" + quote("Cannot delete the last enabled admin."),
status_code=303,
)
set_user_enabled(user_id, False)
target = get_user(user_id) or target
sync_result = sync_gitea_user(target)
if sync_result.get("status") == "error":
return RedirectResponse(
url="/portal/admin/users?error=" + quote(f"User disabled, but Gitea sync failed: {sync_result.get('error')}"),
status_code=303,
)
delete_user(user_id)
log_audit_event(
user,
action="user.deleted",
target_type="user",
target_id=user_id,
metadata={"username": target.get("username"), "role": target.get("role"), "gitea_sync_status": sync_result.get("status")},
)
return RedirectResponse(url="/portal/admin/users?message=" + quote("User deleted."), status_code=303)