mirror of
https://github.com/th30d4y/OpenLearnX.git
synced 2026-05-26 11:25:49 +00:00
109 lines
3.3 KiB
Python
109 lines
3.3 KiB
Python
from flask import Blueprint, request, jsonify, current_app
|
|
import jwt
|
|
from datetime import datetime
|
|
|
|
bp = Blueprint('test', __name__)
|
|
|
|
def get_user_from_token(token):
|
|
"""Extract user from JWT token"""
|
|
try:
|
|
payload = jwt.decode(
|
|
token,
|
|
current_app.config['SECRET_KEY'],
|
|
algorithms=['HS256']
|
|
)
|
|
return payload['user_id']
|
|
except:
|
|
return None
|
|
|
|
@bp.route('/start', methods=['POST'])
|
|
async def start_test():
|
|
"""Start a new test session"""
|
|
token = request.headers.get('Authorization', '').replace('Bearer ', '')
|
|
user_id = get_user_from_token(token)
|
|
|
|
if not user_id:
|
|
return jsonify({"error": "Authentication required"}), 401
|
|
|
|
data = request.get_json()
|
|
subject = data.get('subject', 'General')
|
|
|
|
mongo_service = current_app.config['MONGO_SERVICE']
|
|
|
|
# Create test session
|
|
session = await mongo_service.create_test_session(user_id, subject)
|
|
|
|
# Get first question
|
|
questions = await mongo_service.get_questions_by_difficulty(2, 1)
|
|
|
|
if not questions:
|
|
return jsonify({"error": "No questions available"}), 404
|
|
|
|
question = questions[0]
|
|
session['questions'].append(str(question['_id']))
|
|
await mongo_service.update_test_session(str(session['_id']), {
|
|
'questions': session['questions'],
|
|
'current_question': 0
|
|
})
|
|
|
|
return jsonify({
|
|
"session_id": str(session['_id']),
|
|
"question": {
|
|
"id": str(question['_id']),
|
|
"question": question['question'],
|
|
"options": question['options'],
|
|
"subject": question['subject'],
|
|
"difficulty": question['difficulty']
|
|
},
|
|
"question_number": 1,
|
|
"total_questions": 10
|
|
})
|
|
|
|
@bp.route('/answer', methods=['POST'])
|
|
async def submit_answer():
|
|
"""Submit answer and get feedback"""
|
|
token = request.headers.get('Authorization', '').replace('Bearer ', '')
|
|
user_id = get_user_from_token(token)
|
|
|
|
if not user_id:
|
|
return jsonify({"error": "Authentication required"}), 401
|
|
|
|
data = request.get_json()
|
|
session_id = data.get('session_id')
|
|
question_id = data.get('question_id')
|
|
answer = data.get('answer')
|
|
|
|
mongo_service = current_app.config['MONGO_SERVICE']
|
|
|
|
# Get session and question
|
|
session = await mongo_service.get_test_session(session_id)
|
|
question = await mongo_service.questions.find_one({"_id": question_id})
|
|
|
|
if not session or not question:
|
|
return jsonify({"error": "Invalid session or question"}), 404
|
|
|
|
# Check answer
|
|
is_correct = answer == question['correct_answer']
|
|
|
|
# Provide feedback
|
|
feedback = {
|
|
"correct": is_correct,
|
|
"confidence_score": 0.85 if is_correct else 0.25,
|
|
"explanation": question['explanation'],
|
|
"correct_answer": question['options'][question['correct_answer']],
|
|
"current_score": 75.0,
|
|
"total_answered": len(session.get('answers', [])) + 1
|
|
}
|
|
|
|
return jsonify({
|
|
"feedback": feedback,
|
|
"test_completed": False,
|
|
"next_question": {
|
|
"id": str(question['_id']),
|
|
"question": "Sample next question?",
|
|
"options": ["A", "B", "C", "D"],
|
|
"subject": subject,
|
|
"difficulty": 2
|
|
}
|
|
})
|