/** * Update all the assignment submissions with data from Turnitin * * @param object $part * @param object $start position in submissions array to get details from */ private function update_submissions_from_tii($part, $start = 0) { // Initialise Comms Object. $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); try { $submission = new TiiSubmission(); $submission->setSubmissionIds(array_slice($_SESSION["TiiSubmissions"][$part->id], $start, TURNITINTOOLTWO_SUBMISSION_GET_LIMIT)); $response = $turnitincall->readSubmissions($submission); $readsubmissions = $response->getSubmissions(); foreach ($readsubmissions as $readsubmission) { $turnitintooltwosubmission = new turnitintooltwo_submission($readsubmission->getSubmissionId(), "turnitin", $this, $part->id); $turnitintooltwosubmission->save_updated_submission_data($readsubmission, true); } } catch (Exception $e) { $turnitincomms->handle_exceptions($e, 'tiisubmissiongeterror'); } }
/** * Update simliarity scores. * * @return boolean */ public function cron_update_scores($submissiontype = 'file') { global $DB, $CFG; $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype "; $submissions = $DB->get_records_select('plagiarism_turnitin_files', " statuscode = ? AND " . $typefield . " = ? AND similarityscore IS NULL AND ( orcapable = ? OR orcapable IS NULL ) ", array('success', $submissiontype, 1), 'externalid DESC'); $submissionids = array(); $reportsexpected = array(); // Add submission ids to the request. foreach ($submissions as $tiisubmission) { // Only add the submission to the request if the module still exists. if ($cm = get_coursemodule_from_id('', $tiisubmission->cm)) { if (!isset($reportsexpected[$cm->id])) { $plagiarismsettings = $this->get_settings($cm->id); $reportsexpected[$cm->id] = 1; if (!isset($plagiarismsettings['plagiarism_compare_institution'])) { $plagiarismsettings['plagiarism_compare_institution'] = 0; } // Don't add the submission to the request if module settings mean we will not get a report back. if ($plagiarismsettings['plagiarism_compare_student_papers'] == 0 && $plagiarismsettings['plagiarism_compare_internet'] == 0 && $plagiarismsettings['plagiarism_compare_journals'] == 0 && $plagiarismsettings['plagiarism_compare_institution'] == 0) { $reportsexpected[$cm->id] = 0; } } // Only add the submission to the request if we are expecting an originality report. if ($reportsexpected[$cm->id] == 1) { $submissionids[] = $tiisubmission->externalid; } } } if (count($submissionids) > 0) { // Process submissions in batches, depending on the max. number of submissions the Turnitin API returns. $submissionbatches = array_chunk($submissionids, PLAGIARISM_TURNITIN_NUM_RECORDS_RETURN); foreach ($submissionbatches as $submissionsbatch) { // Initialise Comms Object. $turnitincomms = new turnitin_comms(); $turnitincall = $turnitincomms->initialise_api(); try { $submission = new TiiSubmission(); // Use $submissionsbatch array instead of original $submissionids. $submission->setSubmissionIds($submissionsbatch); $response = $turnitincall->readSubmissions($submission); $readsubmissions = $response->getSubmissions(); foreach ($readsubmissions as $readsubmission) { // Catch exceptions thrown by getSubmissionId to allow rest of the // submissions to get processed. try { $tiisubmissionid = (int) $readsubmission->getSubmissionId(); $currentsubmission = $DB->get_record('plagiarism_turnitin_files', array('externalid' => $tiisubmissionid), 'id, cm, externalid, userid'); if ($cm = get_coursemodule_from_id('', $currentsubmission->cm)) { $plagiarismfile = new object(); $plagiarismfile->id = $currentsubmission->id; $plagiarismfile->externalid = $tiisubmissionid; $plagiarismfile->similarityscore = is_numeric($readsubmission->getOverallSimilarity()) ? $readsubmission->getOverallSimilarity() : null; $plagiarismfile->grade = is_numeric($readsubmission->getGrade()) ? $readsubmission->getGrade() : null; $plagiarismfile->orcapable = $readsubmission->getOriginalityReportCapable() == 1 ? 1 : 0; $plagiarismfile->transmatch = 0; if (is_int($readsubmission->getTranslatedOverallSimilarity()) && $readsubmission->getTranslatedOverallSimilarity() > $readsubmission->getOverallSimilarity()) { $plagiarismfile->similarityscore = $readsubmission->getTranslatedOverallSimilarity(); $plagiarismfile->transmatch = 1; } if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { mtrace("File failed to update: " . $plagiarismfile->id); } else { mtrace("File updated: " . $plagiarismfile->id); } if (!is_null($plagiarismfile->grade)) { $this->update_grade($cm, $readsubmission, $currentsubmission->userid); } } } catch (Exception $e) { mtrace("An exception was thrown while attempting to read submission {$tiisubmissionid}: " . $e->getMessage() . '(' . $e->getFile() . ':' . $e->getLine() . ')'); } } } catch (Exception $e) { mtrace(get_string('tiisubmissionsgeterror', 'turnitintooltwo')); $turnitincomms->handle_exceptions($e, 'tiisubmissionsgeterror', false); // Do not return false if a batch fails - another one might work. } } } return true; }
/** * Update simliarity scores. * @param array $submissions - the submissions to be processed * @return boolean */ public function cron_update_scores($submissiontype = 'file', $submissions) { global $DB, $CFG; $submissionids = array(); $reportsexpected = array(); // Add submission ids to the request. foreach ($submissions as $tiisubmission) { // Only add the submission to the request if the module still exists. if ($cm = get_coursemodule_from_id('', $tiisubmission->cm)) { // Updates the db field 'duedate_report_refresh' if the due date has passed within the last twenty four hours. $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance)); $now = strtotime('now'); $dtdue = !empty($moduledata->duedate) ? $moduledata->duedate : 0; if ($now >= $dtdue && $now < strtotime('+1 day', $dtdue)) { $this->set_duedate_report_refresh($tiisubmission->id, 1); } if (!isset($reportsexpected[$cm->id])) { $plagiarismsettings = $this->get_settings($cm->id); $reportsexpected[$cm->id] = 1; if (!isset($plagiarismsettings['plagiarism_compare_institution'])) { $plagiarismsettings['plagiarism_compare_institution'] = 0; } // Don't add the submission to the request if module settings mean we will not get a report back. if (array_key_exists('plagiarism_compare_student_papers', $plagiarismsettings) && $plagiarismsettings['plagiarism_compare_student_papers'] == 0 && $plagiarismsettings['plagiarism_compare_internet'] == 0 && $plagiarismsettings['plagiarism_compare_journals'] == 0 && $plagiarismsettings['plagiarism_compare_institution'] == 0) { $reportsexpected[$cm->id] = 0; } } // Only add the submission to the request if we are expecting an originality report. if ($reportsexpected[$cm->id] == 1) { $submissionids[] = $tiisubmission->externalid; } } } if (count($submissionids) > 0) { // Process submissions in batches, depending on the max. number of submissions the Turnitin API returns. $submissionbatches = array_chunk($submissionids, PLAGIARISM_TURNITIN_NUM_RECORDS_RETURN); foreach ($submissionbatches as $submissionsbatch) { // Initialise Comms Object. $turnitincomms = new turnitin_comms(); $turnitincall = $turnitincomms->initialise_api(); try { $submission = new TiiSubmission(); // Use $submissionsbatch array instead of original $submissionids. $submission->setSubmissionIds($submissionsbatch); $response = $turnitincall->readSubmissions($submission); $readsubmissions = $response->getSubmissions(); foreach ($readsubmissions as $readsubmission) { // Catch exceptions thrown by getSubmissionId to allow rest of the // submissions to get processed. try { $tiisubmissionid = (int) $readsubmission->getSubmissionId(); $currentsubmission = $DB->get_record('plagiarism_turnitin_files', array('externalid' => $tiisubmissionid), 'id, cm, externalid, userid'); if ($cm = get_coursemodule_from_id('', $currentsubmission->cm)) { $plagiarismfile = new stdClass(); $plagiarismfile->id = $currentsubmission->id; $plagiarismfile->externalid = $tiisubmissionid; $plagiarismfile->similarityscore = is_numeric($readsubmission->getOverallSimilarity()) ? $readsubmission->getOverallSimilarity() : null; $plagiarismfile->grade = is_numeric($readsubmission->getGrade()) ? $readsubmission->getGrade() : null; $plagiarismfile->orcapable = $readsubmission->getOriginalityReportCapable() == 1 ? 1 : 0; $plagiarismfile->transmatch = 0; if (is_int($readsubmission->getTranslatedOverallSimilarity()) && $readsubmission->getTranslatedOverallSimilarity() > $readsubmission->getOverallSimilarity()) { $plagiarismfile->similarityscore = $readsubmission->getTranslatedOverallSimilarity(); $plagiarismfile->transmatch = 1; } if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { mtrace("File failed to update: " . $plagiarismfile->id); } else { mtrace("File updated: " . $plagiarismfile->id); } if (!is_null($plagiarismfile->grade)) { $this->update_grade($cm, $readsubmission, $currentsubmission->userid); } } } catch (Exception $e) { mtrace("An exception was thrown while attempting to read submission {$tiisubmissionid}: " . $e->getMessage() . '(' . $e->getFile() . ':' . $e->getLine() . ')'); } } } catch (Exception $e) { mtrace(get_string('tiisubmissionsgeterror', 'plagiarism_turnitin')); $turnitincomms->handle_exceptions($e, 'tiisubmissionsgeterror', false); // Do not return false if a batch fails - another one might work. } } } // Sets the duedate_report_refresh flag for each processed submission to 2 to prevent them being processed again in the next cron run foreach ($submissions as $tiisubmission) { if ($cm = get_coursemodule_from_id('', $tiisubmission->cm)) { $this->set_duedate_report_refresh($tiisubmission->id, 2); } } return true; }
public function findRecentSubmissions($submission) { try { $query = json_encode(array('lineitem_sourcedid' => $submission->getAssignmentId(), 'date_from' => $submission->getDateFrom())); $soap = $this->discoverResultIds(array('queryObject' => $query)); $response = new Response($this); if ($response->getStatus() == 'error') { throw new TurnitinSDKException($response->getStatusCode(), $response->getDescription()); } else { $tiiSubmission = new TiiSubmission(); $submissionids = array(); if (isset($soap->sourcedIdSet->sourcedId)) { if (!is_array($soap->sourcedIdSet->sourcedId)) { $soap->sourcedIdSet->sourcedId = array($soap->sourcedIdSet->sourcedId); } foreach ($soap->sourcedIdSet->sourcedId as $id) { $submissionids[] = $id; } } $tiiSubmission->setSubmissionIds($submissionids); $response->setSubmission($tiiSubmission); } return $response; } catch (SoapFault $e) { throw new TurnitinSDKException($e->faultcode, $e->faultstring, parent::getLogPath()); } }