MDL-11357, MDL-11358 cleanup and improvements in public grade API - new function grade_get_grades() that returns all grading information (grade item data, outcomes and user grades); other minor improvements and bugfixes; updated assignment to use new grade API

This commit is contained in:
skodak
2007-09-22 20:21:44 +00:00
parent 9f01047ae9
commit fcac8e513a
4 changed files with 277 additions and 233 deletions
+42
View File
@@ -137,6 +137,48 @@ class grade_grade extends grade_object {
*/
var $excluded = 0;
/**
* Returns array of grades for given grade_item+users.
* @param object $grade_item
* @param array $userids
* @param bool $include_missing include grades taht do not exist yet
* @return array userid=>grade_grade array
*/
function fetch_users_grades($grade_item, $userids, $include_missing=true) {
// hmm, there might be a problem with length of sql query
// if there are too many users requested - we might run out of memory anyway
$limit = 2000;
$count = count($userids);
if ($count > $limit) {
$half = (int)($count/2);
$first = array_slice($userids, 0, $half);
$second = array_slice($userids, $half);
return grade_grade::fetch_users_grades($grade_item, $first, $include_missing) + grade_grade::fetch_users_grades($grade_item, $second, $include_missing);
}
$user_ids_cvs = implode(',', $userids);
$result = array();
if ($grade_records = get_records_select('grade_grades', "itemid={$grade_item->id} AND userid IN ($user_ids_cvs)")) {
foreach ($grade_records as $record) {
$result[$record->userid] = new grade_grade($record, false);
}
}
if ($include_missing) {
foreach ($userids as $userid) {
if (!array_key_exists($userid, $result)) {
$grade_grade = new grade_grade();
$grade_grade->userid = $userid;
$grade_grade->itemid = $grade_item->id;
$result[$userid] = $grade_grade;
}
}
}
return $result;
}
/**
* Loads the grade_item object referenced by $this->itemid and saves it as $this->grade_item for easy access.
* @return object grade_item.
+182 -165
View File
@@ -49,6 +49,8 @@ require_once($CFG->libdir . '/grade/grade_outcome.php');
* Only following grade item properties can be changed 'itemname', 'idnumber', 'gradetype', 'grademax',
* 'grademin', 'scaleid', 'multfactor', 'plusfactor', 'deleted'.
*
* Manual, course or category items can not be updated by this function.
* @param string $source source of the grade such as 'mod/assignment'
* @param int $courseid id of course
* @param string $itemtype type of grade item - mod, block
@@ -217,104 +219,16 @@ function grade_update($source, $courseid, $itemtype, $itemmodule, $iteminstance,
}
}
/**
* Tells a module whether a grade (or grade_item if $userid is not given) is currently locked or not.
* If it's locked to the current user then the module can print a nice message or prevent editing in the module.
* If no $userid is given, the method will always return the grade_item's locked state.
* If a $userid is given, the method will first check the grade_item's locked state (the column). If it is locked,
* the method will return true no matter the locked state of the specific grade being checked. If unlocked, it will
* return the locked state of the specific grade.
*
* @param int $courseid id of course
* @param string $itemtype 'mod', 'block'
* @param string $itemmodule 'forum, 'quiz', etc.
* @param int $iteminstance id of the item module
* @param int $itemnumber most probably 0, modules can use other numbers when having more than one grades for each user
* @param int $userid ID of the graded user
* @return boolean Whether the grade is locked or not
*/
function grade_is_locked($courseid, $itemtype, $itemmodule, $iteminstance, $itemnumber, $userid=NULL) {
if (!$grade_items = grade_item::fetch_all(compact('courseid', 'itemtype', 'itemmodule', 'iteminstance', 'itemnumber'))) {
return false;
} else if (count($grade_items) == 1){
$grade_item = reset($grade_items);
return $grade_item->is_locked($userid);
} else {
debugging('Found more than one grade item');
foreach ($grade_items as $grade_item) {
if ($grade_item->is_locked($userid)) {
return true;
}
}
return false;
}
}
/**
* Returns list of outcomes used in activity together with current outcomes for user
* @param int $courseid id of course
* @param string $itemtype 'mod', 'block'
* @param string $itemmodule 'forum, 'quiz', etc.
* @param int $iteminstance id of the item module
* @param int $userid optional id of the graded user
* @return array of outcome information objects (scaleid, name, grade and locked status) indexed with itemnumbers
*/
function grade_get_outcomes($courseid, $itemtype, $itemmodule, $iteminstance, $userid=0) {
$result = array();
$course_item = grade_item::fetch_course_item($courseid);
$needsupdate = $course_item->needsupdate;
if ($items = grade_item::fetch_all(array('itemtype'=>$itemtype, 'itemmodule'=>$itemmodule, 'iteminstance'=>$iteminstance, 'courseid'=>$courseid))) {
foreach ($items as $item) {
if (empty($item->outcomeid)) {
continue;
}
if (!$outcome = grade_outcome::fetch(array('id'=>$item->outcomeid))) {
debugging('Incorect outcomeid found');
continue;
}
// prepare outcome info with user grade
$o = new object();
$o->scaleid = $outcome->scaleid;
$o->name = $outcome->get_name();
if (empty($userid)) {
//no user info
} if ($grade = $item->get_grade($userid,false)) {
$o->grade = $grade->finalgrade;
$o->locked = $grade->is_locked();
$o->hidden = $grade->is_hidden();
} else {
$o->grade = null;
$o->locked = $item->is_locked();
$o->hidden = $grade->is_hidden();
}
if ($needsupdate) {
$o->grade = false;
} else {
$o->grade = intval($o->grade); // 0 means no grade, int for scales
}
$result[$item->itemnumber] = $o;
}
}
return $result;
}
/**
* Updates outcomes of user
* Manual outcomes can not be updated.
* @param string $source source of the grade such as 'mod/assignment'
* @param int $courseid id of course
* @param string $itemtype 'mod', 'block'
* @param string $itemmodule 'forum, 'quiz', etc.
* @param int $iteminstance id of the item module
* @param int $userid ID of the graded user
* @param array $data array itemnumber=>outcomegrade
*/
function grade_update_outcomes($source, $courseid, $itemtype, $itemmodule, $iteminstance, $userid, $data) {
if ($items = grade_item::fetch_all(array('itemtype'=>$itemtype, 'itemmodule'=>$itemmodule, 'iteminstance'=>$iteminstance, 'courseid'=>$courseid))) {
@@ -329,7 +243,8 @@ function grade_update_outcomes($source, $courseid, $itemtype, $itemmodule, $item
}
/**
* Returns list of grades used in activity optionally with current grades of one user
* Returns grading information for given activity - optionally with users grades
* Manual, course or category items can not be queried.
* @param int $courseid id of course
* @param string $itemtype 'mod', 'block'
* @param string $itemmodule 'forum, 'quiz', etc.
@@ -337,82 +252,181 @@ function grade_update_outcomes($source, $courseid, $itemtype, $itemmodule, $item
* @param int $userid optional id of the graded user; if userid not used, returns only information about grade_item
* @return array of grade information objects (scaleid, name, grade and locked status, etc.) indexed with itemnumbers
*/
function grade_get_final_grades($courseid, $itemtype, $itemmodule, $iteminstance, $userid=0) {
$result = array();
function grade_get_grades($courseid, $itemtype, $itemmodule, $iteminstance, $userid_or_ids=0) {
$return = new object();
$return->items = array();
$return->outcomes = array();
$course_item = grade_item::fetch_course_item($courseid);
$needsupdate = $course_item->needsupdate;
if ($items = grade_item::fetch_all(array('itemtype'=>$itemtype, 'itemmodule'=>$itemmodule, 'iteminstance'=>$iteminstance, 'courseid'=>$courseid))) {
foreach ($items as $item) {
if (!empty($item->outcomeid)) {
continue;
}
// prepare grade info with user grade
$o = new object();
$o->scaleid = $item->scaleid;
$o->name = $item->get_name();
$o->grademin = $item->grademin;
$o->grademax = $item->grademax;
$o->gradepass = $item->gadepass;
if (empty($userid)) {
//no user info
} if ($grade = $item->get_grade($userid, false)) {
$o->grade = $grade->finalgrade;
$o->locked = $grade->is_locked();
$o->hidden = $grade->is_hidden();
$o->overridden = $grade->overridden;
$o->feedback = $text->feedback;
$o->feedbackformat = $text->feedbackformat;
} else {
$o->grade = null;
$o->locked = $item->is_locked();
$o->hidden = $grade->is_hidden();
$o->overridden = 0;
$o->feedback = null;
$o->feedbackformat = FORMAT_MOODLE;
}
// create text representation of grade
if ($needsupdate) {
$o->grade = false;
$o->str_grade = get_string('error');
} else if (is_null($o->grade)) {
$o->str_grade = get_string('nograde');
} else {
switch ($item->gradetype) {
case GRADE_TYPE_VALUE:
$o->str_grade = $o->grade;
break;
case GRADE_TYPE_SCALE:
$scale = $item->load_scale();
$o->str_grade = format_string($scale[$o->grade-1]);
break;
case GRADE_TYPE_NONE:
case GRADE_TYPE_TEXT:
default:
$o->str_grade = '';
}
}
// create html representation of feedback
if (is_null($o->feedback)) {
$o->str_feedback = '';
} else {
$o->str_feedback = format_text($o->feedback, $o->feedbackformat);
}
$result[$item->itemnumber] = $o;
$needsupdate = array();
if ($course_item->needsupdate) {
$result = grade_regrade_final_grades($courseid);
if ($result !== true) {
$needsupdate = array_keys($result);
}
}
return $result;
if ($grade_items = grade_item::fetch_all(array('itemtype'=>$itemtype, 'itemmodule'=>$itemmodule, 'iteminstance'=>$iteminstance, 'courseid'=>$courseid))) {
foreach ($grade_items as $grade_item) {
if (empty($grade_item->outcomeid)) {
// prepare information about grade item
$item = new object();
$item->itemnumber = $grade_item->itemnumber;
$item->scaleid = $grade_item->scaleid;
$item->name = $grade_item->get_name();
$item->grademin = $grade_item->grademin;
$item->grademax = $grade_item->grademax;
$item->gradepass = $grade_item->gradepass;
$item->locked = $grade_item->is_locked();
$item->hidden = $grade_item->is_hidden();
$item->grades = array();
switch ($grade_item->gradetype) {
case GRADE_TYPE_NONE:
continue;
case GRADE_TYPE_VALUE:
$item->scaleid = 0;
break;
case GRADE_TYPE_TEXT:
$item->scaleid = 0;
$item->grademin = 0;
$item->grademax = 0;
$item->gradepass = 0;
break;
}
if (empty($userid_or_ids)) {
$userids = array();
} else if (is_array($userid_or_ids)) {
$userids = $userid_or_ids;
} else {
$userids = array($userid_or_ids);
}
if ($userids) {
$grade_grades = grade_grade::fetch_users_grades($grade_item, $userids, true);
foreach ($userids as $userid) {
$grade_grades[$userid]->grade_item =& $grade_item;
$grade = new object();
$grade->grade = $grade_grades[$userid]->finalgrade;
$grade->locked = $grade_grades[$userid]->is_locked();
$grade->hidden = $grade_grades[$userid]->is_hidden();
$grade->overridden = $grade_grades[$userid]->overridden;
$grade->feedback = $grade_grades[$userid]->feedback;
$grade->feedbackformat = $grade_grades[$userid]->feedbackformat;
// create text representation of grade
if (in_array($grade_item->id, $needsupdate)) {
$grade->grade = false;
$grade->str_grade = get_string('error');
} else if (is_null($grade->grade)) {
$grade->str_grade = get_string('nograde');
} else {
switch ($grade_item->gradetype) {
case GRADE_TYPE_VALUE:
$grade->str_grade = $grade->grade; //TODO: fix localisation and decimal places
break;
case GRADE_TYPE_SCALE:
$scale = $grade_item->load_scale();
$grade->str_grade = format_string($scale->scale_items[$grade->grade-1]);
break;
case GRADE_TYPE_TEXT:
default:
$grade->str_grade = '';
}
}
// create html representation of feedback
if (is_null($grade->feedback)) {
$grade->str_feedback = '';
} else {
$grade->str_feedback = format_text($grade->feedback, $grade->feedbackformat);
}
$item->grades[$userid] = $grade;
}
}
$return->items[$grade_item->itemnumber] = $item;
} else {
if (!$grade_outcome = grade_outcome::fetch(array('id'=>$grade_item->outcomeid))) {
debugging('Incorect outcomeid found');
continue;
}
// outcome info
$outcome = new object();
$outcome->itemnumber = $grade_item->itemnumber;
$outcome->scaleid = $grade_outcome->scaleid;
$outcome->name = $grade_outcome->get_name();
$outcome->locked = $grade_item->is_locked();
$outcome->hidden = $grade_item->is_hidden();
if (empty($userid_or_ids)) {
$userids = array();
} else if (is_array($userid_or_ids)) {
$userids = $userid_or_ids;
} else {
$userids = array($userid_or_ids);
}
if ($userids) {
$grade_grades = grade_grade::fetch_users_grades($grade_item, $userids, true);
foreach ($userids as $userid) {
$grade_grades[$userid]->grade_item =& $grade_item;
$grade = new object();
$grade->grade = $grade_grades[$userid]->finalgrade;
$grade->locked = $grade_grades[$userid]->is_locked();
$grade->hidden = $grade_grades[$userid]->is_hidden();
$grade->feedback = $grade_grades[$userid]->feedback;
$grade->feedbackformat = $grade_grades[$userid]->feedbackformat;
// create text representation of grade
if (in_array($grade_item->id, $needsupdate)) {
$grade->grade = false;
$grade->str_grade = get_string('error');
} else if (is_null($grade->grade)) {
$grade->grade = 0;
$grade->str_grade = get_string('nooutcome', 'grades');
} else {
$grade->grade = (int)$grade->grade;
$scale = $grade_item->load_scale();
$grade->str_grade = format_string($scale->scale_items[(int)$grade->grade-1]);
}
// create html representation of feedback
if (is_null($grade->feedback)) {
$grade->str_feedback = '';
} else {
$grade->str_feedback = format_text($grade->feedback, $grade->feedbackformat);
}
$outcome->grades[$userid] = $grade;
}
}
$return->outcomes[$grade_item->itemnumber] = $outcome;
}
}
}
// sort results using itemnumbers
ksort($return->items, SORT_NUMERIC);
ksort($return->outcomes, SORT_NUMERIC);
return $return;
}
/***** END OF PUBLIC API *****/
@@ -891,7 +905,10 @@ function grade_cron() {
rs_close($rs);
}
$sql = "SELECT g.*
$grade_inst = new grade_grade();
$fields = 'g.'.implode(',g.', $grade_inst->required_fields);
$sql = "SELECT $fields
FROM {$CFG->prefix}grade_grades g, {$CFG->prefix}grade_items i
WHERE g.locked = 0 AND g.locktime > 0 AND g.locktime < $now AND g.itemid=i.id AND EXISTS (
SELECT 'x' FROM {$CFG->prefix}grade_items c WHERE c.itemtype='course' AND c.needsupdate=0 AND c.courseid=i.courseid)";
+2 -5
View File
@@ -38,11 +38,8 @@ if (!defined('MOODLE_INTERNAL')) {
require_once($CFG->libdir.'/simpletest/fixtures/gradetest.php');
class gradelib_test extends grade_test {
function test_grade_is_locked() {
$grade_item = $this->grade_items[0];
$this->assertFalse(grade_is_locked($grade_item->courseid, $grade_item->itemtype, $grade_item->itemmodule, $grade_item->iteminstance, $grade_item->itemnumber));
$grade_item = $this->grade_items[6];
$this->assertTrue(grade_is_locked($grade_item->courseid, $grade_item->itemtype, $grade_item->itemmodule, $grade_item->iteminstance, $grade_item->itemnumber));
function test_grade_get_grades() {
//TODO
}
}
+51 -63
View File
@@ -33,7 +33,6 @@ class assignment_base {
var $usehtmleditor;
var $defaultformat;
var $context;
var $lockedgrades;
/**
* Constructor for the base assignment class
@@ -79,9 +78,6 @@ class assignment_base {
$this->assignment->cmidnumber = $this->cm->id; // compatibility with modedit assignment obj
$this->assignment->courseid = $this->course->id; // compatibility with modedit assignment obj
require_once($CFG->libdir.'/gradelib.php');
$this->lockedgrades = grade_is_locked($this->course->id, 'mod', 'assignment', $this->assignment->id, 0);
$this->strassignment = get_string('modulename', 'assignment');
$this->strassignments = get_string('modulenameplural', 'assignment');
$this->strsubmissions = get_string('submissions', 'assignment');
@@ -497,11 +493,6 @@ class assignment_base {
//make user global so we can use the id
global $USER;
// no grading when grades are locked
if ($this->lockedgrades) {
$mode = 'all';
}
switch ($mode) {
case 'grade': // We are in a popup window grading
if ($submission = $this->process_feedback()) {
@@ -694,20 +685,22 @@ class assignment_base {
}
if (!empty($CFG->enableoutcomes) and empty($SESSION->flextable['mod-assignment-submissions']->collapse['outcomes'])) {
if ($outcomes_data = grade_get_outcomes($this->course->id, 'mod', 'assignment', $this->assignment->id, $submission->userid)) {
foreach($outcomes_data as $n=>$data) {
$grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, $submission->userid);
if (!empty($grading_info->outcomes)) {
foreach($grading_info->outcomes as $n=>$outcome) {
if ($data->locked) {
continue;
}
if ($quickgrade){
$output.= 'opener.document.getElementById("outcome_'.$n.'_'.$submission->userid.
'").selectedIndex="'.$data->grade.'";'."\n";
} else {
$options = make_grades_menu(-$data->scaleid);
$options[0] = get_string('nooutcome', 'grades');
$output.= 'opener.document.getElementById("outcome_'.$n.'_'.$submission->userid.'").innerHTML="'.$options[$data->grade]."\";\n";
'").selectedIndex="'.$outcome->grades[$submission->userid]->grade.'";'."\n";
} else {
$options = make_grades_menu(-$outcome->scaleid);
$options[0] = get_string('nooutcome', 'grades');
$output.= 'opener.document.getElementById("outcome_'.$n.'_'.$submission->userid.'").innerHTML="'.$options[$outcome->grades[$submission->userid]->grade]."\";\n";
}
}
@@ -876,15 +869,16 @@ class assignment_base {
echo '<div class="clearer"></div>';
if (!empty($CFG->enableoutcomes) and $outcomes_data = grade_get_outcomes($this->course->id, 'mod', 'assignment', $this->assignment->id, $userid)) {
foreach($outcomes_data as $n=>$data) {
echo '<div class="outcome"><label for="menuoutcome_'.$n.'">'.$data->name.'</label> ';
$options = make_grades_menu(-$data->scaleid);
if ($data->locked) {
if (!empty($CFG->enableoutcomes)) {
$grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, $submission->userid);
foreach($grading_info->outcomes as $n=>$outcome) {
echo '<div class="outcome"><label for="menuoutcome_'.$n.'">'.$outcome->name.'</label> ';
$options = make_grades_menu(-$outcome->scaleid);
if ($outcome->grades[$submission->userid]->locked) {
$options[0] = get_string('nooutcome', 'grades');
echo $options[$data->grade];
echo $options[$outcome->grades[$submission->userid]->grade];
} else {
choose_from_menu($options, 'outcome_'.$n.'['.$userid.']', $data->grade, get_string('nooutcome', 'grades'), '', 0, false, false, 0, 'menuoutcome_'.$n);
choose_from_menu($options, 'outcome_'.$n.'['.$userid.']', $outcome->grades[$submission->userid]->grade, get_string('nooutcome', 'grades'), '', 0, false, false, 0, 'menuoutcome_'.$n);
}
echo '</div>';
echo '<div class="clearer"></div>';
@@ -985,13 +979,11 @@ class assignment_base {
*/
$perpage = get_user_preferences('assignment_perpage', 10);
if ($this->lockedgrades) {
$quickgrade = 0;
} else {
$quickgrade = get_user_preferences('assignment_quickgrade', 0);
}
$quickgrade = get_user_preferences('assignment_quickgrade', 0);
if (!empty($CFG->enableoutcomes) and grade_get_outcomes($this->course->id, 'mod', 'assignment', $this->assignment->id)) {
$grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id);
if (!empty($CFG->enableoutcomes) and !empty($grading_info->outcomes)) {
$uses_outcomes = true;
} else {
$uses_outcomes = false;
@@ -1139,7 +1131,7 @@ class assignment_base {
$grademenu = make_grades_menu($this->assignment->grade);
if (($ausers = get_records_sql($select.$sql.$sort, $table->get_page_start(), $table->get_page_size())) !== false) {
$grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, array_keys($ausers));
foreach ($ausers as $auser) {
/// Calculate user status
$auser->status = ($auser->timemarked > 0) && ($auser->timemarked >= $auser->timemodified);
@@ -1222,33 +1214,29 @@ class assignment_base {
$buttontext = ($auser->status == 1) ? $strupdate : $strgrade;
if ($this->lockedgrades) {
$status = get_string('gradeitemlocked', 'grades');
} else {
///No more buttons, we use popups ;-).
$popup_url = '/mod/assignment/submissions.php?id='.$this->cm->id
. '&amp;userid='.$auser->id.'&amp;mode=single'.'&amp;offset='.$offset++;
$button = link_to_popup_window ($popup_url, 'grade'.$auser->id, $buttontext, 600, 780,
$buttontext, 'none', true, 'button'.$auser->id);
///No more buttons, we use popups ;-).
$popup_url = '/mod/assignment/submissions.php?id='.$this->cm->id
. '&amp;userid='.$auser->id.'&amp;mode=single'.'&amp;offset='.$offset++;
$button = link_to_popup_window ($popup_url, 'grade'.$auser->id, $buttontext, 600, 780,
$buttontext, 'none', true, 'button'.$auser->id);
$status = '<div id="up'.$auser->id.'" class="s'.$auser->status.'">'.$button.'</div>';
}
$status = '<div id="up'.$auser->id.'" class="s'.$auser->status.'">'.$button.'</div>';
$outcomes = '';
if ($uses_outcomes and $outcomes_data = grade_get_outcomes($this->course->id, 'mod', 'assignment', $this->assignment->id, $auser->id)) {
if ($uses_outcomes) {
foreach($outcomes_data as $n=>$data) {
$outcomes .= '<div class="outcome"><label>'.$data->name.'</label>';
$options = make_grades_menu(-$data->scaleid);
foreach($grading_info->outcomes as $n=>$outcome) {
$outcomes .= '<div class="outcome"><label>'.$outcome->name.'</label>';
$options = make_grades_menu(-$outcome->scaleid);
if ($data->locked or !$quickgrade) {
if ($outcome->grades[$auser->id]->locked or !$quickgrade) {
$options[0] = get_string('nooutcome', 'grades');
$outcomes .= ': <span id="outcome_'.$n.'_'.$auser->id.'">'.$options[$data->grade].'</span>';
$outcomes .= ': <span id="outcome_'.$n.'_'.$auser->id.'">'.$options[$outcome->grades[$auser->id]->grade].'</span>';
} else {
$outcomes .= ' ';
$outcomes .= choose_from_menu($options, 'outcome_'.$n.'['.$auser->id.']',
$data->grade, get_string('nooutcome', 'grades'), '', 0, true, false, 0, 'outcome_'.$n.'_'.$auser->id);
$outcome->grades[$auser->id]->grade, get_string('nooutcome', 'grades'), '', 0, true, false, 0, 'outcome_'.$n.'_'.$auser->id);
}
$outcomes .= '</div>';
}
@@ -1296,20 +1284,18 @@ class assignment_base {
echo '<input type="text" id="perpage" name="perpage" size="1" value="'.$perpage.'" />';
helpbutton('pagesize', get_string('pagesize','assignment'), 'assignment');
echo '</td></tr>';
if (!$this->lockedgrades) {
echo '<tr align="right">';
echo '<td>';
print_string('quickgrade','assignment');
echo ':</td>';
echo '<td align="left">';
if ($quickgrade){
echo '<input type="checkbox" name="quickgrade" value="1" checked="checked" />';
} else {
echo '<input type="checkbox" name="quickgrade" value="1" />';
}
helpbutton('quickgrade', get_string('quickgrade', 'assignment'), 'assignment').'</p></div>';
echo '</td></tr>';
echo '<tr align="right">';
echo '<td>';
print_string('quickgrade','assignment');
echo ':</td>';
echo '<td align="left">';
if ($quickgrade){
echo '<input type="checkbox" name="quickgrade" value="1" checked="checked" />';
} else {
echo '<input type="checkbox" name="quickgrade" value="1" />';
}
helpbutton('quickgrade', get_string('quickgrade', 'assignment'), 'assignment').'</p></div>';
echo '</td></tr>';
echo '<tr>';
echo '<td colspan="2" align="right">';
echo '<input type="submit" value="'.get_string('savepreferences').'" />';
@@ -1393,10 +1379,12 @@ class assignment_base {
}
$data = array();
if ($outcomes = grade_get_outcomes($this->course->id, 'mod', 'assignment', $this->assignment->id, $userid)) {
foreach($outcomes as $n=>$old) {
$grading_info = grade_get_grades($this->course->id, 'mod', 'assignment', $this->assignment->id, $userid);
if (!empty($grading_info->outcomes)) {
foreach($grading_info->outcomes as $n=>$old) {
$name = 'outcome_'.$n;
if (isset($formdata->{$name}[$userid]) and $old->grade != $formdata->{$name}[$userid]) {
if (isset($formdata->{$name}[$userid]) and $old->grades[$userid]->grade != $formdata->{$name}[$userid]) {
$data[$n] = $formdata->{$name}[$userid];
}
}