diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 46aa8033c7d..57113820c51 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -1670,16 +1670,27 @@ class grade_item extends grade_object { return true; // no need to recalculate locked items } - // precreate grades - we need them to exist - $params = array($this->courseid, $this->id, $this->id); - $sql = "SELECT DISTINCT go.userid - FROM {grade_grades} go - JOIN {grade_items} gi - ON (gi.id = go.itemid AND gi.courseid = ?) - LEFT OUTER JOIN {grade_grades} g - ON (g.userid = go.userid AND g.itemid = ?) - WHERE gi.id <> ? AND g.id IS NULL"; - if ($missing = $DB->get_records_sql($sql, $params)) { + // Precreate grades - we need them to exist + if ($userid) { + $missing = array(); + if (!$DB->record_exists('grade_grades', array('itemid'=>$this->id, 'userid'=>$userid))) { + $m = new stdClass(); + $m->userid = $userid; + $missing[] = $m; + } + } else { + // Find any users who have grades for some but not all grade items in this course + $params = array('gicourseid' => $this->courseid, 'ggitemid' => $this->id); + $sql = "SELECT gg.userid + FROM {grade_grades} gg + JOIN {grade_items} gi + ON (gi.id = gg.itemid AND gi.courseid = :gicourseid) + GROUP BY gg.userid + HAVING SUM(CASE WHEN gg.itemid = :ggitemid THEN 1 ELSE 0 END) = 0"; + $missing = $DB->get_records_sql($sql, $params); + } + + if ($missing) { foreach ($missing as $m) { $grade = new grade_grade(array('itemid'=>$this->id, 'userid'=>$m->userid), false); $grade->grade_item =& $this;