* @param mixed $feedback teachers feedback as string - false means do not change
* @param int $feedbackformat
* @return boolean success
- * TODO Allow for a change of feedback without a change of finalgrade. Currently I get notice about uninitialised $result
*/
function update_final_grade($userid, $finalgrade=false, $source=NULL, $note=NULL, $feedback=false, $feedbackformat=FORMAT_MOODLE, $usermodified=null) {
global $USER, $CFG;
$usermodified = $USER->id;
}
+ $result = true;
+
// no grading used or locked
if ($this->gradetype == GRADE_TYPE_NONE or $this->is_locked()) {
return false;
$locktime = $grade->get_locktime();
if ($locktime and $locktime < time()) {
- // do not update grades that should be already locked and force regrade
+ // do not update grades that should be already locked, force regrade instead
$this->force_regrading();
return false;
}
$oldgrade = new object();
$oldgrade->finalgrade = $grade->finalgrade;
- $oldgrade->rawgrade = $grade->rawgrade;
- $oldgrade->rawgrademin = $grade->rawgrademin;
- $oldgrade->rawgrademax = $grade->rawgrademax;
- $oldgrade->rawscaleid = $grade->rawscaleid;
$oldgrade->overridden = $grade->overridden;
- $override = false;
- $functionname = null;
-
if ($finalgrade !== false or $feedback !== false) {
if (($this->is_outcome_item() or $this->is_manual_item()) and !$this->is_calculated()) {
// final grades updated only by user - no need for overriding
-
- } else if ($this->itemtype == 'mod' and $this->plusfactor == 0 and $this->multfactor == 1) {
- // do not override grade if module can update own raw grade
- require_once($CFG->dirroot.'/mod/'.$this->itemmodule.'/lib.php');
- $functionname = $this->itemmodule.'_grade_updated';
- if (!function_exists($functionname)) {
- $override = true;
- $functionname = null;
- }
+ $grade->overridden = 0;
} else {
- $override = true;
+ if (!$grade->overridden) {
+ $grade->overridden = time();
+ }
}
}
$finalgrade = $finalgrade;
}
$grade->finalgrade = $finalgrade;
-
- if ($override) {
- if (!$grade->overridden) {
- $grade->overridden = time();
- }
-
- } else if ($this->is_raw_used()) {
- // module which is not overridden - no factors used
- $grade->rawgrade = $finalgrade;
- // copy current grademin/max and scale
- $grade->rawgrademin = $this->grademin;
- $grade->rawgrademax = $this->grademax;
- $grade->rawscaleid = $this->scaleid;
- }
}
if (empty($grade->id)) {
$result = (boolean)$grade->insert($source);
- } else if ($grade->finalgrade !== $oldgrade->finalgrade
- or $grade->rawgrade !== $oldgrade->rawgrade
- or $grade->rawgrademin !== $oldgrade->rawgrademin
- or $grade->rawgrademax !== $oldgrade->rawgrademax
- or $grade->rawscaleid !== $oldgrade->rawscaleid
- or $grade->overridden !== $oldgrade->overridden) {
-
+ } else if ($grade->finalgrade !== $oldgrade->finalgrade or $grade->overridden !== $oldgrade->overridden) {
$result = $grade->update($source);
-
- } else {
- $result = true;
}
// do we have comment from teacher?
$result = $grade->update_feedback($feedback, $feedbackformat, $usermodified);
}
- if ($this->is_course_item() and !$this->needsupdate) {
+ if (!$result) {
+ // something went wrong - better force final grade recalculation
+ $this->force_regrading();
+
+ } else if ($this->is_course_item() and !$this->needsupdate) {
if (!grade_regrade_final_grades($this->courseid, $userid, $this)) {
$this->force_regrading();
}
}
}
- // inform modules, etc. if needed
- if ($result and $functionname) {
- $functionname($this->iteminstance, $this->itemnumber, $userid, $finalgrade, $feedback, $feedbackformat, $usermodified);
- }
-
return $result;
}
return grade_update('mod/assignment', $assignment->courseid, 'mod', 'assignment', $assignment->id, 0, NULL, array('deleted'=>1));
}
-/**
- * Gradebook informs this module about new grade or feedback.
- *
- */
-function assignment_grade_updated($instance, $itemnumber, $userid, $gradevalue, $feedback, $feedbackformat, $usermodified) {
- global $CFG, $USER;
-
- if (!$assignment = get_record('assignment', 'id', $instance)) {
- return true;
- }
- if (! $course = get_record('course', 'id', $assignment->course)) {
- return true;
- }
- if (! $cm = get_coursemodule_from_instance('assignment', $assignment->id, $course->id)) {
- return true;
- }
-
- // Load up the required assignment class
- require_once($CFG->dirroot.'/mod/assignment/type/'.$assignment->assignmenttype.'/assignment.class.php');
- $assignmentclass = 'assignment_'.$assignment->assignmenttype;
- $assignmentinstance = new $assignmentclass($cm->id, $assignment, $cm, $course);
-
- $old = $assignmentinstance->get_submission($userid, true); // Get or make one
- $submission = new object();
- $submission->id = $old->id;
- $submission->userid = $old->userid;
- $submission->teacher = $usermodified;
-
- if ($gradevalue === false) {
- $submission->grade = $old->grade;
- } else if (is_null($gradevalue)) {
- $submission->grade = -1;
- } else {
- $submission->grade = (int)$gradevalue; // round it for now
- $submission->timemarked = time();
- }
-
- if ($feedback === false) {
- $submission->submissioncomment = addslashes($old->submissioncomment);
- $submission->format = $old->format;
- } else {
- $submission->submissioncomment = addslashes($feedback);
- $submission->format = (int)$feedbackformat;
- }
-
- if ($old->submissioncomment != $submission->submissioncomment or $old->grade != $submission->grade) {
-
- $submission->mailed = 0; // Make sure mail goes out (again, even)
-
- if (!update_record('assignment_submissions', $submission)) {
- return false;
- }
- }
-
- // TODO: add proper logging
- add_to_log($course->id, 'assignment', 'update grades',
- 'submissions.php?id='.$assignment->id.'&user='.$submission->userid, $submission->userid, $cm->id);
-
- return true;
-}
-
/**
* Returns the users with data in one assignment (students and teachers)
*