/** * Update class from Turnitin, mainly to get shared rubrics * * @return */ public function read_class_from_tii() { // Initialise Comms Object. $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); $tiiclass = new TiiClass(); try { $tiiclass->setClassId($this->turnitinid); $response = $turnitincall->readClass($tiiclass); $readclass = $response->getClass(); $rubrics = $readclass->getSharedRubrics(); $rubricarray = array(); foreach ($rubrics as $rubric) { $rubricarray[$rubric->getRubricId()] = $rubric->getRubricName() . " [" . get_string('sharedrubric', 'turnitintooltwo') . "]"; } $this->sharedrubrics = $rubricarray; } catch (Exception $e) { $turnitincomms->handle_exceptions($e, 'coursegeterror', false); } }
/** * Read the remote xml file containg helpdesk solutions. * * @return string - xml containing helpdesk solutions. */ public function read_xml_solutions_file() { global $CFG; $xml = ''; try { // Check if solutions exist in the user's language. $solutionsurl = "https://www.turnitin.com/static/resources/files/moodle_helpdesk/moodle-helpdesk-" . current_language() . ".xml"; $ch = curl_init($solutionsurl); curl_setopt($ch, CURLOPT_NOBODY, true); $result = curl_exec($ch); // If there is no solutions file then use English. if ($result !== false) { $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($statusCode != 200) { $solutionsurl = "https://www.turnitin.com/static/resources/files/moodle_helpdesk/moodle-helpdesk-en.xml"; } } // Get correct language file. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $solutionsurl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if (isset($CFG->proxyhost) and !empty($CFG->proxyhost)) { curl_setopt($ch, CURLOPT_PROXY, $CFG->proxyhost . ':' . $CFG->proxyport); } if (isset($CFG->proxyuser) and !empty($CFG->proxyuser)) { curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_PROXYUSERPWD, sprintf('%s:%s', $CFG->proxyuser, $CFG->proxypassword)); } // Execute post. $result = curl_exec($ch); // Close connection. curl_close($ch); // Read XML into an array. $xml = simplexml_load_string($result); } catch (Exception $e) { turnitintooltwo_comms::handle_exceptions($e, 'gethelpdeskxmlerror', true); } return $xml; }
/** * Update assignment from Turnitin * * @global type $DB * @param array $assignmentids array of assignment ids, if 0 then array is created inside * @return object */ public function update_assignment_from_tii($assignmentids = 0) { global $DB; // Initialise Comms Object. $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); if (!$assignmentids) { $parts = $this->get_parts(); $assignments = array(); foreach ($parts as $part) { $assignments[] = $part->tiiassignid; $partids[$part->tiiassignid] = $part->id; } } else { $assignments = $assignmentids; } $assignment = new TiiAssignment(); try { if (count($assignments) == 1) { $assignment->setAssignmentId(current($assignments)); $response = $turnitincall->readAssignment($assignment); $readassignments[0] = $response->getAssignment(); } else { $assignment->setAssignmentIds($assignments); $response = $turnitincall->readAssignments($assignment); $readassignments = $response->getAssignments(); } $assignmentdetails = ""; $newparts = array(); foreach ($readassignments as $readassignment) { $part = new stdClass(); $part->dtstart = strtotime($readassignment->getStartDate()); $part->dtdue = strtotime($readassignment->getDueDate()); $part->dtpost = strtotime($readassignment->getFeedbackReleaseDate()); $part->maxmarks = $readassignment->getMaxGrade(); $part->tiiassignid = $readassignment->getAssignmentId(); if ($assignmentids == 0) { $part->id = $partids[$readassignment->getAssignmentId()]; if (!($dbpart = $DB->update_record('turnitintooltwo_parts', $part))) { turnitintooltwo_activitylog(get_string('turnitintooltwoupdateerror', 'turnitintooltwo') . ' - ID: ' . $this->turnitintooltwo->id . ' - Part: ' . $part->id, 'API_ERROR'); } } else { $part->partname = $readassignment->getTitle(); $newparts[] = $part; } // Update main turnitintooltwo details but only once. if (empty($assignmentdetails)) { $assignmentdetails = new stdClass(); if ($assignmentids == 0) { $assignmentdetails->id = $this->turnitintooltwo->id; } else { $assignmentdetails->timecreated = time(); $assignmentdetails->dateformat = "d/m/Y"; $assignmentdetails->autoupdates = 1; $assignmentdetails->commentedittime = 1800; $assignmentdetails->commentmaxsize = 800; $assignmentdetails->autosubmission = 1; $assignmentdetails->timemodified = time(); $assignmentdetails->intro = $readassignment->getInstructions(); } $assignmentdetails->allowlate = $readassignment->getLateSubmissionsAllowed(); $assignmentdetails->reportgenspeed = $readassignment->getResubmissionRule(); $assignmentdetails->submitpapersto = $readassignment->getSubmitPapersTo(); $assignmentdetails->spapercheck = $readassignment->getSubmittedDocumentsCheck(); $assignmentdetails->internetcheck = $readassignment->getInternetCheck(); $assignmentdetails->journalcheck = $readassignment->getPublicationsCheck(); $assignmentdetails->studentreports = $readassignment->getAuthorOriginalityAccess(); $assignmentdetails->rubric = $readassignment->getRubricId(); $assignmentdetails->excludebiblio = $readassignment->getBibliographyExcluded(); $assignmentdetails->excludequoted = $readassignment->getQuotedExcluded(); $assignmentdetails->excludetype = $readassignment->getSmallMatchExclusionType(); $assignmentdetails->excludevalue = $readassignment->getSmallMatchExclusionThreshold(); $assignmentdetails->erater = $readassignment->getErater(); $assignmentdetails->erater_handbook = $readassignment->getEraterHandbook(); $assignmentdetails->erater_dictionary = $readassignment->getEraterSpellingDictionary(); $assignmentdetails->erater_spelling = (int) $readassignment->getEraterSpelling(); $assignmentdetails->erater_grammar = (int) $readassignment->getEraterGrammar(); $assignmentdetails->erater_usage = (int) $readassignment->getEraterUsage(); $assignmentdetails->erater_mechanics = (int) $readassignment->getEraterMechanics(); $assignmentdetails->erater_style = (int) $readassignment->getEraterStyle(); $assignmentdetails->transmatch = (int) $readassignment->getTranslatedMatching(); $assignmentdetails->allownonor = (int) $readassignment->getAllowNonOrSubmissions(); } // Get Peermark Assignments. $peermarkassignments = $readassignment->getPeermarkAssignments(); if (count($peermarkassignments)) { $peermarkids = array(); foreach ($peermarkassignments as $peermarkassignment) { $peermark = new stdClass(); $peermark->tiiassignid = $peermarkassignment->getAssignmentId(); $peermark->parent_tii_assign_id = $part->tiiassignid; $peermark->dtstart = strtotime($peermarkassignment->getStartDate()); $peermark->dtdue = strtotime($peermarkassignment->getDueDate()); $peermark->dtpost = strtotime($peermarkassignment->getFeedbackReleaseDate()); $peermark->maxmarks = (int) $peermarkassignment->getMaxGrade(); $peermark->title = $peermarkassignment->getTitle(); $peermark->instructions = $peermarkassignment->getInstructions(); $peermark->distributed_reviews = (int) $peermarkassignment->getDistributedReviews(); $peermark->selected_reviews = (int) $peermarkassignment->getSelectedReviews(); $peermark->self_review = (int) $peermarkassignment->getSelfReviewRequired(); $peermark->non_submitters_review = (int) $peermarkassignment->getNonSubmittersToReview(); $currentpeermark = $DB->get_record('turnitintooltwo_peermarks', array('tiiassignid' => $peermark->tiiassignid)); if ($currentpeermark) { $peermark->id = $currentpeermark->id; $DB->update_record('turnitintooltwo_peermarks', $peermark); } else { $peermark->id = $DB->insert_record('turnitintooltwo_peermarks', $peermark); } $peermarkids[] = $peermark->id; } list($notinsql, $notinparams) = $DB->get_in_or_equal($peermarkids, SQL_PARAMS_QM, 'param', false); $DB->delete_records_select('turnitintooltwo_peermarks', " parent_tii_assign_id = ? AND id " . $notinsql, array_merge(array($part->tiiassignid), $notinparams)); } else { $DB->delete_records('turnitintooltwo_peermarks', array('parent_tii_assign_id' => $part->tiiassignid)); } } if ($assignmentids == 0) { if (!($update = $DB->update_record('turnitintooltwo', $assignmentdetails))) { turnitintooltwo_activitylog(get_string('turnitintooltwoupdateerror', 'turnitintooltwo') . ' - ID: ' . $this->turnitintooltwo->id, 'API_ERROR'); } $_SESSION["assignment_updated"][$this->turnitintooltwo->id] = time(); } else { return array("turnitintooltwo" => $assignmentdetails, "parts" => $newparts); } } catch (Exception $e) { // We will use the locally stored assignment data if we can't connect to Turnitin. $turnitincomms->handle_exceptions($e, 'tiiassignmentgeterror', false); } }
/** * Get whether the student has accepted the Turnitin User agreement * * @return boolean */ public function get_accepted_user_agreement() { global $DB; $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); $user = new TiiUser(); $user->setUserId($this->tii_user_id); try { $response = $turnitincall->readUser($user); $readuser = $response->getUser(); if ($readuser->getAcceptedUserAgreement()) { $turnitintooltwouser = $DB->get_record('turnitintooltwo_users', array('userid' => $this->id)); $tii_userinfo = new stdClass(); $tii_userinfo->id = $turnitintooltwouser->id; $tii_userinfo->user_agreement_accepted = 1; $DB->update_record('turnitintooltwo_users', $tii_userinfo); return true; } else { return false; } } catch (Exception $e) { // User may not be joined to account so we'll join them and recall function $this->set_user_values_from_tii(); $this->get_accepted_user_agreement(); // $turnitincomms->handle_exceptions($e, 'tiiusergeterror'); } }
/** * Return the output for a form to launch the relevant LTi function * It is then submitted on load via Javascript * * @param string $userrole either Instructor or Learner * @param int $userid * @return output form */ public static function output_lti_form_launch($type, $userrole, $partid = 0, $classid = 0) { global $USER, $CFG; // Initialise Comms Object. $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); $user = new turnitintooltwo_user($USER->id, $userrole); $lti = new TiiLTI(); $lti->setUserId($user->tii_user_id); $lti->setRole($userrole); $lti->setFormTarget(''); switch ($type) { case "messages_inbox": $ltifunction = "outputMessagesForm"; break; case "rubric_manager": if ($classid != 0) { $lti->setClassId($classid); } $ltifunction = "outputRubricManagerForm"; break; case "rubric_view": $lti->setAssignmentId($partid); $ltifunction = "outputRubricViewForm"; break; case "quickmark_manager": $ltifunction = "outputQuickmarkManagerForm"; break; case "peermark_manager": $lti->setAssignmentId($partid); $ltifunction = "outputPeerMarkSetupForm"; break; case "peermark_reviews": $lti->setAssignmentId($partid); $ltifunction = "outputPeerMarkReviewForm"; break; } ob_start(); $turnitincall->{$ltifunction}($lti); $rubricform = ob_get_contents(); ob_end_clean(); return $rubricform; }
if (is_siteadmin()) { $data = turnitintooltwo_updateavailable($current_version); } echo json_encode($data); break; case "test_connection": if (!confirm_sesskey()) { throw new moodle_exception('invalidsesskey', 'error'); } $data = array("connection_status" => "fail", "msg" => get_string('connecttestcommerror', 'turnitintooltwo')); if (is_siteadmin()) { // Initialise API connection. $account_id = required_param('account_id', PARAM_RAW); $account_shared = required_param('account_shared', PARAM_RAW); $url = required_param('url', PARAM_RAW); $turnitincomms = new turnitintooltwo_comms($account_id, $account_shared, $url); $istestingconnection = true; // Provided by Androgogic to override offline mode for testing connection. $tiiapi = $turnitincomms->initialise_api($istestingconnection); $class = new TiiClass(); $class->setTitle('Test finding a class to see if connection works'); try { $response = $tiiapi->findClasses($class); $data["connection_status"] = "success"; $data["msg"] = get_string('connecttestsuccess', 'turnitintooltwo'); } catch (Exception $e) { $turnitincomms->handle_exceptions($e, 'connecttesterror', false); } } echo json_encode($data); break;
/** * Edit the submission in Turnitin so a tutor can see the identity of the student * * @param string $reason * @return boolean */ public function unanonymise_submission($reason) { // Get user and part details. $turnitintooltwoassignment = new turnitintooltwo_assignment($this->turnitintooltwoid); $partdetails = $turnitintooltwoassignment->get_part_details($this->submission_part); $user = new turnitintooltwo_user($this->userid); // Initialise Comms Object. $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); $submission = new TiiSubmission(); $submission->setSubmissionId($this->submission_objectid); $submission->setAssignmentId($partdetails->tiiassignid); if (strlen($reason) < 5) { $reason = "No specified reason: " . $reason; } $submission->setAnonymousRevealReason($reason); $submission->setAnonymousRevealUser($user->tii_user_id); $submission->setAnonymousRevealDateTime(date("c")); try { $turnitincall->updateSubmission($submission); return true; } catch (Exception $e) { $turnitincomms->handle_exceptions($e, "unanonymiseerror", false); return false; } }
/** * Gets the courses for this account from Turnitin. * * @param array $tiiintegrationids the integration ids we want courses from * @return array of data in a datatables readable format */ function turnitintooltwo_get_courses_from_tii($tiiintegrationids, $coursetitle, $courseintegration, $courseenddate = null, $requestsource = "mod") { global $CFG, $DB, $OUTPUT, $USER; set_time_limit(0); $_SESSION["stored_tii_courses"] = array(); $return = array(); $return["aaData"] = array(); $secho = optional_param('sEcho', 0, PARAM_INT); $ssortdir = optional_param('sSortDir_0', 'desc', PARAM_ALPHA); $isortcol = optional_param('iSortCol_0', '6', PARAM_INT); $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); $class = new TiiClass(); $class->setTitle($coursetitle); if ($courseenddate != null) { $class->setDateFrom(gmdate("Y-m-d", strtotime($courseenddate)) . 'T00:00:00Z'); } if (array_key_exists($courseintegration, $tiiintegrationids)) { $class->setIntegrationId($courseintegration); } if (!is_siteadmin()) { $turnitintooltwouser = new turnitintooltwo_user($USER->id, 'Instructor'); $tiiinstructorid = $turnitintooltwouser->tii_user_id; $class->setUserId($tiiinstructorid); $class->setUserRole('Instructor'); } try { $response = $turnitincall->findClasses($class); $findclass = $response->getClass(); $classids = $findclass->getClassIds(); } catch (Exception $e) { turnitintooltwo_activitylog(get_string('migrationcoursegeterror', 'turnitintooltwo'), "REQUEST"); $classids = array(); } // Get currently linked courses. $currentcourses = array(); if (!empty($classids)) { list($insql, $inparams) = $DB->get_in_or_equal($classids); $currentcourses["PP"] = $DB->get_records_sql("SELECT tc.turnitin_cid FROM {turnitintooltwo_courses} tc " . "RIGHT JOIN {course} c ON c.id = tc.courseid " . "WHERE tc.course_type = 'PP' AND tc.turnitin_cid " . $insql, $inparams); $currentcourses["TT"] = $DB->get_records_sql("SELECT tc.turnitin_cid FROM {turnitintooltwo_courses} tc " . "RIGHT JOIN {course} c ON c.id = tc.courseid " . "WHERE tc.course_type = 'TT' AND tc.turnitin_cid " . $insql, $inparams); } $class = new TiiClass(); $class->setClassIds($classids); $tiicourses = array(); $i = 0; if (!empty($classids)) { try { $response = $turnitincall->readClasses($class); $readclasses = $response->getClasses(); foreach ($readclasses as $readclass) { if (array_key_exists($readclass->getIntegrationId(), $tiiintegrationids)) { $_SESSION["stored_tii_courses"][$readclass->getClassId()] = $readclass->getTitle(); // If we're coming from block we don't need any information, just the number of records if ($requestsource == "mod") { $linkpage = is_siteadmin() ? "settings_extras.php" : "extras.php"; $titlecell = html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/' . $linkpage . '?cmd=class_recreation&id=' . $readclass->getClassId() . '&view_context=box&sesskey=' . sesskey(), $readclass->getTitle(), array("class" => "course_recreate", "id" => "course_" . $readclass->getClassId())); $datecell = html_writer::link('.edit_course_end_date_form', html_writer::tag('span', userdate(strtotime($readclass->getEndDate()), get_string('strftimedate', 'langconfig')), array("id" => $readclass->getClassId() . "_" . gmdate("j", strtotime($readclass->getEndDate())) . "_" . gmdate("n", strtotime($readclass->getEndDate())) . "_" . gmdate("Y", strtotime($readclass->getEndDate())))) . " " . $OUTPUT->pix_icon('edit', get_string('edit'), 'mod_turnitintooltwo'), array("class" => "edit_course_end_link", "id" => "course_date_" . $readclass->getClassId())); $checkbox = ''; $class = ''; if (empty($currentcourses["PP"][$readclass->getClassId()]) && empty($currentcourses["TT"][$readclass->getClassId()])) { $class = 'hidden_class'; $checkbox = html_writer::checkbox('check_' . $readclass->getClassId(), $readclass->getClassId(), false, '', array("class" => "browser_checkbox")); } $moodlecell = $OUTPUT->pix_icon('tick', get_string('moodlelinked', 'turnitintooltwo'), 'mod_turnitintooltwo', array('class' => $class, 'id' => 'tick_' . $readclass->getClassId())); $tiicourses[$i] = array($checkbox, $titlecell, $tiiintegrationids[$readclass->getIntegrationId()], $datecell, $readclass->getClassId(), $moodlecell, $readclass->getTitle(), userdate(strtotime($readclass->getEndDate()), get_string('strftimedate', 'langconfig'))); } $i++; // Keep course names in case of course recreation. $_SESSION['tii_classes'][$readclass->getClassId()] = $readclass->getTitle(); } } if (count($tiicourses) > 0 && $requestsource == "mod") { turnitintooltwo_sort_array($tiicourses, $isortcol, $ssortdir); $j = 0; foreach ($tiicourses as $class) { $return["aaData"][$j] = $class; $j++; } } } catch (Exception $e) { $turnitincomms->handle_exceptions($e, 'coursegettiierror'); } } $return["iTotalRecords"] = $i; $return["iTotalDisplayRecords"] = $i; $return["sEcho"] = $secho; $return["blockHTML"] = $i == 0 ? '' : get_string('coursestomigrate', 'mod_turnitintooltwo', $i); return $return; }
/** * Delete a submission from Turnitin */ private function delete_tii_submission($submissionid) { // Initialise Comms Object. $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); $submission = new TiiSubmission(); $submission->setSubmissionId($submissionid); try { $response = $turnitincall->deleteSubmission($submission); } catch (Exception $e) { $turnitincomms->handle_exceptions($e, 'turnitindeletionerror'); } }