From 0219831af44abb64f1902e92b88b1e5e1c107523 Mon Sep 17 00:00:00 2001 From: Ilya Tregubov Date: Mon, 6 May 2024 12:14:32 +0800 Subject: [PATCH 1/2] MDL-51360 mod_quiz: Don't do full course recalculation. It seems it was never needed. We only need to know if just one grade is overridden and its value. --- mod/quiz/view.php | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/mod/quiz/view.php b/mod/quiz/view.php index 53d9bc79fec..7da171c8d3d 100644 --- a/mod/quiz/view.php +++ b/mod/quiz/view.php @@ -126,21 +126,33 @@ if (!$canpreview) { $mygradeoverridden = false; $gradebookfeedback = ''; -$item = null; - -$gradinginfo = grade_get_grades($course->id, 'mod', 'quiz', $quiz->id, $USER->id); -if (!empty($gradinginfo->items)) { - $item = $gradinginfo->items[0]; - if (isset($item->grades[$USER->id])) { - $grade = $item->grades[$USER->id]; +$gradeitem = grade_item::fetch([ + 'itemtype' => 'mod', + 'itemmodule' => 'quiz', + 'iteminstance' => $quiz->id, + 'itemnumber' => 0, + 'courseid' => $course->id, +]); +if ($gradeitem) { + if ($gradeitem->refresh_grades($USER->id)) { + $grade = $gradeitem->get_grade($USER->id, false); if ($grade->overridden) { - $mygrade = $grade->grade + 0; // Convert to number. + if ($gradeitem->needsupdate) { + // It is Error, but let's be consistent with the old code. + $mygrade = 0; + } else { + $mygrade = $grade->finalgrade; + } $mygradeoverridden = true; } - if (!empty($grade->str_feedback)) { - $gradebookfeedback = $grade->str_feedback; + + if (!empty($grade->feedback)) { + $gradebookfeedback = $grade->feedback; } + } else { + // It is Error, but let's be consistent with the old code. + $mygrade = 0; } } @@ -197,9 +209,9 @@ if ($quiz->attempts != 1) { } // Inform user of the grade to pass if non-zero. -if ($item && grade_floats_different($item->gradepass, 0)) { +if ($gradeitem && grade_floats_different($gradeitem->gradepass, 0)) { $a = new stdClass(); - $a->grade = quiz_format_grade($quiz, $item->gradepass); + $a->grade = quiz_format_grade($quiz, $gradeitem->gradepass); $a->maxgrade = quiz_format_grade($quiz, $quiz->grade); $viewobj->infomessages[] = get_string('gradetopassoutof', 'quiz', $a); } From 7fc818ebb8a8c23f804a85c40f3c58a92ae873af Mon Sep 17 00:00:00 2001 From: Ilya Tregubov Date: Thu, 9 May 2024 14:57:05 +0800 Subject: [PATCH 2/2] MDL-51360 core_grades: Improve documentation of grade_get_grades(). --- lib/gradelib.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/gradelib.php b/lib/gradelib.php index 770a233ab83..a0e444744d1 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -430,10 +430,14 @@ function grade_regrade_final_grades_if_required($course, callable $callback = nu } /** - * Returns grading information for given activity, optionally with user grades + * Returns grading information for given activity, optionally with user grades. * Manual, course or category items can not be queried. * - * @category grade + * This function can be VERY costly - it is doing full course grades recalculation if needsupdate = 1 + * for course grade item. So be sure you really need it. + * If you need just certain grades consider using grade_item::refresh_grades() + * together with grade_item::get_grade() instead. + * * @param int $courseid ID of course * @param string $itemtype Type of grade item. For example, 'mod' or 'block' * @param string $itemmodule More specific then $itemtype. For example, 'forum' or 'quiz'. May be NULL for some item types @@ -441,6 +445,7 @@ function grade_regrade_final_grades_if_required($course, callable $callback = nu * @param mixed $userid_or_ids Either a single user ID, an array of user IDs or null. If user ID or IDs are not supplied returns information about grade_item * @return stdClass Object with keys {items, outcomes, errors}, where 'items' is an array of grade * information objects (scaleid, name, grade and locked status, etc.) indexed with itemnumbers + * @category grade */ function grade_get_grades($courseid, $itemtype, $itemmodule, $iteminstance, $userid_or_ids=null) { global $CFG;