Spaces:
Sleeping
Sleeping
| # user_routes.py | |
| from flask import Blueprint, render_template, request, redirect, url_for, session, flash, jsonify | |
| from auth_backend import ( | |
| register_user, | |
| login_user, | |
| reset_password_via_security_question, | |
| get_user_by_id, | |
| update_user_profile, | |
| ) | |
| from decorators import login_required | |
| # Création du Blueprint 'user_bp' | |
| user_bp = Blueprint('user_bp', __name__) | |
| def inscription(): | |
| if request.method == 'POST': | |
| # Traitement du formulaire d'inscription | |
| username = request.form.get("username") | |
| email = request.form.get("email") | |
| password = request.form.get("password") | |
| confirm_password = request.form.get("confirm_password") | |
| security_question = request.form.get("security_question") | |
| security_answer = request.form.get("security_answer") | |
| # CORRECTION ICI: Déballage des 3 valeurs. On utilise '_' pour la troisième (new_user_data) | |
| user_id, message, _ = register_user(username, email, password, confirm_password, security_question, security_answer) | |
| if user_id: | |
| flash(message, "success") | |
| # Rediriger vers la page de connexion après l'inscription | |
| return redirect(url_for('user_bp.connexion')) | |
| else: | |
| flash(message, "error") | |
| return render_template("inscription.html", | |
| username=username, | |
| email=email, | |
| security_question=security_question, | |
| security_answer=security_answer) | |
| return render_template("inscription.html") | |
| def connexion(): | |
| return render_template("connexion.html") | |
| def deconnexion(): | |
| # Déconnexion en vidant la session | |
| session.pop('user_id', None) | |
| flash("Vous êtes déconnecté avec succès.", "success") | |
| # Redirection vers la page d'accueil ou de connexion | |
| return redirect(url_for('web_bp.index')) | |
| def mot_de_passe_oublie(): | |
| if request.method == 'POST': | |
| username_or_email = request.form.get("username_or_email") | |
| security_answer = request.form.get("security_answer") | |
| new_password = request.form.get("new_password") | |
| confirm_password = request.form.get("confirm_password") | |
| # Validation rapide | |
| if new_password != confirm_password: | |
| flash("Les nouveaux mots de passe ne correspondent pas.", "error") | |
| return render_template("mot_de_passe_oublie.html", username_or_email=username_or_email) | |
| success, message = reset_password_via_security_question(username_or_email, security_answer, new_password) | |
| if success: | |
| flash(message, "success") | |
| return redirect(url_for('user_bp.connexion')) | |
| else: | |
| flash(message, "error") | |
| return render_template("mot_de_passe_oublie.html", username_or_email=username_or_email) | |
| return render_template("mot_de_passe_oublie.html") | |
| # --- Routes du Dashboard --- | |
| def dashboard(): | |
| """ | |
| Page du tableau de bord. Gère le message de succès de paiement (Phase 4). | |
| """ | |
| user = get_user_by_id(session.get('user_id')) | |
| # Logique pour le succès de paiement | |
| payment_status = request.args.get('payment') | |
| if payment_status == 'success': | |
| # On flashe un message pour l'afficher via Jinja dans le dashboard.html | |
| flash("Félicitations ! Votre abonnement a été activé avec succès.", "success") | |
| # Redirection pour nettoyer l'URL du paramètre de paiement | |
| return redirect(url_for('user_bp.dashboard')) | |
| return render_template("dashboard.html", user=user) | |
| # <--- AJOUTER 'POST' | |
| def profile(): | |
| user_id = session.get('user_id') | |
| if request.method == 'POST': | |
| # 1. Récupération des données du formulaire POST | |
| username = request.form.get('username') | |
| email = request.form.get('email') | |
| new_password = request.form.get('new_password') | |
| confirm_password = request.form.get('confirm_password') | |
| # 2. Validation simple côté serveur | |
| if not username or not email: | |
| flash("Le nom d'utilisateur et l'e-mail sont obligatoires.", "error") | |
| elif new_password and new_password != confirm_password: | |
| flash("Le nouveau mot de passe et la confirmation ne correspondent pas.", "error") | |
| else: | |
| # 3. Appel de la fonction de mise à jour du backend | |
| # Note : on passe None si le mot de passe n'est pas fourni/n'est pas validé. | |
| password_to_update = new_password if new_password and new_password == confirm_password else None | |
| success, message = update_user_profile(user_id, username, email, password_to_update) | |
| if success: | |
| flash(message, "success") | |
| # On pourrait aussi rediriger vers la page /profile GET pour rafraîchir la vue | |
| # et nettoyer l'URL. | |
| return redirect(url_for('user_bp.profile')) | |
| else: | |
| # Échec de la mise à jour (ex: email déjà pris, mot de passe trop court) | |
| flash(message, "error") | |
| # Logique pour la méthode GET ou après un échec POST | |
| # On récupère toujours l'utilisateur pour l'affichage (s'assure des données les plus fraîches) | |
| user = get_user_by_id(user_id) | |
| if user is None: | |
| # Erreur critique de session | |
| flash("Erreur de session. Veuillez vous reconnecter.", "error") | |
| session.pop('user_id', None) | |
| return redirect(url_for('user_bp.connexion')) | |
| return render_template("profile.html", user=user) | |
| def api_key(): | |
| """ | |
| Affiche la page de gestion des clés API. | |
| L'objet 'user' (retourné par get_user_by_id) contient maintenant la liste 'api_keys' (5 éléments). | |
| """ | |
| user_id = session.get('user_id') # Récupération de l'ID depuis la session | |
| user = get_user_by_id(user_id) # Appel à la fonction qui pourrait retourner None | |
| # --- CORRECTION DE L'ERREUR DÉTECTÉE DANS LES LOGS --- | |
| if user is None: | |
| # Si l'utilisateur n'est pas trouvé malgré le login_required (session corrompue) | |
| flash("Erreur critique de session. Veuillez vous reconnecter.", "error") | |
| # Forcer la déconnexion en vidant la session et rediriger vers la page de connexion | |
| session.pop('user_id', None) | |
| # Si vous utilisez un logger, il faudrait logger cette erreur pour investigation | |
| # current_app.logger.error(f"FAILURE: User ID {user_id} in session but not found in DB.") | |
| return redirect(url_for('user_bp.connexion')) | |
| # ---------------------------------------------------- | |
| return render_template("api_key.html", user=user) |