Beispiel #1
0
/**
 * 
 * @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);
}
Beispiel #2
0
/**
 * 
 * @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;
}