libdir.'/tablelib.php'); class quiz_report extends quiz_default_report { function display($quiz, $cm, $course) { global $CFG; // Print header $this->print_header_and_tabs($cm, $course, $quiz, $reportmode="regrade"); // Check permissions $context = get_context_instance(CONTEXT_MODULE, $cm->id); if (!has_capability('mod/quiz:grade', $context)) { notify(get_string('regradenotallowed', 'quiz')); return true; } // Fetch all attempts if (!$attempts = get_records_select('quiz_attempts', "quiz = '$quiz->id' AND preview = 0")) { print_heading(get_string('noattempts', 'quiz')); return true; } // Fetch all questions $sql = "SELECT q.*, i.grade AS maxgrade FROM {$CFG->prefix}question q, {$CFG->prefix}quiz_question_instances i WHERE i.quiz = $quiz->id AND i.question = q.id"; if (! $questions = get_records_sql($sql)) { error("Failed to get questions for regrading!"); } get_question_options($questions); // Print heading print_heading(get_string('regradingquiz', 'quiz', format_string($quiz->name))); echo '
'; print_string('regradedisplayexplanation', 'quiz'); echo '
'; // Loop through all questions and all attempts and regrade while printing progress info foreach ($questions as $question) { echo ''.get_string('regradingquestion', 'quiz', $question->name).' '.get_string('attempts', 'quiz').": \n"; foreach ($attempts as $attempt) { set_time_limit(30); $changed = regrade_question_in_attempt($question, $attempt, $quiz, true); if ($changed) { link_to_popup_window ('/mod/quiz/reviewquestion.php?attempt='.$attempt->id.'&question='.$question->id, 'reviewquestion', ' #'.$attempt->id, 450, 550, get_string('reviewresponse', 'quiz')); } else { echo ' #'.$attempt->id; } } echo '
'; // the following makes sure that the output is sent immediately. @flush();@ob_flush(); } // Loop through all questions and recalculate $attempt->sumgrade $attemptschanged = 0; foreach ($attempts as $attempt) { $sumgrades = 0; $questionids = explode(',', quiz_questions_in_quiz($attempt->layout)); foreach($questionids as $questionid) { $lastgradedid = get_field('question_sessions', 'newgraded', 'attemptid', $attempt->uniqueid, 'questionid', $questionid); $sumgrades += get_field('question_states', 'grade', 'id', $lastgradedid); } if ($attempt->sumgrades != $sumgrades) { $attemptschanged++; set_field('quiz_attempts', 'sumgrades', $sumgrades, 'id', $attempt->id); } } // Update the overall quiz grades if ($grades = get_records('quiz_grades', 'quiz', $quiz->id)) { foreach($grades as $grade) { quiz_save_best_grade($quiz, $grade->userid); } } return true; } } ?>