29 lines
766 B
Python
29 lines
766 B
Python
from typing import Dict, Tuple
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models import Module, QuizQuestion, QuizChoice
|
|
|
|
|
|
def grade_quiz(db: Session, module: Module, answers: Dict[int, int]) -> Tuple[float, int, int]:
|
|
questions = (
|
|
db.query(QuizQuestion)
|
|
.filter(QuizQuestion.module_id == module.id)
|
|
.all()
|
|
)
|
|
if not questions:
|
|
return 0.0, 0, 0
|
|
|
|
correct = 0
|
|
total = len(questions)
|
|
for q in questions:
|
|
choice_id = answers.get(q.id)
|
|
if choice_id is None:
|
|
continue
|
|
choice = db.get(QuizChoice, choice_id)
|
|
if choice and choice.question_id == q.id and choice.is_correct:
|
|
correct += 1
|
|
|
|
score = (correct / total) * 100
|
|
return score, correct, total
|