/** * A Standard Moodle function that moodle executes at the time the cron runs */ function turnitintooltwo_cron() { global $DB, $CFG; // get assignment that needs updating and check whether it exists if ($assignment = $DB->get_record('turnitintooltwo', array("needs_updating" => 1), '*', IGNORE_MULTIPLE)) { $turnitintooltwoassignment = new turnitintooltwo_assignment($assignment->id); $cm = get_coursemodule_from_instance("turnitintooltwo", $turnitintooltwoassignment->turnitintooltwo->id, $turnitintooltwoassignment->turnitintooltwo->course); $users = $turnitintooltwoassignment->get_moodle_course_users($cm); foreach ($users as $user) { // Only add to gradebook if author has been unanonymised or assignment doesn't have anonymous marking $grades = new stdClass(); if ($submissions = $DB->get_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $turnitintooltwoassignment->turnitintooltwo->id, 'userid' => $user->id, 'submission_unanon' => 1))) { $overallgrade = $turnitintooltwoassignment->get_overall_grade($submissions, $cm); if ($turnitintooltwoassignment->turnitintooltwo->grade < 0) { // Using a scale. $grades->rawgrade = $overallgrade == '--' ? null : $overallgrade; } else { $grades->rawgrade = $overallgrade == '--' ? null : number_format($overallgrade, 2); } } $grades->userid = $user->id; $params['idnumber'] = $cm->idnumber; @(include_once $CFG->dirroot . "/lib/gradelib.php"); grade_update('mod/turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->course, 'mod', 'turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->id, 0, $grades, $params); } // remove the "needs updating" flag $update_assignment = new stdClass(); $update_assignment->id = $assignment->id; $update_assignment->needs_updating = 0; $DB->update_record("turnitintooltwo", $update_assignment); } // Refresh the submissions for migrated assignment parts if there are none stored locally // as the 1st time this is done can be quite a long job if there are a lot of submissions. $migratedemptyparts = $DB->get_records_select('turnitintooltwo_parts', " migrated = 1 AND " . " (SELECT COUNT(id) FROM {turnitintooltwo_submissions} " . " WHERE submission_part = {turnitintooltwo_parts}.id) = 0 "); if (count($migratedemptyparts) > 0) { $updatedassignments = array(); foreach ($migratedemptyparts as $part) { if (!array_search($part->id, $updatedassignments)) { $turnitintooltwoassignment = new turnitintooltwo_assignment($part->turnitintooltwoid); $turnitintooltwoassignment->get_submission_ids_from_tii($part); $turnitintooltwoassignment->refresh_submissions($part); $updatedassignments[] = $part->id; turnitintooltwo_activitylog('Turnitintool submissions downloaded for assignment ' . $part->id, 'REQUEST'); } } echo 'Turnitintool submissions downloaded for assignments: ' . implode(',', $updatedassignments) . ' '; } }
/** * Save updated submission data from Turnitin to the database * * @global type $DB * @param type $tiisubmissiondata * @param type $bulk * @param type $save - save in db regardless of changes * @return type */ public function save_updated_submission_data($tiisubmissiondata, $bulk = false, $save = false) { global $DB, $CFG; static $part; static $tiiassignid; if ($tiiassignid != $tiisubmissiondata->getAssignmentId() || empty($part)) { $part = $DB->get_record("turnitintooltwo_parts", array("tiiassignid" => $tiisubmissiondata->getAssignmentId())); } $turnitintooltwoassignment = new turnitintooltwo_assignment($part->turnitintooltwoid); $sub = new stdClass(); $sub->submission_title = $tiisubmissiondata->getTitle(); $sub->submission_part = $part->id; $sub->submission_objectid = $tiisubmissiondata->getSubmissionId(); $sub->turnitintooltwoid = $turnitintooltwoassignment->turnitintooltwo->id; $sub->submission_score = is_numeric($tiisubmissiondata->getOverallSimilarity()) ? $tiisubmissiondata->getOverallSimilarity() : null; $sub->submission_transmatch = 0; if ($turnitintooltwoassignment->turnitintooltwo->transmatch == 1 && is_int($tiisubmissiondata->getTranslatedOverallSimilarity())) { if ($tiisubmissiondata->getTranslatedOverallSimilarity() > $tiisubmissiondata->getOverallSimilarity()) { $sub->submission_score = $tiisubmissiondata->getTranslatedOverallSimilarity(); $sub->submission_transmatch = 1; } } $sub->submission_grade = $tiisubmissiondata->getGrade() == '' ? null : $tiisubmissiondata->getGrade(); $sub->submission_gmimaged = $tiisubmissiondata->getFeedbackExists(); $sub->submission_unanon = $tiisubmissiondata->getAnonymous() == 1 ? 0 : 1; $sub->submission_orcapable = $tiisubmissiondata->getOriginalityReportCapable() == 1 ? 1 : 0; $sub->submission_acceptnothing = $tiisubmissiondata->getAcceptNothingSubmission() == 1 ? 1 : 0; $sub->submission_unanonreason = $sub->submission_unanon == 1 ? urldecode($tiisubmissiondata->getAnonymousRevealReason()) : null; $sub->submission_modified = strtotime($tiisubmissiondata->getDate()); $sub->translated_overall_similarity = $tiisubmissiondata->getTranslatedOverallSimilarity(); $sub->submission_attempts = $tiisubmissiondata->getAuthorLastViewedFeedback() > 0 ? strtotime($tiisubmissiondata->getAuthorLastViewedFeedback()) : 0; // If save not passed in then only update if certain items have changed to save on database load. if ($this->submission_grade != $sub->submission_grade || $this->submission_score != $sub->submission_score || $this->submission_modified != $sub->submission_modified || $this->submission_attempts != $sub->submission_attempts || $this->submission_unanon != $sub->submission_unanon || $this->submission_part != $sub->submission_part) { $save = true; } $cm = get_coursemodule_from_instance("turnitintooltwo", $turnitintooltwoassignment->turnitintooltwo->id, $turnitintooltwoassignment->turnitintooltwo->course); if ($save) { // If the user is not a moodle user then get their name from Tii - only do this on initial save. $sub->userid = turnitintooltwo_user::get_moodle_user_id($tiisubmissiondata->getAuthorUserId()); // If we have no user ID get it from the Moodle database by using their Turnitin e-mail address. if ($sub->userid == 0) { $tmpuser = new turnitintooltwo_user(0); $tmpuser->tii_user_id = $tiisubmissiondata->getAuthorUserId(); $tiiuser = $tmpuser->set_user_values_from_tii(); if ($userrecord = $DB->get_record('user', array('email' => $tiiuser["email"]))) { $sub->userid = $userrecord->id; } } // Check if the user is enrolled. if ($sub->userid != 0) { $context = context_module::instance($cm->id); if (!is_enrolled($context, $sub->userid)) { // Enroll the user as a student. $enrol = enrol_get_plugin('manual'); $instance = $DB->get_record("enrol", array('courseid' => $cm->course, 'enrol' => 'manual')); $enrol->enrol_user($instance, $sub->userid, 5); } } if ($sub->userid == 0 && empty($this->id)) { if ($tiisubmissiondata->getAuthorUserId() > 0) { $sub->submission_nmuserid = $tiisubmissiondata->getAuthorUserId(); $tmpuser = new turnitintooltwo_user(0); $tmpuser->tii_user_id = $tiisubmissiondata->getAuthorUserId(); $tiiuser = $tmpuser->set_user_values_from_tii(); $sub->submission_nmfirstname = $tiiuser["firstname"]; $sub->submission_nmlastname = $tiiuser["lastname"]; } else { $sub->submission_nmuserid = "nm-" . $tiisubmissiondata->getAuthorUserId(); $sub->submission_nmfirstname = ''; $sub->submission_nmlastname = get_string('nonmoodleuser', 'turnitintooltwo'); } } if (!empty($this->id)) { $sub->id = $this->id; $DB->update_record("turnitintooltwo_submissions", $sub, $bulk); } else { $sub->id = $DB->insert_record("turnitintooltwo_submissions", $sub, true, $bulk); } // Update gradebook. @(include_once $CFG->libdir . "/gradelib.php"); if ($sub->userid > 0 && $sub->submission_unanon) { $user = new turnitintooltwo_user($sub->userid, "Learner"); $grades = new stdClass(); // Only add to gradebook if author has been unanonymised or assignment doesn't have anonymous marking if ($submissions = $DB->get_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $turnitintooltwoassignment->turnitintooltwo->id, 'userid' => $user->id, 'submission_unanon' => 1))) { $overallgrade = $turnitintooltwoassignment->get_overall_grade($submissions); if ($turnitintooltwoassignment->turnitintooltwo->grade < 0) { // Using a scale. $grades->rawgrade = $overallgrade == '--' ? null : $overallgrade; } else { $grades->rawgrade = $overallgrade == '--' ? null : number_format($overallgrade, 2); } } $grades->userid = $user->id; $params['idnumber'] = $cm->idnumber; grade_update('mod/turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->course, 'mod', 'turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->id, 0, $grades, $params); } } }
/** * Update the gradebook for cron calls. * * @param type $assignment The assignment that we are going to update the grades for. * @param string $task The cron task we are performing the update from. */ function turnitintooltwo_cron_update_gradbook($assignment, $task) { global $DB, $CFG; @(include_once $CFG->dirroot . "/lib/gradelib.php"); $turnitintooltwoassignment = new turnitintooltwo_assignment($assignment->id); $cm = get_coursemodule_from_instance("turnitintooltwo", $turnitintooltwoassignment->turnitintooltwo->id, $turnitintooltwoassignment->turnitintooltwo->course); $users = $turnitintooltwoassignment->get_moodle_course_users($cm); foreach ($users as $user) { $fieldList = array('turnitintooltwoid' => $turnitintooltwoassignment->turnitintooltwo->id, 'userid' => $user->id); // Set submission_unanon when needsupdating is used. if ($task == "needsupdating") { $fieldList['submission_unanon'] = 1; } $grades = new stdClass(); if ($submissions = $DB->get_records('turnitintooltwo_submissions', $fieldList)) { $overallgrade = $turnitintooltwoassignment->get_overall_grade($submissions, $cm); if ($turnitintooltwoassignment->turnitintooltwo->grade < 0) { // Using a scale. $grades->rawgrade = $overallgrade == '--' ? null : $overallgrade; } else { $grades->rawgrade = $overallgrade == '--' ? null : number_format($overallgrade, 2); } } $grades->userid = $user->id; $params['idnumber'] = $cm->idnumber; grade_update('mod/turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->course, 'mod', 'turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->id, 0, $grades, $params); } // Remove the "anongradebook" flag $update_assignment = new stdClass(); $update_assignment->id = $assignment->id; // Depending on the task we need to update a different column. switch ($task) { case "needsupdating": $update_assignment->needs_updating = 0; break; case "anongradebook": $update_assignment->anongradebook = 1; break; } $DB->update_record("turnitintooltwo", $update_assignment); }