--- C:/Users/jmlsteele/AppData/Local/Temp/grade-revBASE.svn000.tmp.php Wed Dec 21 18:38:07 2011 +++ Z:/SVN/moodle/branches/moodle_2_2/moodle/lib/grade/grade_item.php Thu Apr 19 14:30:57 2012 @@ -1671,20 +1671,29 @@ } // 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)) { - foreach ($missing as $m) { - $grade = new grade_grade(array('itemid'=>$this->id, 'userid'=>$m->userid), false); - $grade->grade_item =& $this; - $grade->insert('system'); + static $precreate_done = array(); + if (!array_key_exists($this->id,$precreate_done)) { + $coursecontext = get_context_instance(CONTEXT_COURSE, $this->courseid); + $sql = "SELECT DISTINCT gg.userid + FROM {grade_items} gi + JOIN {grade_grades} gg ON(gi.id = gg.itemid) + WHERE gi.id = ?"; + $existing = array_keys($DB->get_records_sql($sql,array($this->id))); + + $sql = "SELECT DISTINCT userid + FROM {role_assignments} + WHERE roleid IN(?) AND contextid = ?"; + $all_students = array_keys($DB->get_records_sql($sql,array($CFG->gradebookroles,$coursecontext->id))); + + $missing = array_diff($all_students,$existing); + if ($missing) { + foreach ($missing as $m) { + $grade = new grade_grade(array('itemid'=>$this->id, 'userid'=>$m), false); + $grade->grade_item =& $this; + $grade->insert('system'); + } } + $precreate_done[$this->id] = true; } // get used items