/**
  * Create assignment on Moodle, creates each individual part (and the relevant event)
  * and in turn creates them on Turnitin
  *
  * @global type $USER
  * @global type $DB
  * @return int turnitintooltwo id
  */
 public function create_moodle_assignment()
 {
     global $USER, $DB;
     $config = turnitintooltwo_admin_config();
     // 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');
     }
     // Setup or edit course in Turnitin.
     if ($course->turnitin_cid == 0) {
         $tiicoursedata = $this->create_tii_course($course, $owner->id);
         $course->turnitin_cid = $tiicoursedata->turnitin_cid;
         $course->turnitin_ctl = $tiicoursedata->turnitin_ctl;
     } else {
         $this->edit_tii_course($course);
         $course->turnitin_ctl = $course->fullname . " (Moodle TT)";
     }
     $owner->join_user_to_class($course->turnitin_cid);
     // Insert the default options for the assignment.
     $this->turnitintooltwo->timecreated = time();
     $this->turnitintooltwo->dateformat = "d/m/Y";
     $this->turnitintooltwo->gradedisplay = 1;
     $this->turnitintooltwo->commentedittime = 1800;
     $this->turnitintooltwo->commentmaxsize = 800;
     $this->turnitintooltwo->autosubmission = 1;
     $this->turnitintooltwo->shownonsubmission = 1;
     $this->turnitintooltwo->timemodified = time();
     $this->turnitintooltwo->courseid = $course->id;
     $this->turnitintooltwo->usegrademark = $config->usegrademark;
     $toolid = $DB->insert_record("turnitintooltwo", $this->turnitintooltwo);
     turnitintooltwo_activitylog("Turnitintool created (" . $toolid . ") - " . $this->turnitintooltwo->name, "REQUEST");
     // Do the multiple Assignment creation on turnitin for each part.
     for ($i = 1; $i <= $this->turnitintooltwo->numparts; $i++) {
         // Set the assignment details to pass to the API.
         $assignment = new TiiAssignment();
         $assignment->setClassId($course->turnitin_cid);
         $attribute = "partname" . $i;
         $assignment->setTitle($this->turnitintooltwo->name . " " . $this->turnitintooltwo->{$attribute} . " (Moodle TT)");
         $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}));
         $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);
         if ($config->useanon) {
             $assignment->setAnonymousMarking($this->turnitintooltwo->anon);
         }
         $assignment->setAllowNonOrSubmissions($this->turnitintooltwo->allownonor);
         $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(isset($this->turnitintooltwo->transmatch) ? $this->turnitintooltwo->transmatch : 0);
         // Erater settings.
         $assignment->setErater(isset($this->turnitintooltwo->erater) ? $this->turnitintooltwo->erater : 0);
         $assignment->setEraterSpelling(isset($this->turnitintooltwo->erater_spelling) ? $this->turnitintooltwo->erater_spelling : 0);
         $assignment->setEraterGrammar(isset($this->turnitintooltwo->erater_grammar) ? $this->turnitintooltwo->erater_grammar : 0);
         $assignment->setEraterUsage(isset($this->turnitintooltwo->erater_usage) ? $this->turnitintooltwo->erater_usage : 0);
         $assignment->setEraterMechanics(isset($this->turnitintooltwo->erater_mechanics) ? $this->turnitintooltwo->erater_mechanics : 0);
         $assignment->setEraterStyle(isset($this->turnitintooltwo->erater_style) ? $this->turnitintooltwo->erater_style : 0);
         $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);
         // Create Assignment on Turnitin.
         $newassignmentid = $this->create_tii_assignment($assignment, $toolid, $i);
         // Save Part details.
         $part = new stdClass();
         $part->turnitintooltwoid = $toolid;
         $attribute = "partname" . $i;
         $part->partname = $this->turnitintooltwo->{$attribute};
         $part->tiiassignid = $newassignmentid;
         $attribute = "dtstart" . $i;
         $part->dtstart = $this->turnitintooltwo->{$attribute};
         $attribute = "dtdue" . $i;
         $part->dtdue = $this->turnitintooltwo->{$attribute};
         $attribute = "dtpost" . $i;
         $part->dtpost = $this->turnitintooltwo->{$attribute};
         $attribute = "maxmarks" . $i;
         $part->maxmarks = $this->turnitintooltwo->{$attribute};
         $part->deleted = 0;
         if (!($insert = $DB->insert_record('turnitintooltwo_parts', $part))) {
             $DB->delete_records('turnitintooltwo', array('id' => $toolid));
             turnitintooltwo_print_error('partdberror', 'turnitintooltwo', null, $i, __FILE__, __LINE__);
         } else {
             turnitintooltwo_activitylog("Moodle Assignment part created (" . $insert . ") - " . $part->tiiassignid, "REQUEST");
         }
         $this->create_event($toolid, $part->partname, $part->dtdue);
     }
     // Define grade settings.
     $this->turnitintooltwo->id = $toolid;
     turnitintooltwo_grade_item_update($this->turnitintooltwo);
     return $this->turnitintooltwo->id;
 }
 case "default":
     $submissionid = required_param('submissionid', PARAM_INT);
     $user = new turnitintooltwo_user($USER->id, $userrole);
     echo html_writer::tag("div", $turnitintooltwoview->output_dv_launch_form($do, $submissionid, $user->tii_user_id, $userrole), array("class" => "launch_form"));
     if ($do === "origreport") {
         $submission = new turnitintooltwo_submission($submissionid, 'turnitin');
         turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "view submission", 'view.php?id=' . $cm->id, get_string('viewsubmissiondesc', 'turnitintooltwo') . " '{$submission->submission_title}'", $cm->id, $submission->userid);
     }
     break;
 case "submissions":
     // Output a link for the student to accept the turnitin licence agreement.
     $noscriptula = "";
     $ula = "";
     if (!$istutor) {
         $eulaaccepted = false;
         $user = new turnitintooltwo_user($USER->id, $userrole);
         $coursedata = $turnitintooltwoassignment->get_course_data($turnitintooltwoassignment->turnitintooltwo->course);
         $user->join_user_to_class($coursedata->turnitin_cid);
         $eulaaccepted = $user->user_agreement_accepted != 1 ? $user->get_accepted_user_agreement() : $user->user_agreement_accepted;
         // Check if the submitting user has accepted the EULA
         if ($eulaaccepted != 1) {
             // Moodle strips out form and script code for forum posts so we have to do the Eula Launch differently.
             $ula_link = html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/extras.php?cmid=' . $cm->id . '&cmd=useragreement&view_context=box_solid', html_writer::tag('i', '', array('class' => 'tiiicon icon-warn icon-2x turnitin_ula_warn')) . '</br></br>' . get_string('turnitinula', 'turnitintooltwo') . " " . get_string('turnitinula_btn', 'turnitintooltwo'), array("class" => "turnitin_eula_link"));
             $eulaignoredclass = $eulaaccepted == 0 ? ' turnitin_ula_ignored' : '';
             $ula = html_writer::tag('div', $ula_link, array('class' => 'turnitin_ula js_required' . $eulaignoredclass, 'data-userid' => $user->id));
             $noscriptula = html_writer::tag('noscript', turnitintooltwo_view::output_dv_launch_form("useragreement", 0, $user->tii_user_id, "Learner", get_string('turnitinula', 'turnitintooltwo'), false) . " " . get_string('noscriptula', 'turnitintooltwo'), array('class' => 'warning turnitin_ula_noscript'));
             echo $ula . $noscriptula;
         }
     }
     $listsubmissionsdesc = $istutor ? "listsubmissionsdesc" : "listsubmissionsdesc_student";
     turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "list submissions", 'view.php?id=' . $cm->id, get_string($listsubmissionsdesc, 'turnitintooltwo') . ": {$course->id}", $cm->id);
         } else {
             // Create the module as an assignment in Turnitin.
             $tiiassignment = $pluginturnitin->sync_tii_assignment($cm, $coursedata->turnitin_cid);
             $tiiassignmentid = $tiiassignment['tiiassignmentid'];
         }
         $user = new turnitintooltwo_user($USER->id, "Instructor");
         $user->join_user_to_class($coursedata->turnitin_cid);
         echo html_writer::tag("div", turnitintooltwo_view::output_lti_form_launch('peermark_manager', 'Instructor', $tiiassignmentid), array("class" => "launch_form", "style" => "display:none;"));
         echo html_writer::script("<!--\n                                    window.document.forms[0].submit();\n                                    //-->");
     }
     break;
 case "rubricview":
     $isstudent = $cm->modname == "forum" ? has_capability('mod/' . $cm->modname . ':replypost', $context) : has_capability('mod/' . $cm->modname . ':submit', $context);
     if ($isstudent) {
         $tiiassignment = $DB->get_record('plagiarism_turnitin_config', array('cm' => $cm->id, 'name' => 'turnitin_assignid'));
         $user = new turnitintooltwo_user($USER->id, "Learner");
         $coursedata = turnitintooltwo_assignment::get_course_data($cm->course, 'PP');
         $user->join_user_to_class($coursedata->turnitin_cid);
         echo html_writer::tag("div", turnitintooltwo_view::output_lti_form_launch('rubric_view', 'Learner', $tiiassignment->value), array("class" => "launch_form", "style" => "display:none;"));
         echo html_writer::script("<!--\n                                    window.document.forms[0].submit();\n                                    //-->");
     }
     break;
 case "peermarkreviews":
     $isstudent = $cm->modname == "forum" ? has_capability('mod/' . $cm->modname . ':replypost', $context) : has_capability('mod/' . $cm->modname . ':submit', $context);
     if ($userrole == 'Instructor' || $isstudent) {
         $role = $istutor ? 'Instructor' : 'Learner';
         $tiiassignment = $DB->get_record('plagiarism_turnitin_config', array('cm' => $cm->id, 'name' => 'turnitin_assignid'));
         echo html_writer::tag("div", turnitintooltwo_view::output_lti_form_launch('peermark_reviews', $role, $tiiassignment->value), array("class" => "launch_form", "style" => "display:none;"));
         echo html_writer::script("<!--\n                                    window.document.forms[0].submit();\n                                    //-->");
     }
     break;
 /**
  * Show Tutors/Students enrolled on a particular course with Turnitin
  *
  * @global type $CFG
  * @global type $OUTPUT
  * @global type $DB
  * @param type $cm course module data
  * @param type $turnitintooltwoassignment the assignment object
  * @param array $members of the course in Turnitin
  * @return array $memberdata in a format to be shown as rows in a datatable
  */
 public function get_tii_members_by_role($cm, $turnitintooltwoassignment, $members, $role = "Learner")
 {
     global $CFG, $DB, $OUTPUT;
     switch ($role) {
         case "Learner":
             $removestr = get_string('turnitinstudentsremove', 'turnitintooltwo');
             $removeaction = "removestudent";
             $do = "students";
             break;
         case "Instructor":
             $removestr = get_string('turnitintutorsremove', 'turnitintooltwo');
             $removeaction = "removetutor";
             $do = "tutors";
             break;
     }
     $memberdata = array();
     foreach ($members as $k => $v) {
         $membermoodleid = turnitintooltwo_user::get_moodle_user_id($k);
         if ($membermoodleid > 0) {
             $user = $DB->get_record('user', array('id' => $membermoodleid));
             $deleteurl = new moodle_url($CFG->wwwroot . "/mod/turnitintooltwo/view.php", array('id' => $cm->id, 'do' => $do, 'sesskey' => sesskey(), 'action' => $removeaction, 'membership_id' => $v['membership_id']));
             $attributes["onclick"] = 'return confirm(\'' . $removestr . '\');';
             $link = html_writer::link($deleteurl, html_writer::tag('i', '', array('class' => 'fa fa-trash-o fa-lg')), $attributes);
             $userdetails = html_writer::link($CFG->wwwroot . '/user/view.php?id=' . $membermoodleid . '&course=' . $turnitintooltwoassignment->turnitintooltwo->course, format_string($v['lastname']) . ', ' . format_string($v['firstname'])) . ' (' . $user->username . ')';
             $memberdata[] = array($link, $userdetails);
         }
     }
     return $memberdata;
 }
示例#5
0
         throw new moodle_exception('invalidsesskey', 'error');
     }
     $assignmentid = required_param('assignment', PARAM_INT);
     $turnitintooltwoassignment = new turnitintooltwo_assignment($assignmentid);
     $cm = get_coursemodule_from_instance("turnitintooltwo", $assignmentid);
     if (has_capability('mod/turnitintooltwo:grade', context_module::instance($cm->id))) {
         echo $turnitintooltwoassignment->enrol_all_students($cm);
     }
     break;
 case "refresh_rubric_select":
     $courseid = required_param('course', PARAM_INT);
     $assignmentid = required_param('assignment', PARAM_INT);
     $modulename = required_param('modulename', PARAM_ALPHA);
     if (has_capability('moodle/course:update', context_course::instance($courseid))) {
         // Set Rubric options to instructor rubrics.
         $instructor = new turnitintooltwo_user($USER->id, 'Instructor');
         $instructor->set_user_values_from_tii();
         $instructorrubrics = $instructor->get_instructor_rubrics();
         $options = array('' => get_string('norubric', 'turnitintooltwo')) + $instructorrubrics;
         // Add in rubric if the selected rubric belongs to another instructor.
         if (!empty($assignmentid)) {
             if ($modulename == "turnitintooltwo") {
                 $turnitintooltwoassignment = new turnitintooltwo_assignment($assignmentid);
             } else {
                 require_once $CFG->dirroot . '/plagiarism/turnitin/lib.php';
                 $pluginturnitin = new plagiarism_plugin_turnitin();
                 $cm = get_coursemodule_from_instance($modulename, $assignmentid);
                 $plagiarismsettings = $pluginturnitin->get_settings($cm->id);
             }
             if ($modulename == "turnitintooltwo") {
                 if (!empty($turnitintooltwoassignment->turnitintooltwo->rubric)) {
 /**
  * Due to moodle's internal plugin hooks we can not use our bespoke form class for Turnitin
  * settings. This form shows in settings > defaults as well as the activity creation screen.
  *
  * @global type $CFG
  * @param type $plugin_defaults
  * @return type
  */
 public function add_elements_to_settings_form($mform, $course, $location = "activity", $cmid = 0, $currentrubric = 0)
 {
     global $CFG, $OUTPUT, $PAGE, $USER, $DB;
     // Include JS strings (closebutton is needed from both plugins).
     $PAGE->requires->string_for_js('changerubricwarning', 'plagiarism_turnitin');
     $PAGE->requires->string_for_js('closebutton', 'turnitintooltwo');
     $PAGE->requires->string_for_js('closebutton', 'plagiarism_turnitin');
     $config = turnitintooltwo_admin_config();
     $config_warning = '';
     $rubrics = array();
     if ($location == "activity") {
         $instructor = new turnitintooltwo_user($USER->id, 'Instructor');
         $instructor->join_user_to_class($course->turnitin_cid);
         $rubrics = $instructor->get_instructor_rubrics();
         // Get rubrics that are shared on the account.
         $turnitinclass = new turnitin_class($course->id);
         $turnitinclass->sharedrubrics = array();
         $turnitinclass->read_class_from_tii();
         // Merge the arrays, prioitising instructor owned arrays.
         $rubrics = $rubrics + $turnitinclass->sharedrubrics;
     }
     $options = array(0 => get_string('no'), 1 => get_string('yes'));
     $genoptions = array(0 => get_string('genimmediately1', 'plagiarism_turnitin'), 1 => get_string('genimmediately2', 'plagiarism_turnitin'), 2 => get_string('genduedate', 'plagiarism_turnitin'));
     $excludetypeoptions = array(0 => get_string('no'), 1 => get_string('excludewords', 'plagiarism_turnitin'), 2 => get_string('excludepercent', 'plagiarism_turnitin'));
     if ($location == "defaults") {
         $mform->addElement('header', 'plugin_header', get_string('turnitindefaults', 'plagiarism_turnitin'));
         $mform->addElement('html', get_string("defaultsdesc", "turnitintooltwo"));
     }
     if ($location != "defaults") {
         $mform->addElement('header', 'plugin_header', get_string('turnitinpluginsettings', 'plagiarism_turnitin'));
         // Add in custom Javascript and CSS.
         $PAGE->requires->jquery();
         $PAGE->requires->jquery_plugin('ui');
         $PAGE->requires->jquery_plugin('turnitintooltwo-turnitintooltwo', 'mod_turnitintooltwo');
         $PAGE->requires->jquery_plugin('plagiarism-turnitin_module', 'plagiarism_turnitin');
         $PAGE->requires->jquery_plugin('turnitintooltwo-colorbox', 'mod_turnitintooltwo');
         $cssurl = new moodle_url('/mod/turnitintooltwo/css/colorbox.css');
         $PAGE->requires->css($cssurl);
         // Refresh Grades
         $refreshgrades = '';
         if ($cmid != 0) {
             // If assignment has submissions then show a refresh grades button
             $numsubs = $DB->count_records('plagiarism_turnitin_files', array('cm' => $cmid));
             if ($numsubs > 0) {
                 $refreshgrades = html_writer::tag('div', $OUTPUT->pix_icon('refresh', get_string('turnitinrefreshsubmissions', 'plagiarism_turnitin'), 'plagiarism_turnitin') . html_writer::tag('span', get_string('turnitinrefreshsubmissions', 'plagiarism_turnitin')), array('class' => 'plagiarism_turnitin_refresh_grades'));
                 $refreshgrades .= html_writer::tag('div', $OUTPUT->pix_icon('loading', get_string('turnitinrefreshingsubmissions', 'plagiarism_turnitin'), 'plagiarism_turnitin') . html_writer::tag('span', get_string('turnitinrefreshingsubmissions', 'plagiarism_turnitin')), array('class' => 'plagiarism_turnitin_refreshing_grades'));
             }
         }
         // Quickmark Manager.
         $quickmarkmanagerlink = '';
         if ($config->usegrademark) {
             $quickmarkmanagerlink .= $OUTPUT->box_start('row_quickmark_manager', '');
             $quickmarkmanagerlink .= html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/extras.php?cmd=quickmarkmanager&view_context=box', get_string('launchquickmarkmanager', 'plagiarism_turnitin'), array('class' => 'plagiarism_turnitin_quickmark_manager_launch', 'title' => get_string('launchquickmarkmanager', 'plagiarism_turnitin')));
             $quickmarkmanagerlink .= html_writer::tag('span', '', array('class' => 'launch_form', 'id' => 'quickmark_manager_form'));
             $quickmarkmanagerlink .= $OUTPUT->box_end(true);
         }
         $use_turnitin = $DB->get_record('plagiarism_turnitin_config', array('cm' => $cmid, 'name' => 'use_turnitin'));
         // Peermark Manager.
         $peermarkmanagerlink = '';
         if (!empty($config->enablepeermark) && !empty($use_turnitin->value)) {
             if ($cmid != 0) {
                 $peermarkmanagerlink .= $OUTPUT->box_start('row_peermark_manager', '');
                 $peermarkmanagerlink .= html_writer::link($CFG->wwwroot . '/plagiarism/turnitin/ajax.php?cmid=' . $cmid . '&action=peermarkmanager&view_context=box', get_string('launchpeermarkmanager', 'plagiarism_turnitin'), array('class' => 'peermark_manager_launch', 'id' => 'peermark_manager_' . $cmid, 'title' => get_string('launchpeermarkmanager', 'plagiarism_turnitin')));
                 $peermarkmanagerlink .= html_writer::tag('span', '', array('class' => 'launch_form', 'id' => 'peermark_manager_form'));
                 $peermarkmanagerlink .= $OUTPUT->box_end(true);
             }
         }
         if (!empty($quickmarkmanagerlink) || !empty($peermarkmanagerlink) || !empty($refreshgrades)) {
             $mform->addElement('static', 'static', '', $refreshgrades . $quickmarkmanagerlink . $peermarkmanagerlink);
         }
     }
     $locks = $DB->get_records_sql("SELECT name, value FROM {plagiarism_turnitin_config} WHERE cm IS NULL");
     if (empty($config_warning)) {
         $mform->addElement('select', 'use_turnitin', get_string("useturnitin", "turnitintooltwo"), $options);
         $this->lock($mform, $location, $locks);
         $mform->addElement('select', 'plagiarism_show_student_report', get_string("studentreports", "turnitintooltwo"), $options);
         $this->lock($mform, $location, $locks);
         $mform->addHelpButton('plagiarism_show_student_report', 'studentreports', 'plagiarism_turnitin');
         if ($mform->elementExists('submissiondrafts') || $location == 'defaults') {
             $tiidraftoptions = array(0 => get_string("submitondraft", "turnitintooltwo"), 1 => get_string("submitonfinal", "turnitintooltwo"));
             $mform->addElement('select', 'plagiarism_draft_submit', get_string("draftsubmit", "turnitintooltwo"), $tiidraftoptions);
             $this->lock($mform, $location, $locks);
             $mform->disabledIf('plagiarism_draft_submit', 'submissiondrafts', 'eq', 0);
         }
         $mform->addElement('select', 'plagiarism_allow_non_or_submissions', get_string("allownonor", "turnitintooltwo"), $options);
         $this->lock($mform, $location, $locks);
         $mform->addHelpButton('plagiarism_allow_non_or_submissions', 'allownonor', 'plagiarism_turnitin');
         $suboptions = array(0 => get_string('norepository', 'plagiarism_turnitin'), 1 => get_string('standardrepository', 'plagiarism_turnitin'));
         switch ($config->repositoryoption) {
             case 0:
                 // Standard options
                 $mform->addElement('select', 'plagiarism_submitpapersto', get_string('submitpapersto', 'plagiarism_turnitin'), $suboptions);
                 $this->lock($mform, $location, $locks);
                 break;
             case 1:
                 // Standard options + Allow Instituional Repository
                 $suboptions[2] = get_string('institutionalrepository', 'plagiarism_turnitin');
                 $mform->addElement('select', 'plagiarism_submitpapersto', get_string('submitpapersto', 'plagiarism_turnitin'), $suboptions);
                 $this->lock($mform, $location, $locks);
                 break;
             case 2:
                 // Force Standard Repository
                 $mform->addElement('hidden', 'plagiarism_submitpapersto', 1);
                 $mform->setType('plagiarism_submitpapersto', PARAM_RAW);
                 break;
             case 3:
                 // Force No Repository
                 $mform->addElement('hidden', 'plagiarism_submitpapersto', 0);
                 $mform->setType('plagiarism_submitpapersto', PARAM_RAW);
                 break;
         }
         $mform->addElement('html', html_writer::tag('div', get_string('checkagainstnote', 'plagiarism_turnitin'), array('class' => 'tii_checkagainstnote')));
         $mform->addElement('select', 'plagiarism_compare_student_papers', get_string("spapercheck", "turnitintooltwo"), $options);
         $this->lock($mform, $location, $locks);
         $mform->addElement('select', 'plagiarism_compare_internet', get_string("internetcheck", "turnitintooltwo"), $options);
         $this->lock($mform, $location, $locks);
         $mform->addElement('select', 'plagiarism_compare_journals', get_string("journalcheck", "turnitintooltwo"), $options);
         $this->lock($mform, $location, $locks);
         if ($config->repositoryoption == 1) {
             $mform->addElement('select', 'plagiarism_compare_institution', get_string('compareinstitution', 'plagiarism_turnitin'), $options);
             $this->lock($mform, $location, $locks);
         }
         $mform->addElement('select', 'plagiarism_report_gen', get_string("reportgenspeed", "turnitintooltwo"), $genoptions);
         $this->lock($mform, $location, $locks);
         $mform->addElement('html', html_writer::tag('div', get_string('genspeednote', 'plagiarism_turnitin'), array('class' => 'tii_genspeednote')));
         $mform->addElement('select', 'plagiarism_exclude_biblio', get_string("excludebiblio", "turnitintooltwo"), $options);
         $this->lock($mform, $location, $locks);
         $mform->addElement('select', 'plagiarism_exclude_quoted', get_string("excludequoted", "turnitintooltwo"), $options);
         $this->lock($mform, $location, $locks);
         $mform->addElement('select', 'plagiarism_exclude_matches', get_string("excludevalue", "turnitintooltwo"), $excludetypeoptions);
         $this->lock($mform, $location, $locks);
         $mform->addElement('text', 'plagiarism_exclude_matches_value', '');
         $mform->setType('plagiarism_exclude_matches_value', PARAM_INT);
         $mform->addRule('plagiarism_exclude_matches_value', null, 'numeric', null, 'client');
         $mform->disabledIf('plagiarism_exclude_matches_value', 'plagiarism_exclude_matches', 'eq', 0);
         if ($location == 'defaults') {
             $mform->addElement('text', 'plagiarism_locked_message', get_string("locked_message", "plagiarism_turnitin"), 'maxlength="50" size="50"');
             $mform->setType('plagiarism_locked_message', PARAM_TEXT);
             $mform->setDefault('plagiarism_locked_message', get_string("locked_message_default", "plagiarism_turnitin"));
             $mform->addHelpButton('plagiarism_locked_message', 'locked_message', 'plagiarism_turnitin');
         }
         if ($location == "activity" && $config->usegrademark) {
             // Populate Rubric options.
             $rubricoptions = array('' => get_string('norubric', 'plagiarism_turnitin')) + $rubrics;
             if (!empty($currentrubric)) {
                 $rubricoptions[$currentrubric] = isset($rubricoptions[$currentrubric]) ? $rubricoptions[$currentrubric] : get_string('otherrubric', 'plagiarism_turnitin');
             }
             $mform->addElement('select', 'plagiarism_rubric', get_string('attachrubric', 'plagiarism_turnitin'), $rubricoptions);
             $mform->addElement('static', 'rubric_link', '', html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/extras.php?cmd=rubricmanager&view_context=box', get_string('launchrubricmanager', 'plagiarism_turnitin'), array('class' => 'rubric_manager_launch', 'title' => get_string('launchrubricmanager', 'plagiarism_turnitin'))) . html_writer::tag('span', '', array('class' => 'launch_form', 'id' => 'rubric_manager_form')));
             $mform->setDefault('plagiarism_rubric', '');
             $mform->addElement('hidden', 'rubric_warning_seen', '');
             $mform->setType('rubric_warning_seen', PARAM_RAW);
             $mform->addElement('static', 'rubric_note', '', get_string('attachrubricnote', 'plagiarism_turnitin'));
         } else {
             $mform->addElement('hidden', 'plagiarism_rubric', '');
             $mform->setType('plagiarism_rubric', PARAM_RAW);
         }
         if (!empty($config->useerater)) {
             $handbookoptions = array(1 => get_string('erater_handbook_advanced', 'plagiarism_turnitin'), 2 => get_string('erater_handbook_highschool', 'plagiarism_turnitin'), 3 => get_string('erater_handbook_middleschool', 'plagiarism_turnitin'), 4 => get_string('erater_handbook_elementary', 'plagiarism_turnitin'), 5 => get_string('erater_handbook_learners', 'plagiarism_turnitin'));
             $dictionaryoptions = array('en_US' => get_string('erater_dictionary_enus', 'plagiarism_turnitin'), 'en_GB' => get_string('erater_dictionary_engb', 'plagiarism_turnitin'), 'en' => get_string('erater_dictionary_en', 'plagiarism_turnitin'));
             $mform->addElement('select', 'plagiarism_erater', get_string('erater', 'plagiarism_turnitin'), $options);
             $mform->setDefault('plagiarism_erater', 0);
             $mform->addElement('select', 'plagiarism_erater_handbook', get_string('erater_handbook', 'plagiarism_turnitin'), $handbookoptions);
             $mform->setDefault('plagiarism_erater_handbook', 2);
             $mform->disabledIf('plagiarism_erater_handbook', 'plagiarism_erater', 'eq', 0);
             $mform->addElement('select', 'plagiarism_erater_dictionary', get_string('erater_dictionary', 'plagiarism_turnitin'), $dictionaryoptions);
             $mform->setDefault('plagiarism_erater_dictionary', 'en_US');
             $mform->disabledIf('plagiarism_erater_dictionary', 'plagiarism_erater', 'eq', 0);
             $mform->addElement('checkbox', 'plagiarism_erater_spelling', get_string('erater_categories', 'plagiarism_turnitin'), " " . get_string('erater_spelling', 'plagiarism_turnitin'));
             $mform->disabledIf('plagiarism_erater_spelling', 'plagiarism_erater', 'eq', 0);
             $mform->addElement('checkbox', 'plagiarism_erater_grammar', '', " " . get_string('erater_grammar', 'plagiarism_turnitin'));
             $mform->disabledIf('plagiarism_erater_grammar', 'plagiarism_erater', 'eq', 0);
             $mform->addElement('checkbox', 'plagiarism_erater_usage', '', " " . get_string('erater_usage', 'plagiarism_turnitin'));
             $mform->disabledIf('plagiarism_erater_usage', 'plagiarism_erater', 'eq', 0);
             $mform->addElement('checkbox', 'plagiarism_erater_mechanics', '', " " . get_string('erater_mechanics', 'plagiarism_turnitin'));
             $mform->disabledIf('plagiarism_erater_mechanics', 'plagiarism_erater', 'eq', 0);
             $mform->addElement('checkbox', 'plagiarism_erater_style', '', " " . get_string('erater_style', 'plagiarism_turnitin'));
             $mform->disabledIf('plagiarism_erater_style', 'plagiarism_erater', 'eq', 0);
         }
         $mform->addElement('html', html_writer::tag('div', get_string('anonblindmarkingnote', 'plagiarism_turnitin'), array('class' => 'tii_anonblindmarkingnote')));
         if ($config->transmatch) {
             $mform->addElement('select', 'plagiarism_transmatch', get_string("transmatch", "turnitintooltwo"), $options);
         } else {
             $mform->addElement('hidden', 'plagiarism_transmatch', 0);
         }
         $mform->setType('plagiarism_transmatch', PARAM_INT);
         $mform->addElement('hidden', 'action', "defaults");
         $mform->setType('action', PARAM_RAW);
     } else {
         $mform->addElement('hidden', 'use_turnitin', 0);
         $mform->setType('use_turnitin', PARAM_INT);
     }
     // Disable the form change checker - added in 2.3.2.
     if (is_callable(array($mform, 'disable_form_change_checker'))) {
         $mform->disable_form_change_checker();
     }
 }
示例#7
0
/**
 * Get users for unlinking/relinking. Called from ajax.php via turnitintooltwo.js.
 *
 * @global type $DB
 * @return array return array of users to display
 */
function turnitintooltwo_getusers()
{
    global $DB;
    $config = turnitintooltwo_admin_config();
    $return = array();
    $idisplaystart = optional_param('iDisplayStart', 0, PARAM_INT);
    $idisplaylength = optional_param('iDisplayLength', 10, PARAM_INT);
    $secho = optional_param('sEcho', 1, PARAM_INT);
    $displaycolumns = array('tu.userid', 'tu.turnitin_uid', 'mu.lastname', 'mu.firstname', 'mu.email');
    $queryparams = array();
    // Add sort to query.
    $isortcol[0] = optional_param('iSortCol_0', null, PARAM_INT);
    $isortingcols = optional_param('iSortingCols', 0, PARAM_INT);
    $queryorder = "";
    if (!is_null($isortcol[0])) {
        $queryorder = " ORDER BY ";
        $startorder = $queryorder;
        for ($i = 0; $i < intval($isortingcols); $i++) {
            $isortcol[$i] = optional_param('iSortCol_' . $i, null, PARAM_INT);
            $bsortable[$i] = optional_param('bSortable_' . $isortcol[$i], null, PARAM_TEXT);
            $ssortdir[$i] = optional_param('sSortDir_' . $i, null, PARAM_TEXT);
            if ($bsortable[$i] == "true") {
                $queryorder .= $displaycolumns[$isortcol[$i]] . " " . $ssortdir[$i] . ", ";
            }
        }
        if ($queryorder == $startorder) {
            $queryorder = "";
        } else {
            $queryorder = substr_replace($queryorder, "", -2);
        }
    }
    // Add search to query.
    $ssearch = optional_param('sSearch', '', PARAM_TEXT);
    $querywhere = ' WHERE ( ';
    for ($i = 0; $i < count($displaycolumns); $i++) {
        $bsearchable[$i] = optional_param('bSearchable_' . $i, null, PARAM_TEXT);
        if (!is_null($bsearchable[$i]) && $bsearchable[$i] == "true" && $ssearch != '') {
            $include = true;
            if ($i <= 1) {
                if (!is_int($ssearch) || is_null($ssearch)) {
                    $include = false;
                }
            }
            if ($include) {
                $querywhere .= $DB->sql_like($displaycolumns[$i], ':search_term_' . $i, false) . " OR ";
                $queryparams['search_term_' . $i] = '%' . $ssearch . '%';
            }
        }
    }
    if ($querywhere == ' WHERE ( ') {
        $querywhere = "";
    } else {
        $querywhere = substr_replace($querywhere, "", -3);
        $querywhere .= " )";
    }
    $query = "SELECT tu.id AS id, tu.userid AS userid, tu.turnitin_uid AS turnitin_uid, tu.turnitin_utp AS turnitin_utp, " . "mu.firstname AS firstname, mu.lastname AS lastname, mu.email AS email " . "FROM {turnitintooltwo_users} tu " . "LEFT JOIN {user} mu ON tu.userid = mu.id " . $querywhere . $queryorder;
    $users = $DB->get_records_sql($query, $queryparams, $idisplaystart, $idisplaylength);
    $totalusers = count($DB->get_records_sql($query, $queryparams));
    $return["aaData"] = array();
    foreach ($users as $user) {
        $checkbox = html_writer::checkbox('userids[]', $user->id, false, '', array("class" => "browser_checkbox"));
        $pseudoemail = "";
        if (!empty($config->enablepseudo)) {
            $pseudouser = new TiiPseudoUser(turnitintooltwo_user::get_pseudo_domain());
            $pseudouser->setEmail($user->email);
            $pseudoemail = $pseudouser->getEmail();
        }
        $return["aaData"][] = array($checkbox, $user->turnitin_uid == 0 ? '' : $user->turnitin_uid, format_string($user->lastname), format_string($user->firstname), $pseudoemail);
    }
    $return["sEcho"] = $secho;
    $return["iTotalRecords"] = count($users);
    $return["iTotalDisplayRecords"] = $totalusers;
    return $return;
}
 /**
  * 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);
         }
     }
 }
 public function definition()
 {
     global $CFG, $DB, $USER, $COURSE;
     $config = turnitintooltwo_admin_config();
     // Module string is useful for product support.
     $modulestring = '<!-- Turnitin Moodle Direct Version: ' . turnitintooltwo_get_version() . ' - (';
     // Get Moodle Course Object.
     $course = turnitintooltwo_assignment::get_course_data($COURSE->id);
     // Create or edit the class in Turnitin.
     if ($course->turnitin_cid == 0) {
         $tiicoursedata = turnitintooltwo_assignment::create_tii_course($course, $USER->id);
         $course->turnitin_cid = $tiicoursedata->turnitin_cid;
         $course->turnitin_ctl = $tiicoursedata->turnitin_ctl;
     } else {
         turnitintooltwo_assignment::edit_tii_course($course);
         $course->turnitin_ctl = $course->fullname . " (Moodle TT)";
     }
     // Join this user to the class as an instructor and get their rubrics.
     $instructor = new turnitintooltwo_user($USER->id, 'Instructor');
     $instructor->join_user_to_class($course->turnitin_cid);
     $instructor->set_user_values_from_tii();
     $instructorrubrics = $instructor->get_instructor_rubrics();
     // Get rubrics that are shared on the account.
     $turnitinclass = new turnitintooltwo_class($course->id);
     $turnitinclass->read_class_from_tii();
     // Merge the arrays, prioitising instructor owned arrays.
     $rubrics = $instructorrubrics + $turnitinclass->sharedrubrics;
     $this->numsubs = 0;
     if (isset($this->_cm->id)) {
         $turnitintooltwoassignment = new turnitintooltwo_assignment($this->_cm->instance);
         $turnitintooltwoassignment->update_assignment_from_tii();
         $this->turnitintooltwo = $DB->get_record("turnitintooltwo", array("id" => $this->_cm->instance));
         $parts = $DB->get_records("turnitintooltwo_parts", array("turnitintooltwoid" => $this->_cm->instance, "deleted" => 0), 'id');
         $i = 0;
         foreach ($parts as $part) {
             $i++;
             $attributes = array("id", "partname", "dtstart", "dtdue", "dtpost", "maxmarks");
             foreach ($attributes as $att) {
                 $attribute = $att . $i;
                 $this->current->{$attribute} = $part->{$att};
             }
             $attribute = "numsubs" . $i;
             $this->current->{$attribute} = $DB->count_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $this->turnitintooltwo->id, 'submission_part' => $part->id));
             $this->numsubs += $this->current->{$attribute};
             $modulestring .= $modulestring != "(" ? " | " : "";
             $modulestring .= $part->partname . ': ' . $part->tiiassignid;
         }
         $this->updating = true;
     } else {
         $this->updating = false;
         $instructordefaults = $instructor->get_instructor_defaults();
         if (empty($instructordefaults)) {
             $instructordefaults = array();
         }
         foreach ($instructordefaults as $k => $v) {
             $this->current->{$k} = $v;
         }
     }
     // Overwrite instructor default repository if admin is forcing repository setting
     switch ($config->repositoryoption) {
         case 2:
             // Force Standard Repository
             $this->current->submitpapersto = 1;
             break;
         case 3:
             // Force No Repository
             $this->current->submitpapersto = 0;
             break;
     }
     $modulestring .= ') -->';
     $this->show_form($rubrics, $modulestring, $course->turnitin_cid);
 }
 /**
  * If no user data was restored after everything has been restored then
  * create a new course in Turnitin
  */
 public function after_restore()
 {
     global $DB, $CFG;
     if (!empty($_SESSION['tii_course_reset'])) {
         $course = turnitintooltwo_assignment::get_course_data($_SESSION['course_id']);
         //Get the main site admin.
         $admins = explode(",", $CFG->siteadmins);
         $ownerid = $admins[0];
         // Get the number of assignments that already exist on this course that aren't part of recreation.
         $assignments = 0;
         if (!empty($_SESSION['assignments_to_create'])) {
             $modules = $_SESSION['assignments_to_create'];
             list($notinsql, $notinparams) = $DB->get_in_or_equal($modules, SQL_PARAMS_QM, 'param', false);
             $assignments = $DB->count_records_select('turnitintooltwo', " course = ? AND id " . $notinsql, array_merge(array($_SESSION['course_id']), $notinparams));
         }
         // Only recreate course on Turnitin if Turnitin Assignments don't exist on destination course.
         if ($assignments == 0) {
             // Remove Turnitin link from course
             $turnitin_course = new stdClass();
             $turnitin_course->id = $course->tii_rel_id;
             $turnitin_course->turnitin_cid = 0;
             $DB->update_record('turnitintooltwo_courses', $turnitin_course);
             // Recreate course in Turnitin
             $course->turnitin_cid = 0;
             $tmpassignment = new turnitintooltwo_assignment(0, '', '');
             $turnitin_course = $tmpassignment->create_tii_course($course, $ownerid);
             // Join the course as Instructor
             $owner = new turnitintooltwo_user($ownerid, 'Instructor');
             $owner->join_user_to_class($turnitin_course->turnitin_cid);
         }
         unset($_SESSION['tii_course_reset']);
         unset($_SESSION['course_id']);
     }
     if (!empty($_SESSION['assignments_to_create'])) {
         foreach ($_SESSION["assignments_to_create"] as $new_assignment_id) {
             $assignment = new turnitintooltwo_assignment($new_assignment_id);
             $assignment->unlink_assignment();
             $assignment->edit_moodle_assignment(true, true);
         }
         unset($_SESSION['tii_assignment_reset']);
         unset($_SESSION['assignments_to_create']);
     }
 }
 /**
  * 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;
 }
示例#12
0
 public function definition()
 {
     global $CFG, $DB, $USER;
     $config = turnitintooltwo_admin_config();
     // Module string is useful for product support.
     if ($CFG->branch >= 26) {
         $pluginman = \core_plugin_manager::instance();
         $plugins = $pluginman->get_plugins();
         $module = $plugins['mod']['turnitintooltwo'];
     } else {
         $module = $DB->get_record('modules', array('name' => 'turnitintooltwo'));
     }
     $version = empty($module->version) ? $module->versiondisk : $module->version;
     $modulestring = '<!-- Turnitin Moodle Direct Version: ' . $version . ' - (';
     $this->numsubs = 0;
     $instructor = new turnitintooltwo_user($USER->id, 'Instructor');
     $instructor->set_user_values_from_tii();
     $instructorrubrics = $instructor->get_instructor_rubrics();
     if (isset($this->_cm->id)) {
         $turnitintooltwoassignment = new turnitintooltwo_assignment($this->_cm->instance);
         $turnitintooltwoassignment->update_assignment_from_tii();
         $this->turnitintooltwo = $DB->get_record("turnitintooltwo", array("id" => $this->_cm->instance));
         $parts = $DB->get_records("turnitintooltwo_parts", array("turnitintooltwoid" => $this->_cm->instance, "deleted" => 0), 'id');
         $i = 0;
         foreach ($parts as $part) {
             $i++;
             $attributes = array("id", "partname", "dtstart", "dtdue", "dtpost", "maxmarks");
             foreach ($attributes as $att) {
                 $attribute = $att . $i;
                 $this->current->{$attribute} = $part->{$att};
             }
             $attribute = "numsubs" . $i;
             $this->current->{$attribute} = $DB->count_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $this->turnitintooltwo->id, 'submission_part' => $part->id));
             $this->numsubs += $this->current->{$attribute};
             $modulestring .= $modulestring != "(" ? " | " : "";
             $modulestring .= $part->partname . ': ' . $part->tiiassignid;
         }
         $this->updating = true;
     } else {
         $this->updating = false;
         $instructordefaults = $instructor->get_instructor_defaults();
         if (empty($instructordefaults)) {
             $instructordefaults = array();
         }
         foreach ($instructordefaults as $k => $v) {
             $this->current->{$k} = $v;
         }
     }
     // Overwrite instructor default repository if admin is forcing repository setting
     switch ($config->repositoryoption) {
         case 2:
             // Force Standard Repository
             $this->current->submitpapersto = 1;
             break;
         case 3:
             // Force No Repository
             $this->current->submitpapersto = 0;
             break;
     }
     $modulestring .= ') -->';
     $this->show_form($instructorrubrics, $modulestring);
 }
 $jsrequired = true;
 $userids = isset($_REQUEST['userids']) ? $_REQUEST["userids"] : array();
 $userids = clean_param_array($userids, PARAM_INT);
 // Relink users if form has been submitted.
 if ((!is_null($relink) || !is_null($unlink)) && isset($userids) && count($userids) > 0) {
     foreach ($userids as $tiiid) {
         $tuser = $DB->get_record('turnitintooltwo_users', array('id' => $tiiid));
         if ($muser = $DB->get_record('user', array('id' => $tuser->userid))) {
             // Get the email address if the user has been deleted.
             if (empty($muser->email) || strpos($muser->email, '@') === false) {
                 $split = explode('.', $muser->username);
                 array_pop($split);
                 $muser->email = join('.', $split);
             }
             // Unlink user from Turnitin.
             $user = new turnitintooltwo_user($muser->id, $role = null, $enrol = null, $workflowcontext = null, $finduser = false);
             $user->unlink_user($tiiid);
             // Relink user.
             if (!is_null($relink)) {
                 // The user object will create user in Turnitin.
                 $user = new turnitintooltwo_user($muser->id);
             }
         } else {
             $DB->delete_records('turnitintooltwo_users', array('id' => $tiiid));
         }
     }
     redirect(new moodle_url('/mod/turnitintooltwo/settings_extras.php', array('cmd' => 'unlinkusers')));
     exit;
 }
 $output .= html_writer::tag('h2', get_string('unlinkrelinkusers', 'turnitintooltwo'));
 $table = new html_table();
示例#14
0
     $submissionid = required_param('submissionid', PARAM_INT);
     $user = new turnitintooltwo_user($USER->id, $userrole);
     echo html_writer::tag("div", $turnitintooltwoview->output_dv_launch_form($do, $submissionid, $user->tii_user_id, $userrole), array("class" => "launch_form"));
     if ($do === "origreport") {
         $submission = new turnitintooltwo_submission($submissionid, 'turnitin');
         turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "view submission", 'view.php?id=' . $cm->id, get_string('viewsubmissiondesc', 'turnitintooltwo') . " '{$submission->submission_title}'", $cm->id, $submission->userid);
     }
     break;
 case "submissions":
     $listsubmissionsdesc = $istutor ? "listsubmissionsdesc" : "listsubmissionsdesc_student";
     turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "list submissions", 'view.php?id=' . $cm->id, get_string($listsubmissionsdesc, 'turnitintooltwo') . ": {$course->id}", $cm->id);
     if (!$istutor && !has_capability('mod/turnitintooltwo:submit', context_module::instance($cm->id))) {
         turnitintooltwo_print_error('permissiondeniederror', 'turnitintooltwo');
         exit;
     }
     $turnitintooltwouser = new turnitintooltwo_user($USER->id, $userrole);
     // Get course data.
     if ($istutor) {
         $course = $turnitintooltwoassignment->get_course_data($turnitintooltwoassignment->turnitintooltwo->course);
     }
     // Update Assignment from Turnitin on first visit.
     if (empty($_SESSION["assignment_updated"][$turnitintooltwoassignment->turnitintooltwo->id])) {
         $turnitintooltwoassignment->update_assignment_from_tii();
         // Enrol the tutor on the class.
         if ($istutor) {
             $turnitintooltwouser->join_user_to_class($course->turnitin_cid);
         }
     }
     // Show submission failure if this has been a manual submission.
     if (isset($_SESSION["digital_receipt"]["success"]) && $_SESSION["digital_receipt"]["success"] == false) {
         $output = html_writer::tag("div", $_SESSION["digital_receipt"]["message"], array("class" => "general_warning manual_submission_failure_msg"));
示例#15
0
 /**
  * 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;
 }