Index: grade_item.php
===================================================================
RCS file: /cvsroot/moodle/moodle/lib/grade/grade_item.php,v
retrieving revision 1.130.2.27
diff -c -r1.130.2.27 grade_item.php
*** grade_item.php      13 Oct 2008 07:05:40 -0000      1.130.2.27
--- grade_item.php      21 Oct 2008 10:04:34 -0000
***************
*** 1613,1618 ****
--- 1613,1643 ----
          }

          // precreate grades - we need them to exist
+
+         if (strpos($CFG->gradebookroles, ',') === false) {
+             $gradebookroles = " = {$CFG->gradebookroles}";
+         } else {
+             $gradebookroles = " IN ({$CFG->gradebookroles})";
+         }
+
+         $relatedcontexts = get_related_contexts_string(get_context_instance(CONTEXT_COURSE, $this->courseid));
+
+       $users_sql = "SELECT u.id
+                   FROM {$CFG->prefix}user u
+                       INNER JOIN {$CFG->prefix}role_assignments ra ON u.id = ra.userid
+                   WHERE ra.roleid $gradebookroles
+                       AND ra.contextid $relatedcontexts";
+         $courseusers = get_recordset_sql($users_sql);
+
+         $users = '';
+         if ($courseusers) {
+            $user = rs_fetch_next_record($courseusers);
+            $users = $user->id;
+            while ($user = rs_fetch_next_record($courseusers)) {
+                $users .= ' ,'.$user->id;
+            }
+         }
+
          $sql = "SELECT DISTINCT go.userid
                    FROM {$CFG->prefix}grade_grades go
                         JOIN {$CFG->prefix}grade_items gi
***************
*** 1620,1625 ****
--- 1645,1654 ----
                         LEFT OUTER JOIN {$CFG->prefix}grade_grades g
                         ON (g.userid = go.userid AND g.itemid = $this->id)
                   WHERE gi.id <> $this->id AND g.id IS NULL";
+          if (!empty($users)) {
+             $sql .= " AND go.userid in (".$users.")";
+          }
+
          if ($missing = get_records_sql($sql)) {
              foreach ($missing as $m) {
                  $grade = new grade_grade(array('itemid'=>$this->id, 'userid'=>$m->userid), false);