import json from flask import Blueprint, render_template, request, redirect, url_for, session, abort from auth_utils import current_user, login_required from quiz import get_all, get_by_id from db import save_result public_bp = Blueprint('public', __name__) @public_bp.route('/') def index(): quizzes = get_all() return render_template('index.html', quizzes=quizzes, user=current_user()) @public_bp.route('/quiz/') def quiz_list(): quizzes = get_all() return render_template('quiz/list.html', quizzes=quizzes, user=current_user()) @public_bp.route('/quiz//') def quiz_intro(quiz_id): quiz = get_by_id(quiz_id) if not quiz: abort(404) return render_template('quiz/intro.html', quiz=quiz, user=current_user()) @public_bp.route('/quiz//jouer', methods=['GET', 'POST']) def quiz_play(quiz_id): quiz = get_by_id(quiz_id) if not quiz: abort(404) if quiz['members_only'] and not current_user(): session['next_url'] = url_for('public.quiz_play', quiz_id=quiz_id) return redirect(url_for('auth.login')) if request.method == 'POST': answers = {} for i in range(len(quiz['questions'])): val = request.form.get(f'q{i}') answers[i] = int(val) if val is not None else -1 score = sum( 1 for i, q in enumerate(quiz['questions']) if answers.get(i) == q['answer'] ) total = len(quiz['questions']) if current_user(): save_result( current_user()['sub'], current_user()['name'], quiz_id, score, total, ) # Stocke résultat et détail en session pour la page résultat session['last_result'] = { 'quiz_id': quiz_id, 'score': score, 'total': total, 'answers': answers, } return redirect(url_for('public.quiz_result', quiz_id=quiz_id)) return render_template('quiz/play.html', quiz=quiz, quiz_json=json.dumps(quiz), user=current_user()) @public_bp.route('/quiz//resultat') def quiz_result(quiz_id): quiz = get_by_id(quiz_id) result = session.pop('last_result', None) if not quiz or not result or result['quiz_id'] != quiz_id: return redirect(url_for('public.quiz_intro', quiz_id=quiz_id)) return render_template('quiz/result.html', quiz=quiz, result=result, user=current_user())