import html
from urllib.parse import quote
from fastapi import APIRouter, Depends, Form, HTTPException, Request
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.templates.layout import page
router = APIRouter()
def require_admin(user: dict) -> None:
if (user.get("role") or "").lower() != "admin":
raise HTTPException(status_code=403, detail="Only admins can manage users")
def render_role_options(selected: str) -> str:
options = []
for role in ROLES:
selected_attr = " selected" if selected == role else ""
options.append(f'')
return "".join(options)
def render_enabled_pill(enabled) -> str:
if enabled:
return 'enabled'
return 'disabled'
def render_role_overview() -> str:
role_rows = (
("admin", "Full administration, user management, role changes, disabling/enabling users, and admin-only operations."),
("developer", "Operational portal access for application and service workflows. No access to Administration / Users."),
("viewer", "Default Google role. Read-oriented portal access where routes allow it. No access to Administration / Users."),
)
rows = ""
for role, description in role_rows:
rows += f"""