示例#1
0
 /**
  * Update a grade in the grade table for the assignment and in the gradebook.
  *
  * @param stdClass $grade a grade record keyed on id
  * @param bool $reopenattempt If the attempt reopen method is manual, allow another attempt at this assignment.
  * @return bool true for success
  */
 public function update_grade($grade, $reopenattempt = false)
 {
     global $DB;
     $grade->timemodified = time();
     if (!empty($grade->workflowstate)) {
         $validstates = $this->get_marking_workflow_states_for_current_user();
         if (!array_key_exists($grade->workflowstate, $validstates)) {
             return false;
         }
     }
     if ($grade->grade && $grade->grade != -1) {
         if ($this->get_instance()->grade > 0) {
             if (!is_numeric($grade->grade)) {
                 return false;
             } else {
                 if ($grade->grade > $this->get_instance()->grade) {
                     return false;
                 } else {
                     if ($grade->grade < 0) {
                         return false;
                     }
                 }
             }
         } else {
             // This is a scale.
             if ($scale = $DB->get_record('scale', array('id' => -$this->get_instance()->grade))) {
                 $scaleoptions = make_menu_from_list($scale->scale);
                 if (!array_key_exists((int) $grade->grade, $scaleoptions)) {
                     return false;
                 }
             }
         }
     }
     if (empty($grade->attemptnumber)) {
         // Set it to the default.
         $grade->attemptnumber = 0;
     }
     $DB->update_record('assign_grades', $grade);
     $submission = null;
     if ($this->get_instance()->teamsubmission) {
         $submission = $this->get_group_submission($grade->userid, 0, false);
     } else {
         $submission = $this->get_user_submission($grade->userid, false);
     }
     // Only push to gradebook if the update is for the latest attempt.
     // Not the latest attempt.
     if ($submission && $submission->attemptnumber != $grade->attemptnumber) {
         return true;
     }
     if ($this->gradebook_item_update(null, $grade)) {
         \mod_assign\event\submission_graded::create_from_grade($this, $grade)->trigger();
     }
     // If the conditions are met, allow another attempt.
     if ($submission) {
         $this->reopen_submission_if_required($grade->userid, $submission, $reopenattempt);
     }
     return true;
 }