/** * Create assignment on Moodle, creates each individual part (and the relevant event) * and in turn creates them on Turnitin * * @global type $USER * @global type $DB * @return int turnitintooltwo id */ public function create_moodle_assignment() { global $USER, $DB; $config = turnitintooltwo_admin_config(); // Get Moodle Course Object. $course = $this->get_course_data($this->turnitintooltwo->course); // Get the Turnitin owner of this this Course or make user the owner if none. $ownerid = $this->get_tii_owner($course->id); if (!empty($ownerid)) { $owner = new turnitintooltwo_user($ownerid, 'Instructor'); } else { $owner = new turnitintooltwo_user($USER->id, 'Instructor'); } // Setup or edit course in Turnitin. if ($course->turnitin_cid == 0) { $tiicoursedata = $this->create_tii_course($course, $owner->id); $course->turnitin_cid = $tiicoursedata->turnitin_cid; $course->turnitin_ctl = $tiicoursedata->turnitin_ctl; } else { $this->edit_tii_course($course); $course->turnitin_ctl = $course->fullname . " (Moodle TT)"; } $owner->join_user_to_class($course->turnitin_cid); // Insert the default options for the assignment. $this->turnitintooltwo->timecreated = time(); $this->turnitintooltwo->dateformat = "d/m/Y"; $this->turnitintooltwo->gradedisplay = 1; $this->turnitintooltwo->commentedittime = 1800; $this->turnitintooltwo->commentmaxsize = 800; $this->turnitintooltwo->autosubmission = 1; $this->turnitintooltwo->shownonsubmission = 1; $this->turnitintooltwo->timemodified = time(); $this->turnitintooltwo->courseid = $course->id; $this->turnitintooltwo->usegrademark = $config->usegrademark; $toolid = $DB->insert_record("turnitintooltwo", $this->turnitintooltwo); turnitintooltwo_activitylog("Turnitintool created (" . $toolid . ") - " . $this->turnitintooltwo->name, "REQUEST"); // Do the multiple Assignment creation on turnitin for each part. for ($i = 1; $i <= $this->turnitintooltwo->numparts; $i++) { // Set the assignment details to pass to the API. $assignment = new TiiAssignment(); $assignment->setClassId($course->turnitin_cid); $attribute = "partname" . $i; $assignment->setTitle($this->turnitintooltwo->name . " " . $this->turnitintooltwo->{$attribute} . " (Moodle TT)"); $attribute = "dtstart" . $i; $assignment->setStartDate(gmdate("Y-m-d\\TH:i:s\\Z", $this->turnitintooltwo->{$attribute})); $attribute = "dtdue" . $i; $assignment->setDueDate(gmdate("Y-m-d\\TH:i:s\\Z", $this->turnitintooltwo->{$attribute})); $attribute = "dtpost" . $i; $assignment->setFeedbackReleaseDate(gmdate("Y-m-d\\TH:i:s\\Z", $this->turnitintooltwo->{$attribute})); $assignment->setAuthorOriginalityAccess($this->turnitintooltwo->studentreports); $assignment->setRubricId(!empty($this->turnitintooltwo->rubric) ? $this->turnitintooltwo->rubric : ''); $assignment->setSubmitPapersTo($this->turnitintooltwo->submitpapersto); $assignment->setResubmissionRule($this->turnitintooltwo->reportgenspeed); $assignment->setBibliographyExcluded($this->turnitintooltwo->excludebiblio); $assignment->setQuotedExcluded($this->turnitintooltwo->excludequoted); $assignment->setSmallMatchExclusionType($this->turnitintooltwo->excludetype); $assignment->setSmallMatchExclusionThreshold((int) $this->turnitintooltwo->excludevalue); if ($config->useanon) { $assignment->setAnonymousMarking($this->turnitintooltwo->anon); } $assignment->setAllowNonOrSubmissions($this->turnitintooltwo->allownonor); $assignment->setLateSubmissionsAllowed($this->turnitintooltwo->allowlate); if ($config->repositoryoption == 1) { $assignment->setInstitutionCheck(isset($this->turnitintooltwo->institution_check) ? $this->turnitintooltwo->institution_check : 0); } $attribute = "maxmarks" . $i; $assignment->setMaxGrade($this->turnitintooltwo->{$attribute}); $assignment->setSubmittedDocumentsCheck($this->turnitintooltwo->spapercheck); $assignment->setInternetCheck($this->turnitintooltwo->internetcheck); $assignment->setPublicationsCheck($this->turnitintooltwo->journalcheck); $assignment->setTranslatedMatching(isset($this->turnitintooltwo->transmatch) ? $this->turnitintooltwo->transmatch : 0); // Erater settings. $assignment->setErater(isset($this->turnitintooltwo->erater) ? $this->turnitintooltwo->erater : 0); $assignment->setEraterSpelling(isset($this->turnitintooltwo->erater_spelling) ? $this->turnitintooltwo->erater_spelling : 0); $assignment->setEraterGrammar(isset($this->turnitintooltwo->erater_grammar) ? $this->turnitintooltwo->erater_grammar : 0); $assignment->setEraterUsage(isset($this->turnitintooltwo->erater_usage) ? $this->turnitintooltwo->erater_usage : 0); $assignment->setEraterMechanics(isset($this->turnitintooltwo->erater_mechanics) ? $this->turnitintooltwo->erater_mechanics : 0); $assignment->setEraterStyle(isset($this->turnitintooltwo->erater_style) ? $this->turnitintooltwo->erater_style : 0); $assignment->setEraterSpellingDictionary(isset($this->turnitintooltwo->erater_dictionary) ? $this->turnitintooltwo->erater_dictionary : 'en_US'); $assignment->setEraterHandbook(isset($this->turnitintooltwo->erater_handbook) ? $this->turnitintooltwo->erater_handbook : 0); // Create Assignment on Turnitin. $newassignmentid = $this->create_tii_assignment($assignment, $toolid, $i); // Save Part details. $part = new stdClass(); $part->turnitintooltwoid = $toolid; $attribute = "partname" . $i; $part->partname = $this->turnitintooltwo->{$attribute}; $part->tiiassignid = $newassignmentid; $attribute = "dtstart" . $i; $part->dtstart = $this->turnitintooltwo->{$attribute}; $attribute = "dtdue" . $i; $part->dtdue = $this->turnitintooltwo->{$attribute}; $attribute = "dtpost" . $i; $part->dtpost = $this->turnitintooltwo->{$attribute}; $attribute = "maxmarks" . $i; $part->maxmarks = $this->turnitintooltwo->{$attribute}; $part->deleted = 0; if (!($insert = $DB->insert_record('turnitintooltwo_parts', $part))) { $DB->delete_records('turnitintooltwo', array('id' => $toolid)); turnitintooltwo_print_error('partdberror', 'turnitintooltwo', null, $i, __FILE__, __LINE__); } else { turnitintooltwo_activitylog("Moodle Assignment part created (" . $insert . ") - " . $part->tiiassignid, "REQUEST"); } $this->create_event($toolid, $part->partname, $part->dtdue); } // Define grade settings. $this->turnitintooltwo->id = $toolid; turnitintooltwo_grade_item_update($this->turnitintooltwo); return $this->turnitintooltwo->id; }
case "default": $submissionid = required_param('submissionid', PARAM_INT); $user = new turnitintooltwo_user($USER->id, $userrole); echo html_writer::tag("div", $turnitintooltwoview->output_dv_launch_form($do, $submissionid, $user->tii_user_id, $userrole), array("class" => "launch_form")); if ($do === "origreport") { $submission = new turnitintooltwo_submission($submissionid, 'turnitin'); turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "view submission", 'view.php?id=' . $cm->id, get_string('viewsubmissiondesc', 'turnitintooltwo') . " '{$submission->submission_title}'", $cm->id, $submission->userid); } break; case "submissions": // Output a link for the student to accept the turnitin licence agreement. $noscriptula = ""; $ula = ""; if (!$istutor) { $eulaaccepted = false; $user = new turnitintooltwo_user($USER->id, $userrole); $coursedata = $turnitintooltwoassignment->get_course_data($turnitintooltwoassignment->turnitintooltwo->course); $user->join_user_to_class($coursedata->turnitin_cid); $eulaaccepted = $user->user_agreement_accepted != 1 ? $user->get_accepted_user_agreement() : $user->user_agreement_accepted; // Check if the submitting user has accepted the EULA if ($eulaaccepted != 1) { // Moodle strips out form and script code for forum posts so we have to do the Eula Launch differently. $ula_link = html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/extras.php?cmid=' . $cm->id . '&cmd=useragreement&view_context=box_solid', html_writer::tag('i', '', array('class' => 'tiiicon icon-warn icon-2x turnitin_ula_warn')) . '</br></br>' . get_string('turnitinula', 'turnitintooltwo') . " " . get_string('turnitinula_btn', 'turnitintooltwo'), array("class" => "turnitin_eula_link")); $eulaignoredclass = $eulaaccepted == 0 ? ' turnitin_ula_ignored' : ''; $ula = html_writer::tag('div', $ula_link, array('class' => 'turnitin_ula js_required' . $eulaignoredclass, 'data-userid' => $user->id)); $noscriptula = html_writer::tag('noscript', turnitintooltwo_view::output_dv_launch_form("useragreement", 0, $user->tii_user_id, "Learner", get_string('turnitinula', 'turnitintooltwo'), false) . " " . get_string('noscriptula', 'turnitintooltwo'), array('class' => 'warning turnitin_ula_noscript')); echo $ula . $noscriptula; } } $listsubmissionsdesc = $istutor ? "listsubmissionsdesc" : "listsubmissionsdesc_student"; turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "list submissions", 'view.php?id=' . $cm->id, get_string($listsubmissionsdesc, 'turnitintooltwo') . ": {$course->id}", $cm->id);
} else { // Create the module as an assignment in Turnitin. $tiiassignment = $pluginturnitin->sync_tii_assignment($cm, $coursedata->turnitin_cid); $tiiassignmentid = $tiiassignment['tiiassignmentid']; } $user = new turnitintooltwo_user($USER->id, "Instructor"); $user->join_user_to_class($coursedata->turnitin_cid); echo html_writer::tag("div", turnitintooltwo_view::output_lti_form_launch('peermark_manager', 'Instructor', $tiiassignmentid), array("class" => "launch_form", "style" => "display:none;")); echo html_writer::script("<!--\n window.document.forms[0].submit();\n //-->"); } break; case "rubricview": $isstudent = $cm->modname == "forum" ? has_capability('mod/' . $cm->modname . ':replypost', $context) : has_capability('mod/' . $cm->modname . ':submit', $context); if ($isstudent) { $tiiassignment = $DB->get_record('plagiarism_turnitin_config', array('cm' => $cm->id, 'name' => 'turnitin_assignid')); $user = new turnitintooltwo_user($USER->id, "Learner"); $coursedata = turnitintooltwo_assignment::get_course_data($cm->course, 'PP'); $user->join_user_to_class($coursedata->turnitin_cid); echo html_writer::tag("div", turnitintooltwo_view::output_lti_form_launch('rubric_view', 'Learner', $tiiassignment->value), array("class" => "launch_form", "style" => "display:none;")); echo html_writer::script("<!--\n window.document.forms[0].submit();\n //-->"); } break; case "peermarkreviews": $isstudent = $cm->modname == "forum" ? has_capability('mod/' . $cm->modname . ':replypost', $context) : has_capability('mod/' . $cm->modname . ':submit', $context); if ($userrole == 'Instructor' || $isstudent) { $role = $istutor ? 'Instructor' : 'Learner'; $tiiassignment = $DB->get_record('plagiarism_turnitin_config', array('cm' => $cm->id, 'name' => 'turnitin_assignid')); echo html_writer::tag("div", turnitintooltwo_view::output_lti_form_launch('peermark_reviews', $role, $tiiassignment->value), array("class" => "launch_form", "style" => "display:none;")); echo html_writer::script("<!--\n window.document.forms[0].submit();\n //-->"); } break;
/** * Show Tutors/Students enrolled on a particular course with Turnitin * * @global type $CFG * @global type $OUTPUT * @global type $DB * @param type $cm course module data * @param type $turnitintooltwoassignment the assignment object * @param array $members of the course in Turnitin * @return array $memberdata in a format to be shown as rows in a datatable */ public function get_tii_members_by_role($cm, $turnitintooltwoassignment, $members, $role = "Learner") { global $CFG, $DB, $OUTPUT; switch ($role) { case "Learner": $removestr = get_string('turnitinstudentsremove', 'turnitintooltwo'); $removeaction = "removestudent"; $do = "students"; break; case "Instructor": $removestr = get_string('turnitintutorsremove', 'turnitintooltwo'); $removeaction = "removetutor"; $do = "tutors"; break; } $memberdata = array(); foreach ($members as $k => $v) { $membermoodleid = turnitintooltwo_user::get_moodle_user_id($k); if ($membermoodleid > 0) { $user = $DB->get_record('user', array('id' => $membermoodleid)); $deleteurl = new moodle_url($CFG->wwwroot . "/mod/turnitintooltwo/view.php", array('id' => $cm->id, 'do' => $do, 'sesskey' => sesskey(), 'action' => $removeaction, 'membership_id' => $v['membership_id'])); $attributes["onclick"] = 'return confirm(\'' . $removestr . '\');'; $link = html_writer::link($deleteurl, html_writer::tag('i', '', array('class' => 'fa fa-trash-o fa-lg')), $attributes); $userdetails = html_writer::link($CFG->wwwroot . '/user/view.php?id=' . $membermoodleid . '&course=' . $turnitintooltwoassignment->turnitintooltwo->course, format_string($v['lastname']) . ', ' . format_string($v['firstname'])) . ' (' . $user->username . ')'; $memberdata[] = array($link, $userdetails); } } return $memberdata; }
throw new moodle_exception('invalidsesskey', 'error'); } $assignmentid = required_param('assignment', PARAM_INT); $turnitintooltwoassignment = new turnitintooltwo_assignment($assignmentid); $cm = get_coursemodule_from_instance("turnitintooltwo", $assignmentid); if (has_capability('mod/turnitintooltwo:grade', context_module::instance($cm->id))) { echo $turnitintooltwoassignment->enrol_all_students($cm); } break; case "refresh_rubric_select": $courseid = required_param('course', PARAM_INT); $assignmentid = required_param('assignment', PARAM_INT); $modulename = required_param('modulename', PARAM_ALPHA); if (has_capability('moodle/course:update', context_course::instance($courseid))) { // Set Rubric options to instructor rubrics. $instructor = new turnitintooltwo_user($USER->id, 'Instructor'); $instructor->set_user_values_from_tii(); $instructorrubrics = $instructor->get_instructor_rubrics(); $options = array('' => get_string('norubric', 'turnitintooltwo')) + $instructorrubrics; // Add in rubric if the selected rubric belongs to another instructor. if (!empty($assignmentid)) { if ($modulename == "turnitintooltwo") { $turnitintooltwoassignment = new turnitintooltwo_assignment($assignmentid); } else { require_once $CFG->dirroot . '/plagiarism/turnitin/lib.php'; $pluginturnitin = new plagiarism_plugin_turnitin(); $cm = get_coursemodule_from_instance($modulename, $assignmentid); $plagiarismsettings = $pluginturnitin->get_settings($cm->id); } if ($modulename == "turnitintooltwo") { if (!empty($turnitintooltwoassignment->turnitintooltwo->rubric)) {
/** * Due to moodle's internal plugin hooks we can not use our bespoke form class for Turnitin * settings. This form shows in settings > defaults as well as the activity creation screen. * * @global type $CFG * @param type $plugin_defaults * @return type */ public function add_elements_to_settings_form($mform, $course, $location = "activity", $cmid = 0, $currentrubric = 0) { global $CFG, $OUTPUT, $PAGE, $USER, $DB; // Include JS strings (closebutton is needed from both plugins). $PAGE->requires->string_for_js('changerubricwarning', 'plagiarism_turnitin'); $PAGE->requires->string_for_js('closebutton', 'turnitintooltwo'); $PAGE->requires->string_for_js('closebutton', 'plagiarism_turnitin'); $config = turnitintooltwo_admin_config(); $config_warning = ''; $rubrics = array(); if ($location == "activity") { $instructor = new turnitintooltwo_user($USER->id, 'Instructor'); $instructor->join_user_to_class($course->turnitin_cid); $rubrics = $instructor->get_instructor_rubrics(); // Get rubrics that are shared on the account. $turnitinclass = new turnitin_class($course->id); $turnitinclass->sharedrubrics = array(); $turnitinclass->read_class_from_tii(); // Merge the arrays, prioitising instructor owned arrays. $rubrics = $rubrics + $turnitinclass->sharedrubrics; } $options = array(0 => get_string('no'), 1 => get_string('yes')); $genoptions = array(0 => get_string('genimmediately1', 'plagiarism_turnitin'), 1 => get_string('genimmediately2', 'plagiarism_turnitin'), 2 => get_string('genduedate', 'plagiarism_turnitin')); $excludetypeoptions = array(0 => get_string('no'), 1 => get_string('excludewords', 'plagiarism_turnitin'), 2 => get_string('excludepercent', 'plagiarism_turnitin')); if ($location == "defaults") { $mform->addElement('header', 'plugin_header', get_string('turnitindefaults', 'plagiarism_turnitin')); $mform->addElement('html', get_string("defaultsdesc", "turnitintooltwo")); } if ($location != "defaults") { $mform->addElement('header', 'plugin_header', get_string('turnitinpluginsettings', 'plagiarism_turnitin')); // Add in custom Javascript and CSS. $PAGE->requires->jquery(); $PAGE->requires->jquery_plugin('ui'); $PAGE->requires->jquery_plugin('turnitintooltwo-turnitintooltwo', 'mod_turnitintooltwo'); $PAGE->requires->jquery_plugin('plagiarism-turnitin_module', 'plagiarism_turnitin'); $PAGE->requires->jquery_plugin('turnitintooltwo-colorbox', 'mod_turnitintooltwo'); $cssurl = new moodle_url('/mod/turnitintooltwo/css/colorbox.css'); $PAGE->requires->css($cssurl); // Refresh Grades $refreshgrades = ''; if ($cmid != 0) { // If assignment has submissions then show a refresh grades button $numsubs = $DB->count_records('plagiarism_turnitin_files', array('cm' => $cmid)); if ($numsubs > 0) { $refreshgrades = html_writer::tag('div', $OUTPUT->pix_icon('refresh', get_string('turnitinrefreshsubmissions', 'plagiarism_turnitin'), 'plagiarism_turnitin') . html_writer::tag('span', get_string('turnitinrefreshsubmissions', 'plagiarism_turnitin')), array('class' => 'plagiarism_turnitin_refresh_grades')); $refreshgrades .= html_writer::tag('div', $OUTPUT->pix_icon('loading', get_string('turnitinrefreshingsubmissions', 'plagiarism_turnitin'), 'plagiarism_turnitin') . html_writer::tag('span', get_string('turnitinrefreshingsubmissions', 'plagiarism_turnitin')), array('class' => 'plagiarism_turnitin_refreshing_grades')); } } // Quickmark Manager. $quickmarkmanagerlink = ''; if ($config->usegrademark) { $quickmarkmanagerlink .= $OUTPUT->box_start('row_quickmark_manager', ''); $quickmarkmanagerlink .= html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/extras.php?cmd=quickmarkmanager&view_context=box', get_string('launchquickmarkmanager', 'plagiarism_turnitin'), array('class' => 'plagiarism_turnitin_quickmark_manager_launch', 'title' => get_string('launchquickmarkmanager', 'plagiarism_turnitin'))); $quickmarkmanagerlink .= html_writer::tag('span', '', array('class' => 'launch_form', 'id' => 'quickmark_manager_form')); $quickmarkmanagerlink .= $OUTPUT->box_end(true); } $use_turnitin = $DB->get_record('plagiarism_turnitin_config', array('cm' => $cmid, 'name' => 'use_turnitin')); // Peermark Manager. $peermarkmanagerlink = ''; if (!empty($config->enablepeermark) && !empty($use_turnitin->value)) { if ($cmid != 0) { $peermarkmanagerlink .= $OUTPUT->box_start('row_peermark_manager', ''); $peermarkmanagerlink .= html_writer::link($CFG->wwwroot . '/plagiarism/turnitin/ajax.php?cmid=' . $cmid . '&action=peermarkmanager&view_context=box', get_string('launchpeermarkmanager', 'plagiarism_turnitin'), array('class' => 'peermark_manager_launch', 'id' => 'peermark_manager_' . $cmid, 'title' => get_string('launchpeermarkmanager', 'plagiarism_turnitin'))); $peermarkmanagerlink .= html_writer::tag('span', '', array('class' => 'launch_form', 'id' => 'peermark_manager_form')); $peermarkmanagerlink .= $OUTPUT->box_end(true); } } if (!empty($quickmarkmanagerlink) || !empty($peermarkmanagerlink) || !empty($refreshgrades)) { $mform->addElement('static', 'static', '', $refreshgrades . $quickmarkmanagerlink . $peermarkmanagerlink); } } $locks = $DB->get_records_sql("SELECT name, value FROM {plagiarism_turnitin_config} WHERE cm IS NULL"); if (empty($config_warning)) { $mform->addElement('select', 'use_turnitin', get_string("useturnitin", "turnitintooltwo"), $options); $this->lock($mform, $location, $locks); $mform->addElement('select', 'plagiarism_show_student_report', get_string("studentreports", "turnitintooltwo"), $options); $this->lock($mform, $location, $locks); $mform->addHelpButton('plagiarism_show_student_report', 'studentreports', 'plagiarism_turnitin'); if ($mform->elementExists('submissiondrafts') || $location == 'defaults') { $tiidraftoptions = array(0 => get_string("submitondraft", "turnitintooltwo"), 1 => get_string("submitonfinal", "turnitintooltwo")); $mform->addElement('select', 'plagiarism_draft_submit', get_string("draftsubmit", "turnitintooltwo"), $tiidraftoptions); $this->lock($mform, $location, $locks); $mform->disabledIf('plagiarism_draft_submit', 'submissiondrafts', 'eq', 0); } $mform->addElement('select', 'plagiarism_allow_non_or_submissions', get_string("allownonor", "turnitintooltwo"), $options); $this->lock($mform, $location, $locks); $mform->addHelpButton('plagiarism_allow_non_or_submissions', 'allownonor', 'plagiarism_turnitin'); $suboptions = array(0 => get_string('norepository', 'plagiarism_turnitin'), 1 => get_string('standardrepository', 'plagiarism_turnitin')); switch ($config->repositoryoption) { case 0: // Standard options $mform->addElement('select', 'plagiarism_submitpapersto', get_string('submitpapersto', 'plagiarism_turnitin'), $suboptions); $this->lock($mform, $location, $locks); break; case 1: // Standard options + Allow Instituional Repository $suboptions[2] = get_string('institutionalrepository', 'plagiarism_turnitin'); $mform->addElement('select', 'plagiarism_submitpapersto', get_string('submitpapersto', 'plagiarism_turnitin'), $suboptions); $this->lock($mform, $location, $locks); break; case 2: // Force Standard Repository $mform->addElement('hidden', 'plagiarism_submitpapersto', 1); $mform->setType('plagiarism_submitpapersto', PARAM_RAW); break; case 3: // Force No Repository $mform->addElement('hidden', 'plagiarism_submitpapersto', 0); $mform->setType('plagiarism_submitpapersto', PARAM_RAW); break; } $mform->addElement('html', html_writer::tag('div', get_string('checkagainstnote', 'plagiarism_turnitin'), array('class' => 'tii_checkagainstnote'))); $mform->addElement('select', 'plagiarism_compare_student_papers', get_string("spapercheck", "turnitintooltwo"), $options); $this->lock($mform, $location, $locks); $mform->addElement('select', 'plagiarism_compare_internet', get_string("internetcheck", "turnitintooltwo"), $options); $this->lock($mform, $location, $locks); $mform->addElement('select', 'plagiarism_compare_journals', get_string("journalcheck", "turnitintooltwo"), $options); $this->lock($mform, $location, $locks); if ($config->repositoryoption == 1) { $mform->addElement('select', 'plagiarism_compare_institution', get_string('compareinstitution', 'plagiarism_turnitin'), $options); $this->lock($mform, $location, $locks); } $mform->addElement('select', 'plagiarism_report_gen', get_string("reportgenspeed", "turnitintooltwo"), $genoptions); $this->lock($mform, $location, $locks); $mform->addElement('html', html_writer::tag('div', get_string('genspeednote', 'plagiarism_turnitin'), array('class' => 'tii_genspeednote'))); $mform->addElement('select', 'plagiarism_exclude_biblio', get_string("excludebiblio", "turnitintooltwo"), $options); $this->lock($mform, $location, $locks); $mform->addElement('select', 'plagiarism_exclude_quoted', get_string("excludequoted", "turnitintooltwo"), $options); $this->lock($mform, $location, $locks); $mform->addElement('select', 'plagiarism_exclude_matches', get_string("excludevalue", "turnitintooltwo"), $excludetypeoptions); $this->lock($mform, $location, $locks); $mform->addElement('text', 'plagiarism_exclude_matches_value', ''); $mform->setType('plagiarism_exclude_matches_value', PARAM_INT); $mform->addRule('plagiarism_exclude_matches_value', null, 'numeric', null, 'client'); $mform->disabledIf('plagiarism_exclude_matches_value', 'plagiarism_exclude_matches', 'eq', 0); if ($location == 'defaults') { $mform->addElement('text', 'plagiarism_locked_message', get_string("locked_message", "plagiarism_turnitin"), 'maxlength="50" size="50"'); $mform->setType('plagiarism_locked_message', PARAM_TEXT); $mform->setDefault('plagiarism_locked_message', get_string("locked_message_default", "plagiarism_turnitin")); $mform->addHelpButton('plagiarism_locked_message', 'locked_message', 'plagiarism_turnitin'); } if ($location == "activity" && $config->usegrademark) { // Populate Rubric options. $rubricoptions = array('' => get_string('norubric', 'plagiarism_turnitin')) + $rubrics; if (!empty($currentrubric)) { $rubricoptions[$currentrubric] = isset($rubricoptions[$currentrubric]) ? $rubricoptions[$currentrubric] : get_string('otherrubric', 'plagiarism_turnitin'); } $mform->addElement('select', 'plagiarism_rubric', get_string('attachrubric', 'plagiarism_turnitin'), $rubricoptions); $mform->addElement('static', 'rubric_link', '', html_writer::link($CFG->wwwroot . '/mod/turnitintooltwo/extras.php?cmd=rubricmanager&view_context=box', get_string('launchrubricmanager', 'plagiarism_turnitin'), array('class' => 'rubric_manager_launch', 'title' => get_string('launchrubricmanager', 'plagiarism_turnitin'))) . html_writer::tag('span', '', array('class' => 'launch_form', 'id' => 'rubric_manager_form'))); $mform->setDefault('plagiarism_rubric', ''); $mform->addElement('hidden', 'rubric_warning_seen', ''); $mform->setType('rubric_warning_seen', PARAM_RAW); $mform->addElement('static', 'rubric_note', '', get_string('attachrubricnote', 'plagiarism_turnitin')); } else { $mform->addElement('hidden', 'plagiarism_rubric', ''); $mform->setType('plagiarism_rubric', PARAM_RAW); } if (!empty($config->useerater)) { $handbookoptions = array(1 => get_string('erater_handbook_advanced', 'plagiarism_turnitin'), 2 => get_string('erater_handbook_highschool', 'plagiarism_turnitin'), 3 => get_string('erater_handbook_middleschool', 'plagiarism_turnitin'), 4 => get_string('erater_handbook_elementary', 'plagiarism_turnitin'), 5 => get_string('erater_handbook_learners', 'plagiarism_turnitin')); $dictionaryoptions = array('en_US' => get_string('erater_dictionary_enus', 'plagiarism_turnitin'), 'en_GB' => get_string('erater_dictionary_engb', 'plagiarism_turnitin'), 'en' => get_string('erater_dictionary_en', 'plagiarism_turnitin')); $mform->addElement('select', 'plagiarism_erater', get_string('erater', 'plagiarism_turnitin'), $options); $mform->setDefault('plagiarism_erater', 0); $mform->addElement('select', 'plagiarism_erater_handbook', get_string('erater_handbook', 'plagiarism_turnitin'), $handbookoptions); $mform->setDefault('plagiarism_erater_handbook', 2); $mform->disabledIf('plagiarism_erater_handbook', 'plagiarism_erater', 'eq', 0); $mform->addElement('select', 'plagiarism_erater_dictionary', get_string('erater_dictionary', 'plagiarism_turnitin'), $dictionaryoptions); $mform->setDefault('plagiarism_erater_dictionary', 'en_US'); $mform->disabledIf('plagiarism_erater_dictionary', 'plagiarism_erater', 'eq', 0); $mform->addElement('checkbox', 'plagiarism_erater_spelling', get_string('erater_categories', 'plagiarism_turnitin'), " " . get_string('erater_spelling', 'plagiarism_turnitin')); $mform->disabledIf('plagiarism_erater_spelling', 'plagiarism_erater', 'eq', 0); $mform->addElement('checkbox', 'plagiarism_erater_grammar', '', " " . get_string('erater_grammar', 'plagiarism_turnitin')); $mform->disabledIf('plagiarism_erater_grammar', 'plagiarism_erater', 'eq', 0); $mform->addElement('checkbox', 'plagiarism_erater_usage', '', " " . get_string('erater_usage', 'plagiarism_turnitin')); $mform->disabledIf('plagiarism_erater_usage', 'plagiarism_erater', 'eq', 0); $mform->addElement('checkbox', 'plagiarism_erater_mechanics', '', " " . get_string('erater_mechanics', 'plagiarism_turnitin')); $mform->disabledIf('plagiarism_erater_mechanics', 'plagiarism_erater', 'eq', 0); $mform->addElement('checkbox', 'plagiarism_erater_style', '', " " . get_string('erater_style', 'plagiarism_turnitin')); $mform->disabledIf('plagiarism_erater_style', 'plagiarism_erater', 'eq', 0); } $mform->addElement('html', html_writer::tag('div', get_string('anonblindmarkingnote', 'plagiarism_turnitin'), array('class' => 'tii_anonblindmarkingnote'))); if ($config->transmatch) { $mform->addElement('select', 'plagiarism_transmatch', get_string("transmatch", "turnitintooltwo"), $options); } else { $mform->addElement('hidden', 'plagiarism_transmatch', 0); } $mform->setType('plagiarism_transmatch', PARAM_INT); $mform->addElement('hidden', 'action', "defaults"); $mform->setType('action', PARAM_RAW); } else { $mform->addElement('hidden', 'use_turnitin', 0); $mform->setType('use_turnitin', PARAM_INT); } // Disable the form change checker - added in 2.3.2. if (is_callable(array($mform, 'disable_form_change_checker'))) { $mform->disable_form_change_checker(); } }
/** * Get users for unlinking/relinking. Called from ajax.php via turnitintooltwo.js. * * @global type $DB * @return array return array of users to display */ function turnitintooltwo_getusers() { global $DB; $config = turnitintooltwo_admin_config(); $return = array(); $idisplaystart = optional_param('iDisplayStart', 0, PARAM_INT); $idisplaylength = optional_param('iDisplayLength', 10, PARAM_INT); $secho = optional_param('sEcho', 1, PARAM_INT); $displaycolumns = array('tu.userid', 'tu.turnitin_uid', 'mu.lastname', 'mu.firstname', 'mu.email'); $queryparams = array(); // Add sort to query. $isortcol[0] = optional_param('iSortCol_0', null, PARAM_INT); $isortingcols = optional_param('iSortingCols', 0, PARAM_INT); $queryorder = ""; if (!is_null($isortcol[0])) { $queryorder = " ORDER BY "; $startorder = $queryorder; for ($i = 0; $i < intval($isortingcols); $i++) { $isortcol[$i] = optional_param('iSortCol_' . $i, null, PARAM_INT); $bsortable[$i] = optional_param('bSortable_' . $isortcol[$i], null, PARAM_TEXT); $ssortdir[$i] = optional_param('sSortDir_' . $i, null, PARAM_TEXT); if ($bsortable[$i] == "true") { $queryorder .= $displaycolumns[$isortcol[$i]] . " " . $ssortdir[$i] . ", "; } } if ($queryorder == $startorder) { $queryorder = ""; } else { $queryorder = substr_replace($queryorder, "", -2); } } // Add search to query. $ssearch = optional_param('sSearch', '', PARAM_TEXT); $querywhere = ' WHERE ( '; for ($i = 0; $i < count($displaycolumns); $i++) { $bsearchable[$i] = optional_param('bSearchable_' . $i, null, PARAM_TEXT); if (!is_null($bsearchable[$i]) && $bsearchable[$i] == "true" && $ssearch != '') { $include = true; if ($i <= 1) { if (!is_int($ssearch) || is_null($ssearch)) { $include = false; } } if ($include) { $querywhere .= $DB->sql_like($displaycolumns[$i], ':search_term_' . $i, false) . " OR "; $queryparams['search_term_' . $i] = '%' . $ssearch . '%'; } } } if ($querywhere == ' WHERE ( ') { $querywhere = ""; } else { $querywhere = substr_replace($querywhere, "", -3); $querywhere .= " )"; } $query = "SELECT tu.id AS id, tu.userid AS userid, tu.turnitin_uid AS turnitin_uid, tu.turnitin_utp AS turnitin_utp, " . "mu.firstname AS firstname, mu.lastname AS lastname, mu.email AS email " . "FROM {turnitintooltwo_users} tu " . "LEFT JOIN {user} mu ON tu.userid = mu.id " . $querywhere . $queryorder; $users = $DB->get_records_sql($query, $queryparams, $idisplaystart, $idisplaylength); $totalusers = count($DB->get_records_sql($query, $queryparams)); $return["aaData"] = array(); foreach ($users as $user) { $checkbox = html_writer::checkbox('userids[]', $user->id, false, '', array("class" => "browser_checkbox")); $pseudoemail = ""; if (!empty($config->enablepseudo)) { $pseudouser = new TiiPseudoUser(turnitintooltwo_user::get_pseudo_domain()); $pseudouser->setEmail($user->email); $pseudoemail = $pseudouser->getEmail(); } $return["aaData"][] = array($checkbox, $user->turnitin_uid == 0 ? '' : $user->turnitin_uid, format_string($user->lastname), format_string($user->firstname), $pseudoemail); } $return["sEcho"] = $secho; $return["iTotalRecords"] = count($users); $return["iTotalDisplayRecords"] = $totalusers; return $return; }
/** * Save updated submission data from Turnitin to the database * * @global type $DB * @param type $tiisubmissiondata * @param type $bulk * @param type $save - save in db regardless of changes * @return type */ public function save_updated_submission_data($tiisubmissiondata, $bulk = false, $save = false) { global $DB, $CFG; static $part; static $tiiassignid; if ($tiiassignid != $tiisubmissiondata->getAssignmentId() || empty($part)) { $part = $DB->get_record("turnitintooltwo_parts", array("tiiassignid" => $tiisubmissiondata->getAssignmentId())); } $turnitintooltwoassignment = new turnitintooltwo_assignment($part->turnitintooltwoid); $sub = new stdClass(); $sub->submission_title = $tiisubmissiondata->getTitle(); $sub->submission_part = $part->id; $sub->submission_objectid = $tiisubmissiondata->getSubmissionId(); $sub->turnitintooltwoid = $turnitintooltwoassignment->turnitintooltwo->id; $sub->submission_score = is_numeric($tiisubmissiondata->getOverallSimilarity()) ? $tiisubmissiondata->getOverallSimilarity() : null; $sub->submission_transmatch = 0; if ($turnitintooltwoassignment->turnitintooltwo->transmatch == 1 && is_int($tiisubmissiondata->getTranslatedOverallSimilarity())) { if ($tiisubmissiondata->getTranslatedOverallSimilarity() > $tiisubmissiondata->getOverallSimilarity()) { $sub->submission_score = $tiisubmissiondata->getTranslatedOverallSimilarity(); $sub->submission_transmatch = 1; } } $sub->submission_grade = $tiisubmissiondata->getGrade() == '' ? null : $tiisubmissiondata->getGrade(); $sub->submission_gmimaged = $tiisubmissiondata->getFeedbackExists(); $sub->submission_unanon = $tiisubmissiondata->getAnonymous() == 1 ? 0 : 1; $sub->submission_orcapable = $tiisubmissiondata->getOriginalityReportCapable() == 1 ? 1 : 0; $sub->submission_acceptnothing = $tiisubmissiondata->getAcceptNothingSubmission() == 1 ? 1 : 0; $sub->submission_unanonreason = $sub->submission_unanon == 1 ? urldecode($tiisubmissiondata->getAnonymousRevealReason()) : null; $sub->submission_modified = strtotime($tiisubmissiondata->getDate()); $sub->translated_overall_similarity = $tiisubmissiondata->getTranslatedOverallSimilarity(); $sub->submission_attempts = $tiisubmissiondata->getAuthorLastViewedFeedback() > 0 ? strtotime($tiisubmissiondata->getAuthorLastViewedFeedback()) : 0; // If save not passed in then only update if certain items have changed to save on database load. if ($this->submission_grade != $sub->submission_grade || $this->submission_score != $sub->submission_score || $this->submission_modified != $sub->submission_modified || $this->submission_attempts != $sub->submission_attempts || $this->submission_unanon != $sub->submission_unanon || $this->submission_part != $sub->submission_part) { $save = true; } $cm = get_coursemodule_from_instance("turnitintooltwo", $turnitintooltwoassignment->turnitintooltwo->id, $turnitintooltwoassignment->turnitintooltwo->course); if ($save) { // If the user is not a moodle user then get their name from Tii - only do this on initial save. $sub->userid = turnitintooltwo_user::get_moodle_user_id($tiisubmissiondata->getAuthorUserId()); // If we have no user ID get it from the Moodle database by using their Turnitin e-mail address. if ($sub->userid == 0) { $tmpuser = new turnitintooltwo_user(0); $tmpuser->tii_user_id = $tiisubmissiondata->getAuthorUserId(); $tiiuser = $tmpuser->set_user_values_from_tii(); if ($userrecord = $DB->get_record('user', array('email' => $tiiuser["email"]))) { $sub->userid = $userrecord->id; } } // Check if the user is enrolled. if ($sub->userid != 0) { $context = context_module::instance($cm->id); if (!is_enrolled($context, $sub->userid)) { // Enroll the user as a student. $enrol = enrol_get_plugin('manual'); $instance = $DB->get_record("enrol", array('courseid' => $cm->course, 'enrol' => 'manual')); $enrol->enrol_user($instance, $sub->userid, 5); } } if ($sub->userid == 0 && empty($this->id)) { if ($tiisubmissiondata->getAuthorUserId() > 0) { $sub->submission_nmuserid = $tiisubmissiondata->getAuthorUserId(); $tmpuser = new turnitintooltwo_user(0); $tmpuser->tii_user_id = $tiisubmissiondata->getAuthorUserId(); $tiiuser = $tmpuser->set_user_values_from_tii(); $sub->submission_nmfirstname = $tiiuser["firstname"]; $sub->submission_nmlastname = $tiiuser["lastname"]; } else { $sub->submission_nmuserid = "nm-" . $tiisubmissiondata->getAuthorUserId(); $sub->submission_nmfirstname = ''; $sub->submission_nmlastname = get_string('nonmoodleuser', 'turnitintooltwo'); } } if (!empty($this->id)) { $sub->id = $this->id; $DB->update_record("turnitintooltwo_submissions", $sub, $bulk); } else { $sub->id = $DB->insert_record("turnitintooltwo_submissions", $sub, true, $bulk); } // Update gradebook. @(include_once $CFG->libdir . "/gradelib.php"); if ($sub->userid > 0 && $sub->submission_unanon) { $user = new turnitintooltwo_user($sub->userid, "Learner"); $grades = new stdClass(); // Only add to gradebook if author has been unanonymised or assignment doesn't have anonymous marking if ($submissions = $DB->get_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $turnitintooltwoassignment->turnitintooltwo->id, 'userid' => $user->id, 'submission_unanon' => 1))) { $overallgrade = $turnitintooltwoassignment->get_overall_grade($submissions); if ($turnitintooltwoassignment->turnitintooltwo->grade < 0) { // Using a scale. $grades->rawgrade = $overallgrade == '--' ? null : $overallgrade; } else { $grades->rawgrade = $overallgrade == '--' ? null : number_format($overallgrade, 2); } } $grades->userid = $user->id; $params['idnumber'] = $cm->idnumber; grade_update('mod/turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->course, 'mod', 'turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->id, 0, $grades, $params); } } }
public function definition() { global $CFG, $DB, $USER, $COURSE; $config = turnitintooltwo_admin_config(); // Module string is useful for product support. $modulestring = '<!-- Turnitin Moodle Direct Version: ' . turnitintooltwo_get_version() . ' - ('; // Get Moodle Course Object. $course = turnitintooltwo_assignment::get_course_data($COURSE->id); // Create or edit the class in Turnitin. if ($course->turnitin_cid == 0) { $tiicoursedata = turnitintooltwo_assignment::create_tii_course($course, $USER->id); $course->turnitin_cid = $tiicoursedata->turnitin_cid; $course->turnitin_ctl = $tiicoursedata->turnitin_ctl; } else { turnitintooltwo_assignment::edit_tii_course($course); $course->turnitin_ctl = $course->fullname . " (Moodle TT)"; } // Join this user to the class as an instructor and get their rubrics. $instructor = new turnitintooltwo_user($USER->id, 'Instructor'); $instructor->join_user_to_class($course->turnitin_cid); $instructor->set_user_values_from_tii(); $instructorrubrics = $instructor->get_instructor_rubrics(); // Get rubrics that are shared on the account. $turnitinclass = new turnitintooltwo_class($course->id); $turnitinclass->read_class_from_tii(); // Merge the arrays, prioitising instructor owned arrays. $rubrics = $instructorrubrics + $turnitinclass->sharedrubrics; $this->numsubs = 0; if (isset($this->_cm->id)) { $turnitintooltwoassignment = new turnitintooltwo_assignment($this->_cm->instance); $turnitintooltwoassignment->update_assignment_from_tii(); $this->turnitintooltwo = $DB->get_record("turnitintooltwo", array("id" => $this->_cm->instance)); $parts = $DB->get_records("turnitintooltwo_parts", array("turnitintooltwoid" => $this->_cm->instance, "deleted" => 0), 'id'); $i = 0; foreach ($parts as $part) { $i++; $attributes = array("id", "partname", "dtstart", "dtdue", "dtpost", "maxmarks"); foreach ($attributes as $att) { $attribute = $att . $i; $this->current->{$attribute} = $part->{$att}; } $attribute = "numsubs" . $i; $this->current->{$attribute} = $DB->count_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $this->turnitintooltwo->id, 'submission_part' => $part->id)); $this->numsubs += $this->current->{$attribute}; $modulestring .= $modulestring != "(" ? " | " : ""; $modulestring .= $part->partname . ': ' . $part->tiiassignid; } $this->updating = true; } else { $this->updating = false; $instructordefaults = $instructor->get_instructor_defaults(); if (empty($instructordefaults)) { $instructordefaults = array(); } foreach ($instructordefaults as $k => $v) { $this->current->{$k} = $v; } } // Overwrite instructor default repository if admin is forcing repository setting switch ($config->repositoryoption) { case 2: // Force Standard Repository $this->current->submitpapersto = 1; break; case 3: // Force No Repository $this->current->submitpapersto = 0; break; } $modulestring .= ') -->'; $this->show_form($rubrics, $modulestring, $course->turnitin_cid); }
/** * If no user data was restored after everything has been restored then * create a new course in Turnitin */ public function after_restore() { global $DB, $CFG; if (!empty($_SESSION['tii_course_reset'])) { $course = turnitintooltwo_assignment::get_course_data($_SESSION['course_id']); //Get the main site admin. $admins = explode(",", $CFG->siteadmins); $ownerid = $admins[0]; // Get the number of assignments that already exist on this course that aren't part of recreation. $assignments = 0; if (!empty($_SESSION['assignments_to_create'])) { $modules = $_SESSION['assignments_to_create']; list($notinsql, $notinparams) = $DB->get_in_or_equal($modules, SQL_PARAMS_QM, 'param', false); $assignments = $DB->count_records_select('turnitintooltwo', " course = ? AND id " . $notinsql, array_merge(array($_SESSION['course_id']), $notinparams)); } // Only recreate course on Turnitin if Turnitin Assignments don't exist on destination course. if ($assignments == 0) { // Remove Turnitin link from course $turnitin_course = new stdClass(); $turnitin_course->id = $course->tii_rel_id; $turnitin_course->turnitin_cid = 0; $DB->update_record('turnitintooltwo_courses', $turnitin_course); // Recreate course in Turnitin $course->turnitin_cid = 0; $tmpassignment = new turnitintooltwo_assignment(0, '', ''); $turnitin_course = $tmpassignment->create_tii_course($course, $ownerid); // Join the course as Instructor $owner = new turnitintooltwo_user($ownerid, 'Instructor'); $owner->join_user_to_class($turnitin_course->turnitin_cid); } unset($_SESSION['tii_course_reset']); unset($_SESSION['course_id']); } if (!empty($_SESSION['assignments_to_create'])) { foreach ($_SESSION["assignments_to_create"] as $new_assignment_id) { $assignment = new turnitintooltwo_assignment($new_assignment_id); $assignment->unlink_assignment(); $assignment->edit_moodle_assignment(true, true); } unset($_SESSION['tii_assignment_reset']); unset($_SESSION['assignments_to_create']); } }
/** * If there is no submission record then we are creating one. Text content should be submitted. * If a file has already been submitted then check whether the identifier is the same, if it is do nothing. * If it's not then either edit submission or create new one depending on module settings. */ public function tii_submission($cm, $tiiassignmentid, $user, $submitter, $identifier, $submissiontype, $itemid = 0, $title = '', $textcontent = '', $cronerror = '') { global $CFG, $DB, $USER, $turnitinacceptedfiles; // Instantiate error code $errorcode = 0; // Get config, module and course settings that we need. $config = turnitintooltwo_admin_config(); $settings = $this->get_settings($cm->id); $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance)); $coursedata = $this->get_course_data($cm->id, $cm->course, 'cron'); // Update user's details on Turnitin. $user->edit_tii_user(); // Clean up old Turnitin submission files. if ($itemid != 0 && $submissiontype == 'file' && $cm->modname != 'forum') { $this->clean_old_turnitin_submissions($cm, $user->id, $itemid, $submissiontype, $identifier, $user); } // Work out submission method. // If this file has successfully submitted in the past then break, text content is to be submitted. switch ($submissiontype) { case 'file': case 'text_content': // Get file data or prepare text submission. if ($submissiontype == 'file') { $fs = get_file_storage(); $file = $fs->get_file_by_hash($identifier); $title = $file->get_filename(); $timemodified = $file->get_timemodified(); $filename = $file->get_filename(); try { $textcontent = $file->get_content(); } catch (Exception $e) { turnitintooltwo_activitylog('File content not found on submission: ' . $pathnamehash, 'PP_NO_FILE'); mtrace($e); mtrace('File content not found on submission. pathnamehash: ' . $pathnamehash); $errorcode = 9; } } else { // Check when text submission was last modified. switch ($cm->modname) { case 'assign': $moodlesubmission = $DB->get_record('assign_submission', array('assignment' => $cm->instance, 'userid' => $user->id, 'id' => $itemid), 'timemodified'); break; case 'workshop': $moodlesubmission = $DB->get_record('workshop_submissions', array('workshopid' => $cm->instance, 'authorid' => $user->id), 'timemodified'); break; } $title = !empty($title) ? $title : 'onlinetext_' . $user->id . "_" . $cm->id . "_" . $cm->instance . '.txt'; $filename = substr($title, -4) == '.txt' ? $title : $title . '.txt'; $textcontent = strip_tags($textcontent); $timemodified = $moodlesubmission->timemodified; } // Get submission method depending on whether there has been a previous submission. $submissionfields = 'id, cm, externalid, identifier, statuscode, lastmodified, attempt'; $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype "; // Double check there is only one submission. $previoussubmissions = $DB->get_records_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND " . $typefield . " = ? AND identifier = ? ", array($cm->id, $user->id, $submissiontype, $identifier), 'id', $submissionfields); $previoussubmission = end($previoussubmissions); if ($previoussubmission) { // Don't submit if submission hasn't changed. if (in_array($previoussubmission->statuscode, array("success", "error")) && $timemodified <= $previoussubmission->lastmodified) { return true; } else { if ($settings["plagiarism_report_gen"] > 0) { // Replace if Turnitin assignment allows resubmissions or create if we have no Turnitin id stored. $submissionid = $previoussubmission->id; $apimethod = is_null($previoussubmission->externalid) ? "createSubmission" : "replaceSubmission"; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $apimethod = "createSubmission"; if ($previoussubmission->statuscode != "success") { $submissionid = $previoussubmission->id; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } } } } else { // Check if there is previous submission of text content which we will replace $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype "; if ($submissiontype == 'text_content' && ($previoussubmission = $DB->get_record_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND " . $typefield . " = ? ", array($cm->id, $user->id, 'text_content'), 'id, cm, externalid, identifier, statuscode, lastmodified, attempt', 0, 1))) { $submissionid = $previoussubmission->id; $apimethod = is_null($previoussubmission->externalid) || $settings["plagiarism_report_gen"] == 0 ? "createSubmission" : "replaceSubmission"; // Delete old text content submissions from Turnitin if not replacing. if ($settings["plagiarism_report_gen"] == 0 && !is_null($previoussubmission->externalid)) { $this->delete_tii_submission($cm, $previoussubmission->externalid, $user); } $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $apimethod = "createSubmission"; $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } } // Remove any old text submissions here if there are any as there is only one per submission if ($itemid != 0 && $submissiontype == "text_content") { $this->clean_old_turnitin_submissions($cm, $user->id, $itemid, $submissiontype, $identifier, $user); } break; case 'forum_post': if ($previoussubmissions = $DB->get_records_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND identifier = ? ", array($cm->id, $user->id, $identifier), 'id DESC', 'id, cm, externalid, identifier, statuscode, attempt', 0, 1)) { $previoussubmission = current($previoussubmissions); if ($previoussubmission->statuscode == "success") { return true; } else { $submissionid = $previoussubmission->id; $apimethod = "replaceSubmission"; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } } else { $apimethod = "createSubmission"; $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } $forum_post = $DB->get_record_select('forum_posts', " userid = ? AND id = ? ", array($user->id, $itemid)); $textcontent = strip_tags($forum_post->message); $filename = $title; break; } // Check file is less than maximum allowed size. if ($submissiontype == 'file') { if ($file->get_filesize() > TURNITINTOOLTWO_MAX_FILE_UPLOAD_SIZE) { $errorcode = 2; } } // Don't submit if a user has not accepted the eula. if ($user->id == $submitter && $user->user_agreement_accepted != 1) { $errorcode = 3; } // If applicable, check whether file type is accepted. $acceptanyfiletype = !empty($settings["plagiarism_allow_non_or_submissions"]) ? 1 : 0; if (!$acceptanyfiletype && $submissiontype == 'file') { $filenameparts = explode('.', $filename); $fileext = strtolower(end($filenameparts)); if (!in_array("." . $fileext, $turnitinacceptedfiles)) { $errorcode = 4; } } // Read the stored file/content into a temp file for submitting. $submission_title = explode('.', $title); $file_string = array($submission_title[0], $cm->id); // Only include user's name and id if we're not using blind marking and student privacy. if (empty($moduledata->blindmarking) && empty($config->enablepseudo)) { $user_details = array($user->id, $user->firstname, $user->lastname); $file_string = array_merge($user_details, $file_string); } try { $tempfile = turnitintooltwo_tempfile($file_string, $filename); } catch (Exception $e) { $errorcode = 8; } // Any errors from cron processing take prioirity. if (!empty($cronerror)) { $errorcode = $cronerror; } // Save failed submission and don't process any further. if ($errorcode != 0) { return $this->save_failed_submission($cm, $user, $submissionid, $identifier, $submissiontype, $errorcode, $previoussubmission); } $fh = fopen($tempfile, "w"); fwrite($fh, $textcontent); fclose($fh); // Create submission object. $submission = new TiiSubmission(); $submission->setAssignmentId($tiiassignmentid); if ($apimethod == "replaceSubmission") { $submission->setSubmissionId($previoussubmission->externalid); } $submission->setTitle($title); $submission->setAuthorUserId($user->tii_user_id); // Account for submission by teacher in assignment module. if ($user->id == $submitter) { $submission->setSubmitterUserId($user->tii_user_id); $submission->setRole('Learner'); } else { $instructor = new turnitintooltwo_user($submitter, 'Instructor'); $instructor->edit_tii_user(); $submission->setSubmitterUserId($instructor->tii_user_id); $submission->setRole('Instructor'); } $submission->setSubmissionDataPath($tempfile); // Initialise Comms Object. $turnitincomms = new turnitin_comms(); $turnitincall = $turnitincomms->initialise_api(); try { $response = $turnitincall->{$apimethod}($submission); $newsubmission = $response->getSubmission(); $newsubmissionid = $newsubmission->getSubmissionId(); $plagiarismfile = new stdClass(); if ($apimethod == "replaceSubmission" || $submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->submitter = $submitter; $plagiarismfile->identifier = $identifier; $plagiarismfile->externalid = $newsubmissionid; $plagiarismfile->statuscode = 'success'; $plagiarismfile->similarityscore = null; $plagiarismfile->attempt = !empty($previoussubmission) ? $previoussubmission->attempt + 1 : 1; $plagiarismfile->transmatch = 0; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; $plagiarismfile->errorcode = null; $plagiarismfile->errormsg = null; if ($apimethod == "replaceSubmission" || $submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******")", "PP_UPDATE_SUB"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******")", "PP_INSERT_SUB"); } } // Delete the tempfile. if (!is_null($tempfile)) { unlink($tempfile); } // Add config field to show submissions have been made which we use to lock anonymous marking setting $configfield = new stdClass(); $configfield->cm = $cm->id; $configfield->name = 'submitted'; $configfield->value = 1; if (!($currentconfigfield = $DB->get_field('plagiarism_turnitin_config', 'id', array('cm' => $cm->id, 'name' => 'submitted')))) { if (!$DB->insert_record('plagiarism_turnitin_config', $configfield)) { turnitintooltwo_print_error('defaultupdateerror', 'plagiarism_turnitin', null, null, __FILE__, __LINE__); } } // Send a message to the user's Moodle inbox with the digital receipt. $receipt = new pp_receipt_message(); $input = array('firstname' => $user->firstname, 'lastname' => $user->lastname, 'submission_title' => $title, 'assignment_name' => $moduledata->name, 'course_fullname' => $coursedata->turnitin_ctl, 'submission_date' => date('d-M-Y h:iA'), 'submission_id' => $newsubmissionid); $message = $receipt->build_message($input); $receipt->send_message($user->id, $message); // Output a message in the cron for successfull submission to Turnitin. $outputvars = new stdClass(); $outputvars->title = $title; $outputvars->submissionid = $newsubmissionid; $outputvars->assignmentname = $moduledata->name; $outputvars->coursename = $coursedata->turnitin_ctl; mtrace(get_string('cronsubmittedsuccessfully', 'plagiarism_turnitin', $outputvars)); } catch (Exception $e) { $errorstring = empty($previoussubmission->externalid) ? "pp_createsubmissionerror" : "pp_updatesubmissionerror"; $plagiarismfile = new stdClass(); if ($submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->attempt = !empty($previoussubmission) ? $previoussubmission->attempt + 1 : 1; $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->submitter = $submitter; $plagiarismfile->identifier = $identifier; $plagiarismfile->statuscode = 'error'; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; $plagiarismfile->errorcode = 0; $plagiarismfile->errormsg = get_string('pp_submission_error', 'plagiarism_turnitin') . ' ' . $e->getMessage(); if ($submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******") - ", "PP_UPDATE_SUB_ERROR"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******") - ", "PP_INSERT_SUB_ERROR"); } } $turnitincomms->handle_exceptions($e, $errorstring, false); mtrace('-------------------------'); mtrace(get_string('pp_submission_error', 'plagiarism_turnitin') . ': ' . $e->getMessage()); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); } return true; }
public function definition() { global $CFG, $DB, $USER; $config = turnitintooltwo_admin_config(); // Module string is useful for product support. if ($CFG->branch >= 26) { $pluginman = \core_plugin_manager::instance(); $plugins = $pluginman->get_plugins(); $module = $plugins['mod']['turnitintooltwo']; } else { $module = $DB->get_record('modules', array('name' => 'turnitintooltwo')); } $version = empty($module->version) ? $module->versiondisk : $module->version; $modulestring = '<!-- Turnitin Moodle Direct Version: ' . $version . ' - ('; $this->numsubs = 0; $instructor = new turnitintooltwo_user($USER->id, 'Instructor'); $instructor->set_user_values_from_tii(); $instructorrubrics = $instructor->get_instructor_rubrics(); if (isset($this->_cm->id)) { $turnitintooltwoassignment = new turnitintooltwo_assignment($this->_cm->instance); $turnitintooltwoassignment->update_assignment_from_tii(); $this->turnitintooltwo = $DB->get_record("turnitintooltwo", array("id" => $this->_cm->instance)); $parts = $DB->get_records("turnitintooltwo_parts", array("turnitintooltwoid" => $this->_cm->instance, "deleted" => 0), 'id'); $i = 0; foreach ($parts as $part) { $i++; $attributes = array("id", "partname", "dtstart", "dtdue", "dtpost", "maxmarks"); foreach ($attributes as $att) { $attribute = $att . $i; $this->current->{$attribute} = $part->{$att}; } $attribute = "numsubs" . $i; $this->current->{$attribute} = $DB->count_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $this->turnitintooltwo->id, 'submission_part' => $part->id)); $this->numsubs += $this->current->{$attribute}; $modulestring .= $modulestring != "(" ? " | " : ""; $modulestring .= $part->partname . ': ' . $part->tiiassignid; } $this->updating = true; } else { $this->updating = false; $instructordefaults = $instructor->get_instructor_defaults(); if (empty($instructordefaults)) { $instructordefaults = array(); } foreach ($instructordefaults as $k => $v) { $this->current->{$k} = $v; } } // Overwrite instructor default repository if admin is forcing repository setting switch ($config->repositoryoption) { case 2: // Force Standard Repository $this->current->submitpapersto = 1; break; case 3: // Force No Repository $this->current->submitpapersto = 0; break; } $modulestring .= ') -->'; $this->show_form($instructorrubrics, $modulestring); }
$jsrequired = true; $userids = isset($_REQUEST['userids']) ? $_REQUEST["userids"] : array(); $userids = clean_param_array($userids, PARAM_INT); // Relink users if form has been submitted. if ((!is_null($relink) || !is_null($unlink)) && isset($userids) && count($userids) > 0) { foreach ($userids as $tiiid) { $tuser = $DB->get_record('turnitintooltwo_users', array('id' => $tiiid)); if ($muser = $DB->get_record('user', array('id' => $tuser->userid))) { // Get the email address if the user has been deleted. if (empty($muser->email) || strpos($muser->email, '@') === false) { $split = explode('.', $muser->username); array_pop($split); $muser->email = join('.', $split); } // Unlink user from Turnitin. $user = new turnitintooltwo_user($muser->id, $role = null, $enrol = null, $workflowcontext = null, $finduser = false); $user->unlink_user($tiiid); // Relink user. if (!is_null($relink)) { // The user object will create user in Turnitin. $user = new turnitintooltwo_user($muser->id); } } else { $DB->delete_records('turnitintooltwo_users', array('id' => $tiiid)); } } redirect(new moodle_url('/mod/turnitintooltwo/settings_extras.php', array('cmd' => 'unlinkusers'))); exit; } $output .= html_writer::tag('h2', get_string('unlinkrelinkusers', 'turnitintooltwo')); $table = new html_table();
$submissionid = required_param('submissionid', PARAM_INT); $user = new turnitintooltwo_user($USER->id, $userrole); echo html_writer::tag("div", $turnitintooltwoview->output_dv_launch_form($do, $submissionid, $user->tii_user_id, $userrole), array("class" => "launch_form")); if ($do === "origreport") { $submission = new turnitintooltwo_submission($submissionid, 'turnitin'); turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "view submission", 'view.php?id=' . $cm->id, get_string('viewsubmissiondesc', 'turnitintooltwo') . " '{$submission->submission_title}'", $cm->id, $submission->userid); } break; case "submissions": $listsubmissionsdesc = $istutor ? "listsubmissionsdesc" : "listsubmissionsdesc_student"; turnitintooltwo_add_to_log($turnitintooltwoassignment->turnitintooltwo->course, "list submissions", 'view.php?id=' . $cm->id, get_string($listsubmissionsdesc, 'turnitintooltwo') . ": {$course->id}", $cm->id); if (!$istutor && !has_capability('mod/turnitintooltwo:submit', context_module::instance($cm->id))) { turnitintooltwo_print_error('permissiondeniederror', 'turnitintooltwo'); exit; } $turnitintooltwouser = new turnitintooltwo_user($USER->id, $userrole); // Get course data. if ($istutor) { $course = $turnitintooltwoassignment->get_course_data($turnitintooltwoassignment->turnitintooltwo->course); } // Update Assignment from Turnitin on first visit. if (empty($_SESSION["assignment_updated"][$turnitintooltwoassignment->turnitintooltwo->id])) { $turnitintooltwoassignment->update_assignment_from_tii(); // Enrol the tutor on the class. if ($istutor) { $turnitintooltwouser->join_user_to_class($course->turnitin_cid); } } // Show submission failure if this has been a manual submission. if (isset($_SESSION["digital_receipt"]["success"]) && $_SESSION["digital_receipt"]["success"] == false) { $output = html_writer::tag("div", $_SESSION["digital_receipt"]["message"], array("class" => "general_warning manual_submission_failure_msg"));
/** * If there is no submission record then we are creating one. Text content should be submitted. * If a file has already been submitted then check whether the identifier is the same, if it is do nothing. * If it's not then either edit submission or create new one depending on module settings. */ public function tii_submission($cm, $tiiassignmentid, $user, $identifier, $submissiontype, $itemid = 0, $title = '', $textcontent = '', $context = 'instant') { global $CFG, $DB, $USER; $settings = $this->get_settings($cm->id); // Update user's details on Turnitin. $user->edit_tii_user(); // Clean up old Turnitin submission files. if ($itemid != 0 && $submissiontype == 'file' && $cm->modname != 'forum') { $this->clean_old_turnitin_submissions($cm, $user->id, $itemid, $submissiontype, $identifier); } // Work out submission method. // If this file has successfully submitted in the past then break, text content is to be submitted. switch ($submissiontype) { case 'file': case 'text_content': // Get file data or prepare text submission. if ($submissiontype == 'file') { $fs = get_file_storage(); $file = $fs->get_file_by_hash($identifier); $title = $file->get_filename(); $timemodified = $file->get_timemodified(); $filename = $file->get_filename(); $textcontent = $file->get_content(); } else { // If we are submitting text_content via AJAX there will be no actual content passed in so we need to grab it. if ($textcontent == '') { switch ($cm->modname) { case 'assign': // Check whether submission is a group submission so we can get the correct content. // Note: This will not work if the submitting user is in multiple groups. $submissionsquery = array('assignment' => $cm->instance); $submissionsquery['userid'] = $user->id; if ($CFG->branch > 23) { $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance)); if ($moduledata->teamsubmission) { require_once $CFG->dirroot . '/mod/assign/locallib.php'; $context = context_course::instance($cm->course); $assignment = new assign($context, $cm, null); $submissionsquery['userid'] = 0; $submissionsquery['groupid'] = 0; if ($group = $assignment->get_submission_group($user->id)) { $submissionsquery['groupid'] = $group->id; } } } // This will need to be reworked when linkarray in get_links() contains submission id. $moodlesubmissions = $DB->get_records('assign_submission', $submissionsquery, 'id, timemodified'); $moodlesubmission = end($moodlesubmissions); $moodletextsubmission = $DB->get_record('assignsubmission_onlinetext', array('submission' => $moodlesubmission->id), 'onlinetext'); $timemodified = $moodlesubmission->timemodified; $textcontent = strip_tags($moodletextsubmission->onlinetext); break; case 'workshop': $moodlesubmission = $DB->get_record('workshop_submissions', array('workshopid' => $cm->instance, 'authorid' => $user->id), 'title, content, timemodified'); $timemodified = $moodlesubmission->timemodified; $textcontent = strip_tags($moodlesubmission->content); $title = $moodlesubmission->title; break; } } else { switch ($cm->modname) { case 'assign': $moodlesubmission = $DB->get_record('assign_submission', array('assignment' => $cm->instance, 'userid' => $user->id, 'id' => $itemid), 'id, timemodified'); $timemodified = $moodlesubmission->timemodified; $textcontent = strip_tags($textcontent); break; case 'workshop': $moodlesubmission = $DB->get_record('workshop_submissions', array('workshopid' => $cm->instance, 'authorid' => $user->id), 'title, content, timemodified'); $timemodified = $moodlesubmission->timemodified; $textcontent = strip_tags($textcontent); break; } } $title = !empty($title) ? $title : 'onlinetext_' . $user->id . "_" . $cm->id . "_" . $cm->instance . '.txt'; $filename = substr($title, -4) == '.txt' ? $title : $title . '.txt'; } // Get submission method depending on whether there has been a previous submission. $submissionfields = 'id, cm, externalid, identifier, statuscode, lastmodified, attempt, errorcode'; $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype "; // Double check there is only one submission. $previoussubmissions = $DB->get_records_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND " . $typefield . " = ? AND identifier = ? ", array($cm->id, $user->id, $submissiontype, $identifier), 'id', $submissionfields); $previoussubmission = end($previoussubmissions); if ($previoussubmission) { $errorcode = (int) $previoussubmission->errorcode; // Don't submit if submission hasn't changed. if ($previoussubmission->statuscode == "success" && ($submissiontype == 'file' && $timemodified <= $previoussubmission->lastmodified || $submissiontype != 'file')) { return true; } else { if ($previoussubmission->statuscode == "error" && $timemodified <= $previoussubmission->lastmodified) { $return["success"] = false; $return["message"] = get_string('errorcode' . $errorcode, 'turnitintooltwo'); return $return; } else { if ($previoussubmission->attempt >= 5) { // Do not submit if 5 attempts have been made previously. if ($context == 'cron') { mtrace('-------------------------'); mtrace(get_string('pastfiveattempts', 'turnitintooltwo') . ':'); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); return true; } $return["success"] = false; $return["message"] = get_string('pastfiveattempts', 'turnitintooltwo'); return $return; } else { if ($settings["plagiarism_report_gen"] > 0) { // Replace if Turnitin assignment allows resubmissions or create if we have no Turnitin id stored. $submissionid = $previoussubmission->id; $apimethod = is_null($previoussubmission->externalid) ? "createSubmission" : "replaceSubmission"; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $apimethod = "createSubmission"; if ($previoussubmission->statuscode != "success") { $submissionid = $previoussubmission->id; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } } } } } } else { // Check if there is previous submission of text content which we will replace $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype "; if ($submissiontype == 'text_content' && ($previoussubmission = $DB->get_record_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND " . $typefield . " = ? ", array($cm->id, $user->id, 'text_content'), 'id, cm, externalid, identifier, statuscode, lastmodified', 0, 1))) { $submissionid = $previoussubmission->id; $apimethod = is_null($previoussubmission->externalid) || $settings["plagiarism_report_gen"] == 0 ? "createSubmission" : "replaceSubmission"; // Delete old text content submissions from Turnitin if not replacing. if ($settings["plagiarism_report_gen"] == 0 && !is_null($previoussubmission->externalid)) { $this->delete_tii_submission($previoussubmission->externalid); } $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } else { $apimethod = "createSubmission"; $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } } // Remove any old text submissions here if there are any as there is only one per submission if ($itemid != 0 && $submissiontype == "text_content") { $this->clean_old_turnitin_submissions($cm, $user->id, $itemid, $submissiontype, $identifier); } break; case 'forum_post': if ($previoussubmissions = $DB->get_records_select('plagiarism_turnitin_files', " cm = ? AND userid = ? AND identifier = ? ", array($cm->id, $user->id, $identifier), 'id DESC', 'id, cm, externalid, identifier, statuscode', 0, 1)) { $previoussubmission = current($previoussubmissions); if ($previoussubmission->statuscode == "success") { return true; } else { $submissionid = $previoussubmission->id; $apimethod = "replaceSubmission"; $this->reset_tii_submission($cm, $user, $identifier, $previoussubmission, $submissiontype); } } else { $apimethod = "createSubmission"; $submissionid = $this->create_new_tii_submission($cm, $user, $identifier, $submissiontype); } $forum_post = $DB->get_record_select('forum_posts', " userid = ? AND id = ? ", array($user->id, $itemid)); $textcontent = strip_tags($forum_post->message); $filename = $title; break; } // Do not submit if this is text_content and we're not accepting anything and // content is less than 20 words or 100 characters. if ($submissiontype != 'file') { $content = explode(' ', $textcontent); if ($settings['plagiarism_allow_non_or_submissions'] != 1 && (strlen($textcontent) < 100 || count($content) < 20) || empty($textcontent)) { $plagiarismfile = new object(); if ($submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->identifier = $identifier; $plagiarismfile->statuscode = 'error'; $plagiarismfile->errorcode = 1; $plagiarismfile->attempt = 1; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; if ($submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******") - ", "PP_UPDATE_SUB_ERROR"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******") - ", "PP_INSERT_SUB_ERROR"); } } if ($context == 'cron') { mtrace('-------------------------'); mtrace(get_string('errorcode1', 'turnitintooltwo') . ':'); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); return true; } $return["success"] = false; $return["message"] = get_string('errorcode1', 'turnitintooltwo'); return $return; } } // Check file is less than maximum allowed size. if ($submissiontype == 'file') { if ($file->get_filesize() > TURNITINTOOLTWO_MAX_FILE_UPLOAD_SIZE) { $plagiarismfile = new object(); if ($submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->identifier = $identifier; $plagiarismfile->statuscode = 'error'; $plagiarismfile->errorcode = 2; $plagiarismfile->attempt = 1; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = 'file'; if ($submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******") - ", "PP_UPDATE_SUB_ERROR"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******") - ", "PP_INSERT_SUB_ERROR"); } } if ($context == 'cron') { mtrace('-------------------------'); mtrace(get_string('errorcode2', 'turnitintooltwo') . ':'); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); return true; } $return["success"] = false; $return["message"] = get_string('errorcode2', 'turnitintooltwo', display_size(TURNITINTOOLTWO_MAX_FILE_UPLOAD_SIZE)); return $return; } } // Read the stored file/content into a temp file for submitting. $submission_title = explode('.', $title); $file_string = array($submission_title[0], $cm->id); $modulepluginsettings = $this->get_settings($cm->id); if (!$modulepluginsettings["plagiarism_anonymity"]) { $user_details = array($user->id, $user->firstname, $user->lastname); $file_string = array_merge($user_details, $file_string); } $tempfile = turnitintooltwo_tempfile($file_string, $filename); $fh = fopen($tempfile, "w"); fwrite($fh, $textcontent); fclose($fh); // Create submission object. $submission = new TiiSubmission(); $submission->setAssignmentId($tiiassignmentid); if ($apimethod == "replaceSubmission") { $submission->setSubmissionId($previoussubmission->externalid); } $submission->setTitle($title); $submission->setAuthorUserId($user->tii_user_id); if ($user->id == $USER->id && !is_siteadmin()) { $submission->setSubmitterUserId($user->tii_user_id); $submission->setRole('Learner'); } else { $instructor = new turnitintooltwo_user($USER->id, 'Instructor'); $instructor->edit_tii_user(); $submission->setSubmitterUserId($instructor->tii_user_id); $submission->setRole('Instructor'); } $submission->setSubmissionDataPath($tempfile); // Initialise Comms Object. $turnitincomms = new turnitintooltwo_comms(); $turnitincall = $turnitincomms->initialise_api(); try { $response = $turnitincall->{$apimethod}($submission); $newsubmission = $response->getSubmission(); $newsubmissionid = $newsubmission->getSubmissionId(); $plagiarismfile = new object(); if ($apimethod == "replaceSubmission" || $submissionid != 0) { $plagiarismfile->id = $submissionid; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->identifier = $identifier; $plagiarismfile->externalid = $newsubmissionid; $plagiarismfile->statuscode = 'success'; $plagiarismfile->similarityscore = null; $plagiarismfile->attempt = 1; $plagiarismfile->transmatch = 0; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; $plagiarismfile->errorcode = null; $plagiarismfile->errormsg = null; if ($apimethod == "replaceSubmission" || $submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******")", "PP_UPDATE_SUB"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******")", "PP_INSERT_SUB"); } } // Delete the tempfile. if (!is_null($tempfile)) { unlink($tempfile); } // Add config field to show submissions have been made which we use to lock anonymous marking setting $configfield = new object(); $configfield->cm = $cm->id; $configfield->name = 'submitted'; $configfield->value = 1; if (!($currentconfigfield = $DB->get_field('plagiarism_turnitin_config', 'id', array('cm' => $cm->id, 'name' => 'submitted')))) { if (!$DB->insert_record('plagiarism_turnitin_config', $configfield)) { turnitintooltwo_print_error('defaultupdateerror', 'turnitintooltwo', null, null, __FILE__, __LINE__); } } $return["success"] = true; $return["message"] = get_string('submissionuploadsuccess', 'turnitintooltwo') . '<br/>' . get_string('turnitinsubmissionid', 'turnitintooltwo') . ': ' . $newsubmissionid; //Send a message to the user's Moodle inbox with the digital receipt. if (!empty($CFG->smtphosts) && !empty($CFG->smtpuser) && !empty($CFG->smtppass)) { $receipt = new receipt_message(); $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance)); $coursedata = turnitintooltwo_assignment::get_course_data($cm->course, 'PP', 'cron'); $input = array('firstname' => $user->firstname, 'lastname' => $user->lastname, 'submission_title' => $title, 'assignment_name' => $moduledata->name, 'course_fullname' => $coursedata->turnitin_ctl, 'submission_date' => date('d-M-Y h:iA'), 'submission_id' => $newsubmissionid); $message = $receipt->build_message($input); $receipt->send_message($user->id, $message); } if ($context == 'cron') { return true; } } catch (Exception $e) { $errorstring = empty($previoussubmission->externalid) ? "pp_createsubmissionerror" : "pp_updatesubmissionerror"; $return["success"] = false; $return["message"] = get_string('pp_submission_error', 'turnitintooltwo') . ' ' . $e->getMessage(); $plagiarismfile = new object(); if ($submissionid != 0) { $plagiarismfile->id = $submissionid; // Get attempt no $current_record = $DB->get_record('plagiarism_turnitin_files', array("id" => $submissionid)); $plagiarismfile->attempt = $current_record->attempt + 1; } else { $plagiarismfile->attempt = 1; } $plagiarismfile->cm = $cm->id; $plagiarismfile->userid = $user->id; $plagiarismfile->identifier = $identifier; $plagiarismfile->statuscode = 'error'; $plagiarismfile->lastmodified = time(); $plagiarismfile->submissiontype = $submissiontype; $plagiarismfile->errorcode = 0; $plagiarismfile->errormsg = $return["message"]; if ($submissionid != 0) { if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) { turnitintooltwo_activitylog("Update record failed (CM: " . $cm->id . ", User: "******") - ", "PP_UPDATE_SUB_ERROR"); } } else { if (!($fileid = $DB->insert_record('plagiarism_turnitin_files', $plagiarismfile))) { turnitintooltwo_activitylog("Insert record failed (CM: " . $cm->id . ", User: "******") - ", "PP_INSERT_SUB_ERROR"); } } $turnitincomms->handle_exceptions($e, $errorstring, false); if ($context == 'cron') { mtrace('-------------------------'); mtrace(get_string('pp_submission_error', 'turnitintooltwo') . ': ' . $e->getMessage()); mtrace('User: '******' - ' . $user->firstname . ' ' . $user->lastname . ' (' . $user->email . ')'); mtrace('Course Module: ' . $cm->id . ''); mtrace('-------------------------'); return false; } } return $return; }