/** * 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("'", "’", "‘", "'", " "), "_", $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);