File size: 4,151 Bytes
50b7a69 4556c83 50b7a69 de7c6d8 9a82c5c 50b7a69 9a82c5c 4556c83 0d1bedf 9a82c5c 50b7a69 0d1bedf 50b7a69 de7c6d8 50b7a69 0d1bedf 3a7f5ab 0d1bedf 50b7a69 0d1bedf 50b7a69 d77ef80 5b846f1 96884ca 83297c3 5b846f1 96884ca 5b846f1 c26e144 5b846f1 c26e144 5b846f1 d77ef80 50b7a69 83297c3 96884ca de7c6d8 83297c3 4556c83 d77ef80 3a7f5ab 83297c3 de7c6d8 50b7a69 de7c6d8 50b7a69 83297c3 de7c6d8 9a82c5c b4443a9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
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['score'] = 0
session['current_question'] = 0
session['start_time'] = time.time()
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
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 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['answers'].append(answers)
correct_answers = [str(ord(x) - ord('A')) for x in question['correct']]
if set(answers) == set(correct_answers):
session['score'] += 1
else:
if answers:
session['answers'].append(answers)
correct_answers = [str(ord(x) - ord('A')) for x in question['correct']]
if set(answers) == set(correct_answers):
session['score'] += 1
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))
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)
@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'])
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) |