示例#1
0
/**
 * Updates all originality report scores and grades from a turnitin FID10 call
 *
 * @param object $cm The moodle course module object for this instance
 * @param object $turnitintool The turnitintool object for this activity
 * @param int $trigger 0 = allow once per session, 1 = allow once every two minutes, 2 = allow immediately
 * @param object $loaderbar The loaderbar object passed by reference can be NULL if no loader bar is used
 */
function turnitintool_update_all_report_scores($cm, $turnitintool, $trigger, $loaderbar = null)
{
    global $USER, $CFG, $notice;
    $param_type = optional_param('type', null, PARAM_CLEAN);
    $param_do = optional_param('do', null, PARAM_CLEAN);
    $param_ob = optional_param('ob', null, PARAM_CLEAN);
    $param_sh = optional_param('sh', null, PARAM_CLEAN);
    $param_fr = optional_param('fr', null, PARAM_CLEAN);
    $param_ajax = optional_param('ajax', null, PARAM_CLEAN);
    $api_error = false;
    // Check to see if the results for this user's session has been updated from
    // Turnitin in the last two minutes. If they have then we should skip this refresh
    // to avoid system load issues that can occur during busy submission periods
    // where many tutors will enter inbox screens to check progress
    if ($trigger < 2 and isset($_SESSION['updatedscores'][$turnitintool->id]) and $_SESSION['updatedscores'][$turnitintool->id] > strtotime('-2 minutes')) {
        return false;
    }
    // Update the score only when neccessary determined by a session variable
    // This ensures the scores are only updated once per session
    // or if the user requests update specifically [[[[
    if ((isset($_SESSION['updatedscores'][$turnitintool->id]) and $_SESSION['updatedscores'][$turnitintool->id] > 0 or isset($param_type)) and $trigger < 1) {
        return false;
    } else {
        // Get Moodle user object [[[[
        if (!($owner = turnitintool_get_owner($turnitintool->course))) {
            turnitintool_print_error('tutorgeterror', 'turnitintool', NULL, NULL, __FILE__, __LINE__);
            exit;
        }
        // ]]]]
        // get Moodle Course Object [[[[
        if (!($course = turnitintool_get_record('course', 'id', $turnitintool->course))) {
            turnitintool_print_error('coursegeterror', 'turnitintool', NULL, NULL, __FILE__, __LINE__);
            exit;
        }
        // ]]]]
        // get Moodle Parts Object [[[[
        if (!($parts = turnitintool_get_records_select('turnitintool_parts', "turnitintoolid=" . $turnitintool->id . " AND deleted=0"))) {
            turnitintool_print_error('partgeterror', 'turnitintool', NULL, NULL, __FILE__, __LINE__);
            exit;
        }
        // ]]]]
        if (has_capability('mod/turnitintool:grade', turnitintool_get_context('MODULE', $cm->id)) or $turnitintool->studentreports or $trigger > 0) {
            $total = count($parts);
            $loaderbar = is_null($loaderbar) ? new turnitintool_loaderbarclass(0) : $loaderbar;
            $loaderbar->total = $loaderbar->total + $total;
            $tii = new turnitintool_commclass(turnitintool_getUID($owner), $owner->firstname, $owner->lastname, $owner->email, 2, $loaderbar);
            turnitintool_usersetup($owner, get_string('userprocess', 'turnitintool'), $tii, $loaderbar);
            if (isset($tii->result) and $tii->getRerror()) {
                if ($tii->getAPIunavailable()) {
                    turnitintool_print_error('apiunavailable', 'turnitintool', NULL, NULL, __FILE__, __LINE__);
                } else {
                    turnitintool_print_error($tii->getRmessage(), NULL, NULL, NULL, __FILE__, __LINE__);
                }
                exit;
            }
            if (!($ids = turnitintool_get_records_select('turnitintool_submissions', 'turnitintoolid=' . $turnitintool->id . ' AND submission_objectid IS NOT NULL', NULL, '', 'submission_objectid,id,submission_grade,submission_score,submission_modified,submission_status,submission_attempts,userid,submission_unanon'))) {
                $ids = array();
            }
            $context = turnitintool_get_context('COURSE', $turnitintool->course);
            $studentusers = get_users_by_capability($context, 'mod/turnitintool:submit', 'u.id,u.firstname,u.lastname', '', '', '', 0, '', false);
            $studentuser_array = array_keys($studentusers);
            $users_string = join($studentuser_array, ",");
            $users = empty($users_string) ? array() : turnitintool_get_records_sql('SELECT turnitin_uid,userid FROM {turnitintool_users} WHERE userid IN (' . $users_string . ')');
            $post = new stdClass();
            $post->cid = turnitintool_getCID($course->id);
            // Get the Turnitin Class ID for Course
            $post->tem = $owner->email;
            // Get the Turnitin Course Tutor Email
            $post->ctl = turnitintool_getCTL($course->id);
            foreach ($parts as $part) {
                $post->assignid = turnitintool_getAID($part->id);
                // Get the Assignment ID for this Assignment / Turnitintool instance
                $post->assign = $turnitintool->name . ' - ' . $part->partname . ' (Moodle ' . $post->assignid . ')';
                $status = new stdClass();
                $status->user = get_string('student', 'turnitintool');
                $status->proc = isset($loaderbar->proc) ? $loaderbar->proc : null;
                $tii->listSubmissions($post, get_string('updatingscores', 'turnitintool', $status));
                $resultArray = $tii->getSubmissionArray();
                if ($tii->getRerror() and isset($param_do) and $param_do == 'allsubmissions') {
                    $notice = $tii->getAPIunavailable() ? get_string('apiunavailable', 'turnitintool') : $tii->getRmessage();
                } else {
                    if ($tii->getRerror() and isset($param_do) and $param_do == 'submissions') {
                        $notice['error'] = $tii->getAPIunavailable() ? get_string('apiunavailable', 'turnitintool') : $tii->getRmessage();
                    }
                }
                if ($tii->getRerror()) {
                    $api_error = true;
                } else {
                    // Create an array of submission IDs with the TII Paper ID as key to repatriate the feedback with submissions
                    unset($inserts);
                    $inserts = array();
                    foreach ($resultArray as $key => $value) {
                        $insert = new object();
                        $insert->turnitintoolid = $turnitintool->id;
                        $insert->submission_part = $part->id;
                        $insert->submission_title = $value["title"];
                        $insert->submission_type = 1;
                        $insert->submission_filename = str_replace(array("&#39;", "&rsquo;", "&lsquo;", "'", " "), "_", $value["title"]) . '.doc';
                        $insert->submission_objectid = $key;
                        $insert->submission_score = $value["overlap"];
                        if ($value["overlap"] !== '0' && empty($value["overlap"])) {
                            $insert->submission_score = null;
                        }
                        $insert->submission_grade = turnitintool_processgrade($value["grademark"], $part, $owner, $post, $key, $tii, $loaderbar);
                        $insert->submission_status = get_string('submissionuploadsuccess', 'turnitintool');
                        $insert->submission_queued = 0;
                        $insert->submission_attempts = $value["student_view"] > 0 ? strtotime($value["student_view"]) : 0;
                        $insert->submission_gmimaged = $value["grademarkstatus"] > 0 ? 1 : 0;
                        $insert->submission_modified = strtotime($value["date_submitted"]);
                        $insert->submission_parent = 0;
                        $insert->submission_unanon = $value["anon"] == 1 ? 0 : 1;
                        $insert->submission_transmatch = $value["transmatch"] == 1 ? 1 : 0;
                        if (isset($users[$value["userid"]])) {
                            // If returned userid is already stored and the user is enrolled on the course
                            // we can use real Moodle user to store against
                            $insert->submission_nmuserid = 0;
                            $insert->submission_nmfirstname = NULL;
                            $insert->submission_nmlastname = NULL;
                            $insert->userid = $users[$value["userid"]]->userid;
                        } else {
                            // If userid is not already stored we can not use real user to store against, use (Non Moodle) Marker
                            $insert->submission_nmuserid = $value["userid"] == "-1" ? md5($value["firstname"] . $value["lastname"]) : $value["userid"];
                            if (!empty($value["firstname"])) {
                                $insert->submission_nmfirstname = $value["firstname"];
                            } else {
                                $insert->submission_nmfirstname = 'Unnamed';
                            }
                            if (!empty($value["lastname"])) {
                                $insert->submission_nmlastname = $value["lastname"];
                            } else {
                                $insert->submission_nmlastname = 'User';
                            }
                            $insert->userid = 0;
                        }
                        // Only do DB update if the record has changed, saves DB calls
                        if (!isset($ids[$key]) or $insert->submission_grade != $ids[$key]->submission_grade or $insert->submission_score != $ids[$key]->submission_score or $insert->submission_modified != $ids[$key]->submission_modified or $insert->submission_attempts != $ids[$key]->submission_attempts or $insert->userid != $ids[$key]->userid or $insert->submission_unanon != $ids[$key]->submission_unanon) {
                            $inserts[] = $insert;
                        }
                        $keys_found[] = $key;
                    }
                    // Purge old submissions listings
                    foreach ($ids as $submission) {
                        if (!in_array($submission->submission_objectid, $keys_found)) {
                            turnitintool_delete_records_select('turnitintool_submissions', 'submission_objectid=' . $submission->submission_objectid . ' AND submission_part=' . $part->id);
                        }
                    }
                    // Now insert the new submissions and update existing submissions
                    foreach ($inserts as $insert) {
                        $key = $insert->submission_objectid;
                        if (isset($ids[$key])) {
                            $insert->id = $ids[$key]->id;
                            $insertid = turnitintool_update_record('turnitintool_submissions', $insert);
                        } else {
                            $insertid = turnitintool_insert_record('turnitintool_submissions', $insert);
                        }
                        $submission = $insert;
                        unset($insert);
                        // Update gradebook grades in Moodle 1.9 and above
                        @(include_once $CFG->dirroot . "/lib/gradelib.php");
                        if (function_exists('grade_update') and $submission->userid != 0) {
                            $user = turnitintool_get_moodleuser($submission->userid, NULL, __FILE__, __LINE__);
                            $cm = get_coursemodule_from_instance("turnitintool", $turnitintool->id, $turnitintool->course);
                            $grades = turnitintool_buildgrades($turnitintool, $user);
                            $grades->userid = $user->id;
                            $params['idnumber'] = $cm->idnumber;
                            grade_update('mod/turnitintool', $turnitintool->course, 'mod', 'turnitintool', $turnitintool->id, 0, $grades, $params);
                        }
                        // ]]]]
                    }
                }
            }
            if ($api_error) {
                $notice = $tii->getAPIunavailable() ? get_string('apiunavailable', 'turnitintool') : $tii->getRmessage();
                $loaderbar->endloader();
                $_SESSION['updatedscores'][$turnitintool->id] = time();
                if (!empty($param_ajax) && $param_ajax) {
                    header('HTTP/1.0 400 Bad Request');
                    echo $notice;
                    $param_ajax = 0;
                    exit;
                }
                return false;
            }
            $loaderbar->endloader();
            $_SESSION['updatedscores'][$turnitintool->id] = time();
            $redirectlink = $CFG->wwwroot . '/mod/turnitintool/view.php?id=' . $cm->id;
            $redirectlink .= !is_null($param_do) ? '&do=' . $param_do : '&do=intro';
            $redirectlink .= !is_null($param_fr) ? '&fr=' . $param_fr : '';
            $redirectlink .= !is_null($param_sh) ? '&sh=' . $param_sh : '';
            $redirectlink .= !is_null($param_ob) ? '&ob=' . $param_ob : '';
            turnitintool_redirect($redirectlink);
        }
    }
}
        }
    }
    if ($param_do == 'viewreport') {
        echo "</pre>";
    }
} else {
    if (!is_null($param_do) and $param_do == "unlinkusers") {
        if (!is_null($param_unlink) and isset($param_userlinks) and count($param_userlinks) > 0) {
            foreach ($param_userlinks as $userlink) {
                $user = new stdClass();
                $user->id = $userlink;
                if ($tuser = turnitintool_get_record('turnitintool_users', 'id', $userlink) and $muser = turnitintool_get_record('user', 'id', $tuser->userid)) {
                    $user->turnitin_uid = 0;
                    turnitintool_update_record('turnitintool_users', $user);
                } else {
                    turnitintool_delete_records_select('turnitintool_users', 'id', $userlink);
                }
            }
        }
        if (!is_null($param_relink) and isset($param_userlinks) and count($param_userlinks) > 0) {
            $loaderbar = new turnitintool_loaderbarclass(count($param_userlinks));
            foreach ($param_userlinks as $userlink) {
                if ($tuser = turnitintool_get_record('turnitintool_users', 'id', $userlink) and $muser = turnitintool_get_record('user', 'id', $tuser->userid)) {
                    // Get the email address if the user has been deleted
                    if (empty($muser->email) or strpos($muser->email, '@') === false) {
                        $split = explode('.', $muser->username);
                        array_pop($split);
                        $muser->email = join('.', $split);
                    }
                    $tuser->turnitin_utp = $tuser->turnitin_utp != 0 ? $tuser->turnitin_utp : 1;
                    $tii = new turnitintool_commclass(null, $muser->firstname, $muser->lastname, $muser->email, $tuser->turnitin_utp, $loaderbar);