$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);
     if (!$istutor && !has_capability('mod/turnitintooltwo:submit', context_module::instance($cm->id))) {
         turnitintooltwo_print_error('permissiondeniederror', 'turnitintooltwo');
 /**
  * Get the row for this submission in the inbox table
  *
  * @global object $CFG
  * @global type $OUTPUT
  * @param type $cm
  * @param type $turnitintooltwoassignment
  * @param type $parts
  * @param type $partid
  * @param type $submission
  * @param type $useroverallgrades
  * @param type $istutor
  * @return type
  */
 public function get_submission_inbox_row($cm, $turnitintooltwoassignment, $parts, $partid, $submission, &$useroverallgrades, $istutor, $context = 'all')
 {
     global $CFG, $OUTPUT, $USER, $DB;
     $config = turnitintooltwo_admin_config();
     $moodleuserid = substr($submission->userid, 0, 3) != 'nm-' && $submission->userid != 0 ? $submission->userid : 0;
     if (!$istutor) {
         $user = new turnitintooltwo_user($USER->id, "Learner");
     }
     $checkbox = "&nbsp;";
     if (!empty($submission->submission_objectid) && $istutor) {
         $checkbox = html_writer::checkbox('check_' . $submission->submission_objectid, $submission->submission_objectid, false, '', array("class" => "inbox_checkbox"));
     }
     if (!$istutor) {
         // If students viewing it will show 'digital receipt' link
         if (!empty($submission->submission_objectid)) {
             $studentname = html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/view.php?id=' . $cm->id . '&do=digital_receipt&submissionid=' . $submission->submission_objectid . '&view_context=box', $OUTPUT->pix_icon('receipt', get_string('digitalreceipt', 'turnitintooltwo'), 'mod_turnitintooltwo', array('id' => 'tii_digital_receipt_icon')) . get_string('viewdigitalreceipt', 'turnitintooltwo'), array('class' => 'tii_digital_receipt'));
         } else {
             $studentname = "--";
         }
         //Determine whether the student can see the overall grade, based on the post time of all parts.
         $display_overall_grade = 1;
         foreach (array_keys($parts) as $ar_key => $ar_value) {
             if ($parts[$ar_value]->dtpost > time()) {
                 $display_overall_grade = 0;
             }
         }
     } else {
         if ($turnitintooltwoassignment->turnitintooltwo->anon && $parts[$partid]->unanon != 1) {
             if (empty($submission->submission_unanon) and $parts[$partid]->dtpost > time() and !empty($submission->submission_objectid)) {
                 // Anonymous marking is on, postdate has not passed and a submission has been made.
                 $studentname = html_writer::link('.unanonymise_form', get_string('anonenabled', 'turnitintooltwo'), array("class" => "unanonymise", "id" => "submission_" . $submission->submission_objectid));
             } else {
                 if (($parts[$partid]->dtpost <= time() or !empty($submission->submission_unanon)) and empty($submission->nmoodle)) {
                     // Post date has passed or anonymous marking disabled for user and user is a moodle user.
                     $studentname = html_writer::link($CFG->wwwroot . "/user/view.php?id=" . $submission->userid . "&course=" . $turnitintooltwoassignment->turnitintooltwo->course, format_string($submission->lastname) . ", " . format_string($submission->firstname));
                 } else {
                     if (($parts[$partid]->dtpost <= time() or !empty($submission->submission_unanon)) and !empty($submission->nmoodle)) {
                         // Post date has passed or anonymous marking disabled for user and user is a NON moodle user.
                         $studentname = html_writer::tag("span", format_string($submission->lastname) . ", " . format_string($submission->firstname) . " (" . get_string('nonmoodleuser', 'turnitintooltwo') . ")", array("class" => "italic"));
                     } else {
                         // User has not made a submission.
                         $studentname = html_writer::tag("span", get_string('anonenabled', 'turnitintooltwo'), array("class" => "italic"));
                     }
                 }
             }
         } else {
             if (empty($submission->nmoodle)) {
                 // Link to user profile.
                 $studentname = html_writer::link($CFG->wwwroot . "/user/view.php?id=" . $submission->userid . "&course=" . $turnitintooltwoassignment->turnitintooltwo->course, format_string($submission->lastname) . ", " . format_string($submission->firstname));
             } else {
                 if (!empty($submission->nmoodle) && substr($submission->userid, 0, 3) != 'nm-') {
                     // Moodle User not enrolled on this course as a student.
                     $studentname = html_writer::link($CFG->wwwroot . "/user/view.php?id=" . $submission->userid . "&course=" . $turnitintooltwoassignment->turnitintooltwo->course, format_string($submission->lastname) . ", " . format_string($submission->firstname) . " (" . get_string('nonenrolledstudent', 'turnitintooltwo') . ")", array("class" => "italic"));
                 } else {
                     // Non Moodle user.
                     $studentname = html_writer::tag("span", format_string($submission->lastname) . ", " . format_string($submission->firstname) . " (" . get_string('nonmoodleuser', 'turnitintooltwo') . ")", array("class" => "italic"));
                 }
             }
         }
     }
     // Submission title with link to open DV.
     if (!empty($submission->submission_objectid) and !empty($submission->submission_objectid)) {
         $title = $OUTPUT->box_start('default_open', 'default_' . $submission->submission_objectid . '_' . $partid . '_' . $moodleuserid);
         $title .= $OUTPUT->box(format_string($submission->submission_title), 'submission_title underline');
         $title .= $OUTPUT->box($CFG->wwwroot . '/mod/turnitintooltwo/view.php?id=' . $cm->id, 'dv_url', 'default_url_' . $submission->submission_objectid);
         $title .= $OUTPUT->box_end(true);
         $rawtitle = $submission->submission_title;
     } else {
         $title = "--";
         $rawtitle = "--";
     }
     $objectid = !empty($submission->submission_objectid) ? $submission->submission_objectid : "--";
     // Show date of submission or link to submit if it didn't work.
     if (empty($submission->submission_objectid) and !empty($submission->id)) {
         $rawmodified = 1;
         $modified = html_writer::link($CFG->wwwroot . "/mod/turnitintooltwo/view.php?id=" . $cm->id . "&action=manualsubmission" . "&sub=" . $submission->id . '&sesskey=' . sesskey(), $OUTPUT->pix_icon('icon-sml', get_string('submittoturnitin', 'turnitintooltwo'), 'mod_turnitintooltwo') . " " . get_string('submittoturnitin', 'turnitintooltwo'));
     } else {
         if (empty($submission->submission_objectid)) {
             $rawmodified = 0;
             $modified = "--";
         } else {
             $rawmodified = (int) $submission->submission_modified;
             $modified = userdate($submission->submission_modified, get_string('strftimedatetimeshort', 'langconfig'));
             if ($submission->submission_modified > $parts[$partid]->dtdue) {
                 $modified = html_writer::tag('span', $modified, array("class" => "late_submission"));
             }
         }
     }
     // Show Originality score with link to open document viewer.
     if (!empty($submission->id) && is_null($submission->submission_score) && $submission->submission_orcapable == 0) {
         // Don't show if there is no OR score and submission is not OR capable
         $rawscore = null;
         $score = '--';
     } else {
         if (!empty($submission->id) && !empty($submission->submission_objectid) && ($istutor || $turnitintooltwoassignment->turnitintooltwo->studentreports)) {
             // Show score.
             if (is_null($submission->submission_score)) {
                 $score = $OUTPUT->box_start('row_score', 'origreport_' . $submission->submission_objectid . '_' . $partid . '_' . $moodleuserid);
                 $score .= $OUTPUT->box('&nbsp;', 'score_colour score_colour_');
                 $score .= $OUTPUT->box(get_string('pending', 'turnitintooltwo'), 'origreport_score');
                 $rawscore = null;
             } else {
                 $score = $OUTPUT->box_start('row_score origreport_open', 'origreport_' . $submission->submission_objectid . '_' . $partid . '_' . $moodleuserid);
                 // Put EN flag if translated matching is on and that is the score used.
                 $transmatch = $submission->submission_transmatch == 1 ? 'EN' : '&nbsp;';
                 $score .= $OUTPUT->box($transmatch, 'score_colour score_colour_' . round($submission->submission_score, -1));
                 $score .= $OUTPUT->box($submission->submission_score . '%', 'origreport_score');
                 $rawscore = $submission->submission_score;
             }
             // Put in div placeholder for DV launch form.
             $score .= $OUTPUT->box('', 'launch_form', 'origreport_form_' . $submission->submission_objectid);
             // URL for DV launcher
             $score .= $OUTPUT->box($CFG->wwwroot . '/mod/turnitintooltwo/view.php?id=' . $cm->id, 'dv_url', 'origreport_url_' . $submission->submission_objectid);
             $score .= $OUTPUT->box_end(true);
         } else {
             $rawscore = null;
             $score = '--';
         }
     }
     // Show grade and link to DV.
     if ($config->usegrademark) {
         if ($turnitintooltwoassignment->turnitintooltwo->grade == 0) {
             //We set the grade column to N/A if there is no grade type set.
             $rawgrade = null;
             $grade = $OUTPUT->box('N/A', '');
         } else {
             if (isset($submission->submission_objectid) && ($istutor || !$istutor && $parts[$partid]->dtpost < time())) {
                 $submissiongrade = !is_null($submission->submission_grade) ? $submission->submission_grade : '';
                 if (is_null($submission->submission_grade) || $submission->submission_gmimaged == 0 && !$istutor) {
                     $submissiongrade = "--";
                 }
                 // Show warning to instructor if student can still resubmit.
                 $canresubmit = $turnitintooltwoassignment->turnitintooltwo->reportgenspeed > 0;
                 $tutorbeforeduedate = $istutor && time() < $parts[$partid]->dtdue;
                 $allowedlate = $turnitintooltwoassignment->turnitintooltwo->allowlate == 1 && empty($submission->nmoodle);
                 $class = $canresubmit && ($tutorbeforeduedate || $allowedlate) ? 'graded_warning' : '';
                 // Output grademark icon.
                 $grade = $OUTPUT->box(html_writer::tag('i', '', array('class' => 'fa fa-pencil fa-lg gm-blue')), 'grademark_open' . $class, 'grademark_' . $submission->submission_objectid . '_' . $partid . '_' . $moodleuserid, array('title' => $CFG->wwwroot . '/mod/turnitintooltwo/view.php?id=' . $cm->id));
                 // Show grade.
                 $grade .= $OUTPUT->box(html_writer::tag('span', $submissiongrade, array("class" => "grade")) . "/" . $parts[$partid]->maxmarks, 'grademark_grade');
                 // Put in div placeholder for DV launch form.
                 $grade .= $OUTPUT->box('', 'launch_form', 'grademark_form_' . $submission->submission_objectid);
                 // URL for DV launcher
                 $grade .= $OUTPUT->box($CFG->wwwroot . '/mod/turnitintooltwo/view.php?id=' . $cm->id, 'dv_url', 'grademark_url_' . $submission->submission_objectid);
                 $rawgrade = $submissiongrade == "--" ? null : $submissiongrade;
             } else {
                 if (!isset($submission->submission_objectid) && empty($submission->id) && $istutor) {
                     // Allow nothing submission if no submission has been made and this is a tutor
                     $grade = $OUTPUT->box(html_writer::tag('i', '', array('class' => 'fa fa-pencil fa-lg grey')), 'submit_nothing', 'submitnothing_0_' . $partid . '_' . $submission->userid);
                     $rawgrade = null;
                 } else {
                     $rawgrade = null;
                     $grade = $OUTPUT->box('--', '');
                 }
             }
         }
         // Show average grade if more than 1 part.
         if (count($parts) > 1 || $turnitintooltwoassignment->turnitintooltwo->grade < 0) {
             $overallgrade = '--';
             if ($submission->nmoodle != 1 && ($istutor || !$istutor && $parts[$partid]->dtpost < time())) {
                 if (!isset($useroverallgrades[$submission->userid])) {
                     $usersubmissions = $turnitintooltwoassignment->get_user_submissions($submission->userid, $turnitintooltwoassignment->turnitintooltwo->id);
                     $useroverallgrades[$submission->userid] = $turnitintooltwoassignment->get_overall_grade($usersubmissions);
                 }
                 if ($turnitintooltwoassignment->turnitintooltwo->grade == 0 || $useroverallgrades[$submission->userid] === '--' || !$istutor && $display_overall_grade == 0) {
                 } else {
                     if ($turnitintooltwoassignment->turnitintooltwo->grade < 0) {
                         // Scale.
                         $scale = $DB->get_record('scale', array('id' => $turnitintooltwoassignment->turnitintooltwo->grade * -1));
                         $scalearray = explode(",", $scale->scale);
                         $overallgrade = $scalearray[$useroverallgrades[$submission->userid] - 1];
                     } else {
                         $overallgrade = round($useroverallgrades[$submission->userid] / $turnitintooltwoassignment->turnitintooltwo->grade * 100, 1) . '%';
                     }
                 }
                 if ($overallgrade != '--') {
                     $overallgrade = html_writer::tag("span", $overallgrade, array("class" => "overallgrade_" . $submission->userid));
                 }
             }
         }
     }
     // Indicate whether student has seen grademark image.
     if ($istutor) {
         if (isset($submission->submission_objectid)) {
             $submissionattempts = !empty($submission->submission_attempts) ? $submission->submission_attempts : 0;
             if ($submissionattempts > 0) {
                 $studentread = $OUTPUT->pix_icon('icon-student-read', get_string('student_read', 'turnitintooltwo') . ' ' . userdate($submissionattempts), 'mod_turnitintooltwo', array("class" => "student_read_icon"));
             } else {
                 $studentread = $OUTPUT->pix_icon('icon-dot', get_string('student_notread', 'turnitintooltwo'), 'mod_turnitintooltwo', array("class" => "student_dot_icon"));
             }
         } else {
             $studentread = "--";
         }
     }
     // Upload Submission.
     if ((!isset($submission->submission_objectid) || $turnitintooltwoassignment->turnitintooltwo->reportgenspeed != 0) && empty($submission->nmoodle) && time() > $parts[$partid]->dtstart) {
         if (empty($submission->submission_objectid)) {
             $submission->submission_objectid = 0;
         }
         $uploadtext = !$istutor ? html_writer::tag('span', get_string('submitpaper', 'turnitintooltwo')) : '';
         $eulaaccepted = 0;
         if ($submission->userid == $USER->id) {
             $submission_user = new turnitintooltwo_user($submission->userid, "Learner");
             $coursedata = $turnitintooltwoassignment->get_course_data($turnitintooltwoassignment->turnitintooltwo->course);
             $submission_user->join_user_to_class($coursedata->turnitin_cid);
             $eulaaccepted = $submission_user->user_agreement_accepted == 0 ? $submission_user->get_accepted_user_agreement() : $submission_user->user_agreement_accepted;
         }
         $upload = html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/view.php?id=' . $cm->id . '&part=' . $partid . '&user='******'&do=submitpaper&view_context=box_solid', $uploadtext . ' ' . html_writer::tag('i', '', array('class' => 'fa fa-cloud-upload fa-lg')), array("class" => "upload_box nowrap", "id" => "upload_" . $submission->submission_objectid . "_" . $partid . "_" . $submission->userid, 'data-eula' => $eulaaccepted, 'data-user-type' => $istutor));
         if (time() > $parts[$partid]->dtdue && $turnitintooltwoassignment->turnitintooltwo->allowlate == 0 && !$istutor) {
             $upload = "&nbsp;";
         }
     } else {
         $upload = "&nbsp;";
     }
     // Download submission in original format.
     if (!empty($submission->submission_objectid) && !empty($submission->id) && !$submission->submission_acceptnothing) {
         $download = $OUTPUT->box(html_writer::tag('i', '', array('class' => 'fa fa-cloud-download fa-lg')), 'download_original_open', 'downloadoriginal_' . $submission->submission_objectid . "_" . $partid . "_" . $moodleuserid);
         $download .= $OUTPUT->box('', 'launch_form', 'downloadoriginal_form_' . $submission->submission_objectid);
         // Add in LTI launch form incase Javascript is disabled.
         if (!$istutor) {
             $download .= html_writer::tag('noscript', $this->output_dv_launch_form("downloadoriginal", $submission->submission_objectid, $user->tii_user_id, "Learner", get_string('downloadsubmission', 'turnitintooltwo')));
         }
     } else {
         $download = "--";
     }
     $refresh = '--';
     if (!empty($submission->id) && $istutor) {
         $refresh = html_writer::tag('div', html_writer::tag('i', '', array('class' => 'fa fa-refresh fa-lg', 'title' => get_string('turnitinrefreshsubmissions', 'turnitintooltwo'))) . html_writer::tag('i', '', array('class' => 'fa fa-spinner fa-spin')), array('class' => 'refresh_row', 'id' => 'refreshrow_' . $submission->submission_objectid . '_' . $partid . '_' . $moodleuserid));
     }
     // Delete Link.
     $delete = "--";
     if ($istutor) {
         if (!empty($submission->id)) {
             $fnd = array("\n", "\r");
             $rep = array('\\n', '\\r');
             $confirmstring = empty($submission->submission_objectid) ? 'deleteconfirm' : 'turnitindeleteconfirm';
             $string = str_replace($fnd, $rep, get_string($confirmstring, 'turnitintooltwo'));
             $attributes = array("onclick" => "return confirm('" . $string . "');");
             $delete = html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/view.php?id=' . $cm->id . '&action=deletesubmission&sub=' . $submission->id . '&sesskey=' . sesskey(), html_writer::tag('i', '', array('class' => 'fa fa-trash-o fa-lg')), $attributes);
         }
     } else {
         if (empty($submission->submission_objectid) && !empty($submission->id)) {
             $fnd = array("\n", "\r");
             $rep = array('\\n', '\\r');
             $string = str_replace($fnd, $rep, get_string('deleteconfirm', 'turnitintooltwo'));
             $attributes = array("onclick" => "return confirm('" . $string . "');");
             $delete = html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/view.php?id=' . $cm->id . '&action=deletesubmission&sub=' . $submission->id . '&sesskey=' . sesskey(), html_writer::tag('i', '', array('class' => 'fa fa-trash-o fa-lg')), $attributes);
         }
     }
     $data = array($partid, $checkbox, $studentname, $rawtitle, $title, $objectid, $rawmodified, $modified);
     if ($istutor || !$istutor && $turnitintooltwoassignment->turnitintooltwo->studentreports) {
         $data[] = $rawscore;
         $data[] = $score;
     }
     if ($config->usegrademark) {
         $data[] = $rawgrade;
         $data[] = $grade;
         if (count($parts) > 1 || $turnitintooltwoassignment->turnitintooltwo->grade < 0) {
             $data[] = $overallgrade;
         }
     }
     if ($istutor) {
         $data[] = $studentread;
     }
     $data[] = $upload;
     $data[] = $download;
     if ($istutor) {
         $data[] = $refresh;
     }
     $data[] = $delete;
     return $data;
 }
 /**
  * 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;
 }
 /**
  * Make submission to Turnitin
  *
  * @global type $DB
  * @param object $cm the course module object
  * @return string $message to display to user
  */
 public function do_tii_submission($cm, $turnitintooltwoassignment)
 {
     global $DB, $USER, $CFG;
     $config = turnitintooltwo_admin_config();
     $notice = array("success" => false);
     $context = context_module::instance($cm->id);
     // Check if user is a member of class, if not then join them to it.
     $course = $turnitintooltwoassignment->get_course_data($turnitintooltwoassignment->turnitintooltwo->course);
     $user = new turnitintooltwo_user($this->userid, 'Learner');
     $user->join_user_to_class($course->turnitin_cid);
     $user->edit_tii_user();
     // Get the stored file and read it into a temp file for submitting to Turnitin.
     $fs = get_file_storage();
     $files = $fs->get_area_files($context->id, 'mod_turnitintooltwo', 'submissions', $this->id, "timecreated", false);
     $tempfile = "";
     foreach ($files as $file) {
         $filename = array($this->submission_title, $cm->id);
         if (!$turnitintooltwoassignment->turnitintooltwo->anon && empty($config->enablepseudo)) {
             $user_details = array($this->userid, $user->firstname, $user->lastname);
             $filename = array_merge($user_details, $filename);
         }
         $suffix = $file->get_filename();
         $tempfile = turnitintooltwo_tempfile($filename, $suffix);
         $fh = fopen($tempfile, "w");
         fwrite($fh, $file->get_content());
         fclose($fh);
     }
     if (!empty($tempfile)) {
         $part = $turnitintooltwoassignment->get_part_details($this->submission_part);
         // Initialise Comms Object.
         $turnitincomms = new turnitintooltwo_comms();
         $turnitincall = $turnitincomms->initialise_api();
         // Create Submission object to send to Turnitin.
         $newsubmission = new TiiSubmission();
         $newsubmission->setAssignmentId($part->tiiassignid);
         if (!is_null($this->submission_objectid)) {
             $newsubmission->setSubmissionId($this->submission_objectid);
             $apimethod = "replaceSubmission";
         } else {
             $apimethod = "createSubmission";
         }
         $newsubmission->setTitle($this->submission_title);
         $newsubmission->setAuthorUserId($user->tii_user_id);
         if ($user->id == $USER->id) {
             $newsubmission->setSubmitterUserId($user->tii_user_id);
             $newsubmission->setRole('Learner');
         } else {
             $instructor = new turnitintooltwo_user($USER->id, 'Instructor');
             $instructor->edit_tii_user();
             $newsubmission->setSubmitterUserId($instructor->tii_user_id);
             $newsubmission->setRole('Instructor');
         }
         $newsubmission->setSubmissionDataPath($tempfile);
         try {
             $response = $turnitincall->{$apimethod}($newsubmission);
             $newsubmission = $response->getSubmission();
             // Save the submission.
             $submission = new stdClass();
             $submission->id = $this->id;
             $submission->userid = $this->userid;
             $submission->turnitintooltwoid = $this->turnitintooltwoid;
             $submission->submission_part = $this->submission_part;
             $submission->submission_title = $this->submission_title;
             $submission->submission_type = $this->submission_type;
             $submission->submission_filename = $this->submission_filename;
             $submission->submission_objectid = $newsubmission->getSubmissionId();
             $submission->submission_score = $this->submission_score;
             $submission->submission_grade = $this->submission_grade;
             $submission->submission_gmimaged = $this->submission_gmimaged;
             $submission->submission_status = $this->submission_status;
             $submission->submission_queued = $this->submission_queued;
             $submission->submission_attempts = $this->submission_attempts;
             $submission->submission_modified = time();
             $submission->submission_nmuserid = $this->submission_nmuserid;
             $submission->submission_nmfirstname = $this->submission_nmfirstname;
             $submission->submission_nmlastname = $this->submission_nmlastname;
             $submission->submission_unanon = $this->submission_unanon;
             $submission->submission_unanonreason = $this->submission_unanonreason;
             $submission->submission_transmatch = $this->submission_transmatch;
             $submission->submission_acceptnothing = 0;
             $DB->update_record('turnitintooltwo_submissions', $submission);
             // Delete the tempfile.
             if (!is_null($tempfile)) {
                 unlink($tempfile);
             }
             $notice["success"] = true;
             $notice["message"] = get_string('submissionuploadsuccess', 'turnitintooltwo');
             $notice["extract"] = $newsubmission->getTextExtract();
             $notice["tii_submission_id"] = $submission->submission_objectid;
             //Send a message to the user's Moodle inbox with the digital receipt.
             $input = array('firstname' => $user->firstname, 'lastname' => $user->lastname, 'submission_title' => $this->submission_title, 'assignment_name' => $turnitintooltwoassignment->turnitintooltwo->name, 'assignment_part' => $partdetails = $turnitintooltwoassignment->get_part_details($this->submission_part)->partname, 'course_fullname' => $course->fullname, 'submission_date' => date('d-M-Y h:iA'), 'submission_id' => $submission->submission_objectid);
             // Student digital receipt
             $message = $this->receipt->build_message($input);
             $this->receipt->send_message($this->userid, $message);
             // Instructor digital receipt
             $this->submission_instructors = get_enrolled_users($context, 'mod/turnitintooltwo:grade', 0, 'u.id');
             if (!empty($this->submission_instructors)) {
                 $message = $this->instructor_receipt->build_instructor_message($input);
                 $this->instructor_receipt->send_instructor_message($this->submission_instructors, $message);
             }
             // Create a log entry for submission going to Turnitin.
             $logstring = $apimethod == "replaceSubmission" ? 'addresubmissiontiidesc' : 'addsubmissiontiidesc';
             turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "add submission", 'view.php?id=' . $cm->id, get_string($logstring, 'turnitintooltwo') . " '" . $this->submission_title . "'", $cm->id, $user->id);
             // Add to activity log.
             turnitintooltwo_activitylog("Action: Submission | Id: " . $this->turnitintooltwoid . " | Part: " . $submission->submission_part . " | User ID: " . $user->id . " (" . $user->tii_user_id . ") Submission title: " . $submission->submission_title, "REQUEST");
         } catch (Exception $e) {
             $errorstring = !is_null($this->submission_objectid) ? "updatesubmissionerror" : "createsubmissionerror";
             $error = $turnitincomms->handle_exceptions($e, $errorstring, false, true);
             $notice["message"] = $error;
             $notice["success"] = false;
         }
     } else {
         $notice["success"] = false;
         $notice["message"] = get_string('emptycreatedfile', 'turnitintooltwo');
     }
     return $notice;
 }
 /**
  * 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();
     }
 }
 /**
  * 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']);
     }
 }
示例#7
0
/**
 * Function called by course/reset.php when resetting moodle course, this is used to duplicate or reset a courses Turnitin
 * activities. If action specified is 'NEWCLASS' we are creating a new class on Turnitin. For both actions we create new
 * assignments on Turnitin and replace the turnitin ids for those parts in the database.
 *
 * @global object
 * @param var $courseid The course ID for the course to reset
 * @param string $action The action to use OLDCLASS or NEWCLASS
 * @return array The status array to pass to turnitintooltwo_reset_userdata
 */
function turnitintooltwo_duplicate_recycle($courseid, $action)
{
    set_time_limit(0);
    global $DB, $USER;
    $config = turnitintooltwo_admin_config();
    $partsarray = array();
    $error = false;
    $turnitintooltwouser = new turnitintooltwo_user($USER->id, "Instructor");
    $turnitintooltwouser->set_user_values_from_tii();
    $instructorrubrics = $turnitintooltwouser->get_instructor_rubrics();
    if (!($turnitintooltwos = $DB->get_records('turnitintooltwo', array('course' => $courseid)))) {
        turnitintooltwo_print_error('assigngeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__);
        exit;
    }
    if (!($course = $DB->get_record('course', array('id' => $courseid)))) {
        turnitintooltwo_print_error('coursegeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__);
        exit;
    }
    foreach ($turnitintooltwos as $turnitintooltwo) {
        if (!($parts = $DB->get_records('turnitintooltwo_parts', array('turnitintooltwoid' => $turnitintooltwo->id, 'deleted' => 0)))) {
            turnitintooltwo_print_error('partgeterror', 'turnitintooltwo', null, null, __FILE__, __LINE__);
            exit;
        }
        foreach ($parts as $part) {
            $partsarray[$courseid][$turnitintooltwo->id][$part->id]['tiiassignid'] = $part->tiiassignid;
        }
    }
    $currentcourse = turnitintooltwo_assignment::get_course_data($courseid);
    if ($action == "NEWCLASS") {
        // Delete Turnitin class link.
        if (!($delete = $DB->delete_records('turnitintooltwo_courses', array('courseid' => $courseid)))) {
            turnitintooltwo_print_error('coursedeleteerror', 'turnitintooltwo', null, null, __FILE__, __LINE__);
            exit;
        }
        $currentcourse->tii_rel_id = '';
        // Create a new class to use with new parts.
        $tmpassignment = new turnitintooltwo_assignment(0, '', '');
        $newcourse = $tmpassignment->create_tii_course($currentcourse, $USER->id);
        // Join Instructor to class.
        $turnitintooltwouser->join_user_to_class($newcourse->turnitin_cid);
        $currentcourse->turnitin_cid = $newcourse->turnitin_cid;
        $currentcourse->turnitin_ctl = $newcourse->turnitin_ctl;
    }
    // Create array of all the Turnitin assignment ids.
    $assignmentids = array();
    foreach ($partsarray[$courseid] as $tiitoolid => $tiitool) {
        foreach ($tiitool as $partid => $data) {
            $assignmentids[] = $data['tiiassignid'];
        }
    }
    // Update all the assignments and parts from Turnitin.
    $turnitintooltwoassignment = new turnitintooltwo_assignment(0, '', '');
    $turnitintooltwoassignment->update_assignment_from_tii($assignmentids);
    // Loop through Turnitintool instances and re-create assignment on Turnitin then swap over the stored Turnitin ids.
    foreach ($partsarray[$courseid] as $tiitoolid => $tiitool) {
        $turnitintooltwoassignment = new turnitintooltwo_assignment($tiitoolid);
        // Create new Assignment parts on Turnitin.
        $i = 0;
        foreach ($tiitool as $partid => $data) {
            $i++;
            $assignment = new TiiAssignment();
            $assignment->setClassId($currentcourse->turnitin_cid);
            $assignment->setAuthorOriginalityAccess($turnitintooltwoassignment->turnitintooltwo->studentreports);
            $rubric_id = !empty($turnitintooltwoassignment->turnitintooltwo->rubric) ? $turnitintooltwoassignment->turnitintooltwo->rubric : '';
            $rubric_id = !empty($rubric_id) && array_key_exists($rubric_id, $instructorrubrics) ? $rubric_id : '';
            $assignment->setRubricId($rubric_id);
            $assignment->setSubmitPapersTo($turnitintooltwoassignment->turnitintooltwo->submitpapersto);
            $assignment->setResubmissionRule($turnitintooltwoassignment->turnitintooltwo->reportgenspeed);
            $assignment->setBibliographyExcluded($turnitintooltwoassignment->turnitintooltwo->excludebiblio);
            $assignment->setQuotedExcluded($turnitintooltwoassignment->turnitintooltwo->excludequoted);
            $assignment->setSmallMatchExclusionType($turnitintooltwoassignment->turnitintooltwo->excludetype);
            $assignment->setSmallMatchExclusionThreshold((int) $turnitintooltwoassignment->turnitintooltwo->excludevalue);
            if ($config->useanon) {
                $assignment->setAnonymousMarking($turnitintooltwoassignment->turnitintooltwo->anon);
            }
            $assignment->setLateSubmissionsAllowed($turnitintooltwoassignment->turnitintooltwo->allowlate);
            if ($config->repositoryoption == 1) {
                $assignment->setInstitutionCheck(isset($turnitintooltwoassignment->turnitintooltwo->institution_check) ? $turnitintooltwoassignment->turnitintooltwo->institution_check : 0);
            }
            $attribute = "maxmarks" . $i;
            $assignment->setMaxGrade($turnitintooltwoassignment->turnitintooltwo->{$attribute});
            $assignment->setSubmittedDocumentsCheck($turnitintooltwoassignment->turnitintooltwo->spapercheck);
            $assignment->setInternetCheck($turnitintooltwoassignment->turnitintooltwo->internetcheck);
            $assignment->setPublicationsCheck($turnitintooltwoassignment->turnitintooltwo->journalcheck);
            $assignment->setTranslatedMatching($turnitintooltwoassignment->turnitintooltwo->transmatch);
            $assignment->setAllowNonOrSubmissions($turnitintooltwoassignment->turnitintooltwo->allownonor);
            // Erater settings.
            $assignment->setErater(isset($turnitintooltwoassignment->turnitintooltwo->erater) ? $turnitintooltwoassignment->turnitintooltwo->erater : 0);
            $assignment->setEraterSpelling($turnitintooltwoassignment->turnitintooltwo->erater_spelling);
            $assignment->setEraterGrammar($turnitintooltwoassignment->turnitintooltwo->erater_grammar);
            $assignment->setEraterUsage($turnitintooltwoassignment->turnitintooltwo->erater_usage);
            $assignment->setEraterMechanics($turnitintooltwoassignment->turnitintooltwo->erater_mechanics);
            $assignment->setEraterStyle($turnitintooltwoassignment->turnitintooltwo->erater_style);
            $assignment->setEraterSpellingDictionary(isset($turnitintooltwoassignment->turnitintooltwo->erater_dictionary) ? $turnitintooltwoassignment->turnitintooltwo->erater_dictionary : 'en_US');
            $assignment->setEraterHandbook(isset($turnitintooltwoassignment->turnitintooltwo->erater_handbook) ? $turnitintooltwoassignment->turnitintooltwo->erater_handbook : 0);
            $attribute = "dtstart" . $i;
            $assignment->setStartDate(gmdate("Y-m-d\\TH:i:s\\Z", $turnitintooltwoassignment->turnitintooltwo->{$attribute}));
            $attribute = "dtdue" . $i;
            $assignment->setDueDate(gmdate("Y-m-d\\TH:i:s\\Z", $turnitintooltwoassignment->turnitintooltwo->{$attribute}));
            $attribute = "dtpost" . $i;
            $assignment->setFeedbackReleaseDate(gmdate("Y-m-d\\TH:i:s\\Z", $turnitintooltwoassignment->turnitintooltwo->{$attribute}));
            $attribute = "partname" . $i;
            $assignment->setTitle($turnitintooltwoassignment->turnitintooltwo->name . " " . $turnitintooltwoassignment->turnitintooltwo->{$attribute} . " (Moodle TT)");
            $partassignid = $turnitintooltwoassignment->create_tii_assignment($assignment, $turnitintooltwoassignment->turnitintooltwo->id, $i);
            if (empty($partassignid)) {
                turnitintooltwo_activitylog("Moodle Assignment could not be created (" . $turnitintooltwoassignment->id . ") - " . $turnitintooltwoassignment->turnitintooltwo->name, "REQUEST");
                $error = true;
            }
            $part = new stdClass();
            $part->id = $partid;
            $part->tiiassignid = $partassignid;
            $part->turnitintooltwoid = $turnitintooltwoassignment->turnitintooltwo->id;
            $part->partname = $turnitintooltwoassignment->turnitintooltwo->{$attribute};
            $part->deleted = 0;
            $part->maxmarks = $assignment->getMaxGrade();
            $part->dtstart = strtotime($assignment->getStartDate());
            $part->dtdue = strtotime($assignment->getDueDate());
            $part->dtpost = strtotime($assignment->getFeedbackReleaseDate());
            if (!($dbpart = $DB->update_record('turnitintooltwo_parts', $part))) {
                turnitintooltwo_print_error('partupdateerror', 'turnitintooltwo', null, $i, __FILE__, __LINE__);
                exit;
            } else {
                turnitintooltwo_activitylog("Moodle Assignment part updated (" . $part->id . ")", "REQUEST");
            }
            if (!($delete = $DB->delete_records('turnitintooltwo_submissions', array('submission_part' => $partid)))) {
                turnitintooltwo_print_error('submissiondeleteerror', 'turnitintooltwo', null, null, __FILE__, __LINE__);
                exit;
            }
        }
    }
    $item = $action == "NEWCLASS" ? get_string('copyassigndata', 'turnitintooltwo') : get_string('replaceassigndata', 'turnitintooltwo');
    $status[] = array('component' => get_string('modulenameplural', 'turnitintooltwo'), 'item' => $item, 'error' => $error);
    return $status;
}
 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);
 }
 /**
  * Amalgamated handler for Moodle cron events.
  *
  * @param object $eventdata
  * @return bool result
  */
 public function event_handler($eventdata)
 {
     global $DB, $CFG;
     static $ppDisplayCount = 0;
     if (!$ppDisplayCount) {
         $numEvents = $DB->count_records_sql("SELECT count(*) FROM {events_queue} q\n            LEFT JOIN {events_queue_handlers} h ON (h.queuedeventid = q.id)\n            LEFT JOIN {events_handlers} e ON (h.handlerid = e.id)\n            WHERE e.eventname IN ('assessable_file_uploaded', 'assessable_files_done', 'assessable_content_uploaded', 'assessable_submitted') AND component = 'plagiarism_turnitin'");
         mtrace(get_string("ppqueuesize", 'plagiarism_turnitin') . ': ' . $numEvents);
         $ppDisplayCount = 1;
     }
     $result = true;
     // Remove the event if the course module no longer exists.
     if (!($cm = get_coursemodule_from_id($eventdata->modulename, $eventdata->cmid))) {
         return true;
     }
     // Initialise module settings.
     $plagiarismsettings = $this->get_settings($eventdata->cmid);
     $moduletiienabled = $this->get_config_settings('mod_' . $eventdata->modulename);
     if ($eventdata->modulename == 'assign') {
         $plagiarismsettings["plagiarism_draft_submit"] = isset($plagiarismsettings["plagiarism_draft_submit"]) ? $plagiarismsettings["plagiarism_draft_submit"] : 0;
     }
     // Either module not using Turnitin or Turnitin not being used at all so return true to remove event from queue.
     if (empty($plagiarismsettings['use_turnitin']) || empty($moduletiienabled)) {
         return true;
     }
     static $tiiconnection;
     if (empty($tiiconnection)) {
         if (!($tiiconnection = $this->test_turnitin_connection('cron'))) {
             return false;
         }
     }
     // Get course data, return false if there is a problem creating it.
     $coursedata = $this->get_course_data($cm->id, $cm->course, 'cron');
     if (empty($coursedata->turnitin_cid)) {
         return false;
     }
     switch ($eventdata->event_type) {
         case "mod_created":
         case "mod_updated":
             $syncassignment = $this->sync_tii_assignment($cm, $coursedata->turnitin_cid, "cron");
             return true;
             break;
         case "file_uploaded":
         case "assessable_submitted":
         case "content_uploaded":
         case "files_done":
             // Initialise counter, limit submission events processing to
             // PLAGIARISM_TURNITIN_CRON_SUBMISSIONS_LIMIT per cron run.
             static $i;
             if (empty($i)) {
                 $i = 1;
             }
             // Only process submissions up to the processing limit.
             if ($i > PLAGIARISM_TURNITIN_CRON_SUBMISSIONS_LIMIT) {
                 return false;
             }
             $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance));
             if ($cm->modname != 'assign') {
                 $moduledata->submissiondrafts = 0;
             }
             // If draft submissions are turned on then only send to Turnitin if the draft submit setting is set.
             if ($moduledata->submissiondrafts && $plagiarismsettings["plagiarism_draft_submit"] == 1 && ($eventdata->event_type == 'file_uploaded' || $eventdata->event_type == 'content_uploaded')) {
                 return true;
             }
             // Get correct user. In assignments from Moodle 2.7, instructors could submit on behalf of students
             // but the eventdata->userid is still the user who made the submission.
             $submitter = $eventdata->userid;
             // Create module object.
             $moduleclass = "turnitin_" . $cm->modname;
             $moduleobject = new $moduleclass();
             $author = $moduleobject->get_author($eventdata->itemid);
             $author = !empty($author) ? $author : $eventdata->userid;
             $errorcode = "";
             try {
                 // Join User to course.
                 $user = new turnitintooltwo_user($author, 'Learner', true, 'cron');
                 $user->join_user_to_class($coursedata->turnitin_cid);
             } catch (Exception $e) {
                 $user = new turnitintooltwo_user($author, 'Learner', 'false', 'cron', 'false');
                 $errorcode = 7;
             }
             $syncassignment = $this->sync_tii_assignment($cm, $coursedata->turnitin_cid, "cron", true);
             // Cron errorcode needs to be passed to submission function.
             if (!empty($syncassignment['errorcode'])) {
                 $cronerror = $syncassignment['errorcode'];
             } elseif (!empty($errorcode)) {
                 $cronerror = $errorcode;
             } else {
                 $cronerror = "";
             }
             // Get actual text content and files to be submitted for draft submissions
             // as this won't be present in eventdata for certain event types.
             if ($eventdata->modulename == 'assign' && ($eventdata->event_type == "files_done" || $eventdata->event_type == "assessable_submitted")) {
                 // Get content.
                 $moodlesubmission = $DB->get_record('assign_submission', array('assignment' => $cm->instance, 'userid' => $author, 'id' => $eventdata->itemid), 'id');
                 if ($moodletextsubmission = $DB->get_record('assignsubmission_onlinetext', array('submission' => $moodlesubmission->id), 'onlinetext')) {
                     $eventdata->content = $moodletextsubmission->onlinetext;
                 }
                 // Get Files.
                 $eventdata->pathnamehashes = array();
                 $filesconditions = array('component' => 'assignsubmission_file', 'itemid' => $moodlesubmission->id, 'userid' => $author);
                 if ($moodlefiles = $DB->get_records('files', $filesconditions)) {
                     foreach ($moodlefiles as $moodlefile) {
                         $eventdata->pathnamehashes[] = $moodlefile->pathnamehash;
                     }
                 }
             }
             // Attempt to submit text content to Turnitin.
             // If there was an error when creating the assignment then still attempt to process the submission so it can
             // be saved as failed and therefore doesn't cause the cron to get stuck.
             if (($eventdata->event_type == "content_uploaded" || $eventdata->event_type == "files_done" || $eventdata->event_type == "assessable_submitted") && !empty($eventdata->content)) {
                 // Get extra data for text content submissions and remove unneeded events.
                 switch ($eventdata->modulename) {
                     case "assign":
                         if ($contentsubmission = $DB->get_record('assign_submission', array('userid' => $user->id, 'assignment' => $moduledata->id, 'id' => $eventdata->itemid))) {
                             $tempfilename = 'onlinetext_' . $user->id . "_" . $cm->id . "_" . $moduledata->id . '.txt';
                             $submissiontype = 'text_content';
                         } else {
                             // Content has been deleted but event not removed.
                             return true;
                         }
                         break;
                     case "forum":
                         if ($contentsubmission = $DB->get_record('forum_posts', array('id' => $eventdata->itemid))) {
                             $tempfilename = 'forumpost_' . $user->id . "_" . $cm->id . "_" . $moduledata->id . "_" . $eventdata->itemid . '.txt';
                             $submissiontype = 'forum_post';
                         } else {
                             // Content has been deleted but event not removed.
                             return true;
                         }
                         break;
                     case 'workshop':
                         if ($moodlesubmission = $DB->get_record('workshop_submissions', array('id' => $eventdata->itemid))) {
                             $tempfilename = 'onlinetext_' . $user->id . "_" . $cm->id . "_" . $moduledata->id . '.txt';
                             $submissiontype = 'text_content';
                             $eventdata->content = $moodlesubmission->content;
                         } else {
                             // Content has been deleted but event not removed.
                             return true;
                         }
                         break;
                 }
                 $identifier = sha1($eventdata->content);
                 // Get previous text content details if it has been submitted previously.
                 $plagiarismfile = $DB->get_record('plagiarism_turnitin_files', array('userid' => $user->id, 'cm' => $cm->id, 'identifier' => $identifier));
                 if ($plagiarismfile) {
                     // Only submit if this content hasn't been submitted successfuly before.
                     if ($plagiarismfile->statuscode != "success") {
                         $result = $this->tii_submission($cm, $syncassignment['tiiassignmentid'], $user, $submitter, $identifier, $submissiontype, $eventdata->itemid, $tempfilename, $eventdata->content, $cronerror);
                     } else {
                         return true;
                     }
                 } else {
                     $result = $this->tii_submission($cm, $syncassignment['tiiassignmentid'], $user, $submitter, $identifier, $submissiontype, $eventdata->itemid, $tempfilename, $eventdata->content, $cronerror);
                 }
             }
             // Attempt to submit files to Turnitin.
             $result = $result && true;
             if (!empty($eventdata->pathnamehashes)) {
                 foreach ($eventdata->pathnamehashes as $pathnamehash) {
                     $fs = get_file_storage();
                     $file = $fs->get_file_by_hash($pathnamehash);
                     if (!$file) {
                         turnitintooltwo_activitylog('File not found: ' . $pathnamehash, 'PP_NO_FILE');
                         $result = true;
                         continue;
                     } else {
                         try {
                             $file->get_content();
                         } catch (Exception $e) {
                             turnitintooltwo_activitylog('File content not found: ' . $pathnamehash, 'PP_NO_FILE');
                             mtrace($e);
                             mtrace('File content not found. pathnamehash: ' . $pathnamehash);
                             $result = true;
                             continue;
                         }
                     }
                     if ($file->get_filename() === '.') {
                         continue;
                     }
                     if ($this->check_if_submitting($cm, $author, $pathnamehash, 'file')) {
                         $result = $result && $this->tii_submission($cm, $syncassignment['tiiassignmentid'], $user, $submitter, $pathnamehash, 'file', $eventdata->itemid, '', '', $cronerror);
                     } else {
                         $result = $result && true;
                     }
                 }
             }
             // Output warning that no further submissions will be processed as processing limit has been reached.
             if ($i == PLAGIARISM_TURNITIN_CRON_SUBMISSIONS_LIMIT) {
                 mtrace(get_string('ppcronsubmissionlimitreached', 'plagiarism_turnitin', PLAGIARISM_TURNITIN_CRON_SUBMISSIONS_LIMIT));
             }
             $i++;
             break;
     }
     return $result;
 }
示例#10
0
 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"));
     if ($viewcontext == "box_solid") {
         $output = html_writer::tag("div", $output, array("class" => "submission_failure_msg"));
     }
     echo $output;
     unset($_SESSION["digital_receipt"]);
 }
 // Show duplicate assignment warning if applicable.
 if ($istutor) {
     echo $turnitintooltwoview->show_duplicate_assignment_warning($turnitintooltwoassignment, $parts);
 }
示例#11
0
 /**
  * Amalgamated handler for Moodle cron events.
  *
  * @param object $eventdata
  * @return bool result
  */
 public function event_handler($eventdata)
 {
     global $DB, $CFG;
     $cm = get_coursemodule_from_id($eventdata->modulename, $eventdata->cmid);
     // Initialise module settings.
     $plagiarismsettings = $this->get_settings($eventdata->cmid);
     $moduletiienabled = $this->get_config_settings('mod_' . $eventdata->modulename);
     if ($eventdata->modulename == 'assign') {
         $plagiarismsettings["plagiarism_draft_submit"] = isset($plagiarismsettings["plagiarism_draft_submit"]) ? $plagiarismsettings["plagiarism_draft_submit"] : 0;
     }
     // Either module not using Turnitin or Turnitin not being used at all so return true to remove event from queue.
     if (empty($plagiarismsettings['use_turnitin']) || empty($moduletiienabled)) {
         return true;
     }
     static $tiiconnection;
     if (empty($tiiconnection)) {
         if (!($tiiconnection = $this->test_turnitin_connection())) {
             return false;
         }
     }
     if ($cm) {
         // Get course data, return false if there is a problem creating it.
         $coursedata = $this->get_course_data($cm->id, $cm->course, 'cron');
         if (empty($coursedata->turnitin_cid)) {
             return false;
         }
         switch ($eventdata->event_type) {
             case "mod_created":
             case "mod_updated":
                 $result = $this->sync_tii_assignment($cm, $coursedata->turnitin_cid, "cron");
                 break;
             case "file_uploaded":
             case "assessable_submitted":
             case "content_uploaded":
             case "files_done":
                 // Initialise counter, limit submission events processing to
                 // PLAGIARISM_TURNITIN_CRON_SUBMISSIONS_LIMIT per cron run.
                 static $i;
                 if (empty($i)) {
                     $i = 0;
                 }
                 // Only process submissions up to the processing limit.
                 if ($i >= PLAGIARISM_TURNITIN_CRON_SUBMISSIONS_LIMIT) {
                     return false;
                 }
                 $i++;
                 $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance));
                 if ($cm->modname != 'assign') {
                     $moduledata->submissiondrafts = 0;
                 }
                 // If draft submissions are turned on then only submit to Turnitin if using newer than 2.3 and
                 // the Turnitin draft submit setting is set.
                 if ($moduledata->submissiondrafts && $CFG->branch > 23 && $plagiarismsettings["plagiarism_draft_submit"] == 1 && ($eventdata->event_type == 'file_uploaded' || $eventdata->event_type == 'content_uploaded')) {
                     return true;
                 }
                 // Get correct user. In assignments from Moodle 2.7, instructors could submit on behalf of students
                 // but the eventdata->userid is still the user who made the submission.
                 $submitter = $eventdata->userid;
                 // Create module object.
                 $moduleclass = "turnitin_" . $cm->modname;
                 $moduleobject = new $moduleclass();
                 $author = $moduleobject->get_author($eventdata->itemid);
                 $author = !empty($author) ? $author : $eventdata->userid;
                 // Join User to course.
                 $user = new turnitintooltwo_user($author, 'Learner');
                 $user->join_user_to_class($coursedata->turnitin_cid);
                 $tiiassignmentid = $this->sync_tii_assignment($cm, $coursedata->turnitin_cid, "cron", true);
                 if ((int) $tiiassignmentid > 0) {
                     // Submit draft content and files for newer than 2.3.
                     if ($eventdata->modulename == 'assign' && ($eventdata->event_type == "files_done" || $eventdata->event_type == "assessable_submitted")) {
                         // Get content.
                         $moodlesubmission = $DB->get_record('assign_submission', array('assignment' => $cm->instance, 'userid' => $author, 'id' => $eventdata->itemid), 'id');
                         if ($moodletextsubmission = $DB->get_record('assignsubmission_onlinetext', array('submission' => $moodlesubmission->id), 'onlinetext')) {
                             $eventdata->content = $moodletextsubmission->onlinetext;
                         }
                         // Get Files.
                         $eventdata->pathnamehashes = array();
                         $filesconditions = array('component' => 'assignsubmission_file', 'itemid' => $moodlesubmission->id, 'userid' => $author);
                         if ($moodlefiles = $DB->get_records('files', $filesconditions)) {
                             foreach ($moodlefiles as $moodlefile) {
                                 $eventdata->pathnamehashes[] = $moodlefile->pathnamehash;
                             }
                         }
                     }
                     // Submit content.
                     $result = true;
                     if (($eventdata->event_type == "content_uploaded" || $eventdata->event_type == "files_done" || $eventdata->event_type == "assessable_submitted") && !empty($eventdata->content)) {
                         switch ($eventdata->modulename) {
                             case "assign":
                                 if ($contentsubmission = $DB->get_record('assign_submission', array('userid' => $user->id, 'assignment' => $moduledata->id, 'id' => $eventdata->itemid))) {
                                     $tempfilename = 'onlinetext_' . $user->id . "_" . $cm->id . "_" . $moduledata->id . '.txt';
                                     $submissiontype = 'text_content';
                                 } else {
                                     // Content has been deleted but event not removed.
                                     return true;
                                 }
                                 break;
                             case "forum":
                                 if ($contentsubmission = $DB->get_record('forum_posts', array('id' => $eventdata->itemid))) {
                                     $tempfilename = 'forumpost_' . $user->id . "_" . $cm->id . "_" . $moduledata->id . "_" . $eventdata->itemid . '.txt';
                                     $submissiontype = 'forum_post';
                                 } else {
                                     // Content has been deleted but event not removed.
                                     return true;
                                 }
                                 break;
                             case 'workshop':
                                 if ($moodlesubmission = $DB->get_record('workshop_submissions', array('id' => $eventdata->itemid))) {
                                     $tempfilename = 'onlinetext_' . $user->id . "_" . $cm->id . "_" . $moduledata->id . '.txt';
                                     $submissiontype = 'text_content';
                                     $eventdata->content = $moodlesubmission->content;
                                 } else {
                                     // Content has been deleted but event not removed.
                                     return true;
                                 }
                                 break;
                         }
                         $identifier = sha1($eventdata->content);
                         // Get turnitin text content details.
                         $plagiarismfile = $DB->get_record('plagiarism_turnitin_files', array('userid' => $user->id, 'cm' => $cm->id, 'identifier' => $identifier));
                         $result = true;
                         if ($plagiarismfile) {
                             // Only submit if this content hasn't been submitted successfuly before.
                             if ($plagiarismfile->statuscode != "success") {
                                 $result = $this->tii_submission($cm, $tiiassignmentid, $user, $submitter, $identifier, $submissiontype, $eventdata->itemid, $tempfilename, $eventdata->content);
                             } else {
                                 return true;
                             }
                         } else {
                             $result = $this->tii_submission($cm, $tiiassignmentid, $user, $submitter, $identifier, $submissiontype, $eventdata->itemid, $tempfilename, $eventdata->content);
                         }
                     }
                     // Submit files.
                     $result = $result && true;
                     if (!empty($eventdata->pathnamehashes)) {
                         foreach ($eventdata->pathnamehashes as $pathnamehash) {
                             $fs = get_file_storage();
                             $file = $fs->get_file_by_hash($pathnamehash);
                             if (!$file) {
                                 turnitintooltwo_activitylog('File not found: ' . $pathnamehash, 'PP_NO_FILE');
                                 $result = true;
                                 continue;
                             }
                             if ($file->get_filename() === '.') {
                                 continue;
                             }
                             // Don't process anything submitted in the last minute in case it's submitting still.
                             if ($file->get_timemodified() > time() - 60) {
                                 $result = false;
                             }
                             if ($this->check_if_submitting($cm, $author, $pathnamehash, 'file')) {
                                 $result = $result && $this->tii_submission($cm, $tiiassignmentid, $user, $submitter, $pathnamehash, 'file', $eventdata->itemid);
                             } else {
                                 $result = $result && true;
                             }
                         }
                     }
                 } else {
                     mtrace('-------------------------');
                     mtrace(get_string('pp_assignmentsubmiterror', 'turnitintooltwo') . ':');
                     mtrace('Course Module: ' . $cm->id);
                     mtrace('-------------------------');
                     $result = false;
                 }
                 break;
         }
         return $result;
     }
 }
示例#12
0
 /**
  * Amalgamated handler for Moodle cron events.
  *
  * @param object $eventdata
  * @return bool result
  */
 public function event_handler($eventdata)
 {
     global $DB, $CFG;
     $cm = get_coursemodule_from_id($eventdata->modulename, $eventdata->cmid);
     // Initialise plugin class.
     $plagiarismsettings = $this->get_settings($eventdata->cmid);
     if ($eventdata->modulename == 'assign') {
         $plagiarismsettings["plagiarism_draft_submit"] = isset($plagiarismsettings["plagiarism_draft_submit"]) ? $plagiarismsettings["plagiarism_draft_submit"] : 0;
     }
     // This module isn't using Turnitin so return true to remove event from queue.
     if (empty($plagiarismsettings['use_turnitin'])) {
         return true;
     }
     $moduletiienabled = $this->get_config_settings('mod_' . $eventdata->modulename);
     // Exit if Turnitin is not being used for this activity type.
     if (empty($moduletiienabled)) {
         return;
     }
     static $tiiconnection;
     if (empty($tiiconnection)) {
         if (!($tiiconnection = $this->test_turnitin_connection())) {
             return false;
         }
     }
     if ($cm) {
         // Create the course/class in Turnitin if it doesn't already exist.
         $coursedata = turnitintooltwo_assignment::get_course_data($cm->course, 'PP', 'cron');
         if (empty($coursedata->turnitin_cid)) {
             // Course may existed in a previous incarnation of this plugin.
             // Get this and save it in courses table if so.
             if ($turnitincid = $this->get_previous_course_id($cm)) {
                 $coursedata = $this->migrate_previous_course($coursedata, $turnitincid);
             } else {
                 // Otherwise create new course in Turnitin.
                 $tiicoursedata = $this->create_tii_course($cm, $coursedata, "cron");
                 if (empty($tiicoursedata)) {
                     return false;
                 }
                 $coursedata->turnitin_cid = $tiicoursedata->turnitin_cid;
                 $coursedata->turnitin_ctl = $tiicoursedata->turnitin_ctl;
             }
         }
         switch ($eventdata->event_type) {
             case "mod_created":
             case "mod_updated":
                 $result = $this->sync_tii_assignment($cm, $coursedata->turnitin_cid, "cron");
                 break;
             case "file_uploaded":
             case "assessable_submitted":
             case "content_uploaded":
             case "files_done":
                 $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance));
                 if ($cm->modname != 'assign') {
                     $moduledata->submissiondrafts = 0;
                 }
                 // If draft submissions are turned on then only submit to Turnitin if using newer than 2.3 and
                 // the Turnitin draft submit setting is set.
                 if ($moduledata->submissiondrafts && $CFG->branch > 23 && $plagiarismsettings["plagiarism_draft_submit"] == 1 && ($eventdata->event_type == 'file_uploaded' || $eventdata->event_type == 'content_uploaded')) {
                     return true;
                 }
                 // Join User to course.
                 $user = new turnitintooltwo_user($eventdata->userid, 'Learner');
                 $user->join_user_to_class($coursedata->turnitin_cid);
                 // Don't submit and remove from queue if a user has not accepted the eula.
                 if ($user->user_agreement_accepted != 1) {
                     mtrace('-------------------------');
                     mtrace(get_string('notacceptedeula', 'turnitintooltwo'));
                     mtrace(get_string('eventremoved', 'turnitintooltwo') . ':');
                     mtrace('User:  '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')');
                     mtrace('Course Module: ' . $cm->id);
                     mtrace('-------------------------');
                     return true;
                 }
                 $tiiassignmentid = $this->sync_tii_assignment($cm, $coursedata->turnitin_cid, "cron");
                 if ((int) $tiiassignmentid > 0) {
                     // Submit draft content and files for newer than 2.3.
                     if ($eventdata->modulename == 'assign' && ($eventdata->event_type == "files_done" || $eventdata->event_type == "assessable_submitted")) {
                         // Get content.
                         $moodlesubmission = $DB->get_record('assign_submission', array('assignment' => $cm->instance, 'userid' => $eventdata->userid, 'id' => $eventdata->itemid), 'id');
                         if ($moodletextsubmission = $DB->get_record('assignsubmission_onlinetext', array('submission' => $moodlesubmission->id), 'onlinetext')) {
                             $eventdata->content = $moodletextsubmission->onlinetext;
                         }
                         // Get Files.
                         $eventdata->pathnamehashes = array();
                         $filesconditions = array('component' => 'assignsubmission_file', 'itemid' => $moodlesubmission->id, 'userid' => $eventdata->userid);
                         if ($moodlefiles = $DB->get_records('files', $filesconditions)) {
                             foreach ($moodlefiles as $moodlefile) {
                                 $eventdata->pathnamehashes[] = $moodlefile->pathnamehash;
                             }
                         }
                     }
                     // Submit content.
                     $result = true;
                     if (($eventdata->event_type == "content_uploaded" || $eventdata->event_type == "files_done" || $eventdata->event_type == "assessable_submitted") && !empty($eventdata->content)) {
                         switch ($eventdata->modulename) {
                             case "assign":
                                 if ($contentsubmission = $DB->get_record('assign_submission', array('userid' => $user->id, 'assignment' => $moduledata->id, 'id' => $eventdata->itemid))) {
                                     $timemodified = $contentsubmission->timemodified;
                                     $tempfilename = 'onlinetext_' . $user->id . "_" . $cm->id . "_" . $moduledata->id . '.txt';
                                     $submissiontype = 'text_content';
                                 } else {
                                     // Content has been deleted but event not removed.
                                     return true;
                                 }
                                 break;
                             case "forum":
                                 if ($contentsubmission = $DB->get_record('forum_posts', array('id' => $eventdata->itemid))) {
                                     $timemodified = $contentsubmission->modified;
                                     $tempfilename = 'forumpost_' . $user->id . "_" . $cm->id . "_" . $moduledata->id . "_" . $eventdata->itemid . '.txt';
                                     $submissiontype = 'forum_post';
                                 } else {
                                     // Content has been deleted but event not removed.
                                     return true;
                                 }
                                 break;
                         }
                         $identifier = sha1($eventdata->content);
                         // Get turnitin text content details.
                         $plagiarismfile = $DB->get_record('plagiarism_turnitin_files', array('userid' => $user->id, 'cm' => $cm->id, 'identifier' => $identifier));
                         $tiimodifieddate = !empty($plagiarismfile) ? $plagiarismfile->lastmodified : 0;
                         if ($timemodified > $tiimodifieddate) {
                             $result = $this->tii_submission($cm, $tiiassignmentid, $user, $identifier, $submissiontype, $eventdata->itemid, $tempfilename, $eventdata->content, 'cron');
                         } else {
                             $result = true;
                         }
                     }
                     // Submit files.
                     $result = $result && true;
                     if (!empty($eventdata->pathnamehashes)) {
                         foreach ($eventdata->pathnamehashes as $pathnamehash) {
                             $fs = get_file_storage();
                             $file = $fs->get_file_by_hash($pathnamehash);
                             if (!$file) {
                                 turnitintooltwo_activitylog('File not found: ' . $pathnamehash, 'PP_NO_FILE');
                                 $result = true;
                                 continue;
                             }
                             if ($file->get_filename() === '.') {
                                 continue;
                             }
                             // Don't process anything submitted in the last minute in case it's submitting still.
                             if ($file->get_timemodified() > time() - 60) {
                                 $result = false;
                             }
                             if ($this->check_if_submitting($cm, $eventdata->userid, $pathnamehash, 'file')) {
                                 $result = $result && $this->tii_submission($cm, $tiiassignmentid, $user, $pathnamehash, 'file', $eventdata->itemid, '', '', 'cron');
                             } else {
                                 $result = $result && true;
                             }
                         }
                     }
                 } else {
                     mtrace('-------------------------');
                     mtrace(get_string('pp_assignmentsubmiterror', 'turnitintooltwo') . ':');
                     mtrace('Course Module: ' . $cm->id);
                     mtrace('-------------------------');
                     $result = false;
                 }
                 break;
         }
         return $result;
     }
 }