protected function process_turnitintooltwo($data) { global $DB; $config = turnitintooltwo_admin_config(); $_SESSION['tii_assignment_reset'] = 1; if ($this->get_setting_value('userinfo') == 1) { $_SESSION['tii_course_reset'] = 0; $_SESSION['tii_assignment_reset'] = 0; } $data = (object) $data; $oldid = $data->id; $data->course = $this->get_courseid(); // Work out whether we are duplicating a module activity or course. // If activity then we do not want to reset the course. $type = $this->get_task()->get_info()->type; if ($type == 'activity') { $_SESSION['tii_course_reset'] = 0; } if ($data->grade < 0) { // scale found, get mapping $data->grade = -$this->get_mappingid('scale', abs($data->grade)); } if ($config->accountid != $data->tiiaccount) { $a = new stdClass(); $a->backupid = $data->tiiaccount; $a->current = $config->accountid; turnitintooltwo_print_error('wrongaccountid', 'turnitintooltwo', NULL, $a); return false; } else { // insert the activity record $newitemid = $DB->insert_record('turnitintooltwo', $data); $_SESSION['assignment_id'] = $newitemid; // immediately after inserting "activity" record, call this $this->apply_activity_instance($newitemid); } }
if (!$istutor) { turnitintooltwo_print_error('permissiondeniederror', 'turnitintooltwo'); exit; } $introtext = $do == "tutors" ? get_string('turnitintutors_desc', 'turnitintooltwo') : get_string('turnitinstudents_desc', 'turnitintooltwo'); echo $OUTPUT->box($introtext, 'generalbox boxaligncenter', 'general'); $memberrole = $do == "tutors" ? 'Instructor' : 'Learner'; echo $turnitintooltwoview->init_tii_member_by_role_table($cm, $turnitintooltwoassignment, $memberrole); if ($do == "tutors") { $tutors = $turnitintooltwoassignment->get_tii_users_by_role("Instructor"); echo $turnitintooltwoview->show_add_tii_tutors_form($cm, $tutors); } break; case "emailnonsubmittersform": if (!$istutor) { turnitintooltwo_print_error('permissiondeniederror', 'turnitintooltwo'); exit; } $output = ''; if (isset($_SESSION["embeddednotice"])) { $output = html_writer::tag("div", $_SESSION["embeddednotice"]["message"], array('class' => 'general_warning')); unset($_SESSION["embeddednotice"]); } $elements = array(); $elements[] = array('header', 'nonsubmitters_header', get_string('emailnonsubmitters', 'turnitintooltwo')); $elements[] = array('static', 'nonsubmittersformdesc', get_string('nonsubmittersformdesc', 'turnitintooltwo'), '', ''); $elements[] = array('text', 'nonsubmitters_subject', get_string('nonsubmitterssubject', 'turnitintooltwo'), '', '', 'required', get_string('nonsubmitterssubjecterror', 'turnitintooltwo'), PARAM_TEXT); $elements[] = array('textarea', 'nonsubmitters_message', get_string('nonsubmittersmessage', 'turnitintooltwo'), '', '', 'required', get_string('nonsubmittersmessageerror', 'turnitintooltwo'), PARAM_TEXT); $elements[] = array('advcheckbox', 'nonsubmitters_sendtoself', get_string('nonsubmitterssendtoself', 'turnitintooltwo'), '', array(0, 1)); $customdata["checkbox_label_after"] = true; $elements[] = array('hidden', 'id', $cm->id);
/** * Edit the assignment in Moodle then on Turnitin * * @global type $USER * @global type $DB * @param boolean $createevent - setting to determine whether to create a calendar event. * @return boolean */ public function edit_moodle_assignment($createevent = true) { global $USER, $DB, $CFG; $config = turnitintooltwo_admin_config(); $this->turnitintooltwo->id = $this->id; $this->turnitintooltwo->timemodified = time(); // Get Moodle Course Object. $course = $this->get_course_data($this->turnitintooltwo->course); // Get the Turnitin owner of this this Course or make user the owner if none. $ownerid = $this->get_tii_owner($course->id); if (!empty($ownerid)) { $owner = new turnitintooltwo_user($ownerid, 'Instructor'); } else { $owner = new turnitintooltwo_user($USER->id, 'Instructor'); } // Edit course in Turnitin. $this->edit_tii_course($course); $course->turnitin_ctl = $course->fullname . " (Moodle TT)"; // Get Current Moodle Turnitin Tool data (Assignment). if (!($turnitintooltwonow = $DB->get_record("turnitintooltwo", array("id" => $this->id)))) { turnitintooltwo_print_error('turnitintooltwogeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } // Get Current Moodle Turnitin Tool Parts Object. if (!($parts = $DB->get_records_select("turnitintooltwo_parts", " turnitintooltwoid = ? ", array($this->id), 'id ASC'))) { turnitintooltwo_print_error('partgeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } $partids = array_keys($parts); // Update GradeMark setting depending on config setting. $this->turnitintooltwo->usegrademark = $config->usegrademark; // Set the checkbox settings for updates. $this->turnitintooltwo->erater_spelling = isset($this->turnitintooltwo->erater_spelling) ? $this->turnitintooltwo->erater_spelling : 0; $this->turnitintooltwo->erater_grammar = isset($this->turnitintooltwo->erater_grammar) ? $this->turnitintooltwo->erater_grammar : 0; $this->turnitintooltwo->erater_usage = isset($this->turnitintooltwo->erater_usage) ? $this->turnitintooltwo->erater_usage : 0; $this->turnitintooltwo->erater_mechanics = isset($this->turnitintooltwo->erater_mechanics) ? $this->turnitintooltwo->erater_mechanics : 0; $this->turnitintooltwo->erater_style = isset($this->turnitintooltwo->erater_style) ? $this->turnitintooltwo->erater_style : 0; $this->turnitintooltwo->transmatch = isset($this->turnitintooltwo->transmatch) ? $this->turnitintooltwo->transmatch : 0; $this->turnitintooltwo->institution_check = isset($this->turnitintooltwo->institution_check) ? $this->turnitintooltwo->institution_check : 0; // Update each individual part. for ($i = 1; $i <= $this->turnitintooltwo->numparts; $i++) { // Update Turnitin Assignment. $assignment = new TiiAssignment(); $assignment->setClassId($course->turnitin_cid); $assignment->setAuthorOriginalityAccess($this->turnitintooltwo->studentreports); $assignment->setRubricId(!empty($this->turnitintooltwo->rubric) ? $this->turnitintooltwo->rubric : ''); $assignment->setSubmitPapersTo($this->turnitintooltwo->submitpapersto); $assignment->setResubmissionRule($this->turnitintooltwo->reportgenspeed); $assignment->setBibliographyExcluded($this->turnitintooltwo->excludebiblio); $assignment->setQuotedExcluded($this->turnitintooltwo->excludequoted); $assignment->setSmallMatchExclusionType($this->turnitintooltwo->excludetype); $assignment->setSmallMatchExclusionThreshold((int) $this->turnitintooltwo->excludevalue); $assignment->setLateSubmissionsAllowed($this->turnitintooltwo->allowlate); if ($config->repositoryoption == 1) { $assignment->setInstitutionCheck(isset($this->turnitintooltwo->institution_check) ? $this->turnitintooltwo->institution_check : 0); } $attribute = "maxmarks" . $i; $assignment->setMaxGrade($this->turnitintooltwo->{$attribute}); $assignment->setSubmittedDocumentsCheck($this->turnitintooltwo->spapercheck); $assignment->setInternetCheck($this->turnitintooltwo->internetcheck); $assignment->setPublicationsCheck($this->turnitintooltwo->journalcheck); $assignment->setTranslatedMatching($this->turnitintooltwo->transmatch); $assignment->setAllowNonOrSubmissions($this->turnitintooltwo->allownonor); // Erater settings. $assignment->setErater(isset($this->turnitintooltwo->erater) ? $this->turnitintooltwo->erater : 0); $assignment->setEraterSpelling($this->turnitintooltwo->erater_spelling); $assignment->setEraterGrammar($this->turnitintooltwo->erater_grammar); $assignment->setEraterUsage($this->turnitintooltwo->erater_usage); $assignment->setEraterMechanics($this->turnitintooltwo->erater_mechanics); $assignment->setEraterStyle($this->turnitintooltwo->erater_style); $assignment->setEraterSpellingDictionary(isset($this->turnitintooltwo->erater_dictionary) ? $this->turnitintooltwo->erater_dictionary : 'en_US'); $assignment->setEraterHandbook(isset($this->turnitintooltwo->erater_handbook) ? $this->turnitintooltwo->erater_handbook : 0); $attribute = "dtstart" . $i; $assignment->setStartDate(gmdate("Y-m-d\\TH:i:s\\Z", $this->turnitintooltwo->{$attribute})); $attribute = "dtdue" . $i; $assignment->setDueDate(gmdate("Y-m-d\\TH:i:s\\Z", $this->turnitintooltwo->{$attribute})); $attribute = "dtpost" . $i; $assignment->setFeedbackReleaseDate(gmdate("Y-m-d\\TH:i:s\\Z", $this->turnitintooltwo->{$attribute})); $attribute = "partname" . $i; $assignment->setTitle($this->turnitintooltwo->name . " " . $this->turnitintooltwo->{$attribute} . " (Moodle TT)"); // Initialise part. $part = new stdClass(); $part->turnitintooltwoid = $this->id; $part->partname = $this->turnitintooltwo->{$attribute}; $part->deleted = 0; $part->maxmarks = $assignment->getMaxGrade(); $part->dtstart = strtotime($assignment->getStartDate()); $part->dtdue = strtotime($assignment->getDueDate()); $part->dtpost = strtotime($assignment->getFeedbackReleaseDate()); $parttiiassignid = 0; if ($i <= count($partids) && !empty($partids[$i - 1])) { $partdetails = $this->get_part_details($partids[$i - 1]); $part->submitted = $partdetails->submitted; $part->unanon = $partdetails->unanon; // Set anonymous marking depending on whether part has been unanonymised. if ($config->useanon && $partdetails->unanon != 1) { $assignment->setAnonymousMarking($this->turnitintooltwo->anon); } $parttiiassignid = $partdetails->tiiassignid; } if ($parttiiassignid > 0) { $assignment->setAssignmentId($parttiiassignid); $this->edit_tii_assignment($assignment); } else { $parttiiassignid = $this->create_tii_assignment($assignment, $this->id, $i); $part->submitted = 0; } $part->tiiassignid = $parttiiassignid; // Unanonymise part if necessary. if ($part->dtpost < time() && $part->submitted == 1) { $part->unanon = 1; } $properties = new stdClass(); $properties->name = $this->turnitintooltwo->name . ' - ' . $part->partname; $properties->description = $this->turnitintooltwo->intro; $properties->courseid = $this->turnitintooltwo->course; $properties->groupid = 0; $properties->userid = 0; $properties->modulename = 'turnitintooltwo'; $properties->instance = $this->id; $properties->eventtype = 'due'; $properties->timestart = $part->dtdue; $properties->timeduration = 0; if ($i <= count($partids) && !empty($partdetails->id)) { $part->id = $partids[$i - 1]; // Get Current Moodle part data. if (!($partnow = $DB->get_record("turnitintooltwo_parts", array("id" => $part->id)))) { turnitintooltwo_print_error('partgeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } if (!($dbpart = $DB->update_record('turnitintooltwo_parts', $part))) { turnitintooltwo_print_error('partupdateerror', 'turnitintooltwo', null, $i, __FILE__, __LINE__); exit; } else { turnitintooltwo_activitylog("Moodle Assignment part updated (" . $part->id . ") - " . $part->partname, "REQUEST"); } // Delete existing events for this assignment part. $eventname = $turnitintooltwonow->name . " - " . $partnow->partname; $dbselect = " modulename = ? AND instance = ? AND name LIKE ? "; // Moodle pre 2.5 on SQL Server errors here as queries weren't allowed on ntext fields, the relevant fields // are nvarchar from 2.6 onwards so we have to cast the relevant fields in pre 2.5 SQL Server setups. if ($CFG->branch <= 25 && $CFG->dbtype == "sqlsrv") { $dbselect = " CAST(modulename AS nvarchar(max)) = ? AND instance = ? AND CAST(name AS nvarchar(max)) = ? "; } $DB->delete_records_select('event', $dbselect, array('turnitintooltwo', $this->id, $eventname)); } else { if (!($dbpart = $DB->insert_record('turnitintooltwo_parts', $part))) { turnitintooltwo_print_error('partdberror', 'turnitintooltwo', null, $i, __FILE__, __LINE__); exit; } } if ($createevent == true) { require_once $CFG->dirroot . '/calendar/lib.php'; $event = new calendar_event($properties); $event->update($properties, false); } } $this->turnitintooltwo->timemodified = time(); $update = $DB->update_record("turnitintooltwo", $this->turnitintooltwo); turnitintooltwo_activitylog("Turnitintool updated (" . $this->id . ") - " . $this->turnitintooltwo->name, "REQUEST"); // Define grade settings. if (!isset($_SESSION['tii_assignment_reset'])) { turnitintooltwo_grade_item_update($this->turnitintooltwo); } return $update; }
/** * Save the link between the moodle user and Turnitin * * @global type $DB * @return void */ private function save_tii_user() { global $DB; $user = new stdClass(); $user->userid = $this->id; $user->turnitin_uid = $this->tii_user_id; $user->turnitin_utp = 1; if ($this->role == "Instructor") { $user->turnitin_utp = 2; } if ($turnitintooltwouser = $DB->get_record("turnitintooltwo_users", array("userid" => $this->id))) { $user->id = $turnitintooltwouser->id; $user->turnitin_utp = $turnitintooltwouser->turnitin_utp; if (!$DB->update_record('turnitintooltwo_users', $user)) { if ($this->workflowcontext != "cron") { turnitintooltwo_print_error('userupdateerror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } } } else { if (!($insertid = $DB->insert_record('turnitintooltwo_users', $user))) { if ($this->workflowcontext != "cron") { turnitintooltwo_print_error('userupdateerror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } } } }
if ($id != 0) { //Pre 2.8 does not have the function get_course_and_cm_from_cmid. if ($CFG->branch >= 28) { list($course, $cm) = get_course_and_cm_from_cmid($id, 'turnitintooltwo'); } else { $cm = get_coursemodule_from_id('turnitintooltwo', $id, 0, false, MUST_EXIST); $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); } if (!$cm) { turnitintooltwo_print_error('coursemodidincorrect', 'turnitintooltwo'); } if (!($course = $DB->get_record("course", array("id" => $cm->course)))) { turnitintooltwo_print_error('coursemisconfigured', 'turnitintooltwo'); } if (!($turnitintooltwo = $DB->get_record("turnitintooltwo", array("id" => $cm->instance)))) { turnitintooltwo_print_error('coursemodincorrect', 'turnitintooltwo'); } $PAGE->set_context(context_module::instance($cm->id)); $PAGE->set_pagelayout('base'); require_login($course->id, true, $cm); } else { $PAGE->set_context(context_system::instance()); require_login(); } // Load Javascript and CSS. $turnitintooltwoview->load_page_components($hidebg); // Configure URL correctly. $urlparams = array('cmd' => $cmd, 'view_context' => $viewcontext); if ($id != 0) { $urlparams['id'] = $id; }
/** * Log API exceptions and print error to screen if required * * @param object $e * @param string $tterrorstr * @param boolean $toscreen */ public static function handle_exceptions($e, $tterrorstr = "", $toscreen = true, $embedded = false) { $errorstr = ""; if (!empty($tterrorstr)) { $errorstr = get_string($tterrorstr, 'turnitintooltwo') . "<br/><br/>"; if ($embedded == true) { $errorstr .= get_string('tii_submission_failure', 'turnitintooltwo') . "<br/><br/>"; } } if (is_callable(array($e, 'getFaultCode'))) { $errorstr .= get_string('faultcode', 'turnitintooltwo') . ": " . $e->getFaultCode() . " | "; } if (is_callable(array($e, 'getFile'))) { $errorstr .= get_string('file') . ": " . $e->getFile() . " | "; } if (is_callable(array($e, 'getLine'))) { $errorstr .= get_string('line', 'turnitintooltwo') . ": " . $e->getLine() . " | "; } if (is_callable(array($e, 'getMessage'))) { $errorstr .= get_string('message', 'turnitintooltwo') . ": " . $e->getMessage() . " | "; } if (is_callable(array($e, 'getCode'))) { $errorstr .= get_string('code', 'turnitintooltwo') . ": " . $e->getCode(); } turnitintooltwo_activitylog($errorstr, "API_ERROR"); if ($toscreen) { turnitintooltwo_print_error($errorstr, null); } else { if ($embedded) { return $errorstr; } } }
/** * Get full submission details and work out overall grade * * @global type $DB * @param type $turnitintooltwoassignment * @param type $submission_id * @param type $id_type * @return type */ private function get_submission_details($idtype = "moodle", $turnitintooltwoassignment = "") { global $DB; if ($idtype == "moodle") { $condition = array("id" => $this->id); } else { $condition = array("submission_objectid" => $this->submission_objectid); } if ($submission = $DB->get_record('turnitintooltwo_submissions', $condition, '*', IGNORE_MULTIPLE)) { if (empty($turnitintooltwoassignment)) { $turnitintooltwoassignment = new turnitintooltwo_assignment($submission->turnitintooltwoid); $this->turnitintooltwoid = $turnitintooltwoassignment->turnitintooltwo->id; } if (count($turnitintooltwoassignment->get_parts() > 1)) { if ($submission->userid != 0) { $usersubmissions = $turnitintooltwoassignment->get_user_submissions($submission->userid, $submission->turnitintooltwoid); $useroverallgrade = $turnitintooltwoassignment->get_overall_grade($usersubmissions); if ($turnitintooltwoassignment->turnitintooltwo->grade == 0 or $useroverallgrade === '--') { $this->overall_grade = '--'; } else { if ($turnitintooltwoassignment->turnitintooltwo->grade < 0) { // Scale. $scale = $DB->get_record('scale', array('id' => $turnitintooltwoassignment->turnitintooltwo->grade * -1)); $scalearray = explode(",", $scale->scale); // Array is zero indexed, Scale positions are from 1 upward. $index = $useroverallgrade - 1; $this->overall_grade = $scalearray[$index]; } else { $this->overall_grade = round($useroverallgrade / $turnitintooltwoassignment->turnitintooltwo->grade * 100, 1) . '%'; } } } else { $this->overall_grade = '--'; } } foreach ($submission as $field => $value) { $this->{$field} = $value; } if ($submission->userid > 0) { $user = $DB->get_record('user', array('id' => $submission->userid), 'firstname, lastname'); $this->firstname = $user->firstname; $this->lastname = $user->lastname; $this->fullname = fullname($user); $this->nmoodle = 0; } else { $this->firstname = $submission->submission_nmfirstname; $this->lastname = $submission->submission_nmlastname; $tmpuser = new stdClass(); $tmpuser->firstname = $submission->submission_nmfirstname; $tmpuser->lastname = $submission->submission_nmlastname; $this->fullname = fullname($tmpuser); $this->nmoodle = 1; } } else { if ($idtype == "moodle") { turnitintooltwo_print_error('submissiongeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__); } } }
/** * Function called by course/reset.php when resetting moodle course, this is used to duplicate or reset a courses Turnitin * activities. If action specified is 'NEWCLASS' we are creating a new class on Turnitin. For both actions we create new * assignments on Turnitin and replace the turnitin ids for those parts in the database. * * @global object * @param var $courseid The course ID for the course to reset * @param string $action The action to use OLDCLASS or NEWCLASS * @return array The status array to pass to turnitintooltwo_reset_userdata */ function turnitintooltwo_duplicate_recycle($courseid, $action) { set_time_limit(0); global $DB, $USER; $config = turnitintooltwo_admin_config(); $partsarray = array(); $error = false; $turnitintooltwouser = new turnitintooltwo_user($USER->id, "Instructor"); $turnitintooltwouser->set_user_values_from_tii(); $instructorrubrics = $turnitintooltwouser->get_instructor_rubrics(); if (!($turnitintooltwos = $DB->get_records('turnitintooltwo', array('course' => $courseid)))) { turnitintooltwo_print_error('assigngeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } if (!($course = $DB->get_record('course', array('id' => $courseid)))) { turnitintooltwo_print_error('coursegeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } foreach ($turnitintooltwos as $turnitintooltwo) { if (!($parts = $DB->get_records('turnitintooltwo_parts', array('turnitintooltwoid' => $turnitintooltwo->id, 'deleted' => 0)))) { turnitintooltwo_print_error('partgeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } foreach ($parts as $part) { $partsarray[$courseid][$turnitintooltwo->id][$part->id]['tiiassignid'] = $part->tiiassignid; } } $currentcourse = turnitintooltwo_assignment::get_course_data($courseid); if ($action == "NEWCLASS") { // Delete Turnitin class link. if (!($delete = $DB->delete_records('turnitintooltwo_courses', array('courseid' => $courseid)))) { turnitintooltwo_print_error('coursedeleteerror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } $currentcourse->tii_rel_id = ''; // Create a new class to use with new parts. $tmpassignment = new turnitintooltwo_assignment(0, '', ''); $newcourse = $tmpassignment->create_tii_course($currentcourse, $USER->id); // Join Instructor to class. $turnitintooltwouser->join_user_to_class($newcourse->turnitin_cid); $currentcourse->turnitin_cid = $newcourse->turnitin_cid; $currentcourse->turnitin_ctl = $newcourse->turnitin_ctl; } // Create array of all the Turnitin assignment ids. $assignmentids = array(); foreach ($partsarray[$courseid] as $tiitoolid => $tiitool) { foreach ($tiitool as $partid => $data) { $assignmentids[] = $data['tiiassignid']; } } // Update all the assignments and parts from Turnitin. $turnitintooltwoassignment = new turnitintooltwo_assignment(0, '', ''); $turnitintooltwoassignment->update_assignment_from_tii($assignmentids); // Loop through Turnitintool instances and re-create assignment on Turnitin then swap over the stored Turnitin ids. foreach ($partsarray[$courseid] as $tiitoolid => $tiitool) { $turnitintooltwoassignment = new turnitintooltwo_assignment($tiitoolid); // Create new Assignment parts on Turnitin. $i = 0; foreach ($tiitool as $partid => $data) { $i++; $assignment = new TiiAssignment(); $assignment->setClassId($currentcourse->turnitin_cid); $assignment->setAuthorOriginalityAccess($turnitintooltwoassignment->turnitintooltwo->studentreports); $rubric_id = !empty($turnitintooltwoassignment->turnitintooltwo->rubric) ? $turnitintooltwoassignment->turnitintooltwo->rubric : ''; $rubric_id = !empty($rubric_id) && array_key_exists($rubric_id, $instructorrubrics) ? $rubric_id : ''; $assignment->setRubricId($rubric_id); $assignment->setSubmitPapersTo($turnitintooltwoassignment->turnitintooltwo->submitpapersto); $assignment->setResubmissionRule($turnitintooltwoassignment->turnitintooltwo->reportgenspeed); $assignment->setBibliographyExcluded($turnitintooltwoassignment->turnitintooltwo->excludebiblio); $assignment->setQuotedExcluded($turnitintooltwoassignment->turnitintooltwo->excludequoted); $assignment->setSmallMatchExclusionType($turnitintooltwoassignment->turnitintooltwo->excludetype); $assignment->setSmallMatchExclusionThreshold((int) $turnitintooltwoassignment->turnitintooltwo->excludevalue); if ($config->useanon) { $assignment->setAnonymousMarking($turnitintooltwoassignment->turnitintooltwo->anon); } $assignment->setLateSubmissionsAllowed($turnitintooltwoassignment->turnitintooltwo->allowlate); if ($config->repositoryoption == 1) { $assignment->setInstitutionCheck(isset($turnitintooltwoassignment->turnitintooltwo->institution_check) ? $turnitintooltwoassignment->turnitintooltwo->institution_check : 0); } $attribute = "maxmarks" . $i; $assignment->setMaxGrade($turnitintooltwoassignment->turnitintooltwo->{$attribute}); $assignment->setSubmittedDocumentsCheck($turnitintooltwoassignment->turnitintooltwo->spapercheck); $assignment->setInternetCheck($turnitintooltwoassignment->turnitintooltwo->internetcheck); $assignment->setPublicationsCheck($turnitintooltwoassignment->turnitintooltwo->journalcheck); $assignment->setTranslatedMatching($turnitintooltwoassignment->turnitintooltwo->transmatch); $assignment->setAllowNonOrSubmissions($turnitintooltwoassignment->turnitintooltwo->allownonor); // Erater settings. $assignment->setErater(isset($turnitintooltwoassignment->turnitintooltwo->erater) ? $turnitintooltwoassignment->turnitintooltwo->erater : 0); $assignment->setEraterSpelling($turnitintooltwoassignment->turnitintooltwo->erater_spelling); $assignment->setEraterGrammar($turnitintooltwoassignment->turnitintooltwo->erater_grammar); $assignment->setEraterUsage($turnitintooltwoassignment->turnitintooltwo->erater_usage); $assignment->setEraterMechanics($turnitintooltwoassignment->turnitintooltwo->erater_mechanics); $assignment->setEraterStyle($turnitintooltwoassignment->turnitintooltwo->erater_style); $assignment->setEraterSpellingDictionary(isset($turnitintooltwoassignment->turnitintooltwo->erater_dictionary) ? $turnitintooltwoassignment->turnitintooltwo->erater_dictionary : 'en_US'); $assignment->setEraterHandbook(isset($turnitintooltwoassignment->turnitintooltwo->erater_handbook) ? $turnitintooltwoassignment->turnitintooltwo->erater_handbook : 0); $attribute = "dtstart" . $i; $assignment->setStartDate(gmdate("Y-m-d\\TH:i:s\\Z", $turnitintooltwoassignment->turnitintooltwo->{$attribute})); $attribute = "dtdue" . $i; $assignment->setDueDate(gmdate("Y-m-d\\TH:i:s\\Z", $turnitintooltwoassignment->turnitintooltwo->{$attribute})); $attribute = "dtpost" . $i; $assignment->setFeedbackReleaseDate(gmdate("Y-m-d\\TH:i:s\\Z", $turnitintooltwoassignment->turnitintooltwo->{$attribute})); $attribute = "partname" . $i; $assignment->setTitle($turnitintooltwoassignment->turnitintooltwo->name . " " . $turnitintooltwoassignment->turnitintooltwo->{$attribute} . " (Moodle TT)"); $partassignid = $turnitintooltwoassignment->create_tii_assignment($assignment, $turnitintooltwoassignment->turnitintooltwo->id, $i); if (empty($partassignid)) { turnitintooltwo_activitylog("Moodle Assignment could not be created (" . $turnitintooltwoassignment->id . ") - " . $turnitintooltwoassignment->turnitintooltwo->name, "REQUEST"); $error = true; } $part = new stdClass(); $part->id = $partid; $part->tiiassignid = $partassignid; $part->turnitintooltwoid = $turnitintooltwoassignment->turnitintooltwo->id; $part->partname = $turnitintooltwoassignment->turnitintooltwo->{$attribute}; $part->deleted = 0; $part->maxmarks = $assignment->getMaxGrade(); $part->dtstart = strtotime($assignment->getStartDate()); $part->dtdue = strtotime($assignment->getDueDate()); $part->dtpost = strtotime($assignment->getFeedbackReleaseDate()); if (!($dbpart = $DB->update_record('turnitintooltwo_parts', $part))) { turnitintooltwo_print_error('partupdateerror', 'turnitintooltwo', null, $i, __FILE__, __LINE__); exit; } else { turnitintooltwo_activitylog("Moodle Assignment part updated (" . $part->id . ")", "REQUEST"); } if (!($delete = $DB->delete_records('turnitintooltwo_submissions', array('submission_part' => $partid)))) { turnitintooltwo_print_error('submissiondeleteerror', 'turnitintooltwo', null, null, __FILE__, __LINE__); exit; } } } $item = $action == "NEWCLASS" ? get_string('copyassigndata', 'turnitintooltwo') : get_string('replaceassigndata', 'turnitintooltwo'); $status[] = array('component' => get_string('modulenameplural', 'turnitintooltwo'), 'item' => $item, 'error' => $error); return $status; }
/** * If there is no submission record then we are creating one. Text content should be submitted. * If a file has already been submitted then check whether the identifier is the same, if it is do nothing. * If it's not then either edit submission or create new one depending on module settings. */ public function tii_submission($cm, $tiiassignmentid, $user, $submitter, $identifier, $submissiontype, $itemid = 0, $title = '', $textcontent = '', $cronerror = '') { global $CFG, $DB, $USER, $turnitinacceptedfiles; // Instantiate error code $errorcode = 0; // Get config, module and course settings that we need. $config = turnitintooltwo_admin_config(); $settings = $this->get_settings($cm->id); $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance)); $coursedata = $this->get_course_data($cm->id, $cm->course, 'cron'); // Update user's details on Turnitin. $user->edit_tii_user(); // Clean up old Turnitin submission files. if ($itemid != 0 && $submissiontype == 'file' && $cm->modname != 'forum') { $this->clean_old_turnitin_submissions($cm, $user->id, $itemid, $submissiontype, $identifier, $user); } // Work out submission method. // If this file has successfully submitted in the past then break, text content is to be submitted. switch ($submissiontype) { case 'file': case 'text_content': // Get file data or prepare text submission. if ($submissiontype == 'file') { $fs = get_file_storage(); $file = $fs->get_file_by_hash($identifier); $title = $file->get_filename(); $timemodified = $file->get_timemodified(); $filename = $file->get_filename(); try { $textcontent = $file->get_content(); } catch (Exception $e) { turnitintooltwo_activitylog('File content not found on submission: ' . $pathnamehash, 'PP_NO_FILE'); mtrace($e); mtrace('File content not found on submission. pathnamehash: ' . $pathnamehash); $errorcode = 9; } } else { // Check when text submission was last modified. switch ($cm->modname) { case 'assign': $moodlesubmission = $DB->get_record('assign_submission', array('assignment' => $cm->instance, 'userid' => $user->id, 'id' => $itemid), 'timemodified'); break; case 'workshop': $moodlesubmission = $DB->get_record('workshop_submissions', array('workshopid' => $cm->instance, 'authorid' => $user->id), 'timemodified'); break; } $title = !empty($title) ? $title : 'onlinetext_' . $user->id . "_" . $cm->id . "_" . $cm->instance . '.txt'; $filename = substr($title, -4) == '.txt' ? $title : $title . '.txt'; $textcontent = strip_tags($textcontent); $timemodified = $moodlesubmission->timemodified; } // Get submission method depending on whether there has been a previous submission. $submissionfields = 'id, cm, externalid, identifier, statuscode, lastmodified, attempt'; $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype "; // Double check there is only one submission. $previoussubmissions = $DB->get_records_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND " . $typefield . " = ? AND identifier = ? ", array($cm->id, $user->id, $submissiontype, $identifier), 'id', $submissionfields); $previoussubmission = end($previoussubmissions); if ($previoussubmission) { // Don't submit if submission hasn't changed. if (in_array($previoussubmission->statuscode, array("success", "error")) && $timemodified <= $previoussubmission->lastmodified) { return true; } else { if ($settings["plagiarism_report_gen"] > 0) { // Replace if Turnitin assignment allows resubmissions or create if we have no Turnitin id stored. $submissionid = $previoussubmission->id; $apimethod = is_null($previoussubmission->externalid) ? "createSubmission" : "replaceSubmission"; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $apimethod = "createSubmission"; if ($previoussubmission->statuscode != "success") { $submissionid = $previoussubmission->id; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } } } } else { // Check if there is previous submission of text content which we will replace $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype "; if ($submissiontype == 'text_content' && ($previoussubmission = $DB->get_record_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND " . $typefield . " = ? ", array($cm->id, $user->id, 'text_content'), 'id, cm, externalid, identifier, statuscode, lastmodified, attempt', 0, 1))) { $submissionid = $previoussubmission->id; $apimethod = is_null($previoussubmission->externalid) || $settings["plagiarism_report_gen"] == 0 ? "createSubmission" : "replaceSubmission"; // Delete old text content submissions from Turnitin if not replacing. if ($settings["plagiarism_report_gen"] == 0 && !is_null($previoussubmission->externalid)) { $this->delete_tii_submission($cm, $previoussubmission->externalid, $user); } $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $apimethod = "createSubmission"; $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } } // Remove any old text submissions here if there are any as there is only one per submission if ($itemid != 0 && $submissiontype == "text_content") { $this->clean_old_turnitin_submissions($cm, $user->id, $itemid, $submissiontype, $identifier, $user); } break; case 'forum_post': if ($previoussubmissions = $DB->get_records_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND identifier = ? ", array($cm->id, $user->id, $identifier), 'id DESC', 'id, cm, externalid, identifier, statuscode, attempt', 0, 1)) { $previoussubmission = current($previoussubmissions); if ($previoussubmission->statuscode == "success") { return true; } else { $submissionid = $previoussubmission->id; $apimethod = "replaceSubmission"; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } } else { $apimethod = "createSubmission"; $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } $forum_post = $DB->get_record_select('forum_posts', " userid = ? AND id = ? ", array($user->id, $itemid)); $textcontent = strip_tags($forum_post->message); $filename = $title; break; } // Check file is less than maximum allowed size. if ($submissiontype == 'file') { if ($file->get_filesize() > TURNITINTOOLTWO_MAX_FILE_UPLOAD_SIZE) { $errorcode = 2; } } // Don't submit if a user has not accepted the eula. if ($user->id == $submitter && $user->user_agreement_accepted != 1) { $errorcode = 3; } // If applicable, check whether file type is accepted. $acceptanyfiletype = !empty($settings["plagiarism_allow_non_or_submissions"]) ? 1 : 0; if (!$acceptanyfiletype && $submissiontype == 'file') { $filenameparts = explode('.', $filename); $fileext = strtolower(end($filenameparts)); if (!in_array("." . $fileext, $turnitinacceptedfiles)) { $errorcode = 4; } } // Read the stored file/content into a temp file for submitting. $submission_title = explode('.', $title); $file_string = array($submission_title[0], $cm->id); // Only include user's name and id if we're not using blind marking and student privacy. if (empty($moduledata->blindmarking) && empty($config->enablepseudo)) { $user_details = array($user->id, $user->firstname, $user->lastname); $file_string = array_merge($user_details, $file_string); } try { $tempfile = turnitintooltwo_tempfile($file_string, $filename); } catch (Exception $e) { $errorcode = 8; } // Any errors from cron processing take prioirity. if (!empty($cronerror)) { $errorcode = $cronerror; } // Save failed submission and don't process any further. if ($errorcode != 0) { return $this->save_failed_submission($cm, $user, $submissionid, $identifier, $submissiontype, $errorcode, $previoussubmission); } $fh = fopen($tempfile, "w"); fwrite($fh, $textcontent); fclose($fh); // Create submission object. $submission = new TiiSubmission(); $submission->setAssignmentId($tiiassignmentid); if ($apimethod == "replaceSubmission") { $submission->setSubmissionId($previoussubmission->externalid); } $submission->setTitle($title); $submission->setAuthorUserId($user->tii_user_id); // Account for submission by teacher in assignment module. if ($user->id == $submitter) { $submission->setSubmitterUserId($user->tii_user_id); $submission->setRole('Learner'); } else { $instructor = new turnitintooltwo_user($submitter, 'Instructor'); $instructor->edit_tii_user(); $submission->setSubmitterUserId($instructor->tii_user_id); $submission->setRole('Instructor'); } $submission->setSubmissionDataPath($tempfile); // Initialise Comms Object. $turnitincomms = new turnitin_comms(); $turnitincall = $turnitincomms->initialise_api(); try { $response = $turnitincall->{$apimethod}($submission); $newsubmission = $response->getSubmission(); $newsubmissionid = $newsubmission->getSubmissionId(); $plagiarismfile = new stdClass(); if ($apimethod == "replaceSubmission" || $submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->submitter = $submitter; $plagiarismfile->identifier = $identifier; $plagiarismfile->externalid = $newsubmissionid; $plagiarismfile->statuscode = 'success'; $plagiarismfile->similarityscore = null; $plagiarismfile->attempt = !empty($previoussubmission) ? $previoussubmission->attempt + 1 : 1; $plagiarismfile->transmatch = 0; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; $plagiarismfile->errorcode = null; $plagiarismfile->errormsg = null; if ($apimethod == "replaceSubmission" || $submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******")", "PP_UPDATE_SUB"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******")", "PP_INSERT_SUB"); } } // Delete the tempfile. if (!is_null($tempfile)) { unlink($tempfile); } // Add config field to show submissions have been made which we use to lock anonymous marking setting $configfield = new stdClass(); $configfield->cm = $cm->id; $configfield->name = 'submitted'; $configfield->value = 1; if (!($currentconfigfield = $DB->get_field('plagiarism_turnitin_config', 'id', array('cm' => $cm->id, 'name' => 'submitted')))) { if (!$DB->insert_record('plagiarism_turnitin_config', $configfield)) { turnitintooltwo_print_error('defaultupdateerror', 'plagiarism_turnitin', null, null, __FILE__, __LINE__); } } // Send a message to the user's Moodle inbox with the digital receipt. $receipt = new pp_receipt_message(); $input = array('firstname' => $user->firstname, 'lastname' => $user->lastname, 'submission_title' => $title, 'assignment_name' => $moduledata->name, 'course_fullname' => $coursedata->turnitin_ctl, 'submission_date' => date('d-M-Y h:iA'), 'submission_id' => $newsubmissionid); $message = $receipt->build_message($input); $receipt->send_message($user->id, $message); // Output a message in the cron for successfull submission to Turnitin. $outputvars = new stdClass(); $outputvars->title = $title; $outputvars->submissionid = $newsubmissionid; $outputvars->assignmentname = $moduledata->name; $outputvars->coursename = $coursedata->turnitin_ctl; mtrace(get_string('cronsubmittedsuccessfully', 'plagiarism_turnitin', $outputvars)); } catch (Exception $e) { $errorstring = empty($previoussubmission->externalid) ? "pp_createsubmissionerror" : "pp_updatesubmissionerror"; $plagiarismfile = new stdClass(); if ($submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->attempt = !empty($previoussubmission) ? $previoussubmission->attempt + 1 : 1; $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->submitter = $submitter; $plagiarismfile->identifier = $identifier; $plagiarismfile->statuscode = 'error'; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; $plagiarismfile->errorcode = 0; $plagiarismfile->errormsg = get_string('pp_submission_error', 'plagiarism_turnitin') . ' ' . $e->getMessage(); if ($submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******") - ", "PP_UPDATE_SUB_ERROR"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******") - ", "PP_INSERT_SUB_ERROR"); } } $turnitincomms->handle_exceptions($e, $errorstring, false); mtrace('-------------------------'); mtrace(get_string('pp_submission_error', 'plagiarism_turnitin') . ': ' . $e->getMessage()); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); } return true; }
$defaultfield = new stdClass(); $defaultfield->cm = null; $defaultfield->name = $field; if ($field == 'plagiarism_locked_message') { $defaultfield->value = optional_param($field, '', PARAM_TEXT); } else { $defaultfield->value = optional_param($field, '', PARAM_ALPHANUMEXT); } if (isset($plugindefaults[$field])) { $defaultfield->id = $DB->get_field('plagiarism_turnitin_config', 'id', array('cm' => null, 'name' => $field)); if (!$DB->update_record('plagiarism_turnitin_config', $defaultfield)) { turnitintooltwo_print_error('defaultupdateerror', 'plagiarism_turnitin', null, null, __FILE__, __LINE__); } } else { if (!$DB->insert_record('plagiarism_turnitin_config', $defaultfield)) { turnitintooltwo_print_error('defaultinserterror', 'plagiarism_turnitin', null, null, __FILE__, __LINE__); } } } $_SESSION['notice']['message'] = get_string('defaultupdated', 'plagiarism_turnitin'); redirect(new moodle_url('/plagiarism/turnitin/settings.php', array('do' => 'defaults'))); exit; break; case "deletefile": $id = optional_param('id', 0, PARAM_INT); $DB->update_record('plagiarism_turnitin_files', array('id' => $id, 'statuscode' => "deleted")); redirect(new moodle_url('/plagiarism/turnitin/settings.php', array('do' => 'errors'))); exit; break; } }
$defaultfield = new object(); $defaultfield->cm = 0; $defaultfield->name = $field; if ($field == 'plagiarism_locked_message') { $defaultfield->value = optional_param($field, '', PARAM_TEXT); } else { $defaultfield->value = optional_param($field, '', PARAM_ALPHANUMEXT); } if (isset($plugindefaults[$field])) { $defaultfield->id = $DB->get_field('plagiarism_turnitin_config', 'id', array('cm' => 0, 'name' => $field)); if (!$DB->update_record('plagiarism_turnitin_config', $defaultfield)) { turnitintooltwo_print_error('defaultupdateerror', 'turnitintooltwo', null, null, __FILE__, __LINE__); } } else { if (!$DB->insert_record('plagiarism_turnitin_config', $defaultfield)) { turnitintooltwo_print_error('defaultinserterror', 'turnitintooltwo', null, null, __FILE__, __LINE__); } } } $_SESSION['notice']['message'] = get_string('defaultupdated', 'turnitintooltwo'); redirect(new moodle_url('/plagiarism/turnitin/settings.php', array('do' => 'defaults'))); exit; break; case "deletefile": $id = optional_param('id', 0, PARAM_INT); $DB->delete_records('plagiarism_turnitin_files', array('id' => $id)); redirect(new moodle_url('/plagiarism/turnitin/settings.php', array('do' => 'errors'))); exit; break; } }
// but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * @package turnitintooltwo * @copyright 2010 iParadigms LLC */ require_once __DIR__ . "/../../config.php"; require_once __DIR__ . "/lib.php"; require_once __DIR__ . "/turnitintooltwo_view.class.php"; $turnitintooltwoview = new turnitintooltwo_view(); // Load Javascript and CSS. $turnitintooltwoview->load_page_components(); $id = required_param('id', PARAM_INT); // Course id. // Configure URL correctly. $urlparams = array('id' => $id); $url = new moodle_url('/mod/turnitintooltwo/index.php', $urlparams); // Get course data. if (!($course = $DB->get_record("course", array("id" => $id)))) { turnitintooltwo_print_error('courseiderror', 'turnitintooltwo'); } require_login($course->id); // Print the header. $extranavigation = array(array('title' => get_string("modulenameplural", "turnitintooltwo"), 'url' => null)); $turnitintooltwoview->output_header(null, $course, $url, get_string("modulenameplural", "turnitintooltwo"), $SITE->fullname, $extranavigation, '', '', true); echo $turnitintooltwoview->show_assignments($course); echo $OUTPUT->footer();
/** * If there is no submission record then we are creating one. Text content should be submitted. * If a file has already been submitted then check whether the identifier is the same, if it is do nothing. * If it's not then either edit submission or create new one depending on module settings. */ public function tii_submission($cm, $tiiassignmentid, $user, $identifier, $submissiontype, $itemid = 0, $title = '', $textcontent = '', $context = 'instant') { global $CFG, $DB, $USER; $settings = $this->get_settings($cm->id); // Update user's details on Turnitin. $user->edit_tii_user(); // Clean up old Turnitin submission files. if ($itemid != 0 && $submissiontype == 'file' && $cm->modname != 'forum') { $this->clean_old_turnitin_submissions($cm, $user->id, $itemid, $submissiontype, $identifier); } // Work out submission method. // If this file has successfully submitted in the past then break, text content is to be submitted. switch ($submissiontype) { case 'file': case 'text_content': // Get file data or prepare text submission. if ($submissiontype == 'file') { $fs = get_file_storage(); $file = $fs->get_file_by_hash($identifier); $title = $file->get_filename(); $timemodified = $file->get_timemodified(); $filename = $file->get_filename(); $textcontent = $file->get_content(); } else { // If we are submitting text_content via AJAX there will be no actual content passed in so we need to grab it. if ($textcontent == '') { switch ($cm->modname) { case 'assign': // Check whether submission is a group submission so we can get the correct content. // Note: This will not work if the submitting user is in multiple groups. $submissionsquery = array('assignment' => $cm->instance); $submissionsquery['userid'] = $user->id; if ($CFG->branch > 23) { $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance)); if ($moduledata->teamsubmission) { require_once $CFG->dirroot . '/mod/assign/locallib.php'; $context = context_course::instance($cm->course); $assignment = new assign($context, $cm, null); $submissionsquery['userid'] = 0; $submissionsquery['groupid'] = 0; if ($group = $assignment->get_submission_group($user->id)) { $submissionsquery['groupid'] = $group->id; } } } // This will need to be reworked when linkarray in get_links() contains submission id. $moodlesubmissions = $DB->get_records('assign_submission', $submissionsquery, 'id, timemodified'); $moodlesubmission = end($moodlesubmissions); $moodletextsubmission = $DB->get_record('assignsubmission_onlinetext', array('submission' => $moodlesubmission->id), 'onlinetext'); $timemodified = $moodlesubmission->timemodified; $textcontent = strip_tags($moodletextsubmission->onlinetext); break; case 'workshop': $moodlesubmission = $DB->get_record('workshop_submissions', array('workshopid' => $cm->instance, 'authorid' => $user->id), 'title, content, timemodified'); $timemodified = $moodlesubmission->timemodified; $textcontent = strip_tags($moodlesubmission->content); $title = $moodlesubmission->title; break; } } else { switch ($cm->modname) { case 'assign': $moodlesubmission = $DB->get_record('assign_submission', array('assignment' => $cm->instance, 'userid' => $user->id, 'id' => $itemid), 'id, timemodified'); $timemodified = $moodlesubmission->timemodified; $textcontent = strip_tags($textcontent); break; case 'workshop': $moodlesubmission = $DB->get_record('workshop_submissions', array('workshopid' => $cm->instance, 'authorid' => $user->id), 'title, content, timemodified'); $timemodified = $moodlesubmission->timemodified; $textcontent = strip_tags($textcontent); break; } } $title = !empty($title) ? $title : 'onlinetext_' . $user->id . "_" . $cm->id . "_" . $cm->instance . '.txt'; $filename = substr($title, -4) == '.txt' ? $title : $title . '.txt'; } // Get submission method depending on whether there has been a previous submission. $submissionfields = 'id, cm, externalid, identifier, statuscode, lastmodified, attempt, errorcode'; $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype "; // Double check there is only one submission. $previoussubmissions = $DB->get_records_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND " . $typefield . " = ? AND identifier = ? ", array($cm->id, $user->id, $submissiontype, $identifier), 'id', $submissionfields); $previoussubmission = end($previoussubmissions); if ($previoussubmission) { $errorcode = (int) $previoussubmission->errorcode; // Don't submit if submission hasn't changed. if ($previoussubmission->statuscode == "success" && ($submissiontype == 'file' && $timemodified <= $previoussubmission->lastmodified || $submissiontype != 'file')) { return true; } else { if ($previoussubmission->statuscode == "error" && $timemodified <= $previoussubmission->lastmodified) { $return["success"] = false; $return["message"] = get_string('errorcode' . $errorcode, 'turnitintooltwo'); return $return; } else { if ($previoussubmission->attempt >= 5) { // Do not submit if 5 attempts have been made previously. if ($context == 'cron') { mtrace('-------------------------'); mtrace(get_string('pastfiveattempts', 'turnitintooltwo') . ':'); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); return true; } $return["success"] = false; $return["message"] = get_string('pastfiveattempts', 'turnitintooltwo'); return $return; } else { if ($settings["plagiarism_report_gen"] > 0) { // Replace if Turnitin assignment allows resubmissions or create if we have no Turnitin id stored. $submissionid = $previoussubmission->id; $apimethod = is_null($previoussubmission->externalid) ? "createSubmission" : "replaceSubmission"; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $apimethod = "createSubmission"; if ($previoussubmission->statuscode != "success") { $submissionid = $previoussubmission->id; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } } } } } } else { // Check if there is previous submission of text content which we will replace $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype "; if ($submissiontype == 'text_content' && ($previoussubmission = $DB->get_record_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND " . $typefield . " = ? ", array($cm->id, $user->id, 'text_content'), 'id, cm, externalid, identifier, statuscode, lastmodified', 0, 1))) { $submissionid = $previoussubmission->id; $apimethod = is_null($previoussubmission->externalid) || $settings["plagiarism_report_gen"] == 0 ? "createSubmission" : "replaceSubmission"; // Delete old text content submissions from Turnitin if not replacing. if ($settings["plagiarism_report_gen"] == 0 && !is_null($previoussubmission->externalid)) { $this->delete_tii_submission($previoussubmission->externalid); } $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $apimethod = "createSubmission"; $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } } // Remove any old text submissions here if there are any as there is only one per submission if ($itemid != 0 && $submissiontype == "text_content") { $this->clean_old_turnitin_submissions($cm, $user->id, $itemid, $submissiontype, $identifier); } break; case 'forum_post': if ($previoussubmissions = $DB->get_records_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND identifier = ? ", array($cm->id, $user->id, $identifier), 'id DESC', 'id, cm, externalid, identifier, statuscode', 0, 1)) { $previoussubmission = current($previoussubmissions); if ($previoussubmission->statuscode == "success") { return true; } else { $submissionid = $previoussubmission->id; $apimethod = "replaceSubmission"; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } } else { $apimethod = "createSubmission"; $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } $forum_post = $DB->get_record_select('forum_posts', " userid = ? AND id = ? ", array($user->id, $itemid)); $textcontent = strip_tags($forum_post->message); $filename = $title; break; } // Do not submit if this is text_content and we're not accepting anything and // content is less than 20 words or 100 characters. if ($submissiontype != 'file') { $content = explode(' ', $textcontent); if ($settings['plagiarism_allow_non_or_submissions'] != 1 && (strlen($textcontent) < 100 || count($content) < 20) || empty($textcontent)) { $plagiarismfile = new object(); if ($submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->identifier = $identifier; $plagiarismfile->statuscode = 'error'; $plagiarismfile->errorcode = 1; $plagiarismfile->attempt = 1; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; if ($submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******") - ", "PP_UPDATE_SUB_ERROR"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******") - ", "PP_INSERT_SUB_ERROR"); } } if ($context == 'cron') { mtrace('-------------------------'); mtrace(get_string('errorcode1', 'turnitintooltwo') . ':'); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); return true; } $return["success"] = false; $return["message"] = get_string('errorcode1', 'turnitintooltwo'); return $return; } } // Check file is less than maximum allowed size. if ($submissiontype == 'file') { if ($file->get_filesize() > TURNITINTOOLTWO_MAX_FILE_UPLOAD_SIZE) { $plagiarismfile = new object(); if ($submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->identifier = $identifier; $plagiarismfile->statuscode = 'error'; $plagiarismfile->errorcode = 2; $plagiarismfile->attempt = 1; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = 'file'; if ($submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******") - ", "PP_UPDATE_SUB_ERROR"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******") - ", "PP_INSERT_SUB_ERROR"); } } if ($context == 'cron') { mtrace('-------------------------'); mtrace(get_string('errorcode2', 'turnitintooltwo') . ':'); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); return true; } $return["success"] = false; $return["message"] = get_string('errorcode2', 'turnitintooltwo', display_size(TURNITINTOOLTWO_MAX_FILE_UPLOAD_SIZE)); return $return; } } // Read the stored file/content into a temp file for submitting. $submission_title = explode('.', $title); $file_string = array($submission_title[0], $cm->id); $modulepluginsettings = $this->get_settings($cm->id); if (!$modulepluginsettings["plagiarism_anonymity"]) { $user_details = array($user->id, $user->firstname, $user->lastname); $file_string = array_merge($user_details, $file_string); } $tempfile = turnitintooltwo_tempfile($file_string, $filename); $fh = fopen($tempfile, "w"); fwrite($fh, $textcontent); fclose($fh); // Create submission object. $submission = new TiiSubmission(); $submission->setAssignmentId($tiiassignmentid); if ($apimethod == "replaceSubmission") { $submission->setSubmissionId($previoussubmission->externalid); } $submission->setTitle($title); $submission->setAuthorUserId($user->tii_user_id); if ($user->id == $USER->id && !is_siteadmin()) { $submission->setSubmitterUserId($user->tii_user_id); $submission->setRole('Learner'); } else { $instructor = new turnitintooltwo_user($USER->id, 'Instructor'); $instructor->edit_tii_user(); $submission->setSubmitterUserId($instructor->tii_user_id); $submission->setRole('Instructor'); } $submission->setSubmissionDataPath($tempfile); // Initialise Comms Object. $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); try { $response = $turnitincall->{$apimethod}($submission); $newsubmission = $response->getSubmission(); $newsubmissionid = $newsubmission->getSubmissionId(); $plagiarismfile = new object(); if ($apimethod == "replaceSubmission" || $submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->identifier = $identifier; $plagiarismfile->externalid = $newsubmissionid; $plagiarismfile->statuscode = 'success'; $plagiarismfile->similarityscore = null; $plagiarismfile->attempt = 1; $plagiarismfile->transmatch = 0; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; $plagiarismfile->errorcode = null; $plagiarismfile->errormsg = null; if ($apimethod == "replaceSubmission" || $submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******")", "PP_UPDATE_SUB"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******")", "PP_INSERT_SUB"); } } // Delete the tempfile. if (!is_null($tempfile)) { unlink($tempfile); } // Add config field to show submissions have been made which we use to lock anonymous marking setting $configfield = new object(); $configfield->cm = $cm->id; $configfield->name = 'submitted'; $configfield->value = 1; if (!($currentconfigfield = $DB->get_field('plagiarism_turnitin_config', 'id', array('cm' => $cm->id, 'name' => 'submitted')))) { if (!$DB->insert_record('plagiarism_turnitin_config', $configfield)) { turnitintooltwo_print_error('defaultupdateerror', 'turnitintooltwo', null, null, __FILE__, __LINE__); } } $return["success"] = true; $return["message"] = get_string('submissionuploadsuccess', 'turnitintooltwo') . '<br/>' . get_string('turnitinsubmissionid', 'turnitintooltwo') . ': ' . $newsubmissionid; //Send a message to the user's Moodle inbox with the digital receipt. if (!empty($CFG->smtphosts) && !empty($CFG->smtpuser) && !empty($CFG->smtppass)) { $receipt = new receipt_message(); $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance)); $coursedata = turnitintooltwo_assignment::get_course_data($cm->course, 'PP', 'cron'); $input = array('firstname' => $user->firstname, 'lastname' => $user->lastname, 'submission_title' => $title, 'assignment_name' => $moduledata->name, 'course_fullname' => $coursedata->turnitin_ctl, 'submission_date' => date('d-M-Y h:iA'), 'submission_id' => $newsubmissionid); $message = $receipt->build_message($input); $receipt->send_message($user->id, $message); } if ($context == 'cron') { return true; } } catch (Exception $e) { $errorstring = empty($previoussubmission->externalid) ? "pp_createsubmissionerror" : "pp_updatesubmissionerror"; $return["success"] = false; $return["message"] = get_string('pp_submission_error', 'turnitintooltwo') . ' ' . $e->getMessage(); $plagiarismfile = new object(); if ($submissionid != 0) { $plagiarismfile->id = $submissionid; // Get attempt no $current_record = $DB->get_record('plagiarism_turnitin_files', array("id" => $submissionid)); $plagiarismfile->attempt = $current_record->attempt + 1; } else { $plagiarismfile->attempt = 1; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->identifier = $identifier; $plagiarismfile->statuscode = 'error'; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; $plagiarismfile->errorcode = 0; $plagiarismfile->errormsg = $return["message"]; if ($submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******") - ", "PP_UPDATE_SUB_ERROR"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******") - ", "PP_INSERT_SUB_ERROR"); } } $turnitincomms->handle_exceptions($e, $errorstring, false); if ($context == 'cron') { mtrace('-------------------------'); mtrace(get_string('pp_submission_error', 'turnitintooltwo') . ': ' . $e->getMessage()); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); return false; } } return $return; }