} else if ($data = $mform->get_data(false)) {
$old_grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true); //might not exist yet
+ // fix no grade for scales
+ if ($grade_item->gradetype == GRADE_TYPE_SCALE and $data->finalgrade < 1) {
+ $data->finalgrade = NULL;
+ }
+
// update final grade or feedback
$grade_item->update_final_grade($data->userid, $data->finalgrade, NULL, 'editgrade', $data->feedback, $data->feedbackformat);
}
}
- if (has_capability('moodle/grade:override', $context)) {
+ if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:override', $context)) {
// ignore overridden flag when changing final grade
if ($old_grade_grade->finalgrade == $grade_grade->finalgrade) {
if ($grade_grade->set_overridden($data->overridden) and empty($data->overridden)) {
} else if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
// scale grade
$scaleopt = array();
- $scaleopt[-1] = get_string('nograde');
+
+ if (empty($grade_item->outcomeid)) {
+ $scaleopt[-1] = get_string('nograde');
+ } else {
+ $scaleopt[-1] = get_string('nooutcome', 'grades');
+ }
$i = 1;
if ($scale = get_record('scale', 'id', $grade_item->scaleid)) {
}
if ($this->get_pref('quickgrading') and $grade->is_editable()) {
+ $oldval = empty($gradeval) ? -1 : $gradeval;
+ if (empty($item->outcomeid)) {
+ $nogradestr = $this->get_lang_string('nograde');
+ } else {
+ $nogradestr = $this->get_lang_string('nooutcome', 'grades');
+ }
$studentshtml .= '<input type="hidden" name="oldgrade_'.$userid.'_'
- .$item->id.'" value="'.$gradeval.'"/>';
+ .$item->id.'" value="'.$oldval.'"/>';
$studentshtml .= choose_from_menu($scaleopt, 'grade_'.$userid.'_'.$item->id,
- $gradeval, $this->get_lang_string('nograde'), '', '-1',
+ $gradeval, $nogradestr, '', '-1',
true, false, $tabindices[$item->id]['grade']);
} elseif(!empty($scale)) {
$scales = explode(",", $scale->scale);
return "Could not calculate grades for grade item"; // TODO: improve and localize
}
+ // noncalculated outcomes already have final values - raw grades not used
+ } else if ($this->is_outcome_item()) {
+ return true;
+
// aggregate the category grade
} else if ($this->is_category_item() or $this->is_course_item()) {
// aggregate category grade item
$grade->finalgrade = $finalgrade;
}
- // if we can update the raw grade, do update it
- if ($this->is_outcome_item() or !$this->is_normal_item()
- or $this->plusfactor != 0 or $this->multfactor != 1
- or !events_is_registered('grade_updated', $this->itemtype.'/'.$this->itemmodule)) {
+ if ($this->is_outcome_item()) {
+ // no updates of raw grades for outcomes - raw grades not used
+
+ } else if (!$this->is_normal_item() or $this->plusfactor != 0 or $this->multfactor != 1
+ or !events_is_registered('grade_updated', $this->itemtype.'/'.$this->itemmodule)) {
+ // we can not update the raw grade - flag it as overridden
if (!$grade->overridden) {
$grade->overridden = time();
}
+
} else {
$grade->rawgrade = $finalgrade;
// copy current grademin/max and scale