File size: 4,216 Bytes
8e74368
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
102
103
104
import json
import logging
from flask import jsonify, request
from flask_jwt_extended import get_jwt_identity
from models import get_db_connection
import mysql.connector
from datetime import datetime

import traceback
def submit_quiz():
    if request.method == 'POST':
        logging.info("Received a POST request to submit quiz.")

        quiz_id = request.form.get('quiz_id')
        user_response = request.form.getlist('user_response')
        theme = request.form.get('theme')
        start_time = request.form.get('start_time')
        end_time = request.form.get('end_time')

        logging.info(f"Received data: quiz_id={quiz_id}, user_response={user_response}, theme={theme}")

        if not quiz_id or not user_response or not theme or not start_time or not end_time:
            return jsonify({"error": "Please provide all required fields."}), 400

        user_id_attempt = get_jwt_identity()
        logging.info(f"Authenticated user ID: {user_id_attempt}")

        connection = get_db_connection()
        if not connection:
            return jsonify({"error": "Database connection failed."}), 500

        cursor = connection.cursor()
        logging.info("Database connection established.")

        try:
            cursor.execute("SELECT theme_quiz_table FROM themes WHERE theme = %s", (theme,))
            theme_entry = cursor.fetchone()

            if not theme_entry:
                return jsonify({"error": "Invalid theme or theme not supported."}), 400

            theme_table = theme_entry['theme_quiz_table']
            
            
            cursor.execute(f"SELECT * FROM {theme_table} WHERE quiz_id = %s AND FIND_IN_SET(%s, user_id_attempt) > 0", (quiz_id, user_id_attempt))
            if cursor.fetchone():
                return jsonify({"error": "You have already submitted this quiz."}), 403

            
            cursor.execute(f"SELECT * FROM {theme_table} WHERE quiz_id = %s", (quiz_id,))
            quiz = cursor.fetchone()
            
            if not quiz:
                return jsonify({"error": "Quiz not found."}), 404

            
            questions_data = json.loads(quiz.get('questions_by_llm') or quiz.get('questions_by_master', '[]'))
            correct_options = json.loads(quiz.get('correct_options_llm') or quiz.get('correct_options_master', '[]'))
            
            if len(user_response) != len(correct_options):
                return jsonify({"error": "Number of responses does not match the number of questions."}), 400


            score = sum(1 for i in range(len(correct_options)) if user_response[i] == correct_options[i])
            time_taken = str(datetime.strptime(end_time, "%H:%M:%S") - datetime.strptime(start_time, "%H:%M:%S"))
            
        
            cursor.execute("""
                INSERT INTO quiz_response (quiz_id, theme, user_id_attempt, user_response, score, time_taken)
                VALUES (%s, %s, %s, %s, %s, %s)
            """, (quiz_id, theme, user_id_attempt, json.dumps(user_response), score, time_taken))
            
            
            cursor.execute(f"""
                UPDATE {theme_table}
                SET user_id_attempt = CONCAT(COALESCE(user_id_attempt, ''), %s, ',')
                WHERE quiz_id = %s
            """, (user_id_attempt, quiz_id))

        
            cursor.execute("""
                UPDATE users
                SET total_score = total_score + %s
                WHERE id = %s
            """, (score, user_id_attempt))

            connection.commit()
            logging.info(f"User {user_id_attempt} submitted quiz {quiz_id} with score {score} and time taken {time_taken}.")

            return jsonify({"quiz_id": quiz_id, "score": score, "time_taken": time_taken}), 200

        except mysql.connector.Error as err:
            logging.error(f"MySQL Error: {err}")
            return jsonify({"error": "Database operation failed."}), 500

        except Exception as e:
            logging.error(f"Unexpected error: {str(e)}")
            return jsonify({"error": "An unexpected error occurred."}), 500

        finally:
            cursor.close()
            connection.close()
            logging.info("Database connection closed.")