/** * * @param number $userid * @param number $levelid * @param string $levelfeedback * @param object $submission * @param object $draft * @param string $emarking * @param string $context * @param string $generalfeedback * @param string $delete * @param number $cmid * @return multitype:boolean |NULL|multitype:number NULL */ function emarking_set_finalgrade($userid = 0, $levelid = 0, $levelfeedback = '', $submission = null, $draft = null, $emarking = null, $context = null, $generalfeedback = null, $delete = false, $cmid = 0) { global $USER, $DB, $CFG; require_once $CFG->dirroot . '/grade/grading/lib.php'; // Validate parameters if ($userid == 0 || $levelid == 0 && $cmid == 0 || $draft == null || $submission == null || $context == null) { return array(false, false, false); } if ($levelid > 0) { // Firstly get the rubric definition id and criterion id from the level $rubricinfo = $DB->get_record_sql("\n\t\t\t\tSELECT c.definitionid, l.definition, l.criterionid, l.score, c.description\n\t\t\t\tFROM {gradingform_rubric_levels} as l\n\t\t\t\tINNER JOIN {gradingform_rubric_criteria} as c on (l.criterionid = c.id)\n\t\t\t\tWHERE l.id = ?", array($levelid)); } elseif ($cmid > 0) { // Firstly get the rubric definition id and criterion id from the level $rubricinfo = $DB->get_record_sql("\n\t\t\t\tSELECT\n\t\t\t\td.id as definitionid\n\t\t\t\tFROM {course_modules} AS c\n\t\t\t\tinner join {context} AS mc on (c.id = ? AND c.id = mc.instanceid)\n\t\t\t\tinner join {grading_areas} AS ar on (mc.id = ar.contextid)\n\t\t\t\tinner join {grading_definitions} AS d on (ar.id = d.areaid)\n\t\t\t\t", array($cmid)); } else { return null; } // Get the grading manager, then method and finally controller $gradingmanager = get_grading_manager($context, 'mod_emarking', 'attempt'); $gradingmethod = $gradingmanager->get_active_method(); $controller = $gradingmanager->get_controller($gradingmethod); $controller->set_grade_range(array("{$emarking->grademin}" => $emarking->grademin, "{$emarking->grade}" => $emarking->grade), true); $definition = $controller->get_definition(); // Get the grading instance we should already have $gradinginstancerecord = $DB->get_record('grading_instances', array('itemid' => $draft->id, 'definitionid' => $definition->id)); // Use the last marking rater id to get the instance $raterid = $USER->id; $itemid = null; if ($gradinginstancerecord) { if ($gradinginstancerecord->raterid > 0) { $raterid = $gradinginstancerecord->raterid; } $itemid = $gradinginstancerecord->id; } // Get or create grading instance (in case submission has not been graded) $gradinginstance = $controller->get_or_create_instance($itemid, $raterid, $draft->id); $rubricscores = $controller->get_min_max_score(); // Get the fillings and replace the new one accordingly $fillings = $gradinginstance->get_rubric_filling(); if ($levelid > 0) { if ($delete) { if (!($minlevel = $DB->get_record_sql(' SELECT id, score FROM {gradingform_rubric_levels} WHERE criterionid = ? ORDER BY score ASC LIMIT 1', array($rubricinfo->criterionid)))) { return array(false, false, false); } $newfilling = array("remark" => '', "levelid" => $minlevel->id); } else { $newfilling = array("remark" => $levelfeedback, "levelid" => $levelid); } if (isset($fillings['criteria'][$rubricinfo->criterionid]['levelid']) && isset($fillings['criteria'][$rubricinfo->criterionid]['remark'])) { $previouslvlid = $fillings['criteria'][$rubricinfo->criterionid]['levelid']; $previouscomment = $fillings['criteria'][$rubricinfo->criterionid]['remark']; } else { $previouslvlid = 0; $previouscomment = null; } $fillings['criteria'][$rubricinfo->criterionid] = $newfilling; } else { $previouslvlid = 0; $previouscomment = null; } $fillings['raterid'] = $raterid; $gradinginstance->update($fillings); $rawgrade = $gradinginstance->get_grade(); $previousfeedback = ''; $previousfeedback = $draft->generalfeedback == null ? '' : $draft->generalfeedback; if ($generalfeedback == null) { $generalfeedback = $previousfeedback; } $totalscore = emarking_get_totalscore($draft, $controller, $fillings); $finalgrade = emarking_calculate_grade($emarking, $totalscore, $rubricscores['maxscore']); $pendingregrades = $DB->count_records('emarking_regrade', array('draft' => $draft->id, 'accepted' => 0)); // Calculate grade for draft $draft->grade = $finalgrade; $draft->generalfeedback = $generalfeedback; $draft->status = $pendingregrades == 0 ? EMARKING_STATUS_GRADING : EMARKING_STATUS_REGRADING; $draft->timemodified = time(); $DB->update_record('emarking_draft', $draft); // Adds an entry in the grades history $grade_history = new stdClass(); $grade_history->draftid = $draft->id; $grade_history->grade = $finalgrade; $grade_history->score = $totalscore; $grade_history->bonus = 0; $grade_history->marker = $USER->id; $grade_history->timecreated = time(); $grade_history->timemodified = time(); $DB->insert_record('emarking_grade_history', $grade_history); // Aggregate grade for submission $drafts = $DB->get_records("emarking_draft", array("emarkingid" => $submission->emarking, "submissionid" => $submission->id)); $submission->generalfeedback = ''; $submission->grade = 0; foreach ($drafts as $d) { $submission->generalfeedback .= $d->generalfeedback; $submission->grade += $d->grade; } $submission->grade = $submission->grade / count($drafts); $submission->timemodified = time(); $DB->update_record('emarking_submission', $submission); return array($finalgrade, $previouslvlid, $previouscomment); }
/** * * @param unknown $emarking * @param number $userid * @return void|boolean */ function emarking_calculate_grades_users($emarking, $userid = 0) { global $DB, $USER, $CFG; require_once $CFG->dirroot . '/grade/grading/lib.php'; if (!($cm = get_coursemodule_from_instance('emarking', $emarking->id))) { return; } if ($emarking->type != EMARKING_TYPE_ON_SCREEN_MARKING && $emarking->type != EMARKING_TYPE_PEER_REVIEW) { return; } $context = context_module::instance($cm->id); // Get the grading manager, then method and finally controller. $gradingmanager = get_grading_manager($context, 'mod_emarking', 'attempt'); $gradingmethod = $gradingmanager->get_active_method(); $controller = $gradingmanager->get_controller($gradingmethod); $range = $controller->get_grade_range(); $rubricscores = $controller->get_min_max_score(); $totalrubricscore = $rubricscores['maxscore']; $filter = 'WHERE 1=1'; if ($userid > 0) { $filter = 'WHERE es.student = ' . $userid; } $studentscores = $DB->get_records_sql("\n\t\t\tSELECT es.id,\n\t\t\tes.student,\n\t d.id as draftid,\n\t\t\tsum(ifnull(rl.score,0)) as score,\n\t\t\tsum(ifnull(ec.bonus,0)) as bonus,\n\t\t\tsum(ifnull(rl.score,0)) + sum(ifnull(ec.bonus,0)) as totalscore\n\t\t\tFROM {emarking_submission} es\n\t\t\tINNER JOIN {emarking_page} ep ON (es.emarking = :emarking AND ep.submission = es.id)\n\t\t\tINNER JOIN {emarking_draft} d ON (d.submissionid = es.id AND d.qualitycontrol = 0)\n\t\t\tLEFT JOIN {emarking_comment} ec ON (ec.page = ep.id AND ec.levelid > 0 AND ec.draft = d.id)\n\t\t\tLEFT JOIN {gradingform_rubric_levels} rl ON (ec.levelid = rl.id)\n\t\t\t{$filter}\n\t\t\tAND d.status >= 10\n\t AND rl.id IS NOT NULL\n\t\t\tGROUP BY es.emarking, es.id", array('emarking' => $emarking->id)); foreach ($studentscores as $studentscore) { $totalscore = min(floatval($studentscore->totalscore), $totalrubricscore); $finalgrade = emarking_calculate_grade($emarking, $totalscore, $totalrubricscore); $submission = $DB->get_record('emarking_submission', array('id' => $studentscore->id)); $submission->grade = $finalgrade; $DB->update_record('emarking_submission', $submission); $draft = $DB->get_record('emarking_draft', array('id' => $studentscore->draftid)); $draft->grade = $finalgrade; $DB->update_record('emarking_draft', $draft); } return true; }