05/24 Enhance functionalities

This commit is contained in:
2026-05-24 22:51:27 -04:00
parent 9e1493eea7
commit cb98c7e222
7 changed files with 233 additions and 6 deletions
+35 -2
View File
@@ -3,9 +3,13 @@ routes/admin_users.py — User management CRUD routes.
"""
import logging
from flask import Blueprint, render_template, request, redirect, url_for, flash, session
from models import get_all_users, create_user, update_user, delete_user
from flask import Blueprint, render_template, request, redirect, url_for, flash, session, jsonify
from models import (
get_all_users, create_user, update_user, delete_user,
get_user_by_id, create_password_reset_token, log_action,
)
from utils.decorators import admin_required
from utils.email import send_email
logger = logging.getLogger("routes.admin_users")
admin_users_bp = Blueprint("admin_users", __name__, url_prefix="/admin/users")
@@ -82,3 +86,32 @@ def delete(user_id):
flash(f"Error deleting user: {e}", "danger")
return redirect(url_for("admin_users.users_list"))
@admin_users_bp.route("/<int:user_id>/send-reset", methods=["POST"])
@admin_required
def send_reset(user_id):
admin = session["user"]
user = get_user_by_id(user_id)
if not user:
return jsonify({"error": "User not found."}), 404
if not user.get("email"):
return jsonify({"error": f"User '{user['username']}' has no email address set."}), 400
try:
token = create_password_reset_token(user_id)
reset_url = url_for("auth.reset_password", token=token, _external=True)
body = (
f"Hi {user.get('full_name') or user['username']},\n\n"
f"An administrator has sent you a password reset link for your Website Checker account.\n"
f"Click the link below to set a new password (valid for 1 hour):\n\n"
f"{reset_url}\n\n"
f"If you did not expect this, please contact your administrator.\n"
)
send_email(user["email"], "Website Checker — Password Reset", body)
log_action(admin["id"], "SEND_RESET_LINK", "users", user_id,
f"Password reset link sent to '{user['username']}' ({user['email']}).")
logger.info(f"Reset email sent to user_id={user_id} by admin_id={admin['id']}.")
return jsonify({"ok": True, "to": user["email"]})
except Exception as e:
logger.error(f"send_reset error for user_id={user_id}: {e}")
return jsonify({"error": str(e)}), 500