/** * Create the module as an assignment within Turnitin if it does not exist, * if we have a Turnitin id for the module then edit it */ public function sync_tii_assignment($cm, $coursetiiid, $workflowcontext = "site", $submittoturnitin = false) { global $DB, $CFG; $config = turnitintooltwo_admin_config(); $modulepluginsettings = $this->get_settings($cm->id); $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance)); // Configure assignment object to send to Turnitin. $assignment = new TiiAssignment(); $assignment->setClassId($coursetiiid); // We need to truncate the moodle assignment title to be compatible with a Turnitin // assignment title (max length 99) and account for non English multibyte strings. $title = ""; if (mb_strlen($moduledata->name, 'UTF-8') > 80) { $title .= mb_substr($moduledata->name, 0, 80, 'UTF-8') . "..."; } else { $title .= $moduledata->name; } $title .= " (Moodle PP)"; $assignment->setTitle($title); $assignment->setSubmitPapersTo(isset($modulepluginsettings["plagiarism_submitpapersto"]) ? $modulepluginsettings["plagiarism_submitpapersto"] : 1); $assignment->setSubmittedDocumentsCheck($modulepluginsettings["plagiarism_compare_student_papers"]); $assignment->setInternetCheck($modulepluginsettings["plagiarism_compare_internet"]); $assignment->setPublicationsCheck($modulepluginsettings["plagiarism_compare_journals"]); if ($config->repositoryoption == 1) { $institutioncheck = isset($modulepluginsettings["plagiarism_compare_institution"]) ? $modulepluginsettings["plagiarism_compare_institution"] : 0; $assignment->setInstitutionCheck($institutioncheck); } $assignment->setAuthorOriginalityAccess($modulepluginsettings["plagiarism_show_student_report"]); $assignment->setResubmissionRule((int) $modulepluginsettings["plagiarism_report_gen"]); $assignment->setBibliographyExcluded($modulepluginsettings["plagiarism_exclude_biblio"]); $assignment->setQuotedExcluded($modulepluginsettings["plagiarism_exclude_quoted"]); $assignment->setSmallMatchExclusionType($modulepluginsettings["plagiarism_exclude_matches"]); $modulepluginsettings["plagiarism_exclude_matches_value"] = !empty($modulepluginsettings["plagiarism_exclude_matches_value"]) ? $modulepluginsettings["plagiarism_exclude_matches_value"] : 0; $assignment->setSmallMatchExclusionThreshold($modulepluginsettings["plagiarism_exclude_matches_value"]); // Don't set anonymous marking if there have been submissions. $previoussubmissions = $DB->record_exists('plagiarism_turnitin_files', array('cm' => $cm->id, 'statuscode' => 'success')); // Use Moodle's blind marking setting for anonymous marking. if ($config->useanon && !$previoussubmissions) { $anonmarking = !empty($moduledata->blindmarking) ? 1 : 0; $assignment->setAnonymousMarking($anonmarking); } $assignment->setAllowNonOrSubmissions(!empty($modulepluginsettings["plagiarism_allow_non_or_submissions"]) ? 1 : 0); $assignment->setTranslatedMatching(!empty($modulepluginsettings["plagiarism_transmatch"]) ? 1 : 0); // Moodle handles submissions and whether they are allowed so this should always be true. // Otherwise, the Turnitin setting is incompatible with Moodle due to multiple files and resubmission rules. $assignment->setLateSubmissionsAllowed(1); $assignment->setMaxGrade(0); $assignment->setRubricId(!empty($modulepluginsettings["plagiarism_rubric"]) ? $modulepluginsettings["plagiarism_rubric"] : ''); if (!empty($moduledata->grade)) { $assignment->setMaxGrade($moduledata->grade < 0 ? 100 : (int) $moduledata->grade); } if (!empty($moduledata->allowsubmissionsfromdate)) { $dtstart = $moduledata->allowsubmissionsfromdate; } else { if (!empty($moduledata->timeavailable)) { $dtstart = $moduledata->timeavailable; } else { $dtstart = $cm->added; } } $dtstart = $dtstart <= strtotime('-1 year') ? strtotime('-11 months') : $dtstart; $assignment->setStartDate(gmdate("Y-m-d\\TH:i:s\\Z", $dtstart)); // Set post date. If "hidden until" has been set in gradebook then we will use that value, otherwise we will // use start date. If the grades are to be completely hidden then we will set post date in the future. // From 2.6, if grading markflow is enabled and no grades have been released, we will use due date +4 weeks. $dtpost = 0; if ($cm->modname != "forum") { if ($gradeitem = $DB->get_record('grade_items', array('iteminstance' => $cm->instance, 'itemmodule' => $cm->modname, 'courseid' => $cm->course, 'itemnumber' => 0))) { switch ($gradeitem->hidden) { case 1: $dtpost = strtotime('+6 months'); break; case 0: $dtpost = $dtstart; // If any grades have been released early via marking workflow, set post date to current time. if ($cm->modname == 'assign' && !empty($moduledata->markingworkflow)) { $gradesreleased = $DB->record_exists('assign_user_flags', array('assignment' => $cm->instance, 'workflowstate' => 'released')); $dtpost = $gradesreleased ? time() : strtotime('+1 month'); } break; default: $dtpost = $gradeitem->hidden; break; } } } // If blind marking is being used and identities have not been revealed then push out post date. if ($cm->modname == 'assign' && !empty($moduledata->blindmarking) && empty($moduledata->revealidentities)) { $dtpost = strtotime('+6 months'); } // If blind marking is being used for coursework then push out post date. if ($cm->modname == 'coursework' && !empty($moduledata->blindmarking)) { $dtpost = strtotime('+6 months'); } // Ensure post date can't be before start date if ($dtpost < $dtstart) { $dtpost = $dtstart; } // Set due date, dependent on various things. $dtdue = !empty($moduledata->duedate) ? $moduledata->duedate : 0; // If the due date has been set more than a year ahead then restrict it to 1 year from now. if ($dtdue > strtotime('+1 year')) { $dtdue = strtotime('+1 year'); } // Ensure due date can't be before start date if ($dtdue <= $dtstart) { $dtdue = strtotime('+1 month', $dtstart); } // Ensure due date is always in the future for submissions. if ($dtdue <= time() && $submittoturnitin) { $dtdue = strtotime('+1 day'); } $assignment->setDueDate(gmdate("Y-m-d\\TH:i:s\\Z", $dtdue)); // If the duedate is in the future then set any submission duedate_report_refresh flags that are 2 to 1 to make sure they are re-examined in the next cron run if ($dtdue > time()) { $DB->set_field('plagiarism_turnitin_files', 'duedate_report_refresh', 1, array('cm' => $cm->id, 'duedate_report_refresh' => 2)); } $assignment->setFeedbackReleaseDate(gmdate("Y-m-d\\TH:i:s\\Z", $dtpost)); // Erater settings. $assignment->setErater(isset($modulepluginsettings["plagiarism_erater"]) ? $modulepluginsettings["plagiarism_erater"] : 0); $assignment->setEraterSpelling(isset($modulepluginsettings["plagiarism_erater_spelling"]) ? $modulepluginsettings["plagiarism_erater_spelling"] : 0); $assignment->setEraterGrammar(isset($modulepluginsettings["plagiarism_erater_grammar"]) ? $modulepluginsettings["plagiarism_erater_grammar"] : 0); $assignment->setEraterUsage(isset($modulepluginsettings["plagiarism_erater_usage"]) ? $modulepluginsettings["plagiarism_erater_usage"] : 0); $assignment->setEraterMechanics(isset($modulepluginsettings["plagiarism_erater_mechanics"]) ? $modulepluginsettings["plagiarism_erater_mechanics"] : 0); $assignment->setEraterStyle(isset($modulepluginsettings["plagiarism_erater_style"]) ? $modulepluginsettings["plagiarism_erater_style"] : 0); $assignment->setEraterSpellingDictionary(isset($modulepluginsettings["plagiarism_erater_dictionary"]) ? $modulepluginsettings["plagiarism_erater_dictionary"] : 'en_US'); $assignment->setEraterHandbook(isset($modulepluginsettings["plagiarism_erater_handbook"]) ? $modulepluginsettings["plagiarism_erater_handbook"] : 0); // If we have a turnitin id then edit the assignment otherwise create it. if ($tiiassignment = $DB->get_record('plagiarism_turnitin_config', array('cm' => $cm->id, 'name' => 'turnitin_assignid'), 'value')) { $assignment->setAssignmentId($tiiassignment->value); $turnitintooltwoassignment = new turnitintooltwo_assignment(0, '', 'PP'); $return = $turnitintooltwoassignment->edit_tii_assignment($assignment, $workflowcontext); $return['errorcode'] = $return['success'] ? 0 : 6; return $return; } else { $turnitintooltwoassignment = new turnitintooltwo_assignment(0, '', 'PP'); $turnitinassignid = $turnitintooltwoassignment->create_tii_assignment($assignment, 0, 0, 'plagiarism_plugin', $workflowcontext); if (!$turnitinassignid) { $return = array('success' => false, 'tiiassignmentid' => '', 'errorcode' => 5); } else { $moduleconfigvalue = new stdClass(); $moduleconfigvalue->cm = $cm->id; $moduleconfigvalue->name = 'turnitin_assignid'; $moduleconfigvalue->value = $turnitinassignid; $DB->insert_record('plagiarism_turnitin_config', $moduleconfigvalue); $return = array('success' => true, 'tiiassignmentid' => $assignment->getAssignmentId()); } return $return; } }
/** * Create the module as an assignment within Turnitin if it does not exist, * if we have a Turnitin id for the module then edit it */ public function sync_tii_assignment($cm, $coursetiiid, $workflowcontext = "site") { global $DB, $CFG; $config = turnitintooltwo_admin_config(); $modulepluginsettings = $this->get_settings($cm->id); $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance)); // Configure assignment object to send to Turnitin. $assignment = new TiiAssignment(); $assignment->setClassId($coursetiiid); // Need to truncate the moodle assignment title to be compatible with a Turnitin class (max length 99) $assignment->setTitle(mb_strlen($moduledata->name) > 80 ? mb_substr($moduledata->name, 0, 80) . "... (Moodle PP)" : $moduledata->name . " (Moodle PP)"); $assignment->setSubmitPapersTo(isset($modulepluginsettings["plagiarism_submitpapersto"]) ? $modulepluginsettings["plagiarism_submitpapersto"] : 1); $assignment->setSubmittedDocumentsCheck($modulepluginsettings["plagiarism_compare_student_papers"]); $assignment->setInternetCheck($modulepluginsettings["plagiarism_compare_internet"]); $assignment->setPublicationsCheck($modulepluginsettings["plagiarism_compare_journals"]); if ($config->repositoryoption == 1) { $institutioncheck = isset($modulepluginsettings["plagiarism_compare_institution"]) ? $modulepluginsettings["plagiarism_compare_institution"] : 0; $assignment->setInstitutionCheck($institutioncheck); } $assignment->setAuthorOriginalityAccess($modulepluginsettings["plagiarism_show_student_report"]); $assignment->setResubmissionRule($modulepluginsettings["plagiarism_report_gen"]); $assignment->setBibliographyExcluded($modulepluginsettings["plagiarism_exclude_biblio"]); $assignment->setQuotedExcluded($modulepluginsettings["plagiarism_exclude_quoted"]); $assignment->setSmallMatchExclusionType($modulepluginsettings["plagiarism_exclude_matches"]); $modulepluginsettings["plagiarism_exclude_matches_value"] = !empty($modulepluginsettings["plagiarism_exclude_matches_value"]) ? $modulepluginsettings["plagiarism_exclude_matches_value"] : 0; $assignment->setSmallMatchExclusionThreshold($modulepluginsettings["plagiarism_exclude_matches_value"]); if ($config->useanon) { $assignment->setAnonymousMarking($modulepluginsettings["plagiarism_anonymity"]); } $assignment->setAllowNonOrSubmissions(!empty($modulepluginsettings["plagiarism_allow_non_or_submissions"]) ? 1 : 0); $assignment->setTranslatedMatching(!empty($modulepluginsettings["plagiarism_transmatch"]) ? 1 : 0); // Moodle handles submissions and whether they are allowed so this should always be true. // Otherwise, the Turnitin setting is incompatible with Moodle due to multiple files and resubmission rules. $assignment->setLateSubmissionsAllowed(1); $assignment->setMaxGrade(0); $assignment->setRubricId(!empty($modulepluginsettings["plagiarism_rubric"]) ? $modulepluginsettings["plagiarism_rubric"] : ''); if (!empty($moduledata->grade)) { $assignment->setMaxGrade($moduledata->grade < 0 ? 100 : (int) $moduledata->grade); } if (!empty($moduledata->allowsubmissionsfromdate)) { $dtstart = $moduledata->allowsubmissionsfromdate; } else { if (!empty($moduledata->timeavailable)) { $dtstart = $moduledata->timeavailable; } else { $dtstart = $cm->added; } } $dtstart = $dtstart <= strtotime('-1 year') ? strtotime('-11 months') : $dtstart; $assignment->setStartDate(gmdate("Y-m-d\\TH:i:s\\Z", $dtstart)); $dtdue = 0; if (!empty($moduledata->duedate)) { $dtdue = $moduledata->duedate; } else { if (!empty($moduledata->timedue)) { $dtdue = $moduledata->timedue; } } // If the due date has been set more than a year ahead then restrict the // due date in Turnitin to 1 year from now. $nextyear = strtotime('+1 year'); if ($dtdue > $nextyear) { $dtdue = $nextyear; } // Set post date. If "hidden until" has been set in gradebook then we will use that value, otherwise we will // use start date. If the grades are to be completely hidden then we will set post date in the future. // From 2.6, if grading markflow is enabled and no grades have been released, we will use due date +4 weeks. $dtpost = 0; if ($cm->modname != "forum") { if ($gradeitem = $DB->get_record('grade_items', array('iteminstance' => $cm->instance, 'itemmodule' => $cm->modname, 'courseid' => $cm->course))) { switch ($gradeitem->hidden) { case 1: $dtpost = strtotime('+6 months'); break; case 0: $dtpost = $dtstart; // If any grades have been released early via marking workflow, set post date to current time. if ($CFG->branch >= 26 && $cm->modname == 'assign' && !empty($moduledata->markingworkflow)) { $gradesreleased = $DB->record_exists('assign_user_flags', array('assignment' => $cm->instance, 'workflowstate' => 'released')); if ($gradesreleased) { $dtpost = time(); } else { $dtpost = strtotime('+4 weeks', $dtdue); } } break; default: $dtpost = $gradeitem->hidden; break; } } } // If a cut-off date has been set, use that as the Turnitin due date. if (!empty($moduledata->cutoffdate)) { $dtdue = $moduledata->cutoffdate; } // Ensure due date can't be before start date if ($dtdue <= $dtstart) { $dtdue = strtotime('+1 month', $dtstart); } // Ensure post date can't be before start date if ($dtpost < $dtstart) { $dtpost = $dtstart; } $assignment->setDueDate(gmdate("Y-m-d\\TH:i:s\\Z", $dtdue)); $assignment->setFeedbackReleaseDate(gmdate("Y-m-d\\TH:i:s\\Z", $dtpost)); // Erater settings. $assignment->setErater(isset($modulepluginsettings["plagiarism_erater"]) ? $modulepluginsettings["plagiarism_erater"] : 0); $assignment->setEraterSpelling(isset($modulepluginsettings["plagiarism_erater_spelling"]) ? $modulepluginsettings["plagiarism_erater_spelling"] : 0); $assignment->setEraterGrammar(isset($modulepluginsettings["plagiarism_erater_grammar"]) ? $modulepluginsettings["plagiarism_erater_grammar"] : 0); $assignment->setEraterUsage(isset($modulepluginsettings["plagiarism_erater_usage"]) ? $modulepluginsettings["plagiarism_erater_usage"] : 0); $assignment->setEraterMechanics(isset($modulepluginsettings["plagiarism_erater_mechanics"]) ? $modulepluginsettings["plagiarism_erater_mechanics"] : 0); $assignment->setEraterStyle(isset($modulepluginsettings["plagiarism_erater_style"]) ? $modulepluginsettings["plagiarism_erater_style"] : 0); $assignment->setEraterSpellingDictionary(isset($modulepluginsettings["plagiarism_erater_dictionary"]) ? $modulepluginsettings["plagiarism_erater_dictionary"] : 'en_US'); $assignment->setEraterHandbook(isset($modulepluginsettings["plagiarism_erater_handbook"]) ? $modulepluginsettings["plagiarism_erater_handbook"] : 0); // If we have a turnitin id then edit the assignment otherwise create it. if ($tiiassignment = $DB->get_record('plagiarism_turnitin_config', array('cm' => $cm->id, 'name' => 'turnitin_assignid'), 'value')) { $assignment->setAssignmentId($tiiassignment->value); $turnitintooltwoassignment = new turnitintooltwo_assignment(0, '', 'PP'); $turnitintooltwoassignment->edit_tii_assignment($assignment, $workflowcontext); $turnitinassignid = $tiiassignment->value; } else { $turnitintooltwoassignment = new turnitintooltwo_assignment(0, '', 'PP'); $turnitinassignid = $turnitintooltwoassignment->create_tii_assignment($assignment, 0, 0, 'plagiarism_plugin', $workflowcontext); $moduleconfigvalue = new stdClass(); $moduleconfigvalue->cm = $cm->id; $moduleconfigvalue->name = 'turnitin_assignid'; $moduleconfigvalue->value = $turnitinassignid; $DB->insert_record('plagiarism_turnitin_config', $moduleconfigvalue); } // Save the post date we have stored in Turnitin $moduleconfigvalue = new stdClass(); $moduleconfigvalue->cm = $cm->id; $moduleconfigvalue->name = 'plagiarism_post_date'; $moduleconfigvalue->value = $dtpost; if ($plagiarism_post_date = $DB->get_record('plagiarism_turnitin_config', array('cm' => $cm->id, 'name' => 'plagiarism_post_date'), 'id')) { $moduleconfigvalue->id = $plagiarism_post_date->id; $DB->update_record('plagiarism_turnitin_config', $moduleconfigvalue); } else { $DB->insert_record('plagiarism_turnitin_config', $moduleconfigvalue); } return $turnitinassignid; }