PageRenderTime 55ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 2ms

/lib.php

https://github.com/eviweb/moodle-mod_turnitintool
PHP | 7284 lines | 5250 code | 801 blank | 1233 comment | 846 complexity | a1f7c50ee3ef5d2cc0fd45b6e7a8f08c MD5 | raw file
Possible License(s): GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /**
  3. * @package turnitintool
  4. * @copyright 2012 Turnitin
  5. */
  6. ////////////////////////////////////////////////////////////////////////////////////////////////////
  7. /**
  8. * Encryption value passed to the API
  9. */
  10. defined("TURNITINTOOL_ENCRYPT") or define("TURNITINTOOL_ENCRYPT","0");
  11. /**
  12. * The pause in between API calls
  13. */
  14. defined("TURNITINTOOL_LATENCY_SLEEP") or define("TURNITINTOOL_LATENCY_SLEEP","4");
  15. /**
  16. * API Error: Start Error Code
  17. */
  18. defined("TURNITINTOOL_API_ERROR_START") or define("TURNITINTOOL_API_ERROR_START","100");
  19. /**
  20. * API Error: Database Error inserting unique ID into the database
  21. */
  22. defined("TURNITINTOOL_DB_UNIQUEID_ERROR") or define("TURNITINTOOL_DB_UNIQUEID_ERROR","218");
  23. /**
  24. * API Error: Creating/Updating/Deleting assignment failed in fid 4
  25. */
  26. defined("TURNITINTOOL_ASSIGNMENT_UPDATE_ERROR") or define("TURNITINTOOL_ASSIGNMENT_UPDATE_ERROR","411");
  27. /**
  28. * API Error: The assignment you are trying to access does not exist
  29. * in Turnitin for this class
  30. */
  31. defined("TURNITINTOOL_ASSIGNMENT_NOTEXIST_ERROR") or define("TURNITINTOOL_ASSIGNMENT_NOTEXIST_ERROR","206");
  32. /**
  33. * API Error: The assignment with the assignment id that you entered does
  34. * not belong to the class with the class id you entered
  35. */
  36. defined("TURNITINTOOL_ASSIGNMENT_WRONGCLASS_ERROR") or define("TURNITINTOOL_ASSIGNMENT_WRONGCLASS_ERROR","228");
  37. /**
  38. * API SRC Value: The src value defines the integration namespace area
  39. * in the Turnitin integrations database tables
  40. */
  41. defined("TURNITINTOOL_APISRC") or define("TURNITINTOOL_APISRC","12");
  42. /**
  43. * Include the loaderbar class file
  44. */
  45. require_once("loaderbar.php");
  46. /**
  47. * Include the comms class file
  48. */
  49. require_once("comms.php");
  50. /**
  51. * @param string $feature FEATURE_xx constant for requested feature
  52. * @return mixed True if module supports feature, null if doesn't know
  53. */
  54. function turnitintool_supports($feature) {
  55. defined("FEATURE_SHOW_DESCRIPTION") or define("FEATURE_SHOW_DESCRIPTION",null);
  56. switch($feature) {
  57. case FEATURE_GROUPS: return true;
  58. case FEATURE_GROUPMEMBERSONLY: return true;
  59. case FEATURE_MOD_INTRO: return true;
  60. case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
  61. case FEATURE_GRADE_HAS_GRADE: return true;
  62. case FEATURE_GRADE_OUTCOMES: return true;
  63. case FEATURE_BACKUP_MOODLE2: return true;
  64. case FEATURE_SHOW_DESCRIPTION: return true;
  65. default: return null;
  66. }
  67. }
  68. /**
  69. * Given an object containing all the necessary data,
  70. * (defined by the form in mod_form.php) this function
  71. * will create a new instance and return the id number
  72. * of the new instance.
  73. *
  74. * @global object
  75. * @global object
  76. * @param object $turnitintool add turnitintool instance
  77. * @return int intance id
  78. */
  79. function turnitintool_add_instance($turnitintool) {
  80. global $USER,$CFG;
  81. $turnitintool->timecreated = time();
  82. $total=($turnitintool->numparts*2)+2;
  83. // Get Moodle Course Object [[[[
  84. if (!$course = turnitintool_get_record("course", "id", $turnitintool->course)) {
  85. turnitintool_print_error('coursegeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  86. exit();
  87. }
  88. // ]]]]
  89. // Find out if this Course already has a Turnitin Owner [[[[
  90. if (!turnitintool_is_owner($course->id)) {
  91. $owner=turnitintool_get_owner($course->id);
  92. // If the Course has no Turnitin Owner ie above get owner returned NULL
  93. if (is_null($owner)) {
  94. $owner=$USER;
  95. }
  96. } else {
  97. $owner=$USER;
  98. }
  99. // ]]]]
  100. $loaderbar = null;
  101. $tii = new turnitintool_commclass(turnitintool_getUID($owner),$owner->firstname,$owner->lastname,$owner->email,2,$loaderbar);
  102. $tii->startSession();
  103. // Set this user up with a Turnitin Account or check to see if an account has already been set up
  104. // Either return the stored ID OR store the New Turnitin User ID then return it [[[[
  105. $turnitinuser=turnitintool_usersetup($owner,get_string('userprocess','turnitintool'),$tii,$loaderbar); // PROC 1
  106. if ($tii->getRerror()) {
  107. if ($tii->getAPIunavailable()) {
  108. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  109. } else {
  110. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  111. }
  112. exit();
  113. }
  114. $turnitinuser_id=$turnitinuser->turnitin_uid;
  115. // ]]]]
  116. // Set this course up in Turnitin or check to see if it has been already
  117. // Either return the stored ID OR store the New Turnitin Course ID then return it [[[[
  118. $turnitincourse=turnitintool_classsetup($course,$owner,
  119. get_string('classprocess','turnitintool'),$tii,$loaderbar); // PROC 2
  120. $turnitincourse_id=$turnitincourse->turnitin_cid;
  121. // ]]]]
  122. // Insert the Submitted turnitin form data in the database and retreive the id [[[[
  123. $turnitintool->timemodified=time();
  124. // Insert the default options
  125. $turnitintool->dateformat="d/m/Y"; // deprecated (Now using langconfig.php)
  126. $turnitintool->usegrademark=1;
  127. $turnitintool->gradedisplay=1;
  128. $turnitintool->autoupdates=1;
  129. $turnitintool->commentedittime=1800;
  130. $turnitintool->commentmaxsize=800;
  131. $turnitintool->autosubmission=1;
  132. $turnitintool->shownonsubmission=1;
  133. $turnitintool->courseid = $course->id; // compatibility with modedit assignment obj
  134. $insertid=turnitintool_insert_record("turnitintool", $turnitintool);
  135. // ]]]]
  136. // Do the multiple Assignment creation on turnitin
  137. //## We are creating an assignment for each Moodle Assignment Part [[[[
  138. for ($i=1;$i<=$turnitintool->numparts;$i++) {
  139. // Do the turnitin assignment set call to the API [[[[
  140. $tiipost = new stdClass();
  141. $tiipost->courseid=$course->id;
  142. $tiipost->ctl=turnitintool_getCTL($course->id);
  143. $tiipost->dtstart=time(); // Set as today and update to a date in the past if needed to later
  144. $tiipost->dtdue=strtotime('+7 days');
  145. $tiipost->dtpost=strtotime('+7 days');
  146. $uniquestring=strtoupper(uniqid());
  147. $tiipost->name=$turnitintool->name." - ".get_string('turnitinpart','turnitintool',$i).
  148. " (".$uniquestring.")";
  149. $tiipost->s_view_report=$turnitintool->studentreports;
  150. $tiipost->max_points=($turnitintool->grade < 0) ? 100 : $turnitintool->grade;
  151. $tiipost->anon=$turnitintool->anon;
  152. $tiipost->report_gen_speed=$turnitintool->reportgenspeed;
  153. $tiipost->late_accept_flag=$turnitintool->allowlate;
  154. $tiipost->submit_papers_to=$turnitintool->submitpapersto;
  155. $tiipost->s_paper_check=$turnitintool->spapercheck;
  156. $tiipost->internet_check=$turnitintool->internetcheck;
  157. $tiipost->journal_check=$turnitintool->journalcheck;
  158. // Add in Exclude small matches, biblio, quoted etc 20102009
  159. $tiipost->exclude_biblio=$turnitintool->excludebiblio;
  160. $tiipost->exclude_quoted=$turnitintool->excludequoted;
  161. $tiipost->exclude_value=$turnitintool->excludevalue;
  162. $tiipost->exclude_type=$turnitintool->excludetype;
  163. $tiipost->transmatch=$turnitintool->transmatch;
  164. // Add erater settings
  165. $tiipost->erater=(isset($turnitintool->erater)) ? $turnitintool->erater : 0;
  166. $tiipost->erater_handbook=(isset($turnitintool->erater_handbook)) ? $turnitintool->erater_handbook : 0;
  167. $tiipost->erater_dictionary=(isset($turnitintool->erater_dictionary)) ? $turnitintool->erater_dictionary : 'en_US';
  168. $tiipost->erater_spelling=(isset($turnitintool->erater_spelling)) ? $turnitintool->erater_spelling : 0;
  169. $tiipost->erater_grammar=(isset($turnitintool->erater_grammar)) ? $turnitintool->erater_grammar : 0;
  170. $tiipost->erater_usage=(isset($turnitintool->erater_usage)) ? $turnitintool->erater_usage : 0;
  171. $tiipost->erater_mechanics=(isset($turnitintool->erater_mechanics)) ? $turnitintool->erater_mechanics : 0;
  172. $tiipost->erater_style=(isset($turnitintool->erater_style)) ? $turnitintool->erater_style : 0;
  173. $tiipost->transmatch=(isset($turnitintool->transmatch)) ? $turnitintool->transmatch : 0;
  174. // == Create the assignment with no IDs in order to retreive the correct ==
  175. // == Assignment ID for future use. ==
  176. // ## Needed because if one UID is used then all Must Be, ##
  177. // ## we do not have the assignment ID as it has not been created yet ##
  178. $tiipost->cid='';
  179. $tiipost->assignid='';
  180. $tii->createAssignment($tiipost,'INSERT',get_string('assignmentprocess','turnitintool',$i));
  181. if ($tii->getRerror()) {
  182. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool')
  183. : $tii->getRmessage();
  184. turnitintool_delete_records('turnitintool','id',$insertid);
  185. turnitintool_print_error('<strong>'.get_string('inserterror','turnitintool')
  186. .'</strong><br />'.$reason);
  187. exit();
  188. }
  189. $tiipost->cid=turnitintool_getCID($course->id);
  190. $part = new stdClass();
  191. $part->tiiassignid=$tii->getAssignid();
  192. $tiipost->assignid=$part->tiiassignid;
  193. $tiipost->dtstart=$turnitintool->defaultdtstart;
  194. $tiipost->dtdue=$turnitintool->defaultdtdue;
  195. $tiipost->dtpost=$turnitintool->defaultdtpost;
  196. $tiipost->currentassign=$tiipost->name;
  197. $tiipost->name=str_replace(" (".$uniquestring.")"," (Moodle ".$part->tiiassignid.")",$tiipost->name);
  198. // Now individualise the Assignment Name and set the date to allow dates in the past
  199. $tii->createAssignment($tiipost,'UPDATE',get_string('assignmentindividualise',
  200. 'turnitintool',$i)); // PROC 3+
  201. if ($tii->getRerror()) {
  202. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool')
  203. : $tii->getRmessage();
  204. turnitintool_delete_records('turnitintool','id',$insertid);
  205. turnitintool_print_error('<strong>'.get_string('inserterror','turnitintool')
  206. .'</strong><br />'.$reason);
  207. exit();
  208. }
  209. $part->turnitintoolid=$insertid;
  210. $part->partname=get_string('turnitinpart','turnitintool',$i);
  211. $part->dtstart=$turnitintool->defaultdtstart;
  212. $part->dtdue=$turnitintool->defaultdtdue;
  213. $part->dtpost=$turnitintool->defaultdtpost;
  214. $part->maxmarks=($turnitintool->grade < 0) ? 100 : $turnitintool->grade;
  215. $part->deleted=0;
  216. if (!$insert=turnitintool_insert_record('turnitintool_parts',$part,false)) {
  217. turnitintool_delete_records('turnitintool','id',$insertid);
  218. turnitintool_print_error('partdberror','turnitintool',NULL,$i,__FILE__,__LINE__);
  219. }
  220. $event = new object();
  221. $event->name = $turnitintool->name.' - '.$part->partname;
  222. $event->description = ($turnitintool->intro==NULL) ? '' : $turnitintool->intro;
  223. $event->courseid = $turnitintool->course;
  224. $event->groupid = 0;
  225. $event->userid = 0;
  226. $event->modulename = 'turnitintool';
  227. $event->instance = $insertid;
  228. $event->eventtype = 'due';
  229. $event->timestart = $part->dtdue;
  230. $event->timeduration = 0;
  231. add_event($event);
  232. // ]]]]
  233. }
  234. // Define grade settings in Moodle 1.9 and above
  235. $turnitintool->id = $insertid;
  236. turnitintool_grade_item_update( $turnitintool );
  237. // ]]]]
  238. $cmid = isset( $turnitintool->cmidnumber ) ? $turnitintool->cmidnumber : null;
  239. add_to_log($turnitintool->course, "turnitintool", "add turnitintool", "view.php?id=$cmid", "Assignment created '$turnitintool->name'", "$cmid");
  240. $tii->endSession();
  241. return $insertid;
  242. }
  243. /**
  244. * Given an object containing all the necessary data,
  245. * (defined by the form in mod_form.php) this function
  246. * will update an existing instance with new data.
  247. *
  248. * @global object
  249. * @global object
  250. * @param object $turnitintool update turnitintool instance
  251. * @return bool success
  252. */
  253. function turnitintool_update_instance($turnitintool) {
  254. global $USER,$CFG;
  255. $turnitintool->timemodified = time();
  256. $turnitintool->id = $turnitintool->instance;
  257. // Set the checkbox settings for updates
  258. $turnitintool->erater_spelling = (isset($turnitintool->erater_spelling)) ? $turnitintool->erater_spelling : 0;
  259. $turnitintool->erater_grammar = (isset($turnitintool->erater_grammar)) ? $turnitintool->erater_grammar : 0;
  260. $turnitintool->erater_usage = (isset($turnitintool->erater_usage)) ? $turnitintool->erater_usage : 0;
  261. $turnitintool->erater_mechanics = (isset($turnitintool->erater_mechanics)) ? $turnitintool->erater_mechanics : 0;
  262. $turnitintool->erater_style = (isset($turnitintool->erater_style)) ? $turnitintool->erater_style : 0;
  263. $turnitintool->transmatch = (isset($turnitintool->transmatch)) ? $turnitintool->transmatch : 0;
  264. // Get Moodle Course Object [[[[
  265. if (!$course = turnitintool_get_record("course", "id", $turnitintool->course)) {
  266. turnitintool_print_error('coursegeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  267. exit();
  268. }
  269. // ]]]]
  270. // Get Current Moodle Turnitin Tool Object (Assignment) [[[
  271. if (!$turnitintoolnow = turnitintool_get_record("turnitintool", "id", $turnitintool->id)) {
  272. turnitintool_print_error('turnitintoolgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  273. exit();
  274. }
  275. // ]]]]
  276. // Get Current Moodle Turnitin Tool Parts Object [[[
  277. if (!$parts = turnitintool_get_records_select("turnitintool_parts", "turnitintoolid=".
  278. $turnitintool->id." AND deleted=0",'id DESC')) {
  279. turnitintool_print_error('partgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  280. exit();
  281. }
  282. // ]]]]
  283. $partids=array_keys($parts);
  284. $proc=0;
  285. $total=$turnitintool->numparts+2;
  286. if (count($partids)>$turnitintool->numparts) {
  287. // Add the number of deletes needed
  288. $total+=count($partids)-$turnitintool->numparts;
  289. }
  290. if ($turnitintoolnow->numparts<$turnitintool->numparts) {
  291. // Add the number of Insert Individualising required
  292. $total+=$turnitintool->numparts-count($partids);
  293. }
  294. if (turnitintool_is_owner($course->id)) {
  295. $owner=$USER;
  296. } else {
  297. $owner=turnitintool_get_owner($course->id);
  298. }
  299. $loaderbar = null;
  300. $tii = new turnitintool_commclass(turnitintool_getUID($owner),$owner->firstname,$owner->lastname,$owner->email,2,$loaderbar);
  301. $tii->startSession();
  302. if ($turnitintool->numparts<count($partids) AND turnitintool_count_records('turnitintool_submissions','turnitintoolid',$turnitintool->id)>0) {
  303. turnitintool_print_error('reducepartserror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  304. exit();
  305. } else if ($turnitintool->numparts<count($partids)) { // REDUCE THE NUMBER OF PARTS BY CHOPPING THE PARTS OFF THE END
  306. for ($i=0;$i<count($partids);$i++) {
  307. $n=$i+1;
  308. if ($n>$turnitintool->numparts) {
  309. $proc++;
  310. // Get the Turnitin UIDs [[[[
  311. $tiipost = new stdClass();
  312. $tiipost->cid=turnitintool_getCID($course->id);
  313. $tiipost->assignid=turnitintool_getAID($partids[$i]);
  314. // ]]]]
  315. // Do the turnitin assignment set call to the API [[[[
  316. $tiipost->courseid=$course->id;
  317. $tiipost->ctl=turnitintool_getCTL($course->id);
  318. $tiipost->dtstart=time();
  319. $tiipost->dtdue=strtotime('+1 week');
  320. $tiipost->dtpost=strtotime('+1 week');
  321. $tiipost->name=$turnitintool->name.' - '.turnitintool_partnamefromnum($partids[$i]).' (Moodle '.$tiipost->assignid.')';
  322. $tii->deleteAssignment($tiipost,get_string('assignmentdeleteprocess','turnitintool',$n));
  323. if ($tii->getRerror() AND $tii->getRcode()!=TURNITINTOOL_ASSIGNMENT_UPDATE_ERROR AND $tii->getRcode()!=TURNITINTOOL_ASSIGNMENT_NOTEXIST_ERROR) {
  324. if (!$tii->getAPIunavailable()) {
  325. $reason=($tii->getRcode()==TURNITINTOOL_DB_UNIQUEID_ERROR) ? get_string('assignmentdoesnotexist','turnitintool') : $tii->getRmessage();
  326. } else {
  327. $reason=get_string('apiunavailable','turnitintool');
  328. }
  329. turnitintool_print_error('<strong>'.get_string('deleteerror','turnitintool').'</strong><br />'.$reason);
  330. exit();
  331. } else {
  332. if (!$submissions=turnitintool_delete_records('turnitintool_submissions','turnitintoolid',$turnitintool->id,'submission_part',$partids[$i])) {
  333. turnitintool_print_error('submissiondeleteerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  334. exit();
  335. }
  336. }
  337. $part = new stdClass();
  338. $part->id=$partids[$i];
  339. $part->partname=turnitintool_partnamefromnum($part->id);
  340. $part->deleted=1;
  341. if (!$delete=turnitintool_update_record('turnitintool_parts',$part,false)) {
  342. turnitintool_print_error('partdberror','turnitintool',NULL,$i,__FILE__,__LINE__);
  343. }
  344. turnitintool_delete_records_select('event', "modulename='turnitintool' AND instance=".$turnitintool->id." AND name='".$turnitintool->name." - ".$part->partname."'");
  345. // ]]]]
  346. }
  347. }
  348. }
  349. unset($tiipost);
  350. for ($i=0;$i<$turnitintool->numparts;$i++) {
  351. $n=$i+1;
  352. $proc++;
  353. // Update Turnitin Assignment via the API [[[[
  354. $tiipost = new stdClass();
  355. $tiipost->courseid=$course->id;
  356. $tiipost->ctl=turnitintool_getCTL($course->id);
  357. $thisid = isset($partids[$i]) ? $partids[$i] : null;
  358. if ($i>=count($partids)) {
  359. $tiipost->dtstart=time(); // Now
  360. $tiipost->dtdue=strtotime('+1 week'); // 7 days time
  361. $tiipost->dtpost=strtotime('+1 week'); // 7 days time
  362. } else {
  363. $tiipost->dtstart=$parts[$thisid]->dtstart;
  364. $tiipost->dtdue=$parts[$thisid]->dtdue;
  365. $tiipost->dtpost=$parts[$thisid]->dtpost;
  366. }
  367. $tiipost->s_view_report=$turnitintool->studentreports;
  368. $tiipost->anon=$turnitintool->anon;
  369. $tiipost->report_gen_speed=$turnitintool->reportgenspeed;
  370. $tiipost->late_accept_flag=$turnitintool->allowlate;
  371. $tiipost->submit_papers_to=$turnitintool->submitpapersto;
  372. $tiipost->s_paper_check=$turnitintool->spapercheck;
  373. $tiipost->internet_check=$turnitintool->internetcheck;
  374. $tiipost->journal_check=$turnitintool->journalcheck;
  375. // Add in Exclude small matches, biblio, quoted etc 20102009
  376. $tiipost->exclude_biblio=$turnitintool->excludebiblio;
  377. $tiipost->exclude_quoted=$turnitintool->excludequoted;
  378. $tiipost->exclude_value=$turnitintool->excludevalue;
  379. $tiipost->exclude_type=$turnitintool->excludetype;
  380. // Add erater settings
  381. $tiipost->erater=(isset($turnitintool->erater)) ? $turnitintool->erater : 0;
  382. $tiipost->erater_handbook=(isset($turnitintool->erater_handbook)) ? $turnitintool->erater_handbook : 0;
  383. $tiipost->erater_dictionary=(isset($turnitintool->erater_dictionary)) ? $turnitintool->erater_dictionary : 'en_US';
  384. $tiipost->erater_spelling=(isset($turnitintool->erater_spelling)) ? $turnitintool->erater_spelling : 0;
  385. $tiipost->erater_grammar=(isset($turnitintool->erater_grammar)) ? $turnitintool->erater_grammar : 0;
  386. $tiipost->erater_usage=(isset($turnitintool->erater_usage)) ? $turnitintool->erater_usage : 0;
  387. $tiipost->erater_mechanics=(isset($turnitintool->erater_mechanics)) ? $turnitintool->erater_mechanics : 0;
  388. $tiipost->erater_style=(isset($turnitintool->erater_style)) ? $turnitintool->erater_style : 0;
  389. $tiipost->transmatch=(isset($turnitintool->transmatch)) ? $turnitintool->transmatch : 0;
  390. if (turnitintool_is_owner($course->id)) {
  391. $owner=$USER;
  392. } else {
  393. $owner=turnitintool_get_owner($course->id);
  394. }
  395. if ($i<count($partids)) {
  396. $individualise=false;
  397. $partname=turnitintool_partnamefromnum($partids[$i]);
  398. $tiipost->cid=turnitintool_getCID($course->id);
  399. $tiipost->assignid=turnitintool_getAID($partids[$i]);
  400. $tiipost->name=$turnitintool->name.' - '.$partname.' (Moodle '.$tiipost->assignid.')';
  401. $tiipost->currentassign=$turnitintoolnow->name.' - '.turnitintool_partnamefromnum($partids[$i]).' (Moodle '.$tiipost->assignid.')';
  402. $tii->createAssignment($tiipost,'UPDATE',get_string('assignmentupdate','turnitintool',$n));
  403. } else {
  404. $individualise=true;
  405. $tiipost->cid='';
  406. $tiipost->assignid='';
  407. $tiipost->dtstart=strtotime("now"); // Set time to now and change to the correct date later to allow dates in the past
  408. $tiipost->dtdue=strtotime("+1 day"); // Set time to now +1 day and change to the correct date later to allow dates in the past
  409. $tiipost->dtpost=strtotime("+1 day"); // Set time to now +1 day and change to the correct date later to allow dates in the past
  410. $partname=get_string('turnitinpart','turnitintool',$n);
  411. $tiipost->name=$turnitintool->name.' - '.$partname;
  412. $tii->createAssignment($tiipost,'INSERT',get_string('assignmentprocess','turnitintool',$n));
  413. }
  414. if ($tii->getRerror()) {
  415. if ($tii->getAPIunavailable()) {
  416. $reason=get_string('apiunavailable','turnitintool');
  417. } else {
  418. $reason=($tii->getRcode()==TURNITINTOOL_DB_UNIQUEID_ERROR) ? get_string('assignmentdoesnotexist','turnitintool') : $tii->getRmessage();
  419. }
  420. turnitintool_print_error('<strong>'.get_string('updateerror','turnitintool').'</strong><br />'.$reason);
  421. exit();
  422. }
  423. $part = new stdClass();
  424. $part->tiiassignid=$tii->getAssignid();
  425. if ($individualise) {
  426. $tiipost->cid=turnitintool_getCID($course->id);
  427. $tiipost->assignid=$part->tiiassignid;
  428. $tiipost->currentassign=$tiipost->name;
  429. $tiipost->name.=' (Moodle '.$part->tiiassignid.')';
  430. $tiipost->max_points=($turnitintool->grade < 0) ? 100 : $turnitintool->grade;
  431. // Now individualise the Assignment Name and allow to set the date to any date even dates in the past for new assignment part
  432. $proc++;
  433. $tii->createAssignment($tiipost,'UPDATE',get_string('assignmentindividualise','turnitintool',$n)); // PROC 3+
  434. if ($tii->getRerror()) {
  435. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  436. turnitintool_print_error('<strong>'.get_string('inserterror','turnitintool').'</strong><br />'.$reason);
  437. exit();
  438. }
  439. }
  440. $part->turnitintoolid=$turnitintool->id;
  441. $part->partname=$partname;
  442. $part->deleted=0;
  443. if ($i>=count($partids)) {
  444. $part->dtstart=time();
  445. $part->dtdue=strtotime('+1 week');
  446. $part->dtpost=strtotime('+1 week');
  447. } else {
  448. $part->dtdue=$parts[$thisid]->dtdue;
  449. $part->dtpost=$parts[$thisid]->dtpost;
  450. }
  451. $part->dtstart=$tiipost->dtstart;
  452. $part->dtdue=$tiipost->dtdue;
  453. $part->dtpost=$tiipost->dtpost;
  454. $event = new object();
  455. $event->name = $turnitintool->name.' - '.$part->partname;
  456. $event->description = $turnitintool->intro;
  457. $event->courseid = $turnitintool->course;
  458. $event->groupid = 0;
  459. $event->userid = 0;
  460. $event->modulename = 'turnitintool';
  461. $event->instance = $turnitintool->id;
  462. $event->eventtype = 'due';
  463. $event->timestart = $part->dtdue;
  464. $event->timeduration = 0;
  465. if ($i<count($partids)) {
  466. $part->id=$partids[$i];
  467. if (!$dbpart=turnitintool_update_record('turnitintool_parts',$part,false)) {
  468. turnitintool_print_error('partdberror','turnitintool',NULL,$i,__FILE__,__LINE__);
  469. exit();
  470. }
  471. } else {
  472. $part->maxmarks=($turnitintool->grade < 0) ? 100 : $turnitintool->grade;
  473. if (!$dbpart=turnitintool_insert_record('turnitintool_parts',$part,false)) {
  474. turnitintool_print_error('partdberror','turnitintool',NULL,$i,__FILE__,__LINE__);
  475. exit();
  476. }
  477. }
  478. // Delete existing events for this assignment / part
  479. turnitintool_delete_records_select('event', "modulename='turnitintool' AND instance=".$turnitintool->id." AND name='".$turnitintoolnow->name.' - '.$part->partname."'");
  480. add_event($event);
  481. unset($tiipost);
  482. }
  483. // ]]]]
  484. $turnitintool->timemodified=time();
  485. $update=turnitintool_update_record("turnitintool", $turnitintool);
  486. // Define grade settings in Moodle 1.9 and above
  487. turnitintool_grade_item_update( $turnitintool );
  488. $cmid = isset( $turnitintool->cmidnumber ) ? $turnitintool->cmidnumber : null;
  489. add_to_log($turnitintool->course, "turnitintool", "update turnitintool", "view.php?id=$cmid", "Assignment updated '$turnitintool->name'", "$cmid");
  490. $tii->endSession();
  491. return $update;
  492. }
  493. /**
  494. * Create grade item for given assignment
  495. *
  496. * @param object $turnitintool object with extra cmidnumber (if available)
  497. * @param mixed optional array/object of grade(s); 'reset' means reset grades in gradebook
  498. * @return int 0 if ok, error code otherwise
  499. */
  500. function turnitintool_grade_item_update( $turnitintool, $grades=null ) {
  501. global $CFG;
  502. @include_once($CFG->dirroot."/lib/gradelib.php");
  503. if ( function_exists( 'grade_update' ) ) {
  504. $params = array();
  505. $cm=get_coursemodule_from_instance("turnitintool", $turnitintool->id, $turnitintool->course);
  506. $params['itemname'] = $turnitintool->name;
  507. $params['idnumber'] = isset( $cm->idnumber ) ? $cm->idnumber : null;
  508. if ($turnitintool->grade < 0) { // If we're using a grade scale
  509. $params['gradetype'] = GRADE_TYPE_SCALE;
  510. $params['scaleid'] = -$turnitintool->grade;
  511. } else if ($turnitintool->grade > 0) { // If we are using a grade value
  512. $params['gradetype'] = GRADE_TYPE_VALUE;
  513. $params['grademax'] = $turnitintool->grade;
  514. $params['grademin'] = 0;
  515. } else { // If we aren't using a grade at all
  516. $params['gradetype'] = GRADE_TYPE_NONE;
  517. }
  518. $lastpart=turnitintool_get_record('turnitintool_parts','turnitintoolid',$turnitintool->id,'','','','','max(dtpost)');
  519. $lastpart=current($lastpart);
  520. $params['hidden']=$lastpart;
  521. $params['grademin'] = 0;
  522. return grade_update('mod/turnitintool', $turnitintool->course, 'mod', 'turnitintool', $turnitintool->id, 0, $grades, $params);
  523. }
  524. return;
  525. }
  526. /**
  527. * Not used but needed for instance name update via quick update name on the course home page
  528. *
  529. * @param stdClass $turnitintool
  530. * @param integer $userid
  531. * @param boolean $nullifnone
  532. */
  533. function turnitintool_update_grades($turnitintool, $userid=0, $nullifnone=true) {
  534. }
  535. /**
  536. * Given an ID of an instance of this module,
  537. * this function will permanently delete the instance
  538. * and any data that depends on it.
  539. *
  540. * @global object
  541. * @global object
  542. * @param int $id turnitintool instance id
  543. * @return bool success
  544. */
  545. function turnitintool_delete_instance($id) {
  546. global $USER,$CFG;
  547. $result = true;
  548. // Get the Moodle Turnitintool (Assignment) and Course Object [[[[
  549. if (!$turnitintool = turnitintool_get_record("turnitintool", "id", $id)) {
  550. return false;
  551. }
  552. if (!$course = turnitintool_get_record("course", "id", $turnitintool->course)) {
  553. return false;
  554. }
  555. // ]]]]
  556. // Get Current Moodle Turnitin Tool Parts Object [[[
  557. $parts = turnitintool_get_records("turnitintool_parts", "turnitintoolid", $turnitintool->id);
  558. // ]]]]
  559. $partids=array_keys($parts);
  560. $total=count($partids)+2;
  561. $proc=0;
  562. foreach ($parts as $part) {
  563. $proc++;
  564. if (!$submissions=turnitintool_delete_records('turnitintool_submissions','turnitintoolid',$turnitintool->id,'submission_part',$part->id)) {
  565. $result=false;
  566. }
  567. // ]]]]
  568. # Delete any dependent records here #
  569. if (!turnitintool_delete_records("turnitintool_parts", "id", $part->id)) {
  570. $result = false;
  571. }
  572. }
  573. $cm = get_coursemodule_from_instance( "turnitintool", $turnitintool->id, $turnitintool->course );
  574. add_to_log( $turnitintool->course, "turnitintool", "delete turnitintool", 'view.php?id='.$cm->id, 'Assignment deleted "'.$turnitintool->name.'"', $cm->id );
  575. // Delete events for this assignment / part
  576. turnitintool_delete_records('event', 'modulename','turnitintool','instance',$turnitintool->id);
  577. if (!turnitintool_delete_records("turnitintool", "id", $turnitintool->id)) {
  578. $result = false;
  579. }
  580. if ($oldcourses=turnitintool_get_records("turnitintool_courses")) {
  581. foreach ($oldcourses as $oldcourse) { // General Clean Up
  582. if (!turnitintool_count_records("course","id",$oldcourse->courseid)>0) {
  583. // Delete the Turnitin Classes data if the Moodle courses no longer exists
  584. turnitintool_delete_records("turnitintool_courses","courseid",$oldcourse->courseid);
  585. }
  586. if (!turnitintool_count_records("turnitintool","course",$oldcourse->courseid)>0) {
  587. // Delete the Turnitin Class data if no more turnitin assignments exist in it
  588. turnitintool_delete_records("turnitintool_courses","courseid",$oldcourse->courseid);
  589. }
  590. }
  591. }
  592. // Define grade settings in Moodle 1.9 and above
  593. @include_once($CFG->dirroot."/lib/gradelib.php");
  594. if (function_exists('grade_update')) {
  595. $params['deleted'] = 1;
  596. grade_update('mod/turnitintool', $turnitintool->course, 'mod', 'turnitintool', $turnitintool->id, 0, NULL, $params);
  597. }
  598. return $result;
  599. }
  600. /**
  601. * This is a standard Moodle module that checks to make sure there are events for each activity
  602. *
  603. * @param var $courseid The ID of the course this activity belongs to (default 0 for all courses)
  604. * @return bool success
  605. */
  606. function turnitintool_refresh_events($courseid=0) {
  607. if ($courseid == 0) {
  608. if (!$turnitintools = turnitintool_get_records("turnitintool")) {
  609. $result=true;
  610. }
  611. } else {
  612. if (!$turnitintools = turnitintool_get_records("turnitintool", "course",$courseid)) {
  613. $result=true;
  614. }
  615. }
  616. $module = turnitintool_get_records_select('modules',"name='turnitintool'",'id');
  617. $moduleid=current(array_keys($module));
  618. foreach ($turnitintools as $turnitintool) {
  619. $event = new stdClass();
  620. $event->description = $turnitintool->intro;
  621. if (!$parts = turnitintool_get_records("turnitintool_parts","turnitintoolid",$turnitintool->id)) {
  622. $result=false;
  623. }
  624. foreach ($parts as $part) {
  625. $event->timestart=$part->dtdue;
  626. if ($events = turnitintool_get_record_select('event', "modulename='turnitintool' AND instance=".$turnitintool->id." AND name='".$turnitintool->name." - ".$part->partname."'")) {
  627. $event->id = $events->id;
  628. update_event($event);
  629. } else {
  630. $event->courseid = $turnitintool->course;
  631. $event->groupid = 0;
  632. $event->userid = 0;
  633. $event->modulename = 'turnitintool';
  634. $event->instance = $turnitintool->id;
  635. $event->eventtype = 'due';
  636. $event->timeduration = 0;
  637. $event->name = $turnitintool->name.' - '.$part->partname;
  638. $coursemodule = turnitintool_get_record('course_modules','module',$moduleid,'instance',$turnitintool->id);
  639. $event->visible = $coursemodule->visible;
  640. add_event($event);
  641. }
  642. }
  643. $result=true;
  644. }
  645. return $result;
  646. }
  647. /**
  648. * This is a standard Moodle module that prints out a summary of all activities
  649. * of this kind in the My Moodle page for a user
  650. *
  651. * @param object $courses
  652. * @param object $htmlarray
  653. * @return bool success
  654. */
  655. function turnitintool_print_overview($courses, &$htmlarray) {
  656. global $USER, $CFG, $DB;
  657. if (empty($courses) || !is_array($courses) || count($courses) == 0) {
  658. return array();
  659. }
  660. if (!$turnitintools=get_all_instances_in_courses('turnitintool',$courses)) {
  661. return;
  662. }
  663. $ids = array();
  664. $tiidata=array();
  665. foreach ($turnitintools as $key => $turnitintool) {
  666. $now = time();
  667. $parts=turnitintool_get_records_select('turnitintool_parts','turnitintoolid='.$turnitintool->id.' AND deleted=0','id');
  668. $context = get_context_instance(CONTEXT_MODULE, $turnitintool->coursemodule);
  669. // Get Early and Late Date Boundries for each part of this assignment
  670. $earlydate=0;
  671. $latedate=0;
  672. $partsarray=array();
  673. foreach ($parts as $part) {
  674. $earlydate = ($part->dtstart < $earlydate OR $earlydate==0) ? $part->dtstart : $earlydate;
  675. $latedate = ($part->dtpost > $latedate) ? $part->dtpost : $latedate;
  676. $partsarray[$part->id]['name']=$part->partname;
  677. $partsarray[$part->id]['dtdue']=$part->dtdue;
  678. if (has_capability('mod/turnitintool:grade', $context)) { // If user is a grader
  679. $subquery=turnitintool_get_records_select('turnitintool_submissions','turnitintoolid='.$turnitintool->id.
  680. ' AND submission_part='.$part->id.' AND submission_objectid IS NOT NULL AND userid!=0','','count(userid)');
  681. $numsubmissions=key($subquery);
  682. $gradequery=turnitintool_get_records_select('turnitintool_submissions','turnitintoolid='.$turnitintool->id.
  683. ' AND submission_part='.$part->id.' AND userid!=0 AND submission_grade IS NOT NULL','','count(userid)');
  684. $numgrades=key($gradequery);
  685. $allusers=get_users_by_capability($context, 'mod/turnitintool:submit', 'u.id', '', '', '', 0, '', false);
  686. $input = new stdClass();
  687. $input->submitted=$numsubmissions;
  688. $input->graded=$numgrades;
  689. $input->total=count($allusers);
  690. $input->gplural=($numgrades!=1) ? 's' : '';
  691. $partsarray[$part->id]['status']=get_string('tutorstatus','turnitintool',$input);
  692. } else { // If user is a student
  693. if ($submission=turnitintool_get_record_select('turnitintool_submissions','turnitintoolid='.$turnitintool->id.
  694. ' AND submission_part='.$part->id.' AND userid='.$USER->id.' AND submission_objectid IS NOT NULL')) {
  695. $input = new stdClass();
  696. $input->modified=userdate($submission->submission_modified,get_string('strftimedatetimeshort','langconfig'));
  697. $input->objectid=$submission->submission_objectid;
  698. $partsarray[$part->id]['status']=get_string('studentstatus','turnitintool',$input);
  699. } else {
  700. $partsarray[$part->id]['status']=get_string('nosubmissions','turnitintool');
  701. }
  702. }
  703. }
  704. if ($earlydate <= $now AND $latedate >= $now) { // Turnitin Assignment Is Active for this user
  705. $str = '<div class="turnitintool overview"><div class="name">'.get_string('modulename','turnitintool'). ': '.
  706. '<a '.($turnitintool->visible ? '':' class="dimmed"').
  707. 'title="'.get_string('modulename','turnitintool').'" href="'.$CFG->wwwroot.
  708. '/mod/turnitintool/view.php?id='.$turnitintool->coursemodule.'">'.
  709. $turnitintool->name.'</a></div>';
  710. foreach ($partsarray as $thispart) {
  711. $str .= '<div class="info"><b>'.$thispart['name'].' - '.get_string('dtdue','turnitintool').': '.userdate($thispart['dtdue'],get_string('strftimedatetimeshort','langconfig'),$USER->timezone).'</b><br />
  712. <i>'.$thispart['status'].'</i></div>';
  713. }
  714. $str .= '</div>';
  715. if (empty($htmlarray[$turnitintool->course]['turnitintool'])) {
  716. $htmlarray[$turnitintool->course]['turnitintool'] = $str;
  717. } else {
  718. $htmlarray[$turnitintool->course]['turnitintool'] .= $str;
  719. }
  720. }
  721. }
  722. }
  723. /**
  724. * A function to return a Turnitin User ID if one exists in turnitintool_users
  725. * or returns NULL if we do not have a record for that user yet
  726. *
  727. * @param object $owner A data object for the owner user of the Turnitin Class
  728. * @return var A Turnitin User ID or NULL
  729. */
  730. function turnitintool_getUID($owner) {
  731. if (is_null($owner) OR !$turnitintool_user = turnitintool_get_record("turnitintool_users", "userid", $owner->id)) {
  732. return NULL;
  733. } else {
  734. return ( isset($turnitintool_user->turnitin_uid) AND $turnitintool_user->turnitin_uid > 0 )
  735. ? $turnitintool_user->turnitin_uid : NULL;
  736. }
  737. }
  738. /**
  739. * A function to return a Turnitin Class ID if one exists in turnitintool_courses
  740. * or fails with an error if the record does not exist
  741. *
  742. * @param var $courseid The ID of the Moodle course to check against
  743. * @return var A Turnitin Class ID
  744. */
  745. function turnitintool_getCID($courseid) {
  746. if (!$turnitintool_course = turnitintool_get_record("turnitintool_courses", "courseid", $courseid)) {
  747. turnitintool_print_error('coursegeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  748. exit();
  749. } else {
  750. return $turnitintool_course->turnitin_cid;
  751. }
  752. }
  753. /**
  754. * A function to return the Turnitin Class Title if one exists in turnitintool_courses
  755. * or fails with an error if the record does not exist
  756. *
  757. * @param var $courseid The ID of the Moodle course to check against
  758. * @return var A Turnitin Class Title
  759. */
  760. function turnitintool_getCTL($courseid) {
  761. if (!$turnitintool_course = turnitintool_get_record("turnitintool_courses", "courseid", $courseid)) {
  762. turnitintool_print_error('coursegeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  763. exit();
  764. } else {
  765. return $turnitintool_course->turnitin_ctl;
  766. }
  767. }
  768. /**
  769. * A function to return the Turnitin Assignment ID if one exists in turnitintool
  770. * or fails with an error if the record does not exist
  771. *
  772. * @param var $courseid The ID of the Moodle assignment to check against
  773. * @return var A Turnitin Assignment ID
  774. */
  775. function turnitintool_getAID($partid) {
  776. if (!$turnitintool_assign = turnitintool_get_record("turnitintool_parts", "id", $partid)) {
  777. turnitintool_print_error('assigngeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  778. exit();
  779. } else {
  780. return $turnitintool_assign->tiiassignid;
  781. }
  782. }
  783. /**
  784. * Does a user setup up routine, if the user exists in turnitintool_users then the Turnitin User ID is returned for that user
  785. * if not then A call to FID1 to Create the User is called and the ID is returned and stored in turnitintool_users
  786. *
  787. * This is required when user not present calls are made or when there may not yet be a class owner to make the call through the API
  788. * specifically through reset course and add_instance
  789. *
  790. * @param object $userdata The moodle user object for the user we are setting up
  791. * @param string $status The status message that is displayed in the loader bar if the user need to be created
  792. * @param object $tii The turnitintool_commclass object is passed by reference
  793. * @param object $loaderbar The turnitintool_loaderbarclass object is passed by reference can be NULL if no loader bar is to be used
  794. * @return object A turnitintool_users data object that was either created or found during this call
  795. */
  796. function turnitintool_usersetup($userdata,$status='',&$tii,&$loaderbar) {
  797. global $CFG;
  798. if (!turnitintool_check_config()) {
  799. turnitintool_print_error('configureerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  800. exit();
  801. }
  802. if (!$turnitintool_user = turnitintool_get_record("turnitintool_users", "userid", $userdata->id)
  803. // If the user has been unlinked
  804. OR (isset($turnitintool_user->turnitin_uid) AND $turnitintool_user->turnitin_uid < 1)) {
  805. if (isset($loaderbar->total)) {
  806. $loaderbar->total=$loaderbar->total+3;
  807. }
  808. // Do call with NO IDs to check the email address and retrieve the Turnitin UID
  809. $post = new stdClass();
  810. $post->idsync=1;
  811. if ($tii->utp==1 AND $CFG->turnitin_studentemail!="1") {
  812. $post->dis=1;
  813. } else {
  814. $post->dis=0;
  815. }
  816. $tii->createUser($post,$status);
  817. if ($tii->getRerror()) {
  818. return null;
  819. }
  820. $turnitinid=$tii->getUserID();
  821. $turnitinuser=new object();
  822. if ( isset( $turnitintool_user->id ) AND $turnitintool_user->id ) {
  823. $turnitinuser->id = $turnitintool_user->id;
  824. }
  825. $turnitinuser->userid=$userdata->id;
  826. $turnitinuser->turnitin_uid=$turnitinid;
  827. $turnitinuser->turnitin_utp=$tii->utp;
  828. $tii->uid=$turnitinid;
  829. if ( ( isset( $turnitinuser->id ) AND !turnitintool_update_record('turnitintool_users',$turnitinuser) ) ) {
  830. turnitintool_print_error('userupdateerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  831. exit();
  832. } else if ( !isset( $turnitinuser->id ) AND !$insertid=turnitintool_insert_record('turnitintool_users',$turnitinuser) ) {
  833. turnitintool_print_error('userupdateerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  834. exit();
  835. }
  836. $turnitinuser->id=( isset($insertid) ) ? $insertid : $turnitinuser->id;
  837. return $turnitinuser;
  838. } else {
  839. return $turnitintool_user;
  840. }
  841. }
  842. /**
  843. * Does a class setup up routine, if the class exists in turnitintool_class then the Turnitin Class ID is returned for that class
  844. * if not then A call to FID2 to Create the Class is called and the ID is returned and stored in turnitintool_courses
  845. *
  846. * @param object $course The moodle course object for the course we are setting up
  847. * @param object $owner The moodle user object for the turnitin class owner of the course
  848. * @param string $status The status message that is displayed in the loader bar if the class needs to be created
  849. * @param object $tii The turnitintool_commclass object is passed by reference
  850. * @param object $loaderbar The turnitintool_loaderbarclass object is passed by reference can be NULL if no loader bar is to be used
  851. * @return object A turnitintool_courses data object that was either created or found during this call
  852. */
  853. function turnitintool_classsetup($course,$owner,$status='',&$tii,&$loaderbar) {
  854. // Make sure the Turnitin Module has been fully configured
  855. if (!turnitintool_check_config()) {
  856. turnitintool_print_error('configureerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  857. exit();
  858. }
  859. // Check to see if we have an ID and Title stored for this course
  860. if (!$turnitintool_course = turnitintool_get_record("turnitintool_courses", "courseid", $course->id)) {
  861. $classexists=false;
  862. } else {
  863. $classexists=true;
  864. }
  865. // We do not have an ID stored
  866. // Action: Create the class on turnitin and store relevant details
  867. if (!$classexists) {
  868. // Create a Turnitin Comm Object
  869. if (isset($loaderbar->total)) {
  870. $loaderbar->total=$loaderbar->total+1;
  871. }
  872. // Create without IDs initially
  873. $uniquestring=strtoupper(uniqid());
  874. $turnitin_ctl=(strlen($course->fullname) > 76)
  875. ? substr($course->fullname,0,76)."... (".$uniquestring.")" : $course->fullname." (".$uniquestring.")";
  876. $post = new stdClass();
  877. $post->ctl=$turnitin_ctl;
  878. $post->idsync=1;
  879. $tii->createClass($post,$status);
  880. if ($tii->getRerror()) {
  881. if ($tii->getAPIunavailable()) {
  882. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  883. } else {
  884. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  885. }
  886. exit();
  887. }
  888. $post->cid=$tii->getClassID();
  889. $turnitin_ctl=str_replace("(".$uniquestring.")","(Moodle ".$post->cid.")",$turnitin_ctl);
  890. $turnitincourse=new object();
  891. $turnitincourse->courseid=$course->id;
  892. $turnitincourse->ownerid=$owner->id;
  893. $turnitincourse->turnitin_cid=$post->cid;
  894. $turnitincourse->turnitin_ctl=$turnitin_ctl;
  895. if (!$insertid=turnitintool_insert_record('turnitintool_courses',$turnitincourse)) {
  896. turnitintool_print_error('classupdateerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  897. exit();
  898. }
  899. $turnitincourse->id=$insertid;
  900. }
  901. // We already have an ID stored
  902. // Action: Do a call to Turnitin with the Stored IDs to ensure the class has not changed
  903. if (isset($insertid) AND !$turnitintool_course = turnitintool_get_record("turnitintool_courses", "courseid", $course->id)) {
  904. turnitintool_print_error('classgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  905. exit();
  906. }
  907. // Create a Turnitin Comm Object
  908. if (isset($loaderbar->total)) {
  909. $loaderbar->total=$loaderbar->total+2;
  910. }
  911. $post = new stdClass();
  912. $post->cid=$turnitintool_course->turnitin_cid;
  913. $post->ctl=$turnitintool_course->turnitin_ctl;
  914. $post->idsync=0;
  915. $tii->createClass($post,$status);
  916. if ($tii->getRerror()) {
  917. if ($tii->getAPIunavailable()) {
  918. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  919. } else {
  920. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  921. }
  922. exit();
  923. }
  924. return $turnitintool_course;
  925. }
  926. /**
  927. * Prints the tab link menu across the top of the activity module
  928. *
  929. * @param object $cm The moodle course module object for this instance
  930. * @param object $do The query string parameter to determine the page we are on
  931. */
  932. function turnitintool_draw_menu($cm,$do) {
  933. global $CFG,$USER;
  934. $tabs[] = new tabobject('intro', $CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.
  935. '&do=intro', get_string('turnitintoolintro','turnitintool'), get_string('turnitintoolintro','turnitintool'), false);
  936. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  937. $tabs[] = new tabobject('submissions', $CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=submissions',
  938. get_string('submitpaper','turnitintool'), get_string('submitpaper','turnitintool'), false);
  939. $tabs[] = new tabobject('allsubmissions', $CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=allsubmissions',
  940. get_string('allsubmissions','turnitintool'), get_string('allsubmissions','turnitintool'), false);
  941. $tabs[] = new tabobject('options', $CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=options',
  942. get_string('options','turnitintool'), get_string('options','turnitintool'), false);
  943. } else {
  944. $tabs[] = new tabobject('submissions', $CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=submissions',
  945. get_string('mysubmissions','turnitintool'), get_string('mysubmissions','turnitintool'), false);
  946. }
  947. echo '<div class="clearfix"></div>';
  948. if ($do=='notes') {
  949. $tabs[] = new tabobject('notes', '',
  950. get_string('notes','turnitintool'), get_string('notes','turnitintool'), false);
  951. $inactive=array('notes');
  952. $selected='notes';
  953. } else if ($do=='tutors') {
  954. $tabs[] = new tabobject('tutors', '',
  955. get_string('turnitintutors','turnitintool'), get_string('turnitintutors','turnitintool'), false);
  956. $inactive=array('tutors');
  957. $selected='tutors';
  958. } else {
  959. $inactive=array();
  960. $selected=$do;
  961. }
  962. print_tabs(array($tabs),$selected,$inactive);
  963. }
  964. /**
  965. * Processes the data passed by the part update form from the summary page
  966. *
  967. * @param object $cm The moodle course module object for this instance
  968. * @param object $turnitintool The turnitintool object is for this activity
  969. * @param array $post The post array from the part update form
  970. * @return array A notice array contains error details for display on page load in the case of an error nothing returned if no errors occur
  971. */
  972. function turnitintool_update_partnames($cm,$turnitintool,$post) {
  973. global $CFG,$USER;
  974. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  975. $notice['message']='';
  976. $error=false;
  977. $dtstart=make_timestamp(
  978. $post["dtstart"]["year"],
  979. $post["dtstart"]["month"],
  980. $post["dtstart"]["day"],
  981. $post["dtstart"]["hour"],
  982. $post["dtstart"]["minute"],
  983. 0,

Large files files are truncated, but you can click here to view the full file