diff --git a/lib/gradelib.php b/lib/gradelib.php index a189716188f..38280108ecb 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -1619,3 +1619,22 @@ function grade_floats_different($f1, $f2) { function grade_floats_equal($f1, $f2) { return (grade_floatval($f1) === grade_floatval($f2)); } + +/** + * Get the most appropriate grade date for a grade item given the user that the grade relates to. + * + * @param \stdClass $grade + * @param \stdClass $user + * @return int + */ +function grade_get_date_for_user_grade(\stdClass $grade, \stdClass $user): int { + // The `datesubmitted` is the time that the grade was created. + // The `dategraded` is the time that it was modified or overwritten. + // If the grade was last modified by the user themselves use the date graded. + // Otherwise use date submitted. + if ($grade->usermodified == $user->id || empty($grade->datesubmitted)) { + return $grade->dategraded; + } else { + return $grade->datesubmitted; + } +} diff --git a/lib/tests/gradelib_test.php b/lib/tests/gradelib_test.php index 0e6eebcb6f8..8401916fd3c 100644 --- a/lib/tests/gradelib_test.php +++ b/lib/tests/gradelib_test.php @@ -151,4 +151,70 @@ class core_gradelib_testcase extends advanced_testcase { // Now because of the failure, two things need updating. $this->assertEquals(2, $DB->count_records('grade_items', ['courseid' => $course->id, 'needsupdate' => 1])); } + + /** + * Tests for the grade_get_date_for_user_grade function. + * + * @dataProvider grade_get_date_for_user_grade_provider + * @param stdClass $grade + * @param stdClass $user + * @param int $expected + */ + public function test_grade_get_date_for_user_grade(stdClass $grade, stdClass $user, int $expected): void { + $this->assertEquals($expected, grade_get_date_for_user_grade($grade, $user)); + } + + /** + * Data provider for tests of the grade_get_date_for_user_grade function. + * + * @return array + */ + public function grade_get_date_for_user_grade_provider(): array { + $u1 = (object) [ + 'id' => 42, + ]; + $u2 = (object) [ + 'id' => 930, + ]; + + $d1 = 1234567890; + $d2 = 9876543210; + + $g1 = (object) [ + 'usermodified' => $u1->id, + 'dategraded' => $d1, + 'datesubmitted' => $d2, + ]; + $g2 = (object) [ + 'usermodified' => $u1->id, + 'dategraded' => $d1, + 'datesubmitted' => 0, + ]; + + return [ + 'If the user is the last person to have modified the grade_item then show the date that it was graded' => [ + $g1, + $u1, + $d1, + ], + 'If the user is not the last person to have modified the grade_item, ' . + 'and there is no submission date, then show the date that it was submitted' => [ + $g1, + $u2, + $d2, + ], + 'If the user is not the last person to have modified the grade_item, ' . + 'but there is no submission date, then show the date that it was graded' => [ + $g2, + $u2, + $d1, + ], + 'If the user is the last person to have modified the grade_item, ' . + 'and there is no submission date, then still show the date that it was graded' => [ + $g2, + $u1, + $d1, + ], + ]; + } } diff --git a/mod/data/lib.php b/mod/data/lib.php index 4da9e62aa4f..d1405936663 100644 --- a/mod/data/lib.php +++ b/mod/data/lib.php @@ -1201,22 +1201,15 @@ function data_user_outline($course, $user, $mod, $data) { } return $result; } else if ($grade) { - $result = new stdClass(); + $result = (object) [ + 'time' => grade_get_date_for_user_grade($grade, $user), + ]; if (!$grade->hidden || has_capability('moodle/grade:viewhidden', context_course::instance($course->id))) { $result->info = get_string('grade') . ': ' . $grade->str_long_grade; } else { $result->info = get_string('grade') . ': ' . get_string('hidden', 'grades'); } - //datesubmitted == time created. dategraded == time modified or time overridden - //if grade was last modified by the user themselves use date graded. Otherwise use date submitted - //TODO: move this copied & pasted code somewhere in the grades API. See MDL-26704 - if ($grade->usermodified == $user->id || empty($grade->datesubmitted)) { - $result->time = $grade->dategraded; - } else { - $result->time = $grade->datesubmitted; - } - return $result; } return NULL; diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 62f242353a3..cb996933dbf 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -463,22 +463,15 @@ function forum_user_outline($course, $user, $mod, $forum) { } return $result; } else if ($grade) { - $result = new stdClass(); + $result = (object) [ + 'time' => grade_get_date_for_user_grade($grade, $user), + ]; if (!$grade->hidden || has_capability('moodle/grade:viewhidden', context_course::instance($course->id))) { $result->info = get_string('grade') . ': ' . $grade->str_long_grade; } else { $result->info = get_string('grade') . ': ' . get_string('hidden', 'grades'); } - //datesubmitted == time created. dategraded == time modified or time overridden - //if grade was last modified by the user themselves use date graded. Otherwise use date submitted - //TODO: move this copied & pasted code somewhere in the grades API. See MDL-26704 - if ($grade->usermodified == $user->id || empty($grade->datesubmitted)) { - $result->time = $grade->dategraded; - } else { - $result->time = $grade->datesubmitted; - } - return $result; } return NULL; diff --git a/mod/glossary/lib.php b/mod/glossary/lib.php index 50bcddc32c5..2372c35f971 100644 --- a/mod/glossary/lib.php +++ b/mod/glossary/lib.php @@ -270,22 +270,15 @@ function glossary_user_outline($course, $user, $mod, $glossary) { } return $result; } else if ($grade) { - $result = new stdClass(); + $result = (object) [ + 'time' => grade_get_date_for_user_grade($grade, $user), + ]; if (!$grade->hidden || has_capability('moodle/grade:viewhidden', context_course::instance($course->id))) { $result->info = get_string('grade') . ': ' . $grade->str_long_grade; } else { $result->info = get_string('grade') . ': ' . get_string('hidden', 'grades'); } - //datesubmitted == time created. dategraded == time modified or time overridden - //if grade was last modified by the user themselves use date graded. Otherwise use date submitted - //TODO: move this copied & pasted code somewhere in the grades API. See MDL-26704 - if ($grade->usermodified == $user->id || empty($grade->datesubmitted)) { - $result->time = $grade->dategraded; - } else { - $result->time = $grade->datesubmitted; - } - return $result; } return NULL; diff --git a/mod/lesson/lib.php b/mod/lesson/lib.php index 5d7c13c6fb1..bda94f9efdb 100644 --- a/mod/lesson/lib.php +++ b/mod/lesson/lib.php @@ -412,14 +412,7 @@ function lesson_user_outline($course, $user, $mod, $lesson) { $return->info = get_string('grade') . ': ' . get_string('hidden', 'grades'); } - // Datesubmitted == time created. dategraded == time modified or time overridden. - // If grade was last modified by the user themselves use date graded. Otherwise use date submitted. - // TODO: move this copied & pasted code somewhere in the grades API. See MDL-26704. - if ($grade->usermodified == $user->id || empty($grade->datesubmitted)) { - $return->time = $grade->dategraded; - } else { - $return->time = $grade->datesubmitted; - } + $return->time = grade_get_date_for_user_grade($grade, $user); } } return $return; diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index e707eada0f3..84e0493875d 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -503,15 +503,7 @@ function quiz_user_outline($course, $user, $mod, $quiz) { $result->info = get_string('grade') . ': ' . get_string('hidden', 'grades'); } - // Datesubmitted == time created. dategraded == time modified or time overridden - // if grade was last modified by the user themselves use date graded. Otherwise use - // date submitted. - // TODO: move this copied & pasted code somewhere in the grades API. See MDL-26704. - if ($grade->usermodified == $user->id || empty($grade->datesubmitted)) { - $result->time = $grade->dategraded; - } else { - $result->time = $grade->datesubmitted; - } + $result->time = grade_get_date_for_user_grade($grade, $user); return $result; } diff --git a/mod/scorm/lib.php b/mod/scorm/lib.php index 721dafdc62c..4efe051a512 100644 --- a/mod/scorm/lib.php +++ b/mod/scorm/lib.php @@ -354,22 +354,15 @@ function scorm_user_outline($course, $user, $mod, $scorm) { $grades = grade_get_grades($course->id, 'mod', 'scorm', $scorm->id, $user->id); if (!empty($grades->items[0]->grades)) { $grade = reset($grades->items[0]->grades); - $result = new stdClass(); + $result = (object) [ + 'time' => grade_get_date_for_user_grade($grade, $user), + ]; if (!$grade->hidden || has_capability('moodle/grade:viewhidden', context_course::instance($course->id))) { $result->info = get_string('grade') . ': '. $grade->str_long_grade; } else { $result->info = get_string('grade') . ': ' . get_string('hidden', 'grades'); } - // Datesubmitted == time created. dategraded == time modified or time overridden - // if grade was last modified by the user themselves use date graded. Otherwise use date submitted. - // TODO: move this copied & pasted code somewhere in the grades API. See MDL-26704. - if ($grade->usermodified == $user->id || empty($grade->datesubmitted)) { - $result->time = $grade->dategraded; - } else { - $result->time = $grade->datesubmitted; - } - return $result; } return null;