Coverage for app/routes/quiz.py: 26%

35 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-05-02 02:49 +0000

1from flask import request, render_template, Blueprint, redirect, session 

2from app.models.response import * 

3from app.models.status_codes import StatusCodes 

4from flasgger import swag_from 

5from app.services.quiz_service import build_prompt_from_suggestions, generate_quiz_from_prompt 

6from app.controllers.database import client 

7 

8quiz_bp = Blueprint('quiz', __name__) 

9 

10@quiz_bp.route('/quiz/generate', methods=['POST']) 

11def generate_quiz_route(): 

12 try: 

13 data = request.get_json() 

14 user_id = data.get("user_id") 

15 user_class_id = data.get("user_class_id") 

16 

17 print(f"Received request to generate quiz for user_id: {user_id} & user_class_id: {user_class_id}") 

18 

19 if not user_id: 

20 return error_response( 

21 "Missing 'user_id' in request body.", 

22 None, 

23 StatusCodes.BAD_REQUEST 

24 ) 

25 

26 section_query = client.table("user_sections") \ 

27 .select("*") \ 

28 .eq("user_id", user_id) \ 

29 .eq("status", "NEED_REVIEW") 

30 

31 if user_class_id == "non-class": 

32 section_query = section_query.is_("class_id", None) 

33 else: 

34 section_query = section_query.eq("class_id", user_class_id) 

35 

36 section = section_query.limit(1).execute() 

37 

38 if not section.data: 

39 return success_response( 

40 f"You have no sections that need review.", 

41 {"quiz": []}, 

42 StatusCodes.NOT_FOUND 

43 ) 

44 

45 user_section_id = section.data[0]["section_id"] 

46 

47 existing_questions = client.table("user_section_questions") \ 

48 .select("*") \ 

49 .eq("user_section_id", user_section_id) \ 

50 .execute() 

51 

52 if existing_questions.data: 

53 return success_response( 

54 f"Returning existing quiz for user {user_id}", 

55 {"quiz": existing_questions.data}, 

56 StatusCodes.OK 

57 ) 

58 

59 prompt = build_prompt_from_suggestions(user_section_id) 

60 generated_quiz = generate_quiz_from_prompt(prompt) 

61 

62 for quiz in generated_quiz: 

63 client.table("user_section_questions").insert({ 

64 "user_section_id": user_section_id, 

65 "question": quiz["question"], 

66 "choices": quiz["choices"], 

67 "answer_index": quiz["answer_index"], 

68 "explanation": quiz["explanation"], 

69 "user_answer_index": None 

70 }).execute() 

71 

72 saved_questions = client.table("user_section_questions") \ 

73 .select("*") \ 

74 .eq("user_section_id", user_section_id) \ 

75 .execute() 

76 

77 return success_response( 

78 f"Quiz successfully generated for user {user_id}", 

79 {"quiz": saved_questions.data}, 

80 StatusCodes.CREATED 

81 ) 

82 

83 except Exception as e: 

84 return error_response( 

85 f"Error generating quiz: {str(e)}", 

86 None, 

87 StatusCodes.SERVER_ERROR 

88 )