/**
  * Process assignment grading function called by event trigger (see db/events.php).
  * It unlocks pages on Mahara when submission has been graded.
  *
  * @param object $event Event data object passed over by mod_assign
  * @return void
  */
 public static function submission_graded(\mod_assign\event\submission_graded $event)
 {
     global $DB;
     $eventdata = $event->get_data();
     $grade = $event->get_record_snapshot('assign_grades', $eventdata['objectid']);
     $assign = $event->get_assign();
     $maharasubmissionplugin = $assign->get_submission_plugin_by_type('mahara');
     // See if need to unlock anything at all.
     if ((int) $maharasubmissionplugin->get_config('lock') !== ASSIGNSUBMISSION_MAHARA_SETTING_UNLOCK) {
         return;
     }
     // Get submission if it exists.
     if (!($submission = $assign->get_user_submission($grade->userid, false))) {
         return;
     }
     // Get Mahara submission.
     $maharasubmission = $DB->get_record('assignsubmission_mahara', array('submission' => $submission->id));
     // Process further only if we are dealing with mahara submission that is locked.
     if ($maharasubmission && $maharasubmission->viewstatus == assign_submission_mahara::STATUS_SUBMITTED) {
         // Check if marking workflow is in place, page unlocking will be handled in
         // assignsubmission_mahara_observers::workflow_state_updated unless .
         if ($assign->get_instance()->markingworkflow) {
             return;
         }
         // If submission has been "graded" but no grade is selected do not unlock page.
         if (empty($grade->grade)) {
             return;
         }
         self::release_submited_view($maharasubmissionplugin, $maharasubmission);
     }
 }
示例#2
0
 /**
  * Apply a grade from a grading form to a user (may be called multiple times for a group submission).
  *
  * @param stdClass $formdata - the data from the form
  * @param int $userid - the user to apply the grade to
  * @param int $attemptnumber - The attempt number to apply the grade to.
  * @return void
  */
 protected function apply_grade_to_user($formdata, $userid, $attemptnumber)
 {
     global $USER, $CFG, $DB;
     $grade = $this->get_user_grade($userid, true, $attemptnumber);
     $gradingdisabled = $this->grading_disabled($userid);
     $gradinginstance = $this->get_grading_instance($userid, $grade, $gradingdisabled);
     if (!$gradingdisabled) {
         if ($gradinginstance) {
             $grade->grade = $gradinginstance->submit_and_get_grade($formdata->advancedgrading, $grade->id);
         } else {
             // Handle the case when grade is set to No Grade.
             if (isset($formdata->grade)) {
                 $grade->grade = grade_floatval(unformat_float($formdata->grade));
             }
         }
         if (isset($formdata->workflowstate) || isset($formdata->allocatedmarker)) {
             $flags = $this->get_user_flags($userid, true);
             $flags->workflowstate = isset($formdata->workflowstate) ? $formdata->workflowstate : $flags->workflowstate;
             $flags->allocatedmarker = isset($formdata->allocatedmarker) ? $formdata->allocatedmarker : $flags->allocatedmarker;
             $this->update_user_flags($flags);
         }
     }
     $grade->grader = $USER->id;
     $adminconfig = $this->get_admin_config();
     $gradebookplugin = $adminconfig->feedback_plugin_for_gradebook;
     // Call save in plugins.
     foreach ($this->feedbackplugins as $plugin) {
         if ($plugin->is_enabled() && $plugin->is_visible()) {
             if (!$plugin->save($grade, $formdata)) {
                 $result = false;
                 print_error($plugin->get_error());
             }
             if ('assignfeedback_' . $plugin->get_type() == $gradebookplugin) {
                 // This is the feedback plugin chose to push comments to the gradebook.
                 $grade->feedbacktext = $plugin->text_for_gradebook($grade);
                 $grade->feedbackformat = $plugin->format_for_gradebook($grade);
             }
         }
     }
     $this->update_grade($grade);
     $this->notify_grade_modified($grade);
     $addtolog = $this->add_to_log('grade submission', $this->format_grade_for_log($grade), '', true);
     $params = array('context' => $this->context, 'objectid' => $grade->id, 'relateduserid' => $userid);
     $event = \mod_assign\event\submission_graded::create($params);
     $event->set_legacy_logdata($addtolog);
     $event->trigger();
 }
示例#3
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;
 }