from flask import Flask, render_template, request, redirect, url_for, session from flask_session import Session import json import random import os import time app = Flask(__name__) app.secret_key = 'supersecretkey' # Configure Flask-Session app.config['SESSION_TYPE'] = 'filesystem' Session(app) QUESTIONS_FOLDER = 'questions' @app.route('/') def index(): files = [f for f in os.listdir(QUESTIONS_FOLDER) if f.endswith('.json')] return render_template('index.html', files=files) @app.route('/start', methods=['POST']) def start(): session['questions'] = [] session['answers'] = [] session['current_question'] = 0 session['start_time'] = time.time() session['user_answers'] = [] selected_file = request.form['file'] session['selected_file'] = os.path.splitext(selected_file)[0] # Remove file extension file_path = os.path.join(QUESTIONS_FOLDER, selected_file) with open(file_path, 'r') as file: questions = json.load(file) random.shuffle(questions) session['questions'] = questions session['answers'] = [[] for _ in questions] # Initialize answers list for each question return redirect(url_for('quiz')) @app.route('/quiz', methods=['GET', 'POST']) def quiz(): if 'questions' not in session or 'current_question' not in session: return redirect(url_for('index')) if 'user_answers' not in session: session['user_answers'] = [] if request.method == 'POST': action = request.form.get('action') if action == 'next': question = session['questions'][session['current_question']] multiple_selection = 'Choose two' in question['question'] or 'Select TWO' in question['question'] answers = request.form.getlist('answer') if multiple_selection: required_answers = 2 if len(answers) == required_answers: session['user_answers'].append((session['current_question'], answers)) else: if answers: session['user_answers'].append((session['current_question'], answers)) session['current_question'] += 1 if session['current_question'] >= len(session['questions']): return redirect(url_for('results')) elif action == 'previous': session['current_question'] -= 1 if session['current_question'] < 0: session['current_question'] = 0 elif action == 'end': return redirect(url_for('results')) question = session['questions'][session['current_question']] multiple_selection = 'Choose two' in question['question'] or 'Select TWO' in question['question'] elapsed_time = time.time() - session['start_time'] elapsed_time_str = time.strftime('%H:%M:%S', time.gmtime(elapsed_time)) # Find the previous answers for the current question previous_answers = [] for q_index, answers in session['user_answers']: if q_index == session['current_question']: previous_answers = answers break # Debugging statements print(f"Current question index: {session['current_question']}") print(f"Previous answers: {previous_answers}") print(f"Session user answers: {session['user_answers']}") return render_template('quiz.html', question=question, question_number=session['current_question'] + 1, total_questions=len(session['questions']), selected_file=session['selected_file'], show_previous=session['current_question'] > 0, multiple_selection=multiple_selection, elapsed_time=elapsed_time_str, previous_answers=previous_answers) @app.route('/results') def results(): if 'questions' not in session or 'answers' not in session: return redirect(url_for('index')) total_questions = len(session['questions']) session['score'] = 0 # Initialize score for i, question in enumerate(session['questions']): correct_answers = [str(ord(x) - ord('A')) for x in question['correct']] user_answers = session['answers'][i] if set(user_answers) == set(correct_answers): session['score'] += 1 score_percentage = (session['score'] / total_questions) * 100 elapsed_time = time.time() - session['start_time'] elapsed_time_str = time.strftime('%H:%M:%S', time.gmtime(elapsed_time)) return render_template('results.html', score=session['score'], total_questions=total_questions, score_percentage=score_percentage, elapsed_time=elapsed_time_str) if __name__ == '__main__': app.run(host='0.0.0.0', port=7860)