diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index a2dd3e4b394..bf1b7176fd9 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -2371,6 +2371,7 @@ class assign { // Submissions are included if all are true: // - The assignment is visible in the gradebook. // - No previous notification has been sent. + // - The grader was a real user, not an automated process. // - If marking workflow is not enabled, the grade was updated in the past 24 hours, or // if marking workflow is enabled, the workflow state is at 'released'. $sql = "SELECT g.id as gradeid, a.course, a.name, a.blindmarking, a.revealidentities, @@ -2384,7 +2385,7 @@ class assign { LEFT JOIN {assign_user_mapping} um ON g.id = um.userid AND um.assignment = a.id WHERE ((a.markingworkflow = 0 AND g.timemodified >= :yesterday AND g.timemodified <= :today) OR (a.markingworkflow = 1 AND uf.workflowstate = :wfreleased)) AND - uf.mailed = 0 AND gri.hidden = 0 + g.grader > 0 AND uf.mailed = 0 AND gri.hidden = 0 ORDER BY a.course, cm.id"; $params = array( @@ -3714,7 +3715,8 @@ class assign { $grade->timemodified = $grade->timecreated; } $grade->grade = -1; - $grade->grader = $USER->id; + // Do not set the grader id here as it would be the admin users which is incorrect. + $grade->grader = -1; if ($attemptnumber >= 0) { $grade->attemptnumber = $attemptnumber; } @@ -5100,8 +5102,10 @@ class assign { $gradefordisplay = $this->display_grade($gradebookgrade->grade, false); } $gradeddate = $gradebookgrade->dategraded; - if (isset($grade->grader)) { + if (isset($grade->grader) && $grade->grader > 0) { $grader = $DB->get_record('user', array('id' => $grade->grader)); + } else if (isset($gradebookgrade->usermodified) && $gradebookgrade->usermodified > 0) { + $grader = $DB->get_record('user', array('id' => $gradebookgrade->usermodified)); } } @@ -5262,10 +5266,12 @@ class assign { // First lookup the grader info. if (isset($gradercache[$grade->grader])) { $grade->grader = $gradercache[$grade->grader]; - } else { + } else if ($grade->grader > 0) { // Not in cache - need to load the grader record. $grade->grader = $DB->get_record('user', array('id'=>$grade->grader)); - $gradercache[$grade->grader->id] = $grade->grader; + if ($grade->grader) { + $gradercache[$grade->grader->id] = $grade->grader; + } } // Now get the gradefordisplay. diff --git a/mod/assign/tests/locallib_test.php b/mod/assign/tests/locallib_test.php index d4b17e9a7b8..13e0bd6c552 100644 --- a/mod/assign/tests/locallib_test.php +++ b/mod/assign/tests/locallib_test.php @@ -3887,6 +3887,7 @@ Anchor link 2:Link text $assign->get_user_grade($student->id, true); // Set the grade to something errant. + // We don't set the grader here, so we expect it to be -1 as a result. $DB->set_field( 'assign_grades', 'grade', @@ -3904,6 +3905,7 @@ Anchor link 2:Link text // Check that the gradebook was updated with the assign grade. So we can guarentee test results later on. $expectedgrade = $grade == -1 ? null : $grade; // Assign sends null to the gradebook for -1 grades. $gradegrade = grade_grade::fetch(array('userid' => $student->id, 'itemid' => $assign->get_grade_item()->id)); + $this->assertEquals(-1, $gradegrade->usermodified); $this->assertEquals($expectedgrade, $gradegrade->rawgrade); // Call fix_null_grades(). @@ -3915,6 +3917,9 @@ Anchor link 2:Link text $gradegrade = grade_grade::fetch(array('userid' => $student->id, 'itemid' => $assign->get_grade_item()->id)); + $this->assertEquals(-1, $gradegrade->usermodified); + $this->assertEquals($gradebookvalue, $gradegrade->finalgrade); + // Check that the grade was updated in the gradebook by fix_null_grades. $this->assertEquals($gradebookvalue, $gradegrade->finalgrade); }