/** * 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); } }
/** * 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(); }
/** * 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; }