PageRenderTime 58ms CodeModel.GetById 21ms 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
  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,
  984. get_user_timezone()
  985. );
  986. $dtdue=make_timestamp(
  987. $post["dtdue"]["year"],
  988. $post["dtdue"]["month"],
  989. $post["dtdue"]["day"],
  990. $post["dtdue"]["hour"],
  991. $post["dtdue"]["minute"],
  992. 0,
  993. get_user_timezone()
  994. );
  995. $dtpost=make_timestamp(
  996. $post["dtpost"]["year"],
  997. $post["dtpost"]["month"],
  998. $post["dtpost"]["day"],
  999. $post["dtpost"]["hour"],
  1000. $post["dtpost"]["minute"],
  1001. 0,
  1002. get_user_timezone()
  1003. );
  1004. if ($dtstart>=$dtdue) {
  1005. $notice['message'].=get_string('partstarterror','turnitintool');
  1006. $error=true;
  1007. }
  1008. if ($dtpost<$dtstart) {
  1009. $notice['message'].=get_string('partdueerror','turnitintool');
  1010. $error=true;
  1011. }
  1012. if (empty($post['partname'])) {
  1013. $notice['message'].=get_string('partnameerror','turnitintool');
  1014. $error=true;
  1015. }
  1016. if (strlen($post['partname'])>35) {
  1017. $input = new stdClass();
  1018. $input->length=35;
  1019. $input->field=get_string('partname','turnitintool');
  1020. $notice['message'].=get_string('maxlength','turnitintool',$input);
  1021. $error=true;
  1022. }
  1023. if (!preg_match("/^[-]?[0-9]+([\.][0-9]+)?$/", $post['maxmarks'])) { // ENTRY IS NOT A NUMBER
  1024. $notice['message'].=get_string('partmarkserror','turnitintool');
  1025. $error=true;
  1026. }
  1027. if ($error) {
  1028. $notice['error']=$post['submitted'];
  1029. $notice['post']=$post;
  1030. }
  1031. if (!$error) {
  1032. // Update Turnitin Assignment via the API [[[[
  1033. $tiipost = new stdClass();
  1034. $tiipost->ctl=turnitintool_getCTL($turnitintool->course);
  1035. $tiipost->dtstart=$dtstart;
  1036. $tiipost->dtdue=$dtdue;
  1037. $tiipost->dtpost=$dtpost;
  1038. if (turnitintool_is_owner($turnitintool->course)) {
  1039. $owner=$USER;
  1040. } else {
  1041. $owner=turnitintool_get_owner($turnitintool->course);
  1042. }
  1043. if (!$course=turnitintool_get_record('course','id',$turnitintool->course)) {
  1044. turnitintool_print_error('coursegeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1045. exit();
  1046. }
  1047. $loaderbar = new turnitintool_loaderbarclass(3);
  1048. $tii = new turnitintool_commclass(turnitintool_getUID($owner),$owner->firstname,$owner->lastname,$owner->email,2,$loaderbar);
  1049. $tii->startSession();
  1050. turnitintool_usersetup($owner,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  1051. turnitintool_classsetup( $course, $owner, get_string('classprocess','turnitintool'), $tii, $loaderbar );
  1052. if ($tii->getRerror()) {
  1053. if ($tii->getAPIunavailable()) {
  1054. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1055. } else {
  1056. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  1057. }
  1058. exit();
  1059. }
  1060. $tiipost->cid=turnitintool_getCID($turnitintool->course);
  1061. $tiipost->assignid=turnitintool_getAID($post['submitted']);
  1062. $tiipost->s_view_report=$turnitintool->studentreports;
  1063. $tiipost->max_points=$post['maxmarks'];
  1064. $tiipost->anon=$turnitintool->anon;
  1065. $tiipost->report_gen_speed=$turnitintool->reportgenspeed;
  1066. $tiipost->late_accept_flag=$turnitintool->allowlate;
  1067. $tiipost->submit_papers_to=$turnitintool->submitpapersto;
  1068. $tiipost->s_paper_check=$turnitintool->spapercheck;
  1069. $tiipost->internet_check=$turnitintool->internetcheck;
  1070. $tiipost->journal_check=$turnitintool->journalcheck;
  1071. // Add in Exclude small matches, biblio, quoted etc 20102009
  1072. $tiipost->exclude_biblio=$turnitintool->excludebiblio;
  1073. $tiipost->exclude_quoted=$turnitintool->excludequoted;
  1074. $tiipost->exclude_value=$turnitintool->excludevalue;
  1075. $tiipost->exclude_type=$turnitintool->excludetype;
  1076. // Add in the erater settings
  1077. $tiipost->erater=$turnitintool->erater;
  1078. $tiipost->erater_handbook=$turnitintool->erater_handbook;
  1079. $tiipost->erater_dictionary=$turnitintool->erater_dictionary;
  1080. $tiipost->erater_spelling=$turnitintool->erater_spelling;
  1081. $tiipost->erater_grammar=$turnitintool->erater_grammar;
  1082. $tiipost->erater_usage=$turnitintool->erater_usage;
  1083. $tiipost->erater_mechanics=$turnitintool->erater_mechanics;
  1084. $tiipost->erater_style=$turnitintool->erater_style;
  1085. $tiipost->transmatch=$turnitintool->transmatch;
  1086. $tiipost->name=$turnitintool->name.' - '.$post['partname'].' (Moodle '.$tiipost->assignid.')';
  1087. $tiipost->currentassign=$turnitintool->name.' - '.turnitintool_partnamefromnum($post['submitted']).' (Moodle '.$tiipost->assignid.')';
  1088. $tii->createAssignment($tiipost,'UPDATE',get_string('assignmentupdate','turnitintool',''));
  1089. if ($tii->getRerror()) {
  1090. if ($tii->getRcode()==TURNITINTOOL_DB_UNIQUEID_ERROR) {
  1091. $reason=get_string('assignmentdoesnotexist','turnitintool');
  1092. } else {
  1093. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  1094. }
  1095. turnitintool_print_error('<strong>'.get_string('updateerror','turnitintool').'</strong><br />'.$reason);
  1096. exit();
  1097. }
  1098. $part = new stdClass();
  1099. $part->id=$post['submitted'];
  1100. $part->dtstart=$dtstart;
  1101. $part->dtdue=$dtdue;
  1102. $part->dtpost=$dtpost;
  1103. $part->partname=$post['partname'];
  1104. $part->maxmarks=$post['maxmarks'];
  1105. $part->deleted=0;
  1106. $event = new stdClass();
  1107. $event->timestart=$part->dtdue;
  1108. $event->name=$turnitintool->name.' - '.$part->partname;
  1109. $currentevent=$turnitintool->name.' - '.turnitintool_partnamefromnum($post['submitted']);
  1110. if (!$dbpart=turnitintool_update_record('turnitintool_parts',$part,false)) {
  1111. turnitintool_print_error('partdberror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1112. }
  1113. if ($events = turnitintool_get_record_select('event', "modulename='turnitintool' AND instance='".$turnitintool->id."' AND name='".$currentevent."'")) {
  1114. $event->id = $events->id;
  1115. update_event($event);
  1116. }
  1117. @include_once($CFG->dirroot."/lib/gradelib.php"); // Set the view time for Grade Book viewing
  1118. if (function_exists('grade_update')) {
  1119. $lastpart=turnitintool_get_record('turnitintool_parts','turnitintoolid',$turnitintool->id,'','','','','max(dtpost)');
  1120. $lastpart=current($lastpart);
  1121. $params['hidden']=$lastpart;
  1122. grade_update('mod/turnitintool', $turnitintool->course, 'mod', 'turnitintool', $turnitintool->id, 0, NULL, $params);
  1123. }
  1124. $tii->endSession();
  1125. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=intro');
  1126. exit();
  1127. } else {
  1128. return $notice;
  1129. }
  1130. } else {
  1131. turnitintool_print_error('permissiondeniederror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1132. }
  1133. }
  1134. /**
  1135. * Processes the request from a user to delete a part from an activity
  1136. *
  1137. * @param object $cm The moodle course module object for this instance
  1138. * @param object $turnitintool The turnitintool object is for this activity
  1139. * @param var $partid The ID of the assignment part stored in turnitintool_parts
  1140. * @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
  1141. */
  1142. function turnitintool_delete_part($cm,$turnitintool,$partid) {
  1143. global $CFG,$USER;
  1144. $notice['message']='';
  1145. if ($turnitintool->numparts==1) {
  1146. $error=true;
  1147. turnitintool_print_error('onepartdeleteerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1148. } else if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  1149. if (turnitintool_is_owner($turnitintool->course)) {
  1150. $owner=$USER;
  1151. } else {
  1152. $owner=turnitintool_get_owner($turnitintool->course);
  1153. }
  1154. if (!$submissions=turnitintool_delete_records('turnitintool_submissions','turnitintoolid',$turnitintool->id,'submission_part',$partid)) {
  1155. turnitintool_print_error('submissiondeleteerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1156. exit();
  1157. }
  1158. $result = true;
  1159. // ]]]]
  1160. # Delete any dependent records here #
  1161. $part = new stdClass();
  1162. $part->id=$partid;
  1163. $part->deleted=1;
  1164. if (!turnitintool_update_record("turnitintool_parts", $part, false)) {
  1165. turnitintool_print_error('partdeleteerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1166. }
  1167. // Delete events for this assignment / part
  1168. turnitintool_delete_records_select('event', "modulename='turnitintool' AND instance=".$turnitintool->id." AND name='".$turnitintool->name." - ".turnitintool_partnamefromnum($partid)."'");
  1169. $update = new stdClass();
  1170. $update->id=$turnitintool->id;
  1171. $update->numparts=$turnitintool->numparts-1;
  1172. if (!turnitintool_update_record("turnitintool",$update)) {
  1173. turnitintool_print_error('turnitintooldeleteerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1174. }
  1175. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=intro');
  1176. exit();
  1177. } else {
  1178. turnitintool_print_error('permissiondeniederror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1179. exit();
  1180. }
  1181. return $notice;
  1182. }
  1183. /**
  1184. * Outputs the part form HTML
  1185. * @param object $cm The moodle course module object for this instance
  1186. * @param object $part The moodle course module object for this instance
  1187. * @return string Return the part form HTML output
  1188. */
  1189. function turnitintool_partform($cm,$part) {
  1190. global $CFG, $OUTPUT;
  1191. $output='<form name="partform" method="POST" action="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=intro">'.PHP_EOL;
  1192. $element=new MoodleQuickForm_hidden('submitted');
  1193. $element->setValue($part->id);
  1194. $output.=$element->toHTML().PHP_EOL;
  1195. $table = new stdClass();
  1196. $table->width='100%';
  1197. $table->id='uploadtableid';
  1198. $table->class='uploadtable';
  1199. // Part Name Field
  1200. unset($cells);
  1201. $cells[0] = new stdClass();
  1202. $cells[0]->data=get_string('partname','turnitintool');
  1203. $cells[0]->class='cell c0';
  1204. $attr=array('class'=>"formwide");
  1205. $element=new MoodleQuickForm_text('partname',null,$attr);
  1206. $element->setValue($part->partname);
  1207. $cells[1] = new stdClass();
  1208. $cells[1]->data=$element->toHTML();
  1209. $cells[1]->class='cell c1';
  1210. $table->rows[0] = new stdClass();
  1211. $table->rows[0]->cells=$cells;
  1212. $dateoptions=array('startyear' => date( 'Y', strtotime( '-6 years' )), 'stopyear' => date( 'Y', strtotime( '+6 years' )),
  1213. 'timezone' => 99, 'applydst' => true, 'step' => 1, 'optional' => false);
  1214. // Part Start Date
  1215. unset($cells);
  1216. $cells[0] = new stdClass();
  1217. $cells[0]->data=get_string('dtstart','turnitintool');
  1218. $cells[0]->class='cell c0';
  1219. $element=new MoodleQuickForm_date_time_selector('dtstart',null,$dateoptions);
  1220. $date = array('hour'=>userdate($part->dtstart,'%H'),
  1221. 'minute'=>userdate($part->dtstart,'%M'),
  1222. 'day'=>userdate($part->dtstart,'%d'),
  1223. 'month'=>userdate($part->dtstart,'%m'),
  1224. 'year'=>userdate($part->dtstart,'%Y')
  1225. );
  1226. $element->setValue($date);
  1227. $cells[1] = new stdClass();
  1228. $cells[1]->data=$element->toHTML();
  1229. $cells[1]->class='cell c1';
  1230. $table->rows[1] = new stdClass();
  1231. $table->rows[1]->cells=$cells;
  1232. // Part Due Date
  1233. unset($cells);
  1234. $cells[0] = new stdClass();
  1235. $cells[0]->data=get_string('dtdue','turnitintool');
  1236. $cells[0]->class='cell c0';
  1237. $element=new MoodleQuickForm_date_time_selector('dtdue',null,$dateoptions);
  1238. $date = array('hour'=>userdate($part->dtdue,'%H'),
  1239. 'minute'=>userdate($part->dtdue,'%M'),
  1240. 'day'=>userdate($part->dtdue,'%d'),
  1241. 'month'=>userdate($part->dtdue,'%m'),
  1242. 'year'=>userdate($part->dtdue,'%Y')
  1243. );
  1244. $element->setValue($date);
  1245. $cells[1] = new stdClass();
  1246. $cells[1]->data=$element->toHTML();
  1247. $cells[1]->class='cell c1';
  1248. $table->rows[2] = new stdClass();
  1249. $table->rows[2]->cells=$cells;
  1250. // Part Post Date
  1251. unset($cells);
  1252. $cells[0] = new stdClass();
  1253. $cells[0]->data=get_string('dtpost','turnitintool');
  1254. $cells[0]->class='cell c0';
  1255. $element=new MoodleQuickForm_date_time_selector('dtpost',null,$dateoptions);
  1256. $date = array('hour'=>userdate($part->dtpost,'%H'),
  1257. 'minute'=>userdate($part->dtpost,'%M'),
  1258. 'day'=>userdate($part->dtpost,'%d'),
  1259. 'month'=>userdate($part->dtpost,'%m'),
  1260. 'year'=>userdate($part->dtpost,'%Y')
  1261. );
  1262. $element->setValue($date);
  1263. $cells[1] = new stdClass();
  1264. $cells[1]->data=$element->toHTML();
  1265. $cells[1]->class='cell c1';
  1266. $table->rows[3] = new stdClass();
  1267. $table->rows[3]->cells=$cells;
  1268. // Part Max Marks
  1269. unset($cells);
  1270. $cells[0] = new stdClass();
  1271. $cells[0]->data=get_string('maxmarks','turnitintool');
  1272. $cells[0]->class='cell c0';
  1273. $element=new MoodleQuickForm_text('maxmarks');
  1274. $element->setValue($part->maxmarks);
  1275. $cells[1] = new stdClass();
  1276. $cells[1]->data=$element->toHTML();
  1277. $cells[1]->class='cell c1';
  1278. $table->rows[4] = new stdClass();
  1279. $table->rows[4]->cells=$cells;
  1280. // Submit / Cancel
  1281. unset($cells);
  1282. $cells[0] = new stdClass();
  1283. $cells[0]->data='&nbsp;';
  1284. $cells[0]->class='cell c0';
  1285. $attr=array('onclick'=>"location.href='".$CFG->wwwroot."/mod/turnitintool/view.php?id=".$cm->id."';");
  1286. $element=new MoodleQuickForm_button('cancel','Cancel',$attr);
  1287. $cells[1] = new stdClass();
  1288. $cells[1]->data=$element->toHTML();
  1289. $element=new MoodleQuickForm_submit('submit','Submit');
  1290. $cells[1]->data.=$element->toHTML();
  1291. $cells[1]->class='cell c1';
  1292. $table->rows[5] = new stdClass();
  1293. $table->rows[5]->cells=$cells;
  1294. $output.=turnitintool_print_table($table,true);
  1295. $output.='</form>'.PHP_EOL;
  1296. return $output;
  1297. }
  1298. /**
  1299. * Prints the summary page
  1300. *
  1301. * @param object $cm The moodle course module object for this instance
  1302. * @param object $turnitintool The turnitintool object is for this activity
  1303. * @param array $notice A notice array of error details passed if a part update or delete requests fails
  1304. * @return string Returns the output to print to screen
  1305. */
  1306. function turnitintool_introduction($cm,$turnitintool,$notice='') {
  1307. global $CFG,$USER;
  1308. $output='<style language="text/css">
  1309. .generaltable .c0 {
  1310. font-weight: bold;
  1311. background-color: #F3F3F3;
  1312. }
  1313. </style>';
  1314. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive','introduction',true);
  1315. $table = new stdClass();
  1316. $table->width='100%';
  1317. $table->id='uploadtableid';
  1318. $table->class='uploadtable';
  1319. unset($cells);
  1320. $cells[0] = new stdClass();
  1321. $cells[0]->data=get_string('turnitintoolname', 'turnitintool');
  1322. $cells[0]->class='cell c0';
  1323. $cells[1] = new stdClass();
  1324. $cells[1]->data=$turnitintool->name;
  1325. $cells[1]->class='cell c1';
  1326. $table->rows[0] = new stdClass();
  1327. $table->rows[0]->cells=$cells;
  1328. $exportdisabled=false;
  1329. // Get the post date for the last available part
  1330. if (!$part=turnitintool_get_record_select('turnitintool_parts','turnitintoolid='.$turnitintool->id.' AND deleted = 0','max(dtpost) AS dtpost')) {
  1331. turnitintool_print_error('partgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1332. exit();
  1333. } else if ( $part->dtpost > time() AND $turnitintool->anon > 0 ) {
  1334. // Check to see if we make the exports available or not
  1335. $exportdisabled=true;
  1336. }
  1337. // Get the start date for the first available part
  1338. if (!$part=turnitintool_get_record_select('turnitintool_parts','turnitintoolid='.$turnitintool->id.' AND deleted = 0','min(dtstart) AS dtstart')) {
  1339. turnitintool_print_error('partgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1340. exit();
  1341. }
  1342. if ($part->dtstart < time() OR has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  1343. if ( is_callable('format_module_intro') ) {
  1344. $intro=format_module_intro( 'turnitintool', $turnitintool, $cm->id );
  1345. } else {
  1346. $intro=$turnitintool->intro;
  1347. }
  1348. } else {
  1349. $intro=get_string('notavailableyet','turnitintool');
  1350. }
  1351. unset($cells);
  1352. $cells[0] = new stdClass();
  1353. $cells[0]->data=get_string('turnitintoolintro', 'turnitintool');
  1354. $cells[0]->class='cell c0';
  1355. $cells[1] = new stdClass();
  1356. $cells[1]->data=$intro;
  1357. $cells[1]->class='cell c1';
  1358. $table->rows[1] = new stdClass();
  1359. $table->rows[1]->cells=$cells;
  1360. $context = get_context_instance(CONTEXT_MODULE, $cm->id);
  1361. if (has_capability('mod/turnitintool:grade', $context)) {
  1362. unset($cells);
  1363. $cells[0] = new stdClass();
  1364. $cells[0]->data=get_string('turnitintutors','turnitintool');
  1365. $cells[0]->class='cell c0';
  1366. $cells[1] = new stdClass();
  1367. $cells[1]->data='<a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=tutors" title="'.
  1368. get_string('edit','turnitintool').'"><img src="pix/user-group-edit.png" class="tiiicons" alt="'.get_string('edit','turnitintool').'" /></a>';
  1369. $cells[1]->class='cell c1';
  1370. $table->rows[2] = new stdClass();
  1371. $table->rows[2]->cells=$cells;
  1372. }
  1373. $output.=turnitintool_print_table($table,true);
  1374. $output.=turnitintool_box_end(true);
  1375. unset($table);
  1376. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive', 'partsummary',true);
  1377. if (!$parts=turnitintool_get_records_select("turnitintool_parts","turnitintoolid='".$turnitintool->id."' AND deleted=0","dtstart,dtdue,dtpost,id")) {
  1378. turnitintool_print_error('partgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1379. }
  1380. $vars='';
  1381. foreach ($parts as $part) {
  1382. if (!empty($vars)) {
  1383. $vars.=':';
  1384. }
  1385. $vars.=$part->id;
  1386. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) { // TUTOR ONLY
  1387. $param_part=optional_param('part',null,PARAM_CLEAN);
  1388. if (!is_null($param_part) AND $param_part==$part->id) {
  1389. $output.=turnitintool_partform($cm,$part);
  1390. $output.=turnitintool_box_end(true);
  1391. return $output;
  1392. }
  1393. }
  1394. }
  1395. // Create the actual initial Table with the part summaries
  1396. $table = new stdClass();
  1397. $table->width='100%';
  1398. $table->id='submissionTableId';
  1399. $table->class='submissionTable';
  1400. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) { // DO TUTOR HEADERS
  1401. unset($cells);
  1402. $cells[0] = new stdClass();
  1403. $cells[0]->data=get_string('partname','turnitintool');
  1404. $cells[0]->class="header c0 partcell";
  1405. $cells[1] = new stdClass();
  1406. $cells[1]->data=get_string('dtstart','turnitintool');
  1407. $cells[1]->class="header c1 datecell";
  1408. $cells[2] = new stdClass();
  1409. $cells[2]->data=get_string('dtdue','turnitintool');
  1410. $cells[2]->class="header c2 datecell";
  1411. $cells[3] = new stdClass();
  1412. $cells[3]->data=get_string('dtpost','turnitintool');
  1413. $cells[3]->class="header c3 datecell";
  1414. $cells[4] = new stdClass();
  1415. $cells[4]->data=get_string('maxmarks','turnitintool');
  1416. $cells[4]->class="header c4 markscell";
  1417. $cells[5] = new stdClass();
  1418. $cells[5]->data=get_string('downloadexport','turnitintool');
  1419. $cells[5]->class="header c5 markscell";
  1420. $cells[6] = new stdClass();
  1421. $cells[6]->data='&nbsp;';
  1422. $cells[6]->class="header c6 iconcell";
  1423. $cells[7] = new stdClass();
  1424. $cells[7]->data='&nbsp;';
  1425. $cells[7]->class="header c7 iconcell";
  1426. $table->rows[0] = new stdClass();
  1427. $table->rows[0]->cells=$cells;
  1428. unset($cells);
  1429. } else { // Do Student Headers
  1430. unset($cells);
  1431. $cells[0] = new stdClass();
  1432. $cells[0]->data=get_string('partname','turnitintool');
  1433. $cells[0]->class="header c0 partcell";
  1434. $cells[1] = new stdClass();
  1435. $cells[1]->data=get_string('dtstart','turnitintool');
  1436. $cells[1]->class="header c1 datecell";
  1437. $cells[2] = new stdClass();
  1438. $cells[2]->data=get_string('dtdue','turnitintool');
  1439. $cells[2]->class="header c2 datecell";
  1440. $cells[3] = new stdClass();
  1441. $cells[3]->data=get_string('dtpost','turnitintool');
  1442. $cells[3]->class="header c3 datecell";
  1443. $cells[4] = new stdClass();
  1444. $cells[4]->data=get_string('maxmarks','turnitintool');
  1445. $cells[4]->class="header c4 markscell";
  1446. $table->rows[0] = new stdClass();
  1447. $table->rows[0]->cells=$cells;
  1448. unset($cells);
  1449. }
  1450. $row=0;
  1451. foreach($parts as $part) {
  1452. $row++;
  1453. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) { // DO TUTOR VIEW
  1454. $cells[0] = new stdClass();
  1455. $cells[0]->data='<span id="partnametext_'.$part->id.'">'.$part->partname.'</span>';
  1456. $cells[0]->class="cell c0 partcell";
  1457. $cells[1] = new stdClass();
  1458. $cells[1]->data='<span id="dtstarttext_'.$part->id.'">'.userdate($part->dtstart,get_string('strftimedatetimeshort','langconfig')).'</span>';
  1459. $cells[1]->class="cell c1 datecell";
  1460. $cells[2] = new stdClass();
  1461. $cells[2]->data='<span id="dtduetext_'.$part->id.'">'.userdate($part->dtdue,get_string('strftimedatetimeshort','langconfig')).'</span>';
  1462. $cells[2]->class="cell c2 datecell";
  1463. $cells[3] = new stdClass();
  1464. $cells[3]->data='<span id="dtposttext_'.$part->id.'">'.userdate($part->dtpost,get_string('strftimedatetimeshort','langconfig')).'</span>';
  1465. $cells[3]->class="cell c3 datecell";
  1466. $cells[4] = new stdClass();
  1467. $cells[4]->data='<span id="maxmarkstext_'.$part->id.'">'.$part->maxmarks.'</span>';
  1468. $cells[4]->class="cell c4 markscell";
  1469. $cells[5] = new stdClass();
  1470. if (turnitintool_count_records_select('turnitintool_submissions','submission_part='.$part->id.' AND submission_objectid IS NOT NULL') AND !$exportdisabled ) {
  1471. $url = $CFG->wwwroot . '/mod/turnitintool/view.php?id=' . $cm->id;
  1472. $url .= '&jumppage=zipfile&userid=' . $USER->id . '&partid=' . $part->id . '&utp=2';
  1473. $cells[5]->data='<a href="' . $url . '&export_data=1" onclick="screenOpen(this.href,\'\',\'0\',null,\'width=450,height=200\');'
  1474. .'return false;" target="_blank" title="'.get_string('downloadorigzip','turnitintool')
  1475. .'"><img src="pix/file.png" class="tiiicons" alt="'.get_string('downloadorigzip','turnitintool')
  1476. .'" id="orig_'.$row.'" /></a></span>'.PHP_EOL;
  1477. $cells[5]->data.='<a href="' . $url . '&export_data=2' .'" onclick="screenOpen(this.href,\'\',\'0\',null,\'width=450,height=200\');'
  1478. .'return false;" target="_blank" title="'.get_string('downloadpdfzip','turnitintool')
  1479. .'"><img src="pix/file-pdf.png" class="tiiicons" alt="'.get_string('downloadpdfzip','turnitintool')
  1480. .'" id="pdf_'.$row.'" /></a></span>'.PHP_EOL.'<a href="'.$CFG->wwwroot.'/mod/turnitintool/filelink.php?id='.$cm->id
  1481. .'&part='.$part->id.'" title="'.get_string('downloadgradexls','turnitintool')
  1482. .'"><img src="pix/file-xls.png" class="tiiicons" alt="'.get_string('downloadgradexls','turnitintool')
  1483. .'" id="excel_'.$row.'" /></a></span>';
  1484. } else {
  1485. $cells[5]->data='-';
  1486. }
  1487. $cells[5]->class="cell c5 markscell";
  1488. $cells[6] = new stdClass();
  1489. $cells[6]->data='<span id="ticktext_'.$part->id.'"><a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id
  1490. .'&part='.$part->id.'" title="'.get_string('edit','turnitintool')
  1491. .'"><img src="pix/window-osx-edit.png" class="tiiicons" alt="'.get_string('edit','turnitintool').'" id="edit_'.$row.'" /></a></span>';
  1492. $cells[6]->class="cell c6 iconcell";
  1493. if (turnitintool_count_records('turnitintool_submissions','turnitintoolid',$turnitintool->id,'submission_part',$part->id)>0) {
  1494. $fnd = array("\n","\r");
  1495. $rep = array('\n','\r');
  1496. $warning=' onclick="return confirm(\''.str_replace($fnd, $rep, get_string('partdeletewarning','turnitintool')).'\');"';
  1497. } else {
  1498. $warning='';
  1499. }
  1500. $cells[7] = new stdClass();
  1501. $cells[7]->data=(count($parts)>1) ? '<a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.
  1502. '?id='.$cm->id.'&do=intro&delpart='.$part->id.'" title="'.get_string('delete','turnitintool').
  1503. '"'.$warning.'><img src="pix/delete.png" class="tiiicons" alt="'.get_string('delete','turnitintool').'" /></a>' : '';
  1504. $cells[7]->class="cell c9 iconcell";
  1505. } else { // DO STUDENT VIEW
  1506. $cells[0] = new stdClass();
  1507. $cells[0]->data=$part->partname;
  1508. $cells[0]->class="cell c0 partcell";
  1509. $cells[1] = new stdClass();
  1510. $cells[1]->data=userdate($part->dtstart,get_string('strftimedatetimeshort','langconfig'));
  1511. $cells[1]->class="cell c1 datecell";
  1512. $cells[2] = new stdClass();
  1513. $cells[2]->data=userdate($part->dtdue,get_string('strftimedatetimeshort','langconfig'));
  1514. $cells[2]->class="cell c2 datecell";
  1515. $cells[3] = new stdClass();
  1516. $cells[3]->data=userdate($part->dtpost,get_string('strftimedatetimeshort','langconfig'));
  1517. $cells[3]->class="cell c3 datecell";
  1518. $cells[4] = new stdClass();
  1519. $cells[4]->data=$part->maxmarks;
  1520. $cells[4]->class="cell c4 markscell";
  1521. }
  1522. $table->rows[$row] = new stdClass();
  1523. $table->rows[$row]->cells = new stdClass();
  1524. $table->rows[$row]->cells=$cells;
  1525. $table->rows[$row]->class="row r".(($row%2) ? 0 : 1);
  1526. unset($cells);
  1527. }
  1528. $output.=turnitintool_print_table($table,true);
  1529. if (isset($editpart)) {
  1530. $output.=$editpart;
  1531. }
  1532. $output.=turnitintool_box_end(true);
  1533. return $output;
  1534. }
  1535. /**
  1536. * Queries Turnitin for the tutors enrolled on the Turnitin Class
  1537. *
  1538. * @param object $cm The moodle course module object for this instance
  1539. * @param object $turnitintool The turnitintool object is for this activity
  1540. * @return string Returns the output to print to screen
  1541. */
  1542. function turnitintool_get_tiitutors($cm,$turnitintool) {
  1543. $return=null;
  1544. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  1545. $loaderbar = null;
  1546. $owner=turnitintool_get_owner($turnitintool->course);
  1547. $owneruid=turnitintool_getUID($owner);
  1548. $tii = new turnitintool_commclass($owneruid,$owner->firstname,$owner->lastname,$owner->email,2,$loaderbar);
  1549. $post = new stdClass();
  1550. $post->cid=turnitintool_getCID($turnitintool->course);
  1551. $post->ctl=turnitintool_getCTL($turnitintool->course);
  1552. $tutors=$tii->getTutors($post,get_string('turnitintutorsretrieving','turnitintool'));
  1553. if ($tii->getRerror()) {
  1554. $return = new stdClass();
  1555. $return->error=$tii->getRmessage();
  1556. $return->array=null;
  1557. } else {
  1558. $return = new stdClass();
  1559. $return->error=null;
  1560. $return->array=$tutors;
  1561. }
  1562. }
  1563. return $return;
  1564. }
  1565. /**
  1566. * Removes tutor from enrolled tutors on Turnitin
  1567. *
  1568. * @param object $cm The moodle course module object for this instance
  1569. * @param object $turnitintool The turnitintool object is for this activity
  1570. * @param int $tutor The moodle user id to unenrol
  1571. * @return string Returns the output to print to screen
  1572. */
  1573. function turnitintool_remove_tiitutor($cm,$turnitintool,$tutor) {
  1574. $return=null;
  1575. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  1576. $loaderbar = new turnitintool_loaderbarclass(4);
  1577. $thisuser=turnitintool_get_moodleuser($tutor);
  1578. $thisuid=turnitintool_getUID($thisuser);
  1579. $tii = new turnitintool_commclass($thisuid,$thisuser->firstname,$thisuser->lastname,$thisuser->email,2,$loaderbar);
  1580. $tii->startSession();
  1581. $post = new stdClass();
  1582. $post->cid=turnitintool_getCID($turnitintool->course);
  1583. $post->ctl=turnitintool_getCTL($turnitintool->course);
  1584. $return = new stdClass();
  1585. $return->error=null;
  1586. $return->array=null;
  1587. $tutors=$tii->getTutors($post,get_string('turnitintutorsretrieving','turnitintool'));
  1588. if (count($tutors)==1) {
  1589. $return->error=get_string('turnitintutorsremove_errorlast','turnitintool');
  1590. $return->array=null;
  1591. } else {
  1592. if ($owner=turnitintool_get_owner($turnitintool->course) AND $owner->id==$tutor) {
  1593. foreach ($tutors as $tutorobj) {
  1594. if ((string)$tutorobj->email!=$owner->email) {
  1595. $loaderbar->total=$loaderbar->total+1;
  1596. $post->new_teacher_email=(string)$tutorobj->email;
  1597. $tii->changeOwner($post,get_string('changingowner','turnitintool'));
  1598. unset($post->new_teacher_email);
  1599. $newowner=turnitintool_get_record_select('user',"email='".$tutorobj->email."'");
  1600. $tiicourse=turnitintool_get_record('turnitintool_courses','courseid',$turnitintool->course);
  1601. $tiicourse->ownerid=$newowner->id;
  1602. turnitintool_update_record('turnitintool_courses',$tiicourse);
  1603. break;
  1604. }
  1605. }
  1606. }
  1607. $tii->unenrolUser($post,get_string('turnitintutorsretrieving','turnitintool'));
  1608. }
  1609. if ($tii->getRerror()) {
  1610. $return->error=$tii->getRmessage();
  1611. $return->array=null;
  1612. } else {
  1613. $return->array=$tutors;
  1614. }
  1615. $tii->endSession();
  1616. }
  1617. return $return;
  1618. }
  1619. /**
  1620. * Outputs the tutors enrolled on the Turnitin Class
  1621. *
  1622. * @param object $cm The moodle course module object for this instance
  1623. * @param object $turnitintool The turnitintool object is for this activity
  1624. * @return string Returns the output to print to screen
  1625. */
  1626. function turnitintool_view_tiitutors($cm,$turnitintool,$tutors) {
  1627. global $CFG;
  1628. $table = new stdClass();
  1629. $table->width='85%';
  1630. $table->tablealign='center';
  1631. $table->class='submissionTable';
  1632. $table->rows[0] = new stdClass();
  1633. $table->rows[0]->cells[0] = new stdClass();
  1634. $table->rows[0]->cells[0]->class='header c0 iconcell';
  1635. $table->rows[0]->cells[0]->data='';
  1636. $table->rows[0]->cells[1] = new stdClass();
  1637. $table->rows[0]->cells[1]->class='header c1 iconcell';
  1638. $table->rows[0]->cells[1]->data='';
  1639. $table->rows[0]->cells[2] = new stdClass();
  1640. $table->rows[0]->cells[2]->class='header c2';
  1641. $table->rows[0]->cells[2]->data=get_string('turnitintutors','turnitintool');
  1642. $i=0;
  1643. foreach ($tutors->array as $value) {
  1644. $uid = (string)$value->uid;
  1645. if (!$tiiuser=turnitintool_get_record('turnitintool_users','turnitin_uid',$uid)) {
  1646. continue;
  1647. } else {
  1648. $i++;
  1649. $user=turnitintool_get_moodleuser($tiiuser->userid);
  1650. $table->rows[$i]->cells[0] = new stdClass();
  1651. $table->rows[$i]->cells[0]->class='cell c0 iconcell';
  1652. $table->rows[$i]->cells[0]->data='<a href="'.$CFG->wwwroot
  1653. .'/mod/turnitintool/view.php?id='.$cm->id.'&do=tutors&unenrol='
  1654. .$tiiuser->userid.'" title="'.get_string('turnitintutorsremove','turnitintool')
  1655. .'"><img src="pix/delete.png" alt="'
  1656. .get_string('turnitintutorsremove','turnitintool').'" class="tiiicons" /></a>';
  1657. $table->rows[$i]->cells[1] = new stdClass();
  1658. $table->rows[$i]->cells[1]->class='cell c1 iconcell';
  1659. $owner=turnitintool_get_owner($turnitintool->course);
  1660. if ($owner->id==$user->id) {
  1661. $table->rows[$i]->cells[1]->data='<a><img src="pix/ownerstar.gif" alt="'
  1662. .get_string('turnitintoolowner','turnitintool').'" class="tiiicons" /></a>';
  1663. } else {
  1664. $table->rows[$i]->cells[1]->data='<a href="'.$CFG->wwwroot
  1665. .'/mod/turnitintool/view.php?id='.$cm->id.'&do=changeowner&owner='
  1666. .$tiiuser->userid.'" title="'.get_string('changeowner','turnitintool')
  1667. .'"><img src="pix/ownerstar_grey.gif" alt="'
  1668. .get_string('changeowner','turnitintool').'" class="tiiicons" /></a>';
  1669. }
  1670. $table->rows[$i]->cells[2] = new stdClass();
  1671. $table->rows[$i]->cells[2]->class='cell c2';
  1672. $table->rows[$i]->cells[2]->data='<a href="'.$CFG->wwwroot
  1673. .'/user/view.php?id='.$tiiuser->userid.'&course='.$turnitintool->course
  1674. .'">'.(string)$value->lastname.', '.(string)$value->firstname.'</a>'.' ('.$user->username.')';
  1675. }
  1676. }
  1677. turnitintool_box_start('generalbox boxwidthwide boxaligncenter', 'general');
  1678. echo print_string('turnitintutors_desc','turnitintool');
  1679. turnitintool_box_end();
  1680. turnitintool_print_table($table);
  1681. unset($table);
  1682. $table = new stdClass();
  1683. $table->width='85%';
  1684. $table->tablealign='center';
  1685. $table->class='uploadtable';
  1686. $table->rows[0] = new stdClass();
  1687. $table->rows[0]->cells[0] = new stdClass();
  1688. $table->rows[0]->cells[0]->class='cell c0';
  1689. $table->rows[0]->cells[0]->data=get_string('turnitintutors','turnitintool');
  1690. $table->rows[0]->cells[1] = new stdClass();
  1691. $table->rows[0]->cells[1]->class='cell c1';
  1692. $context = get_context_instance(CONTEXT_MODULE, $cm->id);
  1693. $availabletutors=get_users_by_capability($context,'mod/turnitintool:grade','u.id,u.firstname,u.lastname,u.username','','','',0,'',false);
  1694. $tutorselection=get_string('turnitintutorsallenrolled','turnitintool');
  1695. foreach ($tutors->array as $value) {
  1696. $idarray[]=(string)$value->userid;
  1697. }
  1698. $options='';
  1699. foreach ($availabletutors as $available) {
  1700. if (!in_array(turnitintool_getUID($available),$idarray)) {
  1701. $options.='<option value="'.$available->id.'" label="'.$available->lastname.', '.$available->firstname
  1702. .' ('.$available->username.')">'.$available->lastname.', '
  1703. .$available->firstname.' ('.$available->username.')</option>';
  1704. }
  1705. }
  1706. if (!empty($options)) {
  1707. $tutorselection='<select name="enroltutor">'.PHP_EOL;
  1708. $tutorselection.=$options.PHP_EOL;
  1709. $tutorselection.='</select>'.PHP_EOL;
  1710. }
  1711. $table->rows[0]->cells[1]->data=$tutorselection;
  1712. if (!empty($options)) {
  1713. $table->rows[1] = new stdClass();
  1714. $table->rows[1]->cells[0] = new stdClass();
  1715. $table->rows[1]->cells[0]->class='cell c0';
  1716. $table->rows[1]->cells[0]->data='&nbsp;';
  1717. $table->rows[1]->cells[1] = new stdClass();
  1718. $table->rows[1]->cells[1]->class='cell c1';
  1719. $table->rows[1]->cells[1]->data='<input type="submit" value="'.get_string('turnitintutorsadd','turnitintool').'" />';
  1720. }
  1721. turnitintool_box_start('generalbox boxwidthwide boxaligncenter', 'general');
  1722. echo '<form method="POST" action="'.$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=tutors">';
  1723. turnitintool_print_table($table);
  1724. echo '</form>';
  1725. turnitintool_box_end();
  1726. }
  1727. /**
  1728. * Adds / Deletes a tutor to the list enrolled on the Turnitin Class
  1729. *
  1730. * @param object $cm The moodle course module object for this instance
  1731. * @param object $turnitintool The turnitintool object is for this activity
  1732. * @param int $tutor The moodle user id to unenrol
  1733. * @return string Returns the output to print to screen
  1734. */
  1735. function turnitintool_add_tiitutor($cm,$turnitintool,$tutor) {
  1736. $return=null;
  1737. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  1738. $loaderbar = new turnitintool_loaderbarclass(4);
  1739. $thisuser=turnitintool_get_moodleuser($tutor);
  1740. $thisuid=turnitintool_getUID($thisuser);
  1741. if (is_null($thisuid)) {
  1742. $tii = new turnitintool_commclass($thisuid,$thisuser->firstname,$thisuser->lastname,$thisuser->email,2,$loaderbar);
  1743. $tii->startSession();
  1744. turnitintool_usersetup($thisuser,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  1745. $tii->endSession();
  1746. $thisuid=turnitintool_getUID($thisuser);
  1747. }
  1748. $tii = new turnitintool_commclass($thisuid,$thisuser->firstname,$thisuser->lastname,$thisuser->email,2,$loaderbar);
  1749. $tii->startSession();
  1750. $post = new stdClass();
  1751. $post->cid=turnitintool_getCID($turnitintool->course);
  1752. $post->ctl=turnitintool_getCTL($turnitintool->course);
  1753. $return = new stdClass();
  1754. $return->error=null;
  1755. $return->array=null;
  1756. $tutors=$tii->getTutors($post,get_string('turnitintutorsretrieving','turnitintool'));
  1757. $tii->enrolTutor($post,get_string('turnitintutorsadding','turnitintool'));
  1758. if ($tii->getRerror()) {
  1759. $return->error=$tii->getRmessage();
  1760. $return->array=null;
  1761. } else {
  1762. $return->array=$tutors;
  1763. }
  1764. $tii->endSession();
  1765. }
  1766. return $return;
  1767. }
  1768. /**
  1769. * Processes the owner change form
  1770. *
  1771. * @param object $cm The moodle course module object for this instance
  1772. * @param object $turnitintool The turnitintool object is for this activity
  1773. * @param var $newid The Moodle User ID of the proposed new Turnitin Class Owner
  1774. */
  1775. function turnitintool_ownerprocess($cm,$turnitintool,$newid) {
  1776. // Firstly Double Check to make sure this user is a tutor on this course
  1777. if ($newid!='NULL') {
  1778. $context = get_context_instance(CONTEXT_MODULE, $cm->id);
  1779. $isadmin=false;
  1780. if (has_capability('moodle/site:config',get_context_instance(CONTEXT_SYSTEM))) {
  1781. $isadmin=true;
  1782. }
  1783. $allusers=get_users_by_capability($context, 'mod/turnitintool:grade', "u.id AS id", '', '', '', 0, '', true);
  1784. if (!isset($allusers[$newid]) AND !$isadmin) {
  1785. turnitintool_print_error('permissiondeniederror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1786. exit();
  1787. } else {
  1788. $owner=turnitintool_get_owner($turnitintool->course);
  1789. $owneruid=turnitintool_getUID($owner);
  1790. $newowner=turnitintool_get_moodleuser($newid);
  1791. $newowneruid=turnitintool_getUID($newowner);
  1792. $loaderbar = new turnitintool_loaderbarclass(3);
  1793. $tii = new turnitintool_commclass($newowneruid,$newowner->firstname,$newowner->lastname,$newowner->email,2,$loaderbar);
  1794. if (is_null($newowneruid)) { // User doesnt exist -- create Turnitin user
  1795. $tii->startSession();
  1796. turnitintool_usersetup($newowner,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  1797. if ($tii->getRerror()) {
  1798. if ($tii->getAPIunavailable()) {
  1799. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1800. } else {
  1801. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  1802. }
  1803. exit();
  1804. }
  1805. $tii->endSession();
  1806. }
  1807. $post = new stdClass();
  1808. $post->cid=turnitintool_getCID($turnitintool->course);
  1809. $post->ctl=turnitintool_getCTL($turnitintool->course);
  1810. $tii->enrolTutor($post,get_string('changingowner','turnitintool'));
  1811. if ($tii->getRerror()) {
  1812. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  1813. turnitintool_print_error('<strong>'.get_string('turnitintoolupdateerror','turnitintool').'</strong><br />'.$reason,NULL,NULL,NULL,__FILE__,__LINE__);
  1814. exit();
  1815. } else {
  1816. $currcourse=turnitintool_get_record('turnitintool_courses','courseid',$turnitintool->course);
  1817. $update = new stdClass();
  1818. $update->id=$currcourse->id;
  1819. $update->ownerid=$newid;
  1820. if (!$dodb=turnitintool_update_record('turnitintool_courses',$update)) {
  1821. turnitintool_print_error('classupdateerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  1822. exit();
  1823. }
  1824. }
  1825. $tii->endSession();
  1826. }
  1827. }
  1828. }
  1829. /**
  1830. * Prints the date selection form elements in the format specified in the options for the activity
  1831. *
  1832. * @param string $fieldname A string used in the name attributes to distinguish one instance of this date selector form another
  1833. * @param array $selectedarray An array that stores details of the currently stored settings
  1834. * @return string Returns the output to print to screen
  1835. */
  1836. function turnitintool_dateselect($fieldname,$selectedarray=NULL) {
  1837. $date['h']='<select name="hour_'.$fieldname.'">';
  1838. for ($i=0;$i<=23;$i++) { // Days
  1839. if (!is_null($selectedarray) AND $selectedarray['h']==$i) {
  1840. $selected=' selected';
  1841. } else if (is_null($selectedarray) AND date('H',time())==$i) {
  1842. $selected=' selected';
  1843. } else {
  1844. $selected='';
  1845. }
  1846. $date['h'].='<option label="'.str_pad($i,2,"0",0).'" value="'.str_pad($i,2,"0",0).'"'.$selected.'>'.str_pad($i,2,"0",0).'</option>';
  1847. $selected='';
  1848. }
  1849. $date['h'].='</select>';
  1850. $date['min']='<select name="min_'.$fieldname.'">';
  1851. for ($i=0;$i<=59;$i++) { // Days
  1852. if (!is_null($selectedarray) AND $selectedarray['min']==$i) {
  1853. $selected=' selected';
  1854. } else if (is_null($selectedarray) AND date('i',time())==$i) {
  1855. $selected=' selected';
  1856. } else {
  1857. $selected='';
  1858. }
  1859. $date['min'].='<option label="'.str_pad($i,2,"0",0).'" value="'.str_pad($i,2,"0",0).'"'.$selected.'>'.str_pad($i,2,"0",0).'</option>';
  1860. $selected='';
  1861. }
  1862. $date['min'].='</select>';
  1863. $date['d']='<select name="day_'.$fieldname.'">';
  1864. for ($i=1;$i<=31;$i++) { // Days
  1865. if (!is_null($selectedarray) AND $selectedarray['d']==$i) {
  1866. $selected=' selected';
  1867. } else if (is_null($selectedarray) AND date('j',time())==$i) {
  1868. $selected=' selected';
  1869. } else {
  1870. $selected='';
  1871. }
  1872. $date['d'].='<option label="'.str_pad($i,2,"0",0).'" value="'.str_pad($i,2,"0",0).'"'.$selected.'>'.str_pad($i,2,"0",0).'</option>';
  1873. $selected='';
  1874. }
  1875. $date['d'].='</select>';
  1876. $date['m']='<select name="month_'.$fieldname.'">';
  1877. for ($i=1;$i<=12;$i++) { // Month
  1878. if (!is_null($selectedarray) AND $selectedarray['m']==$i) {
  1879. $selected=' selected';
  1880. } else if (is_null($selectedarray) AND date('n',time())==$i) {
  1881. $selected=' selected';
  1882. } else {
  1883. $selected='';
  1884. }
  1885. $date['m'].='<option label="'.str_pad($i,2,"0",0).'" value="'.str_pad($i,2,"0",0).'"'.$selected.'>'.str_pad($i,2,"0",0).'</option>';
  1886. $selected='';
  1887. }
  1888. $date['m'].='</select>';
  1889. $date['Y']='<select name="year_'.$fieldname.'">';
  1890. $theyear=date('Y',strtotime('-10 years'));
  1891. for ($i=1;$i<=20;$i++) { // Year
  1892. if (!is_null($selectedarray) AND $selectedarray['Y']==$theyear) {
  1893. $selected=' selected';
  1894. } else if (is_null($selectedarray) AND date('Y',time())==$theyear) {
  1895. $selected=' selected';
  1896. } else {
  1897. $selected='';
  1898. }
  1899. $date['Y'].='<option label="'.$theyear.'" value="'.$theyear.'"'.$selected.'>'.$theyear.'</option>';
  1900. $theyear++;
  1901. $selected='';
  1902. }
  1903. $date['Y'].='</select>';
  1904. $output='';
  1905. $output.=$date['h'].':'.$date['min'].',<br />';
  1906. $output.=$date['Y'].'/'.$date['m'].'/'.$date['d'];
  1907. return $output;
  1908. }
  1909. /**
  1910. * Outputs the file path for the user passed in the $userid parameter
  1911. *
  1912. * @global object
  1913. * @param object $cm The moodle course module object for this instance
  1914. * @param object $turnitintool The turnitintool object for this activity
  1915. * @param var $userid The moodle user ID for the user to return the file path of
  1916. * @return string Returns the file path
  1917. */
  1918. function turnitintool_file_path($cm,$turnitintool,$userid) {
  1919. global $CFG;
  1920. $seperator='/';
  1921. $output=$turnitintool->course.$seperator.$CFG->moddata.$seperator.'turnitintool'.$seperator.$turnitintool->id.$seperator.$userid;
  1922. return $output;
  1923. }
  1924. /**
  1925. * Outputs the file path for the user passed in the $userid parameter
  1926. *
  1927. * @global object
  1928. * @global object
  1929. * @param object $cm The moodle course module object for this instance
  1930. * @param object $turnitintool The turnitintool object for this activity
  1931. * @param object $submission A data object for the submission in turnitintool_submissions
  1932. * @return string A formatted html similarity score box with similarity score or '-' if it is not to be displayed or unavailable
  1933. */
  1934. function turnitintool_draw_similarityscore($cm,$turnitintool,$submission) {
  1935. global $CFG,$USER;
  1936. if (empty($submission->submission_objectid)) {
  1937. $score='-';
  1938. } else {
  1939. $result=$submission->submission_score;
  1940. $objectid=$submission->submission_objectid;
  1941. if (!is_null($objectid) AND (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id)) OR $turnitintool->studentreports)) {
  1942. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  1943. $utp=2;
  1944. } else {
  1945. $utp=1;
  1946. }
  1947. $thisuser=$USER;
  1948. if ((!is_null($result) AND !empty($result)) OR $result=="0") {
  1949. $style=turnitintool_percent_to_gradpos($result);
  1950. $style2="";
  1951. $result.='%';
  1952. $reportlink = $CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id . '&jumppage=report';
  1953. $reportlink .= '&userid=' . $thisuser->id . '&objectid=' . $submission->submission_objectid . '&utp=' . $utp;
  1954. $transmatch = ( $submission->submission_transmatch == 1 ) ? 'EN' : '&nbsp;';
  1955. $score='<div class="origLink"><a href="'.$reportlink.'" target="_blank" title="'.get_string('viewreport','turnitintool').
  1956. '" class="scoreLink" onclick="screenOpen(\''.$reportlink.'\',\''.$submission->id.'\',\''.
  1957. $turnitintool->autoupdates.'\');return false;"><span class="scoreBox"'.$style2.'>'.$result.'<span class="scoreColor"'.$style.'>'.$transmatch.'</span></span></a></div>';
  1958. } else {
  1959. $color='#FCFCFC';
  1960. $style=' style="background-color: '.$color.';text-align: center;"';
  1961. $style2=' style="padding: 0px;"';
  1962. $result=get_string('pending','turnitintool');
  1963. $score='<div class="origLink">
  1964. <a name="Pending" class="scoreLink"'.$style.'><span class="scoreBox"'.$style2.'>'.$result.'</span></a></div>';
  1965. }
  1966. } else {
  1967. $score='-';
  1968. }
  1969. }
  1970. return $score;
  1971. }
  1972. /**
  1973. * Outputs the file link for the submission passed in the $submission parameter
  1974. *
  1975. * @global object
  1976. * @global object
  1977. * @param object $cm The moodle course module object for this instance
  1978. * @param object $turnitintool The turnitintool object for this activity
  1979. * @param object $submission A data object for the submission in turnitintool_submissions
  1980. * @param boolean $download A boolean value that determines (if this is a Turnitin submission) whether to show the submission screen or download the file
  1981. * @return string A formatted html file link
  1982. */
  1983. function turnitintool_get_filelink($cm,$turnitintool,$submission,$download=false) {
  1984. global $CFG,$USER;
  1985. $context = get_context_instance(CONTEXT_MODULE, $cm->id);
  1986. if (empty($submission->submission_objectid)) {
  1987. if (is_callable("get_file_storage")) {
  1988. $filelink=$CFG->wwwroot.'/mod/turnitintool/filelink.php?id='.$cm->id.'&sub='.$submission->id;
  1989. } else {
  1990. $filelink=$CFG->wwwroot.'/file.php?file=/'.turnitintool_file_path($cm,$turnitintool,$submission->userid).'/'.str_replace(" ","_",$submission->submission_filename);
  1991. }
  1992. } else {
  1993. if (has_capability('mod/turnitintool:grade', $context)) {
  1994. $utp=2;
  1995. } else {
  1996. $utp=1;
  1997. }
  1998. $thisuser=$USER;
  1999. if (!$download) {
  2000. $filelink=$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&jumppage=submission&userid='.$thisuser->id.'&utp='.$utp.'&partid='.$submission->submission_part.'&objectid='.$submission->submission_objectid;
  2001. } else {
  2002. $filelink=$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&jumppage=download&userid='.$thisuser->id.'&utp='.$utp.'&partid='.$submission->submission_part.'&objectid='.$submission->submission_objectid;
  2003. }
  2004. }
  2005. return $filelink;
  2006. }
  2007. /**
  2008. * Outputs Student Submission Inbox
  2009. *
  2010. * @global object
  2011. * @global object
  2012. * @param object $cm The moodle course module object for this instance
  2013. * @param object $turnitintool The turnitintool object for this activity
  2014. * @return string Outputs the Students Submission Inbox
  2015. */
  2016. function turnitintool_view_student_submissions($cm,$turnitintool) {
  2017. global $CFG,$USER;
  2018. $output = '';
  2019. $param_do=optional_param('do',null,PARAM_CLEAN);
  2020. $i=0;
  2021. if (!has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  2022. // If a grading user (Tutor then this list is not needed)
  2023. if (!$submissions = turnitintool_get_records_select('turnitintool_submissions','userid='.$USER->id.' AND turnitintoolid='.$turnitintool->id,'id')) {
  2024. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter centertext eightyfive', 'nosubmissions',true);
  2025. $output.=get_string('nosubmissions','turnitintool');
  2026. $output.='<p>[<a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do='.$param_do.
  2027. '&update=1" title="'.get_string('synchyoursubmissions','turnitintool').
  2028. '" class="refreshLink">'.get_string('synchyoursubmissions','turnitintool').'</a>]</p>';
  2029. $output.=turnitintool_box_end(true);
  2030. } else {
  2031. $output.='
  2032. <div class="tabLinks">
  2033. <div style="display: none;" id="inboxNotice"><span style="background: url(pix/ajax-loader.gif) no-repeat left center;padding-left: 80px;">
  2034. <span style="background: url(pix/ajax-loader.gif) no-repeat right center;padding-right: 80px;">'
  2035. .get_string('turnitinloading','turnitintool').'</span></span></div>
  2036. <a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do='.$param_do.
  2037. '&update=1" onclick="refreshSubmissionsAjax();return false;"><img src="'.$CFG->wwwroot.'/mod/turnitintool/pix/refresh.gif" alt="'.
  2038. get_string('turnitinrefreshsubmissions','turnitintool').'" class="tiiicons" /> '.
  2039. get_string('turnitinrefreshsubmissions','turnitintool').'</a></div>';
  2040. $table = new stdClass();
  2041. $table->width='85%';
  2042. $table->tablealign='center';
  2043. $table->class='submissionTable';
  2044. $table->id='inboxTable';
  2045. $table->rows[0] = new stdClass();
  2046. $table->rows[0]->hcells[0] = new stdClass();
  2047. $table->rows[0]->hcells[0]->class='header c0 namecell';
  2048. $table->rows[0]->hcells[0]->data='<div>'.get_string('submission','turnitintool').'</div>';
  2049. $table->rows[0]->hcells[1] = new stdClass();
  2050. $table->rows[0]->hcells[1]->class='header c1 datecell';
  2051. $table->rows[0]->hcells[1]->data='<div>'.get_string('posted','turnitintool').'</div>';
  2052. $table->rows[0]->hcells[2] = new stdClass();
  2053. $table->rows[0]->hcells[2]->class='header c2 markscell';
  2054. $table->rows[0]->hcells[2]->data='<div>'.get_string('submissionorig','turnitintool').'</div>';
  2055. $table->rows[0]->hcells[3] = new stdClass();
  2056. $table->rows[0]->hcells[3]->class='header c3 markscell';
  2057. $table->rows[0]->hcells[3]->data='<div>'.get_string('submissiongrade','turnitintool').'</div>';
  2058. $table->rows[0]->hcells[4] = new stdClass();
  2059. $table->rows[0]->hcells[4]->class='header c4 markscell';
  2060. $table->rows[0]->hcells[4]->data='<div>'.get_string('feedback','turnitintool').'</div>';
  2061. $table->rows[0]->hcells[5] = new stdClass();
  2062. $table->rows[0]->hcells[5]->class='header c5 iconcell';
  2063. $table->rows[0]->hcells[5]->data='<div>&nbsp;</div>';
  2064. $table->rows[0]->hcells[6] = new stdClass();
  2065. $table->rows[0]->hcells[6]->class='header c6 iconcell';
  2066. $table->rows[0]->hcells[6]->data='<div>&nbsp;</div>';
  2067. $table->size=array('','14%','8%','8%','4%','4%','4%');
  2068. $table->align=array('left','center','center','center','center','center','center');
  2069. $table->valign=array('top','center','center','center','center','center','center');
  2070. $table->wrap=array(NULL,'nowrap','nowrap','nowrap','nowrap','nowrap','nowrap');
  2071. if (!$parts=turnitintool_get_records_select('turnitintool_parts','turnitintoolid='.$turnitintool->id.' AND deleted = 0')) {
  2072. turnitintool_print_error('partgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2073. exit();
  2074. }
  2075. $submissionids = array_keys( $submissions );
  2076. $submission_string = join( ',', $submissionids );
  2077. $comments = turnitintool_get_records_sql( 'SELECT submissionid, count( id ) AS count FROM {turnitintool_comments} WHERE submissionid IN ( '.$submission_string.' ) GROUP BY submissionid' );
  2078. $i=0;
  2079. foreach ($submissions as $submission) {
  2080. unset($cell);
  2081. $cell=array();
  2082. $part = $parts[ $submission->submission_part ];
  2083. $filelink=turnitintool_get_filelink($cm,$turnitintool,$submission);
  2084. $downloadlink=turnitintool_get_filelink($cm,$turnitintool,$submission,$download=true);
  2085. $link='';
  2086. if ($submission->submission_type==1) {
  2087. $submission_type_label=get_string('fileupload','turnitintool');
  2088. } else if ($submission->submission_type==2) {
  2089. $submission_type_label=get_string('textsubmission','turnitintool');
  2090. } else if ($submission->submission_type==3) {
  2091. $submission_type_label=get_string('webpage','turnitintool');
  2092. }
  2093. $doscript='';
  2094. if (!empty($submission->submission_objectid)) {
  2095. $doscript=' onclick="screenOpen(\''.$filelink.'\',\''.$submission->id.'\',\''.$turnitintool->autoupdates.'\');return false;"';
  2096. }
  2097. if ($turnitintool->numparts>1) {
  2098. $partnameoutput=$part->partname.' - ';
  2099. } else {
  2100. $partnameoutput='';
  2101. }
  2102. $downloadurl=turnitintool_get_filelink($cm,$turnitintool,$submission,$download=true);
  2103. $downscript='';
  2104. if (!empty($submission->submission_objectid)) {
  2105. $downscript=' onclick="screenOpen(\''.$downloadurl.'\',\''.$submission->id.'\',\''.$turnitintool->autoupdates.'\');return false;"';
  2106. }
  2107. $downloadlink='<a href="'.$downloadurl.'" class="tiiicons" target="_blank"'.$downscript.'>*</a>';
  2108. $link.='<a href="'.$filelink.'" target="_blank"'.$doscript.'>'.$partnameoutput.$submission->submission_title.'</a><br />';
  2109. // ###############################
  2110. // Do Submission to Turnitin Form
  2111. // ###############################
  2112. $modified='-';
  2113. if (empty($submission->submission_objectid)) {
  2114. $modified='<div class="submittoLinkSmall"><img src="'.$CFG->wwwroot.'/mod/turnitintool/icon.gif" /><a href="'.
  2115. $CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&up='.$submission->id.'">'.
  2116. get_string('submittoturnitin','turnitintool').'</a></div>';
  2117. } else if (!is_null($submission->id)) {
  2118. $modified=(empty($submission->submission_objectid)) ? '-' : userdate($submission->submission_modified,get_string('strftimedatetimeshort','langconfig'));
  2119. if ($submission->submission_modified>$part->dtdue) {
  2120. $modified='<span style="color: red;">'.$modified.'</span>';
  2121. }
  2122. }
  2123. // ###################################
  2124. // Get originality score if available
  2125. // ###################################
  2126. $score = turnitintool_draw_similarityscore($cm,$turnitintool,$submission);
  2127. // ###################################
  2128. // get Grade if available ############
  2129. // ###################################
  2130. $i++;
  2131. $grade=turnitintool_dogradeoutput($cm,$turnitintool,$submission,$part->dtdue,$part->dtpost,$part->maxmarks,'black','transparent',false);
  2132. $status='<b>'.get_string('status','turnitintool').':</b> '.get_string('submissionnotyetuploaded','turnitintool');
  2133. if (!empty($submission->submission_status)) {
  2134. $status='<b>'.get_string('status','turnitintool').':</b> '.$submission->submission_status;
  2135. }
  2136. // ###################################
  2137. // Get Comments / Feedback ###########
  2138. // ###################################
  2139. $num = isset( $comments[$submission->id] ) ? $comments[$submission->id]->count : 0;
  2140. $notes=turnitintool_getnoteslink($cm,$turnitintool,$submission,$num);
  2141. // ###################################
  2142. // Print Download Link ###############
  2143. // ###################################
  2144. if (!is_null($submission->submission_objectid)) {
  2145. $downscript=' onclick="screenOpen(this.href,\''.$submission->id.'\',false,null,\'width=450,height=200\');return false;"';
  2146. $download='<a href="'.turnitintool_get_filelink($cm,$turnitintool,$submission,true).'" title="'.
  2147. get_string('downloadsubmission','turnitintool').'" target="_blank"'.$downscript.'><img src="pix/file-download.png" alt="'.
  2148. get_string('downloadsubmission','turnitintool').'" class="tiiicons" /></a>';
  2149. } else {
  2150. $download='';
  2151. }
  2152. // ###################################
  2153. // Print Delete Button ###############
  2154. // ###################################
  2155. $fnd = array("\n","\r");
  2156. $rep = array('\n','\r');
  2157. if (empty($submission->submission_objectid)) {
  2158. $confirm=' onclick="return confirm(\''.str_replace($fnd, $rep, get_string('deleteconfirm','turnitintool')).'\');"';
  2159. } else if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  2160. $confirm=' onclick="return confirm(\''.str_replace($fnd, $rep, get_string('turnitindeleteconfirm','turnitintool')).'\')"';
  2161. } else {
  2162. $confirm=' onclick="return confirm(\''.str_replace($fnd, $rep, get_string('studentdeleteconfirm','turnitintool')).'\')"';
  2163. }
  2164. if (empty($submission->submission_objectid)
  2165. OR has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  2166. $delete='<a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&delete='.$submission->id.
  2167. '&do='.$param_do.'"'.$confirm.' title="'.get_string('deletesubmission','turnitintool').
  2168. '"><img src="pix/delete.png" alt="'.get_string('deletesubmission','turnitintool').'" class="tiiicons" /></a>';
  2169. } else {
  2170. $delete='-';
  2171. }
  2172. $cell[0] = new stdClass();
  2173. $cell[0]->data=$link.$status;
  2174. $cell[0]->class='cell c0';
  2175. $cell[1] = new stdClass();
  2176. $cell[1]->data=$modified;
  2177. $cell[1]->class='cell c1 datecell';
  2178. $cell[2] = new stdClass();
  2179. $cell[2]->data=$score;
  2180. $cell[2]->class='cell c2 markscell';
  2181. $cell[3] = new stdClass();
  2182. $cell[3]->data=$grade;
  2183. $cell[3]->class='cell c3 markscell';
  2184. $cell[4] = new stdClass();
  2185. $cell[4]->data=$notes;
  2186. $cell[4]->class='cell c4 markscell';
  2187. $cell[5] = new stdClass();
  2188. $cell[5]->data=$download;
  2189. $cell[5]->class='cell c5 iconcell';
  2190. $cell[6] = new stdClass();
  2191. $cell[6]->data=$delete;
  2192. $cell[6]->class='cell c6 iconcell';
  2193. $key=($i%2) ? 0 : 1;
  2194. $table->rows[$i] = new stdClass();
  2195. $table->rows[$i]->cells=$cell;
  2196. $table->rows[$i]->class='row r'.$key;
  2197. $i++;
  2198. }
  2199. $sessionrefresh = (isset($_SESSION['updatedscores'][$turnitintool->id]) AND $_SESSION['updatedscores'][$turnitintool->id]>0) ? '' : 'refreshSubmissionsAjax();';
  2200. $output .= '
  2201. <script type="text/javascript">
  2202. jQuery(document).ready(function() {
  2203. jQuery("#inboxTable").dataTable( { "sPaginationType": "full_numbers", "sDom": "r<\"top navbar\"lf><\"dt_page\"pi>t<\"bottom\"><\"dt_page\"pi>", } );
  2204. ' . $sessionrefresh . '
  2205. });
  2206. </script>';
  2207. $output.=turnitintool_print_table($table,true).'<br />';
  2208. if (!$turnitintool->studentreports) {
  2209. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive', 'introduction',true);
  2210. $output.=get_string('studentnotallowed','turnitintool');
  2211. $output.=turnitintool_box_end(true);
  2212. }
  2213. }
  2214. }
  2215. return $output;
  2216. }
  2217. /**
  2218. * Converts an array into a data object
  2219. *
  2220. * @param array $input An array to convert to an object
  2221. * @return object The converted array
  2222. */
  2223. function turnitintool_array_to_object($input) {
  2224. $output = new object();
  2225. foreach ($input as $key=>$value) {
  2226. if (!empty($key)) {
  2227. $output->$key = $value;
  2228. }
  2229. }
  2230. return $output;
  2231. }
  2232. /**
  2233. * Calculates and returns the overall grade for this activity
  2234. *
  2235. * @param array $input An array to convert to an object
  2236. * @return object The converted array
  2237. */
  2238. function turnitintool_overallgrade_old($turnitintool,$usersubmissions,$userid,$parts,$scale) {
  2239. $overallgrade=NULL;
  2240. $i=1;
  2241. foreach ($parts as $part) {
  2242. $weightarray[$part->id]=$part->maxmarks;
  2243. }
  2244. $overallweight=array_sum($weightarray);
  2245. if ($turnitintool->grade<0) { // Scale in use
  2246. $maxgrade=count(explode(",",$scale->scale));
  2247. } else {
  2248. $maxgrade=$turnitintool->grade;
  2249. }
  2250. foreach ($usersubmissions[$userid] as $usersubmission) {
  2251. if (!is_nan($usersubmission->submission_grade) AND !is_null($usersubmission->submission_grade) AND $weightarray[$usersubmission->submission_part]!=0) {
  2252. $overallgrade+=($usersubmission->submission_grade/$weightarray[$usersubmission->submission_part])
  2253. *($weightarray[$usersubmission->submission_part]/$overallweight)
  2254. *$maxgrade;
  2255. }
  2256. }
  2257. if (!is_null($overallgrade) AND $turnitintool->grade<0) {
  2258. return ($overallgrade==0) ? 1 : ceil($overallgrade);
  2259. } else {
  2260. return (!is_nan($overallgrade) AND !is_null($usersubmission->submission_grade)) ? number_format($overallgrade,1) : '-';
  2261. }
  2262. }
  2263. /**
  2264. * Calculates and returns the overall grade for this activity
  2265. *
  2266. * @param array $inboxarray Grade array for this calculation keyed by partid
  2267. * @param array $grade Max grade for this Turnitin activity
  2268. * @param object $parts turnitintool_parts DB data transfer object
  2269. * @param object $scale turnitintool_parts DB data transfer object
  2270. * @return object The converted array
  2271. */
  2272. function turnitintool_overallgrade($inboxarray,$maxgrade,$parts,$scale) {
  2273. $overallgrade=NULL;
  2274. foreach ( $parts as $part ) {
  2275. $weightarray[ $part->id ] = $part->maxmarks;
  2276. }
  2277. $overallweight = array_sum( $weightarray );
  2278. if ( $maxgrade < 0 ) { // Scale in use
  2279. $maxgrade = count( explode( ",", $scale->scale ) );
  2280. }
  2281. foreach ( $inboxarray as $inboxrow ) {
  2282. if ( !is_nan($inboxrow->submission_grade) AND !is_null($inboxrow->submission_grade) AND $weightarray[$inboxrow->submission_part] != 0 ) {
  2283. $overallgrade += ( $inboxrow->submission_grade / $weightarray[$inboxrow->submission_part] )
  2284. * ( $weightarray[$inboxrow->submission_part] / $overallweight )
  2285. * $maxgrade;
  2286. }
  2287. }
  2288. if ( !is_null( $overallgrade ) AND gettype( $scale ) == 'object' ) {
  2289. return ( $overallgrade == 0 ) ? 1 : ceil( $overallgrade );
  2290. } else {
  2291. return ( !is_nan( $overallgrade ) AND !is_null( $overallgrade ) ) ? number_format( $overallgrade, 1 ) : '-';
  2292. }
  2293. }
  2294. /**
  2295. * Outputs the Notes / Submission Comments screen
  2296. *
  2297. * @global object
  2298. * @global object
  2299. * @param object $cm The moodle course module object for this instance
  2300. * @param object $turnitintool The turnitintool object for this activity
  2301. * @param var $view The Submission ID that the comments are attached to
  2302. * @param array $post The posted comments from the comments edit / add form
  2303. * @return string Outputs the screen contents
  2304. */
  2305. function turnitintool_view_notes($cm,$turnitintool,$view,$post) {
  2306. global $CFG,$USER;
  2307. $output='';
  2308. if (!$submission=turnitintool_get_record('turnitintool_submissions','id',$view)) {
  2309. turnitintool_print_error('submissiongeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2310. exit();
  2311. }
  2312. if ($submission->userid==$USER->id OR has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  2313. if ($comments=turnitintool_get_records_select('turnitintool_comments',"submissionid=".$submission->id." AND deleted=0")) {
  2314. foreach ($comments as $comment) {
  2315. $commentuser=turnitintool_get_moodleuser($comment->userid,NULL,__FILE__,__LINE__);
  2316. $drawcomment=true;
  2317. if (isset($post['action']) AND ($post['action']=='view' OR $post['action']=='edit') AND $post['comment']!=$comment->id) {
  2318. $drawcomment=false;
  2319. } else {
  2320. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive','notes',true);
  2321. if ($submission->submission_unanon OR !has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  2322. $commentname=$commentuser->firstname.' '.$commentuser->lastname;
  2323. } else {
  2324. $commentname=get_string('anonenabled','turnitintool');
  2325. }
  2326. $output.='<div class="commentBlock"><div class="commentLeft"><b>'.get_string('commentby','turnitintool').
  2327. ':</b> '.$commentname.'</div>';
  2328. $output.='<div class="commentRight"><b>'.get_string('posted','turnitintool').':</b> '.userdate($comment->dateupdated,get_string('strftimerecentfull','langconfig')).'</div>';
  2329. $output.='<hr class="commentRule" />';
  2330. $output.='<div class="commentComments">'.nl2br($comment->commenttext).'</div>';
  2331. $output.='<br />
  2332. <div class="clearBlock">&nbsp;</div>';
  2333. if ($comment->userid==$USER->id AND ($comment->dateupdated>=time()-$turnitintool->commentedittime
  2334. OR
  2335. has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id)))) {
  2336. $fnd = array("\n","\r");
  2337. $rep = array('\n','\r');
  2338. $output.='<div class="commentBottom">
  2339. <form action="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=notes&s='.$submission->id.
  2340. '" class="commentLeft" method="POST" onsubmit="return confirm(\''.str_replace($fnd, $rep, get_string('deletecommentconfirm','turnitintool')).'\')">
  2341. <input name="action" value="delete" type="hidden" />
  2342. <input name="comment" value="'.$comment->id.'" type="hidden" />
  2343. <input name="submitted" value="'.get_string('deletecomment','turnitintool').'" type="submit" />
  2344. </form>';
  2345. $output.='<form action="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=notes&s='.$submission->id.'" method="POST" class="commentRight">
  2346. <input name="action" value="view" type="hidden" />
  2347. <input name="comment" value="'.$comment->id.'" type="hidden" />
  2348. <input name="submitted" value="'.get_string('editcomment','turnitintool').'" type="submit" />
  2349. </form>';
  2350. if (!has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  2351. $output.='<span class="editNotice">'.get_string('edituntil','turnitintool').' '.userdate($comment->dateupdated+$turnitintool->commentedittime,get_string('strftimerecentfull','langconfig')).'</span>';
  2352. }
  2353. $output.='</div>
  2354. <div class="clearBlock">&nbsp;</div>';
  2355. }
  2356. $output.='</div>';
  2357. $output.=turnitintool_box_end(true);
  2358. }
  2359. }
  2360. } else {
  2361. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive','notes',true);
  2362. $output.=get_string('nocomments','turnitintool');
  2363. $output.=turnitintool_box_end(true);
  2364. }
  2365. } else {
  2366. turnitintool_print_error('permissiondeniederror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2367. exit();
  2368. }
  2369. return $output;
  2370. }
  2371. /**
  2372. * Outputs the Notes / Submission for for editting / adding comments
  2373. *
  2374. * @global object
  2375. * @global object
  2376. * @param object $cm The moodle course module object for this instance
  2377. * @param object $turnitintool The turnitintool object for this activity
  2378. * @param var $view The Submission ID that the comments are attached to
  2379. * @param array $post The posted comments from the comments edit / add form
  2380. * @param array $notice An array that contains error data from the posted form
  2381. * @return string Outputs the comment add / edit form
  2382. */
  2383. function turnitintool_addedit_notes($cm,$turnitintool,$view,$post,$notice) {
  2384. global $CFG,$USER;
  2385. $output='';
  2386. if (!$submission=turnitintool_get_record('turnitintool_submissions','id',$view)) {
  2387. turnitintool_print_error('submissiongeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2388. exit();
  2389. }
  2390. if ($submission->userid==$USER->id OR has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  2391. $title=get_string('addeditcomment','turnitintool');
  2392. $action='<input name="action" value="add" type="hidden" />';
  2393. if (isset($post['action']) AND ($post['action']=='view' OR $post['action']=='edit')) {
  2394. if (!$comment=turnitintool_get_record('turnitintool_comments','id',$post["comment"])) {
  2395. turnitintool_print_error('submissiongeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2396. exit();
  2397. }
  2398. $action='<input name="action" value="edit" type="hidden" /><input name="comment" value="'.$post["comment"].'" type="hidden" />';
  2399. $comments=$comment->commenttext;
  2400. } else if (isset($post["comments"])) {
  2401. $comments=$post["comments"];
  2402. } else {
  2403. $comments='';
  2404. }
  2405. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive','notes',true);
  2406. $output.='<b>'.$title.'</b><br />';
  2407. $table = new stdClass();
  2408. $table->width='100%';
  2409. $table->tablealign='center';
  2410. $table->class='uploadtable';
  2411. $cell[0] = new stdClass();
  2412. $cell[0]->data=get_string('comment','turnitintool').' (<span id="charsBlock">'.strlen($comments).'/'.$turnitintool->commentmaxsize.'</span> chars)';
  2413. $cell[0]->class='cell c0';
  2414. $cell[1] = new stdClass();
  2415. $cell[1]->data='<textarea class="submissionText" name="comments" onkeyup="turnitintool_countchars(this,\'charsBlock\','.$turnitintool->commentmaxsize.',\''.
  2416. get_string('maxcommentjserror','turnitintool',$turnitintool->commentmaxsize).'\')" onclick="turnitintool_countchars(this,\'charsBlock\','.
  2417. $turnitintool->commentmaxsize.',\''.get_string('maxcommentjserror','turnitintool',$turnitintool->commentmaxsize).'\')">'.$comments.'</textarea>';
  2418. $cell[1]->class='cell c1';
  2419. $table->rows[0] = new stdClass();
  2420. $table->rows[0]->cells=$cell;
  2421. unset($cell);
  2422. $cell[0] = new stdClass();
  2423. $cell[0]->data='&nbsp;';
  2424. $cell[0]->class='cell c0';
  2425. $cell[1] = new stdClass();
  2426. $cell[1]->data=$action.'<a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=notes&s='.$submission->id.'"><input name="cancel" value="Cancel" type="button" /></a>
  2427. <input name="submitted" value="'.$title.'" type="submit" />';
  2428. $cell[1]->class='cell c1';
  2429. $table->rows[1] = new stdClass();
  2430. $table->rows[1]->cells=$cell;
  2431. unset($cell);
  2432. $output.='<form action="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=notes&s='.$submission->id.'" method="post">';
  2433. $output.=turnitintool_print_table($table,true);
  2434. $output.='</form>';
  2435. $output.=turnitintool_box_end(true);
  2436. } else {
  2437. turnitintool_print_error('permissiondeniederror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2438. exit();
  2439. }
  2440. return $output;
  2441. }
  2442. /**
  2443. * Processes the comments entered in the add / edit comments form
  2444. *
  2445. * @global object
  2446. * @global object
  2447. * @param object $cm The moodle course module object for this instance
  2448. * @param object $turnitintool The turnitintool object is for this activity
  2449. * @param var $view The Submission ID that the comments are attached to
  2450. * @param array $post The posted comments from the comments edit / add form
  2451. * @return array Returns the error array used as $notice in the other comments functions
  2452. */
  2453. function turnitintool_process_notes($cm,$turnitintool,$view,$post) {
  2454. global $CFG,$USER;
  2455. $output=array();
  2456. if (!$submission=turnitintool_get_record('turnitintool_submissions','id',$view)) {
  2457. turnitintool_print_error('submissiongeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2458. exit();
  2459. }
  2460. if ($submission->userid==$USER->id OR has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) { // Revalidate user
  2461. $isgrader=has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id));
  2462. if (isset($post["action"]) AND $post["action"]!="view") {
  2463. $comment=new object();
  2464. if (($post["action"]=="edit" OR $post["action"]=="delete") AND !$comment=turnitintool_get_record('turnitintool_comments','id',$post["comment"])) {
  2465. turnitintool_print_error('commentgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2466. exit();
  2467. }
  2468. if ($post["action"]=="delete" AND (($comment->userid==$USER->id AND $comment->dateupdated>=time()-$turnitintool->commentedittime) OR $isgrader)) {
  2469. turnitintool_delete_records('turnitintool_comments','id',$post["comment"]);
  2470. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=notes&s='.$submission->id);
  2471. exit();
  2472. } else if (($post["action"]=="edit" AND (($comment->userid==$USER->id AND $comment->dateupdated>=time()-$turnitintool->commentedittime) OR $isgrader)) OR $post["action"]=="add") {
  2473. if (empty($post["comments"])) {
  2474. $output['error']=true;
  2475. $output['message']=get_string('nocommenterror','turnitintool');
  2476. } else if (strlen($post["comments"])>$turnitintool->commentmaxsize) {
  2477. $input = new stdClass();
  2478. $input->actual=strlen($post["comments"]);
  2479. $input->allowed=$turnitintool->commentmaxsize;
  2480. $output['error']=true;
  2481. $output['message']=get_string('maxcommenterror','turnitintool',$input);
  2482. } else if ($post["action"]=="edit") {
  2483. $update = new stdClass();
  2484. $update->id=$post["comment"];
  2485. $update->commenttext=strip_tags($post["comments"]);
  2486. $update->dateupdated=time();
  2487. turnitintool_update_record('turnitintool_comments',$update);
  2488. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=notes&s='.$submission->id);
  2489. exit();
  2490. } else {
  2491. $insert = new stdClass();
  2492. $insert->submissionid=$submission->id;
  2493. $insert->userid=$USER->id;
  2494. $insert->commenttext=strip_tags($post["comments"]);
  2495. $insert->dateupdated=time();
  2496. $insert->deleted=0;
  2497. turnitintool_insert_record('turnitintool_comments',$insert);
  2498. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=notes&s='.$submission->id);
  2499. exit();
  2500. }
  2501. } else {
  2502. turnitintool_print_error('permissiondeniederror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2503. exit();
  2504. }
  2505. }
  2506. } else {
  2507. turnitintool_print_error('permissiondeniederror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  2508. exit();
  2509. }
  2510. return $output;
  2511. }
  2512. /**
  2513. * Returns the Moodle User Data object for a user regardless of wether they have been deleted or not
  2514. *
  2515. * @param var $userid The moodle userid
  2516. * @param var $arg1 The optional parameter $a for the print_error call
  2517. * @param var $arg2 The passed in __FILE__ the error occured on if an error occurs
  2518. * @param var $arg3 The passed in __LINE__ the error occured on if an error occurs
  2519. * @return object A properly built Moodle User Data object with complete rebuilt email address
  2520. */
  2521. function turnitintool_get_moodleuser($userid,$arg1=NULL,$arg2=NULL,$arg3=NULL) {
  2522. if (!$user=turnitintool_get_record('user','id',$userid)) {
  2523. turnitintool_print_error('usergeterror','turnitintool',NULL,$arg1,$arg2,$arg3);
  2524. exit();
  2525. }
  2526. // Moodle 2.0 replaces email with a hash on deletion, moodle 1.9 deletes the email address check both
  2527. if ( empty( $user->email ) OR strpos( $user->email, '@' ) === false ) {
  2528. $split=explode('.',$user->username);
  2529. array_pop($split);
  2530. $user->email=join('.',$split);
  2531. }
  2532. return $user;
  2533. }
  2534. /**
  2535. * Processes the options that were set and submitted via the options screen
  2536. *
  2537. * @global object
  2538. * @global object
  2539. * @param object $cm The moodle course module object for this instance
  2540. * @param object $turnitintool The turnitintool object for this activity
  2541. * @param array $post The POST array that has been submitted via the form
  2542. * @return string Returns the notice displaying whether the Options set suceeded or failed
  2543. */
  2544. function turnitintool_process_options($cm,$turnitintool,$post) {
  2545. global $CFG, $turnitintool;
  2546. $turnitintool->autosubmission=$post['autosubmission'];
  2547. $turnitintool->shownonsubmission=$post['shownonsubmission'];
  2548. if (isset($post['usegrademark'])) {
  2549. $turnitintool->usegrademark=$post['usegrademark'];
  2550. }
  2551. $turnitintool->gradedisplay=$post['gradedisplay'];
  2552. $turnitintool->autoupdates=$post['autoupdates'];
  2553. $turnitintool->commentedittime=$post['commentedittime'];
  2554. $turnitintool->commentmaxsize=$post['commentmaxsize'];
  2555. if (turnitintool_update_record('turnitintool',$turnitintool,false)) {
  2556. return get_string('optionsupdatesaved','turnitintool');
  2557. } else {
  2558. return get_string('optionsupdateerror','turnitintool');
  2559. }
  2560. }
  2561. /**
  2562. * Outputs the options screen that is used to set the global options for the activity
  2563. *
  2564. * @global object
  2565. * @param object $cm The moodle course module object for this instance
  2566. * @param object $turnitintool The turnitintool object for this activity
  2567. * @return string Output of the options screen form
  2568. */
  2569. function turnitintool_view_options($cm,$turnitintool) {
  2570. global $CFG;
  2571. $output='<form action="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=options" method="post">';
  2572. $output.='<input name="submitted" type="hidden" value="1" />';
  2573. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive','notes',true);
  2574. $output.='<fieldset class="clearfix"><legend>'.get_string('generalsettings','turnitintool').'</legend>';
  2575. $table = new stdClass();
  2576. $table->width='100%';
  2577. $table->tablealign='center';
  2578. $table->class='optionstable1';
  2579. $table->class='uploadtable';
  2580. $selected=array('1'=>'','0'=>'');
  2581. $selected[$turnitintool->autosubmission]=' selected';
  2582. $row = 0;
  2583. unset($cell);
  2584. $cell[0] = new stdClass();
  2585. $cell[0]->class='cell c0';
  2586. $cell[0]->data=get_string('autosubmit','turnitintool').turnitintool_help_icon('autosubmit',get_string('autosubmit','turnitintool'),'turnitintool',true,false,'',true);
  2587. $cell[1] = new stdClass();
  2588. $cell[1]->class='cell c1';
  2589. $cell[1]->data='<select name="autosubmission" class="formwide">';
  2590. $cell[1]->data.='<option label="'.get_string('autosubmiton','turnitintool').'" value="1"'.$selected['1'].'>'.get_string('autosubmiton','turnitintool').'</option>';
  2591. $cell[1]->data.='<option label="'.get_string('autosubmitoff','turnitintool').'" value="0"'.$selected['0'].'>'.get_string('autosubmitoff','turnitintool').'</option>';
  2592. $cell[1]->data.='</select>';
  2593. $table->rows[$row] = new stdClass();
  2594. $table->rows[$row]->cells=$cell;
  2595. $row++;
  2596. unset($cell);
  2597. $output.=turnitintool_print_table($table,true);
  2598. $output.=turnitintool_box_end(true);
  2599. $output.='</fieldset>';
  2600. unset($table->rows);
  2601. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive','notes',true);
  2602. $output.='<fieldset class="clearfix">';
  2603. $output.='<legend>'.get_string('gradessettings','turnitintool').'</legend>';
  2604. if ($CFG->turnitin_usegrademark) {
  2605. unset($selected);
  2606. $selected=array('1'=>'','0'=>'');
  2607. $selected[$turnitintool->usegrademark]=' selected';
  2608. unset($cell);
  2609. $cell[0] = new stdClass();
  2610. $cell[0]->class='cell c0';
  2611. $cell[0]->data=get_string('turnitinusegrademark','turnitintool').turnitintool_help_icon( 'turnitinusegrademark',
  2612. get_string('turnitinusegrademark','turnitintool'),
  2613. 'turnitintool',
  2614. true,
  2615. false,
  2616. '',
  2617. true
  2618. );
  2619. $cell[1] = new stdClass();
  2620. $cell[1]->class='cell c1';
  2621. $cell[1]->data='<select name="usegrademark" class="formwide">';
  2622. $cell[1]->data.='<option label="'.get_string('yesgrademark','turnitintool').'" value="1"'.$selected['1'].'>'.get_string('yesgrademark','turnitintool').'</option>';
  2623. $cell[1]->data.='<option label="'.get_string('nogrademark','turnitintool').'" value="0"'.$selected['0'].'>'.get_string('nogrademark','turnitintool').'</option>';
  2624. $cell[1]->data.='</select>';
  2625. $table->rows[$row] = new stdClass();
  2626. $table->rows[$row]->cells=$cell;
  2627. $row++;
  2628. }
  2629. unset($selected);
  2630. $selected=array('1'=>'','2'=>'');
  2631. $selected[$turnitintool->gradedisplay]=' selected';
  2632. unset($cell);
  2633. $cell[0] = new stdClass();
  2634. $cell[0]->class='cell c0';
  2635. $cell[0]->data=get_string('displaygradesas','turnitintool').turnitintool_help_icon('displaygradesas',get_string('displaygradesas','turnitintool'),'turnitintool',true,false,'',true);
  2636. $cell[1] = new stdClass();
  2637. $cell[1]->class='cell c1';
  2638. $cell[1]->data='<select name="gradedisplay" class="formwide">';
  2639. $cell[1]->data.='<option label="'.get_string('displaygradesaspercent','turnitintool').'" value="1"'.$selected['1'].'>'.get_string('displaygradesaspercent','turnitintool').'</option>';
  2640. $cell[1]->data.='<option label="'.get_string('displaygradesasfraction','turnitintool').'" value="2"'.$selected['2'].'>'.get_string('displaygradesasfraction','turnitintool').'</option>';
  2641. $cell[1]->data.='</select>';
  2642. $table->rows[$row] = new stdClass();
  2643. $table->rows[$row]->cells=$cell;
  2644. $row++;
  2645. unset($selected);
  2646. $selected=array('1'=>'','0'=>'');
  2647. $selected[$turnitintool->autoupdates]=' selected';
  2648. unset($cell);
  2649. $cell[0] = new stdClass();
  2650. $cell[0]->class='cell c0';
  2651. $cell[0]->data=get_string('autorefreshgrades','turnitintool').turnitintool_help_icon('autorefreshgrades',get_string('autorefreshgrades','turnitintool'),'turnitintool',true,false,'',true);
  2652. $cell[1] = new stdClass();
  2653. $cell[1]->class='cell c1';
  2654. $cell[1]->data='<select name="autoupdates" class="formwide">';
  2655. $cell[1]->data.='<option label="'.get_string('yesgrades','turnitintool').'" value="1"'.$selected['1'].'>'.get_string('yesgrades','turnitintool').'</option>';
  2656. $cell[1]->data.='<option label="'.get_string('nogrades','turnitintool').'" value="0"'.$selected['0'].'>'.get_string('nogrades','turnitintool').'</option>';
  2657. $cell[1]->data.='</select>';
  2658. $table->rows[$row] = new stdClass();
  2659. $table->rows[$row]->cells=$cell;
  2660. $row++;
  2661. unset($selected);
  2662. $selected=array('1'=>'','0'=>'');
  2663. $selected[$turnitintool->shownonsubmission]=' selected';
  2664. unset($cell);
  2665. $cell[0] = new stdClass();
  2666. $cell[0]->class='cell c0';
  2667. $cell[0]->data=get_string('submissionlist','turnitintool').turnitintool_help_icon('submissionlist',get_string('submissionlist','turnitintool'),'turnitintool',true,false,'',true);
  2668. $cell[1] = new stdClass();
  2669. $cell[1]->class='cell c1';
  2670. $cell[1]->data='<select name="shownonsubmission" class="formwide">';
  2671. $cell[1]->data.='<option label="'.get_string('shownonsubmissions','turnitintool').'" value="1"'.$selected['1'].'>'.get_string('shownonsubmissions','turnitintool').'</option>';
  2672. $cell[1]->data.='<option label="'.get_string('showonlysubmissions','turnitintool').'" value="0"'.$selected['0'].'>'.get_string('showonlysubmissions','turnitintool').'</option>';
  2673. $cell[1]->data.='</select>';
  2674. $table->rows[$row] = new stdClass();
  2675. $table->rows[$row]->cells=$cell;
  2676. $row++;
  2677. $output.=turnitintool_print_table($table,true);
  2678. $output.=turnitintool_box_end(true);
  2679. $output.='</fieldset>';
  2680. unset($table->rows);
  2681. $row = 0;
  2682. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive','notes',true);
  2683. $output.='<fieldset class="clearfix">';
  2684. $output.='<legend>'.get_string('commentssettings','turnitintool').'</legend>';
  2685. unset($cell);
  2686. $selected=array('0'=>'','300'=>'','600'=>'','900'=>'','1200'=>'','1500'=>'','1800'=>'','3600'=>'','7200'=>'','10800'=>'','14400'=>'','18000'=>'','21600'=>'','43200'=>'','86400'=>'');
  2687. $selected[$turnitintool->commentedittime]=' selected';
  2688. $cell[0] = new stdClass();
  2689. $cell[0]->class='cell c0';
  2690. $cell[0]->data=get_string('commenteditwindow','turnitintool').turnitintool_help_icon('commenteditwindow',get_string('commenteditwindow','turnitintool'),'turnitintool',true,false,'',true);
  2691. $cell[1] = new stdClass();
  2692. $cell[1]->class='cell c1';
  2693. $cell[1]->data='<select name="commentedittime" class="formwide">';
  2694. $cell[1]->data.='<option label="'.get_string('nolimit','turnitintool').'" value="0"'.$selected['0'].'>'.get_string('nolimit','turnitintool').'</option>';
  2695. $cell[1]->data.='<option label="5 '.get_string('minutes','turnitintool').'" value="300"'.$selected['300'].'>5 '.get_string('minutes','turnitintool').'</option>';
  2696. $cell[1]->data.='<option label="10 '.get_string('minutes','turnitintool').'" value="600"'.$selected['600'].'>10 '.get_string('minutes','turnitintool').'</option>';
  2697. $cell[1]->data.='<option label="15 '.get_string('minutes','turnitintool').'" value="900"'.$selected['900'].'>15 '.get_string('minutes','turnitintool').'</option>';
  2698. $cell[1]->data.='<option label="20 '.get_string('minutes','turnitintool').'" value="1200"'.$selected['1200'].'>20 '.get_string('minutes','turnitintool').'</option>';
  2699. $cell[1]->data.='<option label="25 '.get_string('minutes','turnitintool').'" value="1500"'.$selected['1500'].'>25 '.get_string('minutes','turnitintool').'</option>';
  2700. $cell[1]->data.='<option label="30 '.get_string('minutes','turnitintool').'" value="1800"'.$selected['1800'].'>30 '.get_string('minutes','turnitintool').'</option>';
  2701. $cell[1]->data.='<option label="1 '.get_string('hours','turnitintool').'" value="3600"'.$selected['3600'].'>1 '.get_string('hours','turnitintool').'</option>';
  2702. $cell[1]->data.='<option label="2 '.get_string('hours','turnitintool').'" value="7200"'.$selected['7200'].'>2 '.get_string('hours','turnitintool').'</option>';
  2703. $cell[1]->data.='<option label="3 '.get_string('hours','turnitintool').'" value="10800"'.$selected['10800'].'>3 '.get_string('hours','turnitintool').'</option>';
  2704. $cell[1]->data.='<option label="4 '.get_string('hours','turnitintool').'" value="14400"'.$selected['14400'].'>4 '.get_string('hours','turnitintool').'</option>';
  2705. $cell[1]->data.='<option label="5 '.get_string('hours','turnitintool').'" value="18000"'.$selected['18000'].'>5 '.get_string('hours','turnitintool').'</option>';
  2706. $cell[1]->data.='<option label="6 '.get_string('hours','turnitintool').'" value="21600"'.$selected['21600'].'>6 '.get_string('hours','turnitintool').'</option>';
  2707. $cell[1]->data.='<option label="12 '.get_string('hours','turnitintool').'" value="43200"'.$selected['43200'].'>12 '.get_string('hours','turnitintool').'</option>';
  2708. $cell[1]->data.='<option label="24 '.get_string('hours','turnitintool').'" value="86400"'.$selected['86400'].'>24 '.get_string('hours','turnitintool').'</option>';
  2709. $cell[1]->data.='</select>';
  2710. $table->rows[$row] = new stdClass();
  2711. $table->rows[$row]->cells=$cell;
  2712. $row++;
  2713. unset($cell);
  2714. $selected=array('100'=>'','200'=>'','300'=>'','400'=>'','500'=>'','600'=>'','700'=>'','800'=>'','900'=>'','1000'=>'','1100'=>'','1200'=>'','1300'=>'','1400'=>'','1500'=>'');
  2715. $selected[$turnitintool->commentmaxsize]=' selected';
  2716. $cell[0] = new stdClass();
  2717. $cell[0]->class='cell c0';
  2718. $cell[0]->data=get_string('maxcommentsize','turnitintool').turnitintool_help_icon('maxcommentsize',get_string('maxcommentsize','turnitintool'),'turnitintool',true,false,'',true);
  2719. $cell[1] = new stdClass();
  2720. $cell[1]->class='cell c1';
  2721. $cell[1]->data='<select name="commentmaxsize" class="formwide">';
  2722. for ($i=1;$i<=15;$i++) {
  2723. $n=$i*100;
  2724. $cell[1]->data.='<option label="'.$n.' '.get_string('characters','turnitintool').'" value="'.$n.'"'.$selected[$n].'>'.$n.' '.get_string('characters','turnitintool').'</option>';
  2725. }
  2726. $cell[1]->data.='</select>';
  2727. $table->rows[$row] = new stdClass();
  2728. $table->rows[$row]->cells=$cell;
  2729. $row++;
  2730. $output.=turnitintool_print_table($table,true);
  2731. $output.=turnitintool_box_end(true);
  2732. $output.='</fieldset>';
  2733. unset($table->rows);
  2734. $row = 0;
  2735. $output.=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive','notes',true);
  2736. unset($cell);
  2737. $cell[0] = new stdClass();
  2738. $cell[0]->class='cell c0';
  2739. $cell[0]->data='';
  2740. $cell[1] = new stdClass();
  2741. $cell[1]->class='cell c1';
  2742. $cell[1]->data='<input type="submit" value="'.get_string('savechanges','turnitintool').'" />';
  2743. $table->rows[$row] = new stdClass();
  2744. $table->rows[$row]->cells=$cell;
  2745. $row++;
  2746. $output.=turnitintool_print_table($table,true);
  2747. $output.=turnitintool_box_end(true);
  2748. $output.='</form>';
  2749. return $output;
  2750. }
  2751. /**
  2752. * Outputs header links for the inbox table including the hi lo toggle for order bys
  2753. *
  2754. * @global object
  2755. * @param object $cm The moodle course module object for this instance
  2756. * @param object $turnitintool The turnitintool object for this activity
  2757. * @param string $title The title of the table header
  2758. * @param boolean $hilo Shows if this is ordered high to low values
  2759. * @param boolean $lohi Shows if this is ordered low to high values
  2760. * @return string Output of the header link
  2761. */
  2762. function turnitintool_doheaderlinks($cm,$turnitintool,$title,$hilo,$lohi) {
  2763. global $CFG;
  2764. $param_do=optional_param('do',null,PARAM_CLEAN);
  2765. $param_ob=optional_param('ob',null,PARAM_CLEAN);
  2766. $param_sh=optional_param('sh',null,PARAM_CLEAN);
  2767. $param_fr=optional_param('fr',null,PARAM_CLEAN);
  2768. $baselink=$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do='.$param_do;
  2769. $baselink.=(!is_null($param_sh)) ? '&sh='.$param_sh : '';
  2770. $baselink.=(!is_null($param_fr)) ? '&fr='.$param_fr : '';
  2771. $headerlink='<a href="'.$baselink.'&ob=%%OB%%">'.$title.'</a>';
  2772. if (isset($param_ob) AND $param_ob==$hilo) {
  2773. $headerlink.=' <img src="pix/order_down.gif" class="ordericons" />';
  2774. $headerlink=str_replace('%%OB%%',$lohi,$headerlink);
  2775. } else if (isset($param_ob) AND $param_ob==$lohi) {
  2776. $headerlink.=' <img src="pix/order_up.gif" class="ordericons" />';
  2777. $headerlink=str_replace('%%OB%%',$hilo,$headerlink);
  2778. } else if (!isset($param_ob) AND $hilo==1) {
  2779. $headerlink.=' <img src="pix/order_down.gif" class="ordericons" />';
  2780. $headerlink=str_replace('%%OB%%',$lohi,$headerlink);
  2781. } else {
  2782. $headerlink=str_replace('%%OB%%',$hilo,$headerlink);
  2783. }
  2784. // ORDER BY: 1: Av. Originality Score - Max-Min,
  2785. // 2: Av. Originality Score - Min-Max,
  2786. // 3: Av. Grade - Max-Min,
  2787. // 4: Av. Grade - Min-Max,
  2788. // 5: Modified - Earliest-Latest,
  2789. // 6: Modified - Latest-Earliest,
  2790. // 7: Students Last Name - A-Z,
  2791. // 8: Student Last Name - Z-A
  2792. return $headerlink;
  2793. }
  2794. /**
  2795. * Processes the tutor request to reveal an anonymous students name
  2796. *
  2797. * @global object
  2798. * @param object $cm The moodle course module object for this instance
  2799. * @param object $turnitintool The turnitintool object for this activity
  2800. * @param array $post The POST values from the reveal student form
  2801. */
  2802. function turnitintool_revealuser($cm,$turnitintool,$post,$loaderbar=null) {
  2803. global $CFG;
  2804. $anonid=$post["anonid"];
  2805. // For the sake of anonymity we get the userid from the object id
  2806. $submission=turnitintool_get_record('turnitintool_submissions','submission_objectid',$anonid);
  2807. $reason=$post["reason"][$anonid];
  2808. if ($reason==get_string('revealreason','turnitintool') OR empty($reason)) {
  2809. turnitintool_print_error('revealerror','turnitintool',$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=allsubmissions',NULL,__FILE__,__LINE__);
  2810. exit();
  2811. } else {
  2812. $owner=turnitintool_get_owner($turnitintool->course);
  2813. $tii = new turnitintool_commclass(turnitintool_getUID($owner),$owner->firstname,$owner->lastname,$owner->email,2,$loaderbar);
  2814. $tiipost = new stdClass();
  2815. $tiipost->cid=turnitintool_getCID($turnitintool->course);
  2816. $tiipost->paperid=$submission->submission_objectid;
  2817. $tiipost->anon_reason=(strlen($reason)>1 AND strlen($reason)<6) ? str_pad($reason,6," ") : $reason;
  2818. $input = new stdClass();
  2819. $input->from=1;
  2820. $input->to=1;
  2821. $result=$tii->revealAnon($tiipost,get_string('updatestudent','turnitintool',$input));
  2822. if ($tii->getRerror()) {
  2823. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  2824. turnitintool_print_error('<strong>'.get_string('submissionupdateerror','turnitintool').'</strong><br />'.$reason,NULL,NULL,NULL,__FILE__,__LINE__);
  2825. exit();
  2826. }
  2827. $update = new stdClass();
  2828. $update->id=$submission->id;
  2829. $update->submission_unanon=1;
  2830. $update->submission_unanonreason=$reason;
  2831. turnitintool_update_record('turnitintool_submissions',$update);
  2832. unset($tii);
  2833. unset($loaderbar);
  2834. }
  2835. }
  2836. /**
  2837. * Outputs submission inbox for student submissions (Teacher View)
  2838. *
  2839. * @global object
  2840. * @param object $cm The moodle course module object for this instance
  2841. * @param object $turnitintool The turnitintool object for this activity
  2842. * @param string $orderby The query string option for the ordering of the column
  2843. * @return string Output of the tutor view submission inbox
  2844. */
  2845. function turnitintool_view_all_submissions($cm,$turnitintool,$orderby='1') {
  2846. global $CFG, $USER;
  2847. $param_do=optional_param('do',null,PARAM_CLEAN);
  2848. $param_reason=optional_param('reason',array(),PARAM_CLEAN);
  2849. $module_group = turnitintool_module_group( $cm );
  2850. $context = get_context_instance(CONTEXT_COURSE, $turnitintool->course);
  2851. $studentusers = get_users_by_capability($context,'mod/turnitintool:submit','u.id,u.firstname,u.lastname','','','',$module_group,'',false);
  2852. $studentuser_array = array_keys($studentusers);
  2853. $scale=turnitintool_get_record('scale','id',$turnitintool->grade*-1);
  2854. $parts=turnitintool_get_records_select('turnitintool_parts','turnitintoolid='.$turnitintool->id.' AND deleted != 1');
  2855. $concat = turnitintool_sql_concat("COALESCE(u.id,0)","'-'","COALESCE(s.id,0)","'-'","COALESCE(s.submission_objectid,0)");
  2856. $usifieldid = 'NULL';
  2857. $usifield = '';
  2858. $displayusi = 'false';
  2859. if ( $CFG->turnitin_enablepseudo AND $CFG->turnitin_pseudolastname > 0 ) {
  2860. $uf = turnitintool_get_record( 'user_info_field', 'id', $CFG->turnitin_pseudolastname );
  2861. $usifield = $uf->name;
  2862. $usifieldid = $CFG->turnitin_pseudolastname;
  2863. }
  2864. $group_in = join(',', $studentuser_array);
  2865. $groupselect = ( $module_group != 0 ) ? "u.id IN ( select gm.userid from {groups_members} gm where gm.groupid = $module_group ) AND" : "";
  2866. $query = "
  2867. SELECT
  2868. $concat AS keyid,
  2869. s.id AS id,
  2870. u.id AS userid,
  2871. u.firstname AS firstname,
  2872. u.lastname AS lastname,
  2873. ud.data AS usi,
  2874. tu.turnitin_uid AS turnitin_uid,
  2875. p.id AS partid,
  2876. p.partname AS partname,
  2877. p.dtstart AS dtstart,
  2878. p.dtdue AS dtdue,
  2879. p.dtpost AS dtpost,
  2880. p.maxmarks AS maxmarks,
  2881. t.name AS assignmentname,
  2882. t.grade AS overallgrade,
  2883. t.anon AS anon,
  2884. t.id AS turnitintoolid,
  2885. s.submission_part AS submission_part,
  2886. s.submission_title AS submission_title,
  2887. s.submission_type AS submission_type,
  2888. s.submission_filename AS submission_filename,
  2889. s.submission_objectid AS submission_objectid,
  2890. s.submission_score AS submission_score,
  2891. s.submission_grade AS submission_grade,
  2892. s.submission_gmimaged AS submission_gmimaged,
  2893. s.submission_status AS submission_status,
  2894. s.submission_queued AS submission_queued,
  2895. s.submission_attempts AS submission_attempts,
  2896. s.submission_modified AS submission_modified,
  2897. s.submission_parent AS submission_parent,
  2898. s.submission_nmuserid AS submission_nmuserid,
  2899. s.submission_nmfirstname AS submission_nmfirstname,
  2900. s.submission_nmlastname AS submission_nmlastname,
  2901. s.submission_unanon AS submission_unanon,
  2902. s.submission_unanonreason AS submission_unanonreason,
  2903. s.submission_transmatch AS submission_transmatch
  2904. FROM {turnitintool_submissions} s
  2905. LEFT JOIN
  2906. {user} u ON u.id = s.userid
  2907. LEFT JOIN
  2908. {turnitintool_parts} p ON p.id = s.submission_part
  2909. LEFT JOIN
  2910. {turnitintool} t ON t.id = p.turnitintoolid
  2911. LEFT JOIN
  2912. {turnitintool_users} tu ON u.id = tu.userid
  2913. LEFT JOIN
  2914. {user_info_data} ud ON u.id = ud.userid AND ud.fieldid = $usifieldid
  2915. WHERE
  2916. $groupselect
  2917. s.turnitintoolid = ".$turnitintool->id."
  2918. ORDER BY s.submission_grade DESC
  2919. ";
  2920. $records = turnitintool_get_records_sql( $query );
  2921. $records = is_array( $records ) ? $records : array();
  2922. $userrows = array();
  2923. $subuser_array = array();
  2924. $submissionids = array();
  2925. foreach ( $records as $record ) {
  2926. $turnitin_uid = ( !is_null( $record->turnitin_uid ) ) ? $record->turnitin_uid : $record->submission_nmuserid;
  2927. $key = $record->userid . '-' . $turnitin_uid;
  2928. $record->nonmoodle = ( $record->submission_nmuserid ) ? true : false;
  2929. $userrows[$key][]=$record;
  2930. if ( !is_null( $record->id ) ) $submissionids[] = $record->id;
  2931. if ( !is_null( $record->userid ) ) $subuser_array[] = $record->userid;
  2932. }
  2933. $comments = array();
  2934. if ( count( $submissionids ) > 0 ) {
  2935. $submission_string = join( ',', $submissionids );
  2936. $comments = turnitintool_get_records_sql( 'SELECT submissionid, count( id ) AS count FROM {turnitintool_comments} WHERE deleted = 0 AND submissionid IN ( '.$submission_string.' ) GROUP BY submissionid' );
  2937. }
  2938. $nosubuser_array = ( !$turnitintool->shownonsubmission OR $turnitintool->anon ) ? array() : array_diff( $studentuser_array, $subuser_array );
  2939. foreach ( $nosubuser_array as $user ) {
  2940. $key = $studentusers[$user]->id . '-' . 0;
  2941. $record = new stdClass();
  2942. $record->userid = $studentusers[$user]->id;
  2943. $record->firstname = $studentusers[$user]->firstname;
  2944. $record->lastname = $studentusers[$user]->lastname;
  2945. $userrows[$key][]=$record;
  2946. }
  2947. $table = new stdClass();
  2948. $table->style = 'display: none;';
  2949. $table->width = '100%';
  2950. $table->id = 'inboxTable';
  2951. $table->class = 'gradeTable';
  2952. $table->tablealign = 'center';
  2953. $n = 0;
  2954. $table->rows[0] = new stdClass();
  2955. $table->rows[0]->class = 'header';
  2956. $table->rows[0]->hcells[$n] = new stdClass();
  2957. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' iconcell';
  2958. $table->rows[0]->hcells[$n]->data = '<div>&nbsp;</div>';
  2959. $n++;
  2960. $table->rows[0]->hcells[$n] = new stdClass();
  2961. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' iconcell';
  2962. $table->rows[0]->hcells[$n]->data = '<div>&nbsp;</div>';
  2963. $n++;
  2964. $table->rows[0]->hcells[$n] = new stdClass();
  2965. $table->rows[0]->hcells[$n]->class = 'header c'.$n.' namecell';
  2966. $table->rows[0]->hcells[$n]->data = '<div>'.get_string( 'submissionstudent', 'turnitintool' ).'</div>';
  2967. $n++;
  2968. $table->rows[0]->hcells[$n] = new stdClass();
  2969. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' markscell';
  2970. $table->rows[0]->hcells[$n]->data = '&nbsp;';
  2971. $n++;
  2972. $table->rows[0]->hcells[$n] = new stdClass();
  2973. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' markscell';
  2974. $table->rows[0]->hcells[$n]->data = '<div>&nbsp;'.$usifield.'</div>';
  2975. $n++;
  2976. $table->rows[0]->hcells[$n] = new stdClass();
  2977. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' markscell';
  2978. $table->rows[0]->hcells[$n]->data = '<div>'.get_string( 'objectid', 'turnitintool' ).'</div>';
  2979. $n++;
  2980. $table->rows[0]->hcells[$n] = new stdClass();
  2981. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' datecell';
  2982. $table->rows[0]->hcells[$n]->data = '<div>'.get_string( 'posted', 'turnitintool' ).'</div>';
  2983. $n++;
  2984. $table->rows[0]->hcells[$n] = new stdClass();
  2985. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' markscell';
  2986. $table->rows[0]->hcells[$n]->data = '&nbsp;';
  2987. $n++;
  2988. $table->rows[0]->hcells[$n] = new stdClass();
  2989. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' markscell';
  2990. $table->rows[0]->hcells[$n]->data = '<div>'.get_string( 'submissionorig', 'turnitintool' ).'</div>';
  2991. $n++;
  2992. $table->rows[0]->hcells[$n] = new stdClass();
  2993. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' markscell';
  2994. $table->rows[0]->hcells[$n]->data = '&nbsp;';
  2995. $n++;
  2996. $table->rows[0]->hcells[$n] = new stdClass();
  2997. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' markscell';
  2998. $table->rows[0]->hcells[$n]->data = '&nbsp;';
  2999. $n++;
  3000. $table->rows[0]->hcells[$n] = new stdClass();
  3001. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' markscell';
  3002. $table->rows[0]->hcells[$n]->data = '<div>'.get_string( 'submissiongrade', 'turnitintool' ).'</div>';
  3003. $n++;
  3004. $table->rows[0]->hcells[$n] = new stdClass();
  3005. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' iconcell';
  3006. $table->rows[0]->hcells[$n]->data = '<div>&nbsp;</div>';
  3007. $n++;
  3008. $table->rows[0]->hcells[$n] = new stdClass();
  3009. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' iconcell';
  3010. $table->rows[0]->hcells[$n]->data = '<div>&nbsp;</div>';
  3011. $n++;
  3012. $table->rows[0]->hcells[$n] = new stdClass();
  3013. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' iconcell';
  3014. $table->rows[0]->hcells[$n]->data = '<div>&nbsp;</div>';
  3015. $n++;
  3016. $table->rows[0]->hcells[$n] = new stdClass();
  3017. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' iconcell';
  3018. $table->rows[0]->hcells[$n]->data = '<div>&nbsp;</div>';
  3019. $n++;
  3020. $table->rows[0]->hcells[$n] = new stdClass();
  3021. $table->rows[0]->hcells[$n]->class = 'header c' . $n . ' iconcell';
  3022. $table->rows[0]->hcells[$n]->data = '<div>&nbsp;</div>';
  3023. $n++;
  3024. $i = 1;
  3025. foreach ( $userrows as $key => $userrow ) {
  3026. if ( isset( $userrow[0]->id ) ) $overall_grade = turnitintool_overallgrade( $userrow, $turnitintool->grade, $parts, $scale );
  3027. $rowcount = ( count( $userrow ) == 1 && !isset( $userrow[0]->id ) ) ? 0 : count( $userrow );
  3028. $submissionstring=( $rowcount == 1 ) ? get_string('submission','turnitintool') : get_string('submissions','turnitintool');
  3029. if ( is_null( $userrow[0]->firstname ) ) {
  3030. $student='<i>'.$userrow[0]->submission_nmlastname.', '.$userrow[0]->submission_nmfirstname.
  3031. ' ('.get_string('nonmoodleuser','turnitintool').')</i> - ('.$rowcount.
  3032. ' '.$submissionstring.')';
  3033. } else {
  3034. $student='<b><a href="'.$CFG->wwwroot.'/user/view.php?id='.
  3035. $userrow[0]->userid.'&course='.$turnitintool->course.'">'.$userrow[0]->lastname.', '.$userrow[0]->firstname.
  3036. '</a></b> - ('.$rowcount.' '.$submissionstring.')';
  3037. }
  3038. foreach ( $userrow as $submission ) {
  3039. $postdatepassed = ( isset( $submission->submission_part ) AND $parts[$submission->submission_part]->dtpost > time() ) ? 0 : 1;
  3040. $displayusi = ( ( $turnitintool->anon == 1 AND !$postdatepassed )
  3041. OR !isset( $CFG->turnitin_enablepseudo ) OR $CFG->turnitin_enablepseudo === "0" ) ? 'false' : 'true';
  3042. $n = 0;
  3043. if ( !isset( $submission->id ) OR is_null( $submission->id ) ) {
  3044. // Do blank user line and continue
  3045. $nmuserid = ( isset( $submission->submission_nmuserid ) ) ? $submission->submission_nmuserid : 0;
  3046. $grouprow=$submission->userid . '-' . $nmuserid;
  3047. $table->rows[$i]->cells[$n] = new stdClass();
  3048. $table->rows[$i]->cells[$n]->class = 'cell c' . $n;
  3049. $table->rows[$i]->cells[$n]->data = $grouprow;
  3050. $n++;
  3051. $table->rows[$i]->cells[$n] = new stdClass();
  3052. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' hide';
  3053. $table->rows[$i]->cells[$n]->data = $student;
  3054. $n++;
  3055. for ( $j = 0; $j < 15; $j++ ) {
  3056. $table->rows[$i]->cells[$n] = new stdClass();
  3057. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' hide';
  3058. if ( $j == 4 ) {
  3059. $output = '00/00/00, 00:00:00';
  3060. } else {
  3061. $output = '&nbsp;&nbsp;';
  3062. }
  3063. $table->rows[$i]->cells[$n]->data = $output;
  3064. $n++;
  3065. }
  3066. $i++;
  3067. continue;
  3068. }
  3069. $entryCount[$submission->userid]=(!isset($entryCount[$submission->userid]))
  3070. ? 1 : $entryCount[$submission->userid]+1;
  3071. $i++;
  3072. $lastclass=($i==$rowcount) ? ' lastmark' : ' leftmark';
  3073. // Do Sort Row, Part Name if Anon and User Name if not
  3074. if ( $submission->anon AND !$postdatepassed ) {
  3075. $grouprow=$submission->partid;
  3076. } else {
  3077. $grouprow=$submission->userid . '-' . $submission->submission_nmuserid;
  3078. }
  3079. $table->rows[$i]->cells[$n] = new stdClass();
  3080. $table->rows[$i]->cells[$n]->class = 'cell c' . $n;
  3081. $table->rows[$i]->cells[$n]->data = $grouprow;
  3082. $n++;
  3083. // Do Sort header table
  3084. if ( $submission->anon AND !$postdatepassed ) {
  3085. $grouptable='<b>'.$submission->partname.'</b>';
  3086. } else {
  3087. $grouptable=$student;
  3088. }
  3089. $table->rows[$i]->cells[$n] = new stdClass();
  3090. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' hide';
  3091. $table->rows[$i]->cells[$n]->data = $grouptable;
  3092. $n++;
  3093. // Do Submission Filelink / Anon Button Column
  3094. $filelink=turnitintool_get_filelink($cm,$turnitintool,$submission);
  3095. $doscript='';
  3096. if (!empty($submission->submission_objectid)) {
  3097. $doscript=' onclick="screenOpen(\''.$filelink.'\',\''.$submission->id.'\',\''.$turnitintool->autoupdates.'\');return false;"';
  3098. }
  3099. $length = 60;
  3100. $truncate = (strlen($submission->submission_title)>$length)
  3101. ? substr($submission->submission_title,0,$length).'...'
  3102. : $submission->submission_title;
  3103. if ( !$turnitintool->anon OR $postdatepassed ) {
  3104. $submission_link = '<b>'.$submission->partname.'</b>: <a href="'.$filelink.'" target="_blank" class="fileicon"'
  3105. .$doscript.' title="'.$submission->submission_title.'">'.$truncate.'</a>';
  3106. } else if ( $submission->submission_unanon AND $turnitintool->anon ) {
  3107. $submission_link = '<b><a href="'.$CFG->wwwroot.'/user/view.php?id='.
  3108. $userrow[0]->userid.'&course='.$turnitintool->course.'">'.$userrow[0]->lastname.', '.$userrow[0]->firstname.
  3109. '</a></b>: ';
  3110. $submission_link .= '<a href="'.$filelink.'" target="_blank" class="fileicon"'
  3111. .$doscript.' title="'.$submission->submission_title.'">'.$truncate.'</a>';
  3112. } else if ( $turnitintool->anon AND !$postdatepassed ) {
  3113. $reason=(isset($param_reason[$submission->submission_objectid])) ? $param_reason[$submission->submission_objectid] : get_string('revealreason','turnitintool');
  3114. $submission_link = '<a href="'.$filelink.'" target="_blank" class="fileicon"'
  3115. .$doscript.' title="'.$submission->submission_title.'" style="line-height: 1.8em;">'.$truncate.'</a><br /><span id="anonform_'.$submission->submission_objectid.
  3116. '" style="display: none;"><form action="'.$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.
  3117. '&do=allsubmissions" method="POST" class="" onsubmit="return anonValidate(this.reason);">&nbsp;&nbsp;&nbsp;<input id="reason" name="reason['.
  3118. $submission->submission_objectid.']" value="'.$reason.'" type="text" onclick="this.value=\'\';" /><input id="anonid" name="anonid" value="'.
  3119. $submission->submission_objectid.'" type="hidden" />&nbsp;<input value="'.get_string('reveal','turnitintool').
  3120. '" type="submit" /></form></span><button id="studentname_'.$submission->submission_objectid.
  3121. '" onclick="document.getElementById(\'anonform_'.$submission->submission_objectid.'\').style.display = \'block\';this.style.display = \'none\';">'.
  3122. get_string('anonenabled','turnitintool').'</button>';
  3123. }
  3124. $table->rows[$i]->cells[$n] = new stdClass();
  3125. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . $lastclass;
  3126. $table->rows[$i]->cells[$n]->data = $submission_link;
  3127. $n++;
  3128. // Output USI if required
  3129. $table->rows[$i]->cells[$n] = new stdClass();
  3130. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' markscell';
  3131. $table->rows[$i]->cells[$n]->data = ( !isset($submission->usi) OR ( $submission->anon AND !$postdatepassed ) ) ? '&nbsp;' : $submission->usi;
  3132. $n++;
  3133. $table->rows[$i]->cells[$n] = new stdClass();
  3134. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' markscell';
  3135. $table->rows[$i]->cells[$n]->data = '&nbsp;';
  3136. $n++;
  3137. // Do Paper ID column
  3138. $objectid=(is_null($submission->submission_objectid)
  3139. OR empty($submission->submission_objectid))
  3140. ? '-' : $submission->submission_objectid;
  3141. $table->rows[$i]->cells[$n] = new stdClass();
  3142. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' markscell';
  3143. $table->rows[$i]->cells[$n]->data = $objectid;
  3144. $n++;
  3145. // Do Submission to Turnitin Form
  3146. $modified='-';
  3147. if (empty($submission->submission_objectid) AND $turnitintool->autosubmission) {
  3148. $modified='<div class="submittoLinkSmall"><img src="'.$CFG->wwwroot.'/mod/turnitintool/icon.gif" /><a href="'.$CFG->wwwroot.
  3149. '/mod/turnitintool/view.php'.'?id='.$cm->id.'&up='.$submission->id.'">'.get_string('submittoturnitin','turnitintool').'</a></div>';
  3150. } else if (!is_null($submission->id)) {
  3151. $modified=(empty($submission->submission_objectid)) ? '-' : userdate($submission->submission_modified,get_string('strftimedatetimeshort','langconfig'));
  3152. if ($submission->submission_modified>$submission->dtdue) {
  3153. $modified='<span style="color: red;">'.$modified.'</span>';
  3154. }
  3155. }
  3156. $table->rows[$i]->cells[$n] = new stdClass();
  3157. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' datecell';
  3158. $table->rows[$i]->cells[$n]->data = $modified;
  3159. $n++;
  3160. // Get originality score if available
  3161. $table->rows[$i]->cells[$n] = new stdClass();
  3162. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' markscell';
  3163. $table->rows[$i]->cells[$n]->data = $submission->submission_score;
  3164. $n++;
  3165. $score = turnitintool_draw_similarityscore($cm,$turnitintool,$submission);
  3166. $table->rows[$i]->cells[$n] = new stdClass();
  3167. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' markscell';
  3168. $table->rows[$i]->cells[$n]->data = $score;
  3169. $n++;
  3170. // Get grade if available
  3171. $grade=turnitintool_dogradeoutput($cm,$turnitintool,$submission,$submission->dtdue,$submission->dtpost,$submission->maxmarks);
  3172. $grade='<form action="'.$CFG->wwwroot.
  3173. '/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=allsubmissions" method="POST">'.$grade.'</form>';
  3174. // Raw grade goes in hidden column for sorting
  3175. $table->rows[$i]->cells[$n] = new stdClass();
  3176. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' markscell';
  3177. if ($turnitintool->grade==0 OR $overall_grade==='-') {
  3178. $overall_grade='-';
  3179. } else if ($turnitintool->grade < 0) { // Scale
  3180. $scalearray=explode(",",$scale->scale);
  3181. // Array is zero indexed
  3182. // Scale positions are from 1 upward
  3183. $index = $overall_grade-1;
  3184. $overall_grade = ( $index < 0 ) ? $scalearray[0] : $scalearray[$index];
  3185. } else if ($turnitintool->gradedisplay==2) { // 2 is fraction
  3186. $overall_grade.='/'.$turnitintool->grade;
  3187. } else if ($turnitintool->gradedisplay==1) { // 1 is percentage
  3188. $overall_grade=round($overall_grade/$turnitintool->grade*100,1).'%';
  3189. }
  3190. $overall_grade = ( $turnitintool->anon AND !$postdatepassed ) ? '-'.$submission->submission_part : $overall_grade;
  3191. $table->rows[$i]->cells[$n]->data = $overall_grade;
  3192. $n++;
  3193. $subgrade = $submission->submission_grade;
  3194. $table->rows[$i]->cells[$n] = new stdClass();
  3195. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' markscell';
  3196. $table->rows[$i]->cells[$n]->data = ( !is_null( $subgrade ) AND $subgrade != '-' ) ? $subgrade : 0;
  3197. $n++;
  3198. $table->rows[$i]->cells[$n] = new stdClass();
  3199. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' markscell';
  3200. $table->rows[$i]->cells[$n]->data = $grade;
  3201. $n++;
  3202. // Get Student View indicator
  3203. $grademarkurl = $CFG->wwwroot . '/mod/turnitintool/view.php?id=' . $cm->id . '&jumppage=grade';
  3204. $grademarkurl .= '&userid=' . $USER->id . '&utp=2&objectid=' . $submission->submission_objectid;
  3205. $warn=($turnitintool->reportgenspeed==1 AND $submission->dtdue > time()) ? $warn=',\''.get_string('resubmissiongradewarn','turnitintool').'\'' : '';
  3206. if ( $submission->submission_attempts > 0 ) {
  3207. $cells['studentview']='<a href="' . $grademarkurl . '" title="' . get_string( 'student_read', 'turnitintool' ) . ' ' . userdate($submission->submission_attempts) . '" ';
  3208. $cells['studentview'].=' onclick="screenOpen(this.href,\''.$submission->id.'\',\''.$turnitintool->autoupdates.'\''.$warn.');return false;"';
  3209. $cells['studentview'].='><img style="position: relative; top: 4px;" src="'.$CFG->wwwroot.'/mod/turnitintool/pix/icon-student-read.png" class="tiiicons" /></a>';
  3210. } else {
  3211. $cells['studentview']='<a href="' . $grademarkurl . '" title="' . get_string( 'student_notread', 'turnitintool' ) . '" ';
  3212. $cells['studentview'].=' onclick="screenOpen(this.href,\''.$submission->id.'\',\''.$turnitintool->autoupdates.'\''.$warn.');return false;"';
  3213. $cells['studentview'].='><img style="position: relative; top: 4px;" src="'.$CFG->wwwroot.'/mod/turnitintool/pix/icon-dot.png" class="tiiicons" /></a>';
  3214. }
  3215. $table->rows[$i]->cells[$n] = new stdClass();
  3216. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' iconcell';
  3217. $table->rows[$i]->cells[$n]->data = $cells['studentview'];
  3218. $n++;
  3219. // Get Feedback Icon if needed
  3220. if (!$submission->nonmoodle) {
  3221. $comment_count = ( isset($comments[$submission->id]) ) ? $comments[$submission->id]->count : 0;
  3222. $notes=turnitintool_getnoteslink($cm,$turnitintool,$submission,$comment_count);
  3223. } else {
  3224. $notes='-';
  3225. }
  3226. $table->rows[$i]->cells[$n] = new stdClass();
  3227. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' iconcell';
  3228. $table->rows[$i]->cells[$n]->data = $notes;
  3229. $n++;
  3230. // Get Download Icon if needed
  3231. if (!is_null($submission->submission_objectid)) {
  3232. $downscript=' onclick="screenOpen(this.href,\''.$submission->id.'\',false,null,\'width=450,height=200\');return false;"';
  3233. $download='<a href="'.turnitintool_get_filelink($cm,$turnitintool,$submission,$download=true).'" title="'.
  3234. get_string('downloadsubmission','turnitintool').'" target="_blank"'.$downscript.'><img src="pix/file-download.png" alt="'.
  3235. get_string('downloadsubmission','turnitintool').'" class="tiiicons" /></a>';
  3236. } else {
  3237. $download='';
  3238. }
  3239. $table->rows[$i]->cells[$n] = new stdClass();
  3240. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' iconcell';
  3241. $table->rows[$i]->cells[$n]->data = $download;
  3242. $n++;
  3243. // Get Refresh Icon if needed
  3244. if (!is_null($submission->submission_objectid) && $submission->userid > 0) {
  3245. $refresh='<a class="refreshrow" style="cursor: pointer;" id="refreshrow-'.$cm->id.'-'.$turnitintool->id.'-'.$submission->id.'-'.$submission->submission_objectid.'" title="'.
  3246. get_string('refresh','turnitintool').'"><img src="pix/refresh.gif" alt="'.
  3247. get_string('refresh','turnitintool').'" class="tiiicons" /></a>';
  3248. } else {
  3249. $refresh='';
  3250. }
  3251. $table->rows[$i]->cells[$n] = new stdClass();
  3252. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' iconcell';
  3253. $table->rows[$i]->cells[$n]->data = $refresh;
  3254. $n++;
  3255. // Get Delete Icon if needed
  3256. $fnd = array("\n","\r");
  3257. $rep = array('\n','\r');
  3258. if (empty($submission->submission_objectid)) {
  3259. $confirm=' onclick="return confirm(\''.str_replace($fnd, $rep, get_string('deleteconfirm','turnitintool')).'\');"';
  3260. } else {
  3261. $confirm=' onclick="return confirm(\''.str_replace($fnd, $rep, get_string('turnitindeleteconfirm','turnitintool')).'\')"';
  3262. }
  3263. $delete='<a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&delete='.$submission->id.'&do='.$param_do.
  3264. '"'.$confirm.' title="'.get_string('deletesubmission','turnitintool').'"><img src="pix/delete.png" alt="'.
  3265. get_string('deletesubmission','turnitintool').'" class="tiiicons" /></a>';
  3266. $table->rows[$i]->cells[$n] = new stdClass();
  3267. $table->rows[$i]->cells[$n]->class = 'cell c' . $n . ' iconcell';
  3268. $table->rows[$i]->cells[$n]->data = $delete;
  3269. $n++;
  3270. $i++;
  3271. }
  3272. }
  3273. $sessionrefresh = (isset($_SESSION['updatedscores'][$turnitintool->id]) AND $_SESSION['updatedscores'][$turnitintool->id]>0) ? '' : 'refreshSubmissionsAjax();';
  3274. $output = "
  3275. <script type=\"text/javascript\">
  3276. var users = ".json_encode($studentuser_array).";
  3277. var message = '".get_string('turnitinenrollstudents','turnitintool')."';
  3278. jQuery(document).ready(function() {
  3279. jQuery(this).inboxTable( '".$cm->id."', ".$displayusi.", ".turnitintool_datatables_strings()." );
  3280. jQuery('#loader').css( 'display', 'none' );
  3281. $sessionrefresh
  3282. });
  3283. </script>";
  3284. $output .= '
  3285. <div class="tabLinks">
  3286. <div style="display: none;" id="inboxNotice"><span style="background: url(pix/ajax-loader.gif) no-repeat left center;padding-left: 80px;">
  3287. <span style="background: url(pix/ajax-loader.gif) no-repeat right center;padding-right: 80px;">'
  3288. .get_string('turnitinloading','turnitintool').'</span></span></div>
  3289. <a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=allsubmissions'.
  3290. '&update=1" onclick="refreshSubmissionsAjax();return false;" class="rightcor"><img src="'.$CFG->wwwroot.'/mod/turnitintool/pix/refresh.gif" alt="'.
  3291. get_string('turnitinrefreshsubmissions','turnitintool').'" class="tiiicons" /> '.
  3292. get_string('turnitinrefreshsubmissions','turnitintool').'</a>
  3293. <a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=allsubmissions'.
  3294. '&enroll=1" onclick="enrolStudentsAjax( users, message );return false;" class="rightcor"><img src="'.$CFG->wwwroot.'/mod/turnitintool/pix/enrollicon.gif" alt="'.
  3295. get_string('turnitinenrollstudents','turnitintool').'" class="tiiicons" /> '.
  3296. get_string('turnitinenrollstudents','turnitintool').'</a>
  3297. </div>';
  3298. if ( count( $table->rows ) == 1 ) { // If we only have one row it's a header and we found no data to display
  3299. $output .= '<div style="padding: 18px; margin: 0;text-align: center;vertical-align: center" class="navbar" id="loader">'
  3300. .get_string('nosubmissions','turnitintool').'</div><br /><br />';
  3301. } else {
  3302. $output .= '<div id="loader" style="padding: 18px; margin: 0;text-align: center;vertical-align: center" class="navbar">
  3303. <noscript>Javascript Required</noscript>
  3304. <script>
  3305. jQuery("#loader span").css( "display", "inline" );
  3306. </script><span style="display: none;background: url(pix/ajax-loader.gif) no-repeat left center;padding-left: 80px;">
  3307. <span style="background: url(pix/ajax-loader.gif) no-repeat right center;padding-right: 80px;">'.get_string('turnitinloading','turnitintool').'</span></span></div>';
  3308. $output .= turnitintool_print_table( $table, true );
  3309. }
  3310. return $output;
  3311. }
  3312. /**
  3313. * Outputs the table for the inbox, this is called by turnitintool_view_all_submissions()
  3314. *
  3315. * @global object
  3316. * @param object $cm The moodle course module object for this instance
  3317. * @param object $turnitintool The turnitintool object for this activity
  3318. * @param array $input The array of data containing table elements
  3319. * @return string Output of the tutor view submission inbox
  3320. */
  3321. function turnitintool_draw_submission_table($cm, $turnitintool, $input=array()) {
  3322. global $CFG;
  3323. // Input Multi Dimensional Array of table data
  3324. $table = new stdClass();
  3325. $table->width='85%';
  3326. $table->tablealign='center';
  3327. $table->class='gradeTable';
  3328. if (!$turnitintool->anon) {
  3329. $student_header=turnitintool_doheaderlinks($cm,$turnitintool,get_string('submissionstudent','turnitintool'),'7','8');
  3330. } else {
  3331. $student_header=get_string('submissionstudent','turnitintool');
  3332. }
  3333. $objectid_header=get_string('objectid','turnitintool');
  3334. $modified_header=turnitintool_doheaderlinks($cm,$turnitintool,get_string('posted','turnitintool'),'5','6');
  3335. $submissionorig_header=turnitintool_doheaderlinks($cm,$turnitintool,get_string('submissionorig','turnitintool'),'1','2');
  3336. $submissiongrade_header=turnitintool_doheaderlinks($cm,$turnitintool,get_string('submissiongrade','turnitintool'),'3','4');
  3337. $feedback_header=get_string('feedback','turnitintool');
  3338. $cells[0] = new stdClass();
  3339. $cells[0]->data=$student_header;
  3340. $cells[0]->class='header c0';
  3341. $plus=0;
  3342. if ( $CFG->turnitin_enablepseudo == 1 AND $CFG->turnitin_pseudolastname > 0 ) {
  3343. $user_info = turnitintool_get_record( 'user_info_field', 'id', $CFG->turnitin_pseudolastname );
  3344. $cells[1] = new stdClass();
  3345. $cells[1]->data=$user_info->name;
  3346. $cells[1]->class='header c1 markscell';
  3347. $plus=1;
  3348. }
  3349. $cells[1+$plus] = new stdClass();
  3350. $cells[1+$plus]->data=$objectid_header;
  3351. $cells[1+$plus]->class='header c'.(1+$plus).' markscell';
  3352. $cells[2+$plus] = new stdClass();
  3353. $cells[2+$plus]->data=$modified_header;
  3354. $cells[2+$plus]->class='header c'.(2+$plus).' datecell';
  3355. $cells[3+$plus] = new stdClass();
  3356. $cells[3+$plus]->data=$submissionorig_header;
  3357. $cells[3+$plus]->class='header c'.(3+$plus).' markscell';
  3358. $cells[4+$plus] = new stdClass();
  3359. $cells[4+$plus]->data=$submissiongrade_header;
  3360. $cells[4+$plus]->class='header c'.(4+$plus).' markscell';
  3361. $cells[5+$plus] = new stdClass();
  3362. $cells[5+$plus]->data='';
  3363. $cells[5+$plus]->class='header c'.(5+$plus).' iconcell';
  3364. $cells[6+$plus] = new stdClass();
  3365. $cells[6+$plus]->data='';
  3366. $cells[6+$plus]->class='header c'.(6+$plus).' markscell';
  3367. $cells[7+$plus] = new stdClass();
  3368. $cells[7+$plus]->data='';
  3369. $cells[7+$plus]->class='header c'.(7+$plus).' iconcell';
  3370. $cells[8+$plus] = new stdClass();
  3371. $cells[8+$plus]->data='';
  3372. $cells[8+$plus]->class='header c'.(8+$plus).' iconcell';
  3373. $table->rows[0] = new stdClass();
  3374. $table->rows[0]->cells=$cells;
  3375. $table->rows[0]->id='tableHeader';
  3376. $table->rows[0]->class='header';
  3377. unset($cells);
  3378. $i=0;
  3379. foreach ($input as $row) {
  3380. $i++;
  3381. $cells[0] = new stdClass();
  3382. $cells[0]->class='cell c0';
  3383. $cells[0]->data=$row['student'];
  3384. $plus=0;
  3385. if ( $CFG->turnitin_enablepseudo == 1 AND $CFG->turnitin_pseudolastname > 0 ) {
  3386. $cells[1] = new stdClass();
  3387. $cells[1]->data=( isset( $row['usi'] ) ) ? $row['usi'] : '';
  3388. $cells[1]->class='cell c1 markscell';
  3389. $plus=1;
  3390. }
  3391. $cells[1+$plus] = new stdClass();
  3392. $cells[1+$plus]->class='cell c'.(1+$plus).' markscell';
  3393. $cells[1+$plus]->data=$row['objectid'];
  3394. $cells[2+$plus] = new stdClass();
  3395. $cells[2+$plus]->class='cell c'.(1+$plus).' datecell';
  3396. $cells[2+$plus]->data=$row['modified'];
  3397. $cells[3+$plus] = new stdClass();
  3398. $cells[3+$plus]->class='cell c'.(1+$plus).' markscell';
  3399. $cells[3+$plus]->data=$row['score'];
  3400. $cells[4+$plus] = new stdClass();
  3401. $cells[4+$plus]->class='cell c'.(1+$plus).' markscell';
  3402. $cells[4+$plus]->data=$row['grade'];
  3403. $cells[5+$plus] = new stdClass();
  3404. $cells[5+$plus]->class='cell c'.(1+$plus).' iconcell';
  3405. $cells[5+$plus]->data=$row['studentview'];
  3406. $cells[6+$plus] = new stdClass();
  3407. $cells[6+$plus]->class='cell c'.(1+$plus).' markscell';
  3408. $cells[6+$plus]->data=$row['feedback'];
  3409. $cells[7+$plus] = new stdClass();
  3410. $cells[7+$plus]->class='cell c'.(1+$plus).' iconcell';
  3411. $cells[7+$plus]->data=$row['download'];
  3412. $cells[8+$plus] = new stdClass();
  3413. $cells[8+$plus]->class='cell c'.(1+$plus).' iconcell';
  3414. $cells[8+$plus]->data=$row['delete'];
  3415. $table->rows[$i] = new stdClass();
  3416. $table->rows[$i]->cells=$cells;
  3417. $table->rows[$i]->id=(isset($row['rowid'])) ? $row['rowid'] : '';
  3418. $table->rows[$i]->class=(isset($row['rowid'])) ? $row['class'] : '';
  3419. unset($cells);
  3420. }
  3421. // Draw Full Table
  3422. return turnitintool_print_table($table,true);
  3423. }
  3424. function turnitintool_reloadinbox_row( $cm, $turnitintool, $objectid ) {
  3425. // Must be instructor on the class
  3426. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id)) OR $turnitintool->studentreports OR $trigger>0) {
  3427. // Get the current submission values from the database
  3428. if ( !$submissions = turnitintool_get_records_select('turnitintool_submissions','submission_objectid='.$objectid.' AND turnitintoolid='.$turnitintool->id,'id DESC') ) {
  3429. header('HTTP/1.0 400 Bad Request');
  3430. echo get_string('submissiongeterror','turnitintool');
  3431. exit();
  3432. }
  3433. $first_submission = current( $submissions );
  3434. $userid = isset($first_submission->userid) ? $first_submission->userid : 0;
  3435. if ( $userid < 1 ) {
  3436. header('HTTP/1.0 400 Bad Request');
  3437. echo get_string('usergeterror','turnitintool');
  3438. exit();
  3439. }
  3440. $user = turnitintool_get_moodleuser( $userid );
  3441. // Instantiate the TII Comms Class
  3442. $loaderbar = null;
  3443. $tii=new turnitintool_commclass(turnitintool_getUID($user),$user->firstname,$user->lastname,$user->email,2,$loaderbar);
  3444. // Set the user up with a TII account if they do not already have one
  3445. turnitintool_usersetup($user,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  3446. if (isset( $tii->result) AND $tii->getRerror() ) {
  3447. header('HTTP/1.0 400 Bad Request');
  3448. if ($tii->getAPIunavailable()) {
  3449. echo get_string('apiunavailable','turnitintool');
  3450. } else {
  3451. echo $tii->getRmessage();
  3452. }
  3453. exit();
  3454. }
  3455. $grade = null;
  3456. $score = null;
  3457. $transmatch = null;
  3458. // Get all submissions for this user and this assignment part
  3459. $post = new stdClass();
  3460. $owner=turnitintool_get_owner($turnitintool->course);
  3461. $post->ctl=turnitintool_getCTL($turnitintool->course);
  3462. $post->cid=turnitintool_getCID($turnitintool->course);
  3463. $post->tem=$owner->email;
  3464. if (!$part=turnitintool_get_record('turnitintool_parts','id',$first_submission->submission_part)) {
  3465. header('HTTP/1.0 400 Bad Request');
  3466. echo get_string('partgeterror', 'turnitintool');
  3467. exit();
  3468. }
  3469. $post->assignid=turnitintool_getAID($part->id); // Get the Assignment ID for this Assignment / Turnitintool instance
  3470. $post->assign=$turnitintool->name.' - '.$part->partname.' (Moodle '.$post->assignid.')';
  3471. $tii->listSubmissions($post,'');
  3472. $tiisub_array=$tii->getSubmissionArray();
  3473. // loop through the submission array and grab the score and grade
  3474. foreach ( $tiisub_array as $index => $value ) {
  3475. if ( $index == $objectid ) {
  3476. $grade=turnitintool_processgrade($value["grademark"],$part,$owner,$post,$key,$tii,$loaderbar);
  3477. $score = $value["overlap"];
  3478. if ( $value["overlap"] !== '0' && empty( $value["overlap"] ) ) {
  3479. $score = null;
  3480. }
  3481. $transmatch = ($value["transmatch"]==1) ? 1 : 0;
  3482. break;
  3483. }
  3484. }
  3485. // If there are more than one row, which rarely happens but nice to deal with that here as part of this process
  3486. if ( count( $submissions ) > 1 ) {
  3487. $num_exists = 0;
  3488. // For each submission check to see if there are comments if there are do not delete the row, if not delete all and reinsert a single submission row
  3489. foreach ( $submissions as $submission ) {
  3490. if ( turnitintool_count_records('turnitintool_comments', 'submissionid', $submission->id) < 1 ) {
  3491. turnitintool_delete_records( 'turnitintool_submissions', 'id', $submission->id );
  3492. } else {
  3493. // There were comments, update what we have and increment the numebr that existed $num_exists
  3494. $submission->submission_score = $score;
  3495. if ( $submission->submission_score !== '0' && empty( $submission->submission_score ) ) {
  3496. $submission->submission_score = null;
  3497. }
  3498. $submission->submission_grade = $grade;
  3499. $submission->submission_transmatch = $transmatch;
  3500. turnitintool_update_record('turnitintool_submissions',$submission);
  3501. $num_exists++;
  3502. }
  3503. }
  3504. // If we didn't find any associated comments then we deleted all rows to insert the highest id submission values back into the table
  3505. if ( $num_exists == 0 ) {
  3506. $submission = array_shift( $submissions );
  3507. $submission->id = null;
  3508. if ( $submission->submission_score !== '0' && empty( $submission->submission_score ) ) {
  3509. $submission->submission_score = null;
  3510. }
  3511. $submission->submission_grade = $grade;
  3512. $submission->submission_transmatch = $transmatch;
  3513. turnitintool_insert_record('turnitintool_submissions',$submission);
  3514. }
  3515. } else {
  3516. // We should get here most times, this is where we only had one submission, in this case we update the row we have with the new values from the API
  3517. $submission = array_shift( $submissions );
  3518. $submission->submission_score = $score;
  3519. if ( $submission->submission_score !== '0' && empty( $submission->submission_score ) ) {
  3520. $submission->submission_score = null;
  3521. }
  3522. $submission->submission_grade = $grade;
  3523. $submission->submission_transmatch = $transmatch;
  3524. turnitintool_update_record('turnitintool_submissions',$submission);
  3525. }
  3526. // Return the submission details in a JSON response message
  3527. echo $submission->id;
  3528. } else {
  3529. header('HTTP/1.0 403 Not Found');
  3530. echo get_string('permissiondeniederror','turnitintool');
  3531. exit();
  3532. }
  3533. }
  3534. function turnitintool_getnoteslink( $cm, $turnitintool, $submission, $num=null ) {
  3535. global $CFG;
  3536. $num = ( is_null( $num ) ) ? turnitintool_count_records_select('turnitintool_comments','submissionid='.$submission->id.' AND deleted<1') : $num;
  3537. $notes='(<a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=notes&s='.$submission->id.'" title="'.get_string('notes','turnitintool').'">'.$num.'</a>)';
  3538. return $notes;
  3539. }
  3540. /**
  3541. * Enrolls a single Moodle user as a student onto the Turnitin Class
  3542. *
  3543. * @param object $cm The moodle course module object for this instance
  3544. * @param object $turnitintool The turnitintool object for this activity
  3545. * @param integer $userid The moodle student user id
  3546. */
  3547. function turnitintool_enroll_student($cm,$turnitintool,$userid) {
  3548. if (!$user = turnitintool_get_record('user','id',$userid)) {
  3549. $reason=get_string('usergeterror','turnitintool');
  3550. $response["status"] = 'error';
  3551. $response["description"] = get_string('updateerror','turnitintool').': '.get_string('turnitinenrollstudents','turnitintool');
  3552. $response["msg"] = $reason." (".$userid.")\n\n";
  3553. echo json_encode( $response );
  3554. exit();
  3555. }
  3556. if ( !has_capability( 'mod/turnitintool:submit', get_context_instance( CONTEXT_MODULE, $cm->id ) ) ) {
  3557. $reason=get_string('permissiondeniederror','turnitintool');
  3558. $response["status"] = 'error';
  3559. $response["description"] = get_string('updateerror','turnitintool').': '.get_string('turnitinenrollstudents','turnitintool');
  3560. $response["msg"] = $user->lastname.", ".$user->firstname." (".$user->email.")\n".$reason."\n\n";
  3561. echo json_encode( $response );
  3562. exit();
  3563. }
  3564. if (!$course = turnitintool_get_record('course','id',$turnitintool->course)) {
  3565. $reason=get_string('coursegeterror','turnitintool');
  3566. $response["status"] = 'error';
  3567. $response["description"] = get_string('updateerror','turnitintool').': '.get_string('turnitinenrollstudents','turnitintool');
  3568. $response["msg"] = $user->lastname.", ".$user->firstname." (".$user->email.")\n".$reason."\n\n";
  3569. echo json_encode( $response );
  3570. exit();
  3571. }
  3572. $post = new stdClass();
  3573. $post->cid=turnitintool_getCID($course->id); // Get the Turnitin Class ID for Course
  3574. $post->ctl=turnitintool_getCTL($course->id);
  3575. $owner = turnitintool_get_owner($turnitintool->course);
  3576. $post->tem=turnitintool_get_tutor_email($owner->id);
  3577. $tii = new turnitintool_commclass(turnitintool_getUID($user),$user->firstname,$user->lastname,$user->email,1,$loaderbar);
  3578. $tii->startSession();
  3579. $loaderbar = null;
  3580. $newuser=turnitintool_usersetup($user,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  3581. if ($tii->getRerror()) {
  3582. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  3583. $response["status"] = 'error';
  3584. $response["description"] = get_string('updateerror','turnitintool').': '.get_string('turnitinenrollstudents','turnitintool');
  3585. $response["msg"] = $user->lastname.", ".$user->firstname." (".$user->email.")\n".$reason."\n\n";
  3586. $tii->endSession();
  3587. echo json_encode( $response );
  3588. exit();
  3589. }
  3590. $tii->uid=$newuser->turnitin_uid;
  3591. $tii->joinClass($post,'');
  3592. if ($tii->getRerror()) {
  3593. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  3594. $response["status"] = 'error';
  3595. $response["description"] = get_string('updateerror','turnitintool').': '.get_string('turnitinenrollstudents','turnitintool');
  3596. $response["msg"] = $user->lastname.", ".$user->firstname." (".$user->email.")\n".$reason."\n\n";
  3597. } else {
  3598. $response["status"] = 'success';
  3599. $response["description"] = '';
  3600. $response["msg"] = '';
  3601. }
  3602. $tii->endSession();
  3603. echo json_encode( $response );
  3604. exit();
  3605. }
  3606. /**
  3607. * Enrolls all of the students enrolled in the Moodle Course onto the Turnitin Class
  3608. *
  3609. * @param object $cm The moodle course module object for this instance
  3610. * @param object $turnitintool The turnitintool object for this activity
  3611. */
  3612. function turnitintool_enroll_all_students($cm,$turnitintool) {
  3613. $context=get_context_instance(CONTEXT_MODULE, $cm->id);
  3614. $courseusers=get_users_by_capability($context, 'mod/turnitintool:submit', '', '', '', '', 0, '', false);
  3615. $courseusers=(!is_array($courseusers)) ? array() : $courseusers;
  3616. if (count($courseusers)>0) {
  3617. $total=(count($courseusers)*3);
  3618. $loaderbar = new turnitintool_loaderbarclass($total);
  3619. if (!$course = turnitintool_get_record('course','id',$turnitintool->course)) {
  3620. turnitintool_print_error('coursegeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  3621. exit();
  3622. }
  3623. $post = new stdClass();
  3624. $post->cid=turnitintool_getCID($course->id); // Get the Turnitin Class ID for Course
  3625. $post->ctl=turnitintool_getCTL($course->id);
  3626. $owner = turnitintool_get_owner($turnitintool->course);
  3627. $post->tem=turnitintool_get_tutor_email($owner->id);
  3628. $thisstudent=0;
  3629. $totalstudents=count($courseusers);
  3630. foreach ($courseusers as $courseuser) {
  3631. $tii = new turnitintool_commclass(turnitintool_getUID($courseuser),$courseuser->firstname,$courseuser->lastname,$courseuser->email,1,$loaderbar);
  3632. $tii->startSession();
  3633. $thisstudent++;
  3634. $newuser=turnitintool_usersetup($courseuser,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  3635. if ($tii->getRerror()) {
  3636. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  3637. $usererror[]='<br /><b>'.$courseuser->lastname.', '.$courseuser->firstname.' ('.$courseuser->email.')</b><br />'.$reason.'<br />';
  3638. $tii->endSession();
  3639. continue;
  3640. }
  3641. $tii->uid=$newuser->turnitin_uid;
  3642. $tii->joinClass($post,get_string('joiningclass','turnitintool','('.$thisstudent.'/'.$totalstudents.' '.get_string('students').')'));
  3643. if ($tii->getRerror()) {
  3644. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  3645. $usererror[]='<br /><b>'.$courseuser->lastname.', '.$courseuser->firstname.' ('.$courseuser->email.')</b><br />'.$reason.'<br />';
  3646. }
  3647. $tii->endSession();
  3648. }
  3649. if (isset($usererror) AND count($usererror)>0) {
  3650. $errorstring=get_string('updateerror','turnitintool').': '.get_string('turnitinenrollstudents','turnitintool').'<br />';
  3651. $errorstring.=implode($usererror).'<br />';
  3652. turnitintool_print_error($errorstring,NULL,NULL,NULL,__FILE__,__LINE__);
  3653. exit();
  3654. }
  3655. // Force Grade refresh on next page load
  3656. $_SESSION['updatedscores'][$turnitintool->id]==0;
  3657. }
  3658. }
  3659. /**
  3660. * Outputs the grade formatted with either a grademark for or moodle grade form depending on the options set
  3661. *
  3662. * @global object
  3663. * @global object
  3664. * @param object $cm The moodle course module object for this instance
  3665. * @param object $turnitintool The turnitintool object for this activity
  3666. * @param object $submission The submission object from the turnitintool_submissions table
  3667. * @param int $duedate The due date for this assignment part
  3668. * @param int $postdate The post date for this assignment part
  3669. * @param int $maxmarks The maximum marks allowed for this assignment part
  3670. * @param string $textcolour The colour of the grade text
  3671. * @param string $background The colour of the background for the grade box
  3672. * @param boolean $gradeable Is the grade gradeable or read only
  3673. * @return string Output of the grade form / display
  3674. */
  3675. function turnitintool_dogradeoutput($cm,$turnitintool,$submission,$duedate,$postdate,$maxmarks,$textcolour='#666666',$background='transparent',$gradeable=true) {
  3676. global $CFG, $USER;
  3677. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  3678. $utp=2;
  3679. } else {
  3680. $utp=1;
  3681. }
  3682. $thisuser=$USER;
  3683. $output='';
  3684. if ($CFG->turnitin_usegrademark AND $turnitintool->usegrademark AND ($utp==2 OR ($utp==1 AND $postdate<=time()))) {
  3685. $grademarkurl = $CFG->wwwroot . '/mod/turnitintool/view.php?id=' . $cm->id . '&jumppage=grade';
  3686. $grademarkurl .= '&userid=' . $thisuser->id . '&utp=' . $utp . '&objectid=' . $submission->submission_objectid;
  3687. $doscript='';
  3688. if (!empty($submission->submission_objectid)) {
  3689. $warn=($turnitintool->reportgenspeed==1 AND $duedate > time()) ? $warn=',\''.get_string('resubmissiongradewarn','turnitintool').'\'' : '';
  3690. $doscript=' onclick="screenOpen(\''.$grademarkurl.'\',\''.$submission->id.'\',\''.$turnitintool->autoupdates.'\''.$warn.');return false;"';
  3691. }
  3692. if (!empty($submission->submission_grade) OR $submission->submission_grade==0) {
  3693. if (is_null($submission->submission_grade)) {
  3694. $submission->submission_grade='-';
  3695. }
  3696. $output.='<input name="grade['.$submission->id.']" type="text" readonly="readonly" size="3" class="gradebox" value="'.
  3697. $submission->submission_grade.'" style="border: 0px solid white;background-color: '.$background.';color: '.$textcolour.';" />/'.$maxmarks.' ';
  3698. }
  3699. if (!empty($submission->submission_objectid) AND ($utp==2 OR ($utp == 1 AND $postdate <= time()))) {
  3700. if (!$submission->submission_gmimaged) {
  3701. $output.='<img src="pix/icon-edit-grey.png" class="tiiicons" />';
  3702. } else {
  3703. $output.='<a href="'.$grademarkurl.'"'.$doscript.'><img src="pix/icon-edit.png" class="tiiicons" /></a>';
  3704. }
  3705. }
  3706. } else {
  3707. if ($utp==2 AND $gradeable) {
  3708. $warn=($turnitintool->reportgenspeed==1 AND $postdate > time()) ? $warn=',\''.get_string('resubmissiongradewarn','turnitintool').'\'' : '';
  3709. $output.='
  3710. <span id="hideshow_'.$submission->id.'"><input name="grade['.$submission->id.']" id="grade_'.$submission->id.
  3711. '" type="text" size="3" class="gradebox" value="'.$submission->submission_grade.'" style="border: 1px inset;color: black;" />/'.$maxmarks.'</span>';
  3712. $output.='<input src="pix/tickicon.gif" name="updategrade" value="updategrade" id="tick_'.$submission->id.'" class="tiiicons" type="image" />';
  3713. $output.='<script language="javascript" type="text/javascript">
  3714. viewgrade(\''.$submission->id.'\',\''.$textcolour.'\',\''.$background.'\''.$warn.');
  3715. </script>';
  3716. } else if ($utp==2 OR $postdate<=time()) {
  3717. $output.='
  3718. <input name="grade['.$submission->id.']" id="grade_'.$submission->id.'" type="text" size="3" class="gradebox" value="'.$submission->submission_grade.
  3719. '" style="border: 0px;color: black;background-color: '.$background.'" readonly="readonly" />/'.$maxmarks;
  3720. }
  3721. }
  3722. if (empty($output)) {
  3723. $output.='
  3724. <input name="grade['.$submission->id.']" id="grade_'.$submission->id.
  3725. '" type="text" size="3" class="gradebox" value="-" style="border: 0px;color: black;background-color: '.
  3726. $background.'" readonly="readonly" />/'.$maxmarks;
  3727. }
  3728. return $output;
  3729. }
  3730. /**
  3731. * Processes the grade entry if grades are updated via Moodle only
  3732. *
  3733. * @param object $cm The moodle course module object for this instance
  3734. * @param object $turnitintool The turnitintool object for this activity
  3735. * @param array $post The POST array supplied from the grade update form
  3736. * @return string Returns $notice in the event of an error
  3737. */
  3738. function turnitintool_update_form_grades($cm,$turnitintool,$post) {
  3739. global $CFG;
  3740. $notice='';
  3741. $total=0;
  3742. $owner=turnitintool_get_owner($turnitintool->course);
  3743. foreach ($post['grade'] as $id => $thisgrade) {
  3744. if (!$submission=turnitintool_get_record('turnitintool_submissions','id',$id)) {
  3745. turnitintool_print_error('submissiongeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  3746. exit();
  3747. }
  3748. if ($thisgrade!=$submission->submission_grade) {
  3749. $total++;
  3750. }
  3751. }
  3752. $loaderbar = new turnitintool_loaderbarclass($total+2);
  3753. $tii = new turnitintool_commclass(turnitintool_getUID($owner),$owner->firstname,$owner->lastname,$owner->email,2,$loaderbar);
  3754. $tii->startSession();
  3755. $proc=0;
  3756. foreach ($post['grade'] as $id => $thisgrade) {
  3757. $thisgrade=round($thisgrade); // round the grade to an integer / Turnitin won't accept a null grade via the API
  3758. if (!$submission=turnitintool_get_record('turnitintool_submissions','id',$id)) {
  3759. turnitintool_print_error('submissiongeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  3760. exit();
  3761. }
  3762. if (!$part=turnitintool_get_record_select('turnitintool_parts',"id=".$submission->submission_part." AND deleted=0")) {
  3763. turnitintool_print_error('partgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  3764. exit();
  3765. }
  3766. // work out if the grade has changed from what is stored
  3767. if (empty($thisgrade) OR $thisgrade!=$submission->submission_grade) {
  3768. $user=turnitintool_get_moodleuser($submission->userid,NULL,__FILE__,__LINE__);
  3769. $update = new object;
  3770. $update->id=$id;
  3771. $update->submission_grade=$thisgrade;
  3772. print_object( $update );
  3773. if ($thisgrade>$part->maxmarks) {
  3774. $input = new stdClass();
  3775. $input->fullname=$user->firstname.' '.$user->lastname;
  3776. $input->part=turnitintool_partnamefromnum($submission->submission_part);
  3777. $input->maximum=$part->maxmarks;
  3778. $notice.=get_string('submissiongradetoohigh','turnitintool',$input);
  3779. } else {
  3780. if (!$result=turnitintool_update_record('turnitintool_submissions',$update)) {
  3781. $notice=get_string('submissionupdateerror','turnitintool');
  3782. }
  3783. }
  3784. // now push the grade to Turnitin
  3785. $post=new object();
  3786. $post->oid=$submission->submission_objectid;
  3787. $post->score=$thisgrade;
  3788. $post->cid=turnitintool_getCID($turnitintool->course);
  3789. $proc++;
  3790. $add = new stdClass();
  3791. $add->num=$proc;
  3792. $add->total=$total;
  3793. $tii->setGradeMark($post,get_string('pushinggrade','turnitintool',$add));
  3794. if ($tii->getRerror()) {
  3795. if ($tii->getAPIunavailable()) {
  3796. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  3797. } else {
  3798. turnitintool_print_error($tii->getRmessage().' CODE: '.$tii->getRcode(),NULL,NULL,NULL,__FILE__,__LINE__);
  3799. }
  3800. exit();
  3801. }
  3802. @include_once($CFG->dirroot."/lib/gradelib.php");
  3803. if (function_exists('grade_update')) {
  3804. $grades=turnitintool_buildgrades($turnitintool,$user);
  3805. $cm=get_coursemodule_from_instance("turnitintool", $turnitintool->id, $turnitintool->course);
  3806. $params['idnumber'] = $cm->idnumber;
  3807. grade_update('mod/turnitintool', $turnitintool->course, 'mod', 'turnitintool', $turnitintool->id, 0, $grades, $params);
  3808. }
  3809. }
  3810. }
  3811. $tii->endSession();
  3812. $loaderbar->endloader();
  3813. // Update gradebook grades in Moodle 1.9 and above
  3814. turnitintool_redirect($CFG->wwwroot."/mod/turnitintool/view.php?id=".$cm->id."&do=allsubmissions&update=1");
  3815. return $notice;
  3816. }
  3817. /**
  3818. * Updates all originality report scores and grades from a turnitin FID10 call
  3819. *
  3820. * @param object $cm The moodle course module object for this instance
  3821. * @param object $turnitintool The turnitintool object for this activity
  3822. * @param int $trigger 0 = allow once per session, 1 = allow once every two minutes, 2 = allow immediately
  3823. * @param object $loaderbar The loaderbar object passed by reference can be NULL if no loader bar is used
  3824. */
  3825. function turnitintool_update_all_report_scores($cm,$turnitintool,$trigger,$loaderbar=null) {
  3826. global $USER,$CFG,$notice;
  3827. $param_type=optional_param('type',null,PARAM_CLEAN);
  3828. $param_do=optional_param('do',null,PARAM_CLEAN);
  3829. $param_ob=optional_param('ob',null,PARAM_CLEAN);
  3830. $param_sh=optional_param('sh',null,PARAM_CLEAN);
  3831. $param_fr=optional_param('fr',null,PARAM_CLEAN);
  3832. $api_error=false;
  3833. // Check to see if the results for this user's session has been updated from
  3834. // Turnitin in the last two minutes. If they have then we should skip this refresh
  3835. // to avoid system load issues that can occur during busy submission periods
  3836. // where many tutors will enter inbox screens to check progress
  3837. if ($trigger<2 AND isset($_SESSION['updatedscores'][$turnitintool->id]) AND $_SESSION['updatedscores'][$turnitintool->id]>strtotime('-2 minutes')) {
  3838. return false;
  3839. }
  3840. // Update the score only when neccessary determined by a session variable
  3841. // This ensures the scores are only updated once per session
  3842. // or if the user requests update specifically [[[[
  3843. if (((isset($_SESSION['updatedscores'][$turnitintool->id]) AND $_SESSION['updatedscores'][$turnitintool->id]>0) OR isset($param_type)) AND $trigger<1) {
  3844. return false;
  3845. } else {
  3846. // Get Moodle user object [[[[
  3847. if (!$owner = turnitintool_get_owner($turnitintool->course)) {
  3848. turnitintool_print_error('tutorgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  3849. exit();
  3850. }
  3851. // ]]]]
  3852. // get Moodle Course Object [[[[
  3853. if (!$course = turnitintool_get_record('course','id',$turnitintool->course)) {
  3854. turnitintool_print_error('coursegeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  3855. exit();
  3856. }
  3857. // ]]]]
  3858. // get Moodle Parts Object [[[[
  3859. if (!$parts=turnitintool_get_records_select('turnitintool_parts',"turnitintoolid=".$turnitintool->id." AND deleted=0")) {
  3860. turnitintool_print_error('partgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  3861. exit();
  3862. }
  3863. // ]]]]
  3864. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id)) OR $turnitintool->studentreports OR $trigger>0) {
  3865. $total=count($parts);
  3866. $loaderbar = ( is_null( $loaderbar ) ) ? new turnitintool_loaderbarclass( 0 ) : $loaderbar;
  3867. $loaderbar->total=$loaderbar->total+$total;
  3868. $tii=new turnitintool_commclass(turnitintool_getUID($owner),$owner->firstname,$owner->lastname,$owner->email,2,$loaderbar);
  3869. turnitintool_usersetup($owner,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  3870. if (isset( $tii->result) AND $tii->getRerror() ) {
  3871. if ($tii->getAPIunavailable()) {
  3872. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  3873. } else {
  3874. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  3875. }
  3876. exit();
  3877. }
  3878. if (!$ids=turnitintool_get_records_select('turnitintool_submissions','turnitintoolid='.$turnitintool->id.' AND submission_objectid IS NOT NULL','','submission_objectid,id,submission_grade,submission_score,submission_modified,submission_status,submission_attempts,userid,submission_unanon')) {
  3879. $ids=array();
  3880. }
  3881. $context = get_context_instance( CONTEXT_COURSE, $turnitintool->course );
  3882. $studentusers = get_users_by_capability($context,'mod/turnitintool:submit','u.id,u.firstname,u.lastname','','','',0,'',false);
  3883. $studentuser_array = array_keys($studentusers);
  3884. $users_string = join( $studentuser_array, "," );
  3885. $users = turnitintool_get_records_sql('SELECT turnitin_uid,userid FROM {turnitintool_users} WHERE userid IN ('.$users_string.')');
  3886. $post = new stdClass();
  3887. $post->cid=turnitintool_getCID($course->id); // Get the Turnitin Class ID for Course
  3888. $post->tem=$owner->email; // Get the Turnitin Course Tutor Email
  3889. $post->ctl=turnitintool_getCTL($course->id);
  3890. foreach ($parts as $part) {
  3891. $post->assignid=turnitintool_getAID($part->id); // Get the Assignment ID for this Assignment / Turnitintool instance
  3892. $post->assign=$turnitintool->name.' - '.$part->partname.' (Moodle '.$post->assignid.')';
  3893. $status = new stdClass();
  3894. $status->user=get_string('student','turnitintool');
  3895. $status->proc=(isset($loaderbar->proc)) ? $loaderbar->proc : null;
  3896. $tii->listSubmissions($post,get_string('updatingscores','turnitintool',$status));
  3897. $resultArray=$tii->getSubmissionArray();
  3898. if ($tii->getRerror() AND isset($param_do) AND $param_do=='allsubmissions') {
  3899. $notice=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  3900. } else if ($tii->getRerror() AND isset($param_do) AND $param_do=='submissions') {
  3901. $notice['error']=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  3902. }
  3903. if ($tii->getRerror()) {
  3904. $api_error=true;
  3905. } else {
  3906. // Create an array of submission IDs with the TII Paper ID as key to repatriate the feedback with submissions
  3907. unset($inserts);
  3908. $inserts=array();
  3909. foreach ($resultArray as $key => $value) {
  3910. $insert=new object;
  3911. $insert->turnitintoolid=$turnitintool->id;
  3912. $insert->submission_part=$part->id;
  3913. $insert->submission_title=$value["title"];
  3914. $insert->submission_type=1;
  3915. $insert->submission_filename=str_replace(" ","_",$value["title"]).'.doc';
  3916. $insert->submission_objectid=$key;
  3917. $insert->submission_score=$value["overlap"];
  3918. if ( $value["overlap"] !== '0' && empty( $value["overlap"] ) ) {
  3919. $insert->submission_score = null;
  3920. }
  3921. $insert->submission_grade=turnitintool_processgrade($value["grademark"],$part,$owner,$post,$key,$tii,$loaderbar);
  3922. $insert->submission_status=get_string('submissionuploadsuccess','turnitintool');
  3923. $insert->submission_queued=0;
  3924. $insert->submission_attempts=( $value["student_view"] > 0 ) ? strtotime($value["student_view"]) : 0;
  3925. $insert->submission_gmimaged = $value["grademarkstatus"]>0 ? 1 : 0;
  3926. $insert->submission_modified=strtotime($value["date_submitted"]);
  3927. $insert->submission_parent=0;
  3928. $insert->submission_unanon=($value["anon"]==1) ? 0 : 1;
  3929. $insert->submission_transmatch=($value["transmatch"]==1) ? 1 : 0;
  3930. if ( isset($users[$value["userid"]]) ) {
  3931. // If returned userid is already stored and the user is enrolled on the course
  3932. // we can use real Moodle user to store against
  3933. $insert->submission_nmuserid=0;
  3934. $insert->submission_nmfirstname=NULL;
  3935. $insert->submission_nmlastname=NULL;
  3936. $insert->userid=$users[$value["userid"]]->userid;
  3937. } else {
  3938. // If userid is not already stored we can not use real user to store against, use (Non Moodle) Marker
  3939. $insert->submission_nmuserid=($value["userid"]=="-1") ? md5($value["firstname"].$value["lastname"]) : $value["userid"];
  3940. if (!empty($value["firstname"])) {
  3941. $insert->submission_nmfirstname=$value["firstname"];
  3942. } else {
  3943. $insert->submission_nmfirstname='Unnamed';
  3944. }
  3945. if (!empty($value["lastname"])) {
  3946. $insert->submission_nmlastname=$value["lastname"];
  3947. } else {
  3948. $insert->submission_nmlastname='User';
  3949. }
  3950. $insert->userid=0;
  3951. }
  3952. // Only do DB update if the record has changed, saves DB calls
  3953. if ( !isset( $ids[$key] ) OR $insert->submission_grade != $ids[$key]->submission_grade
  3954. OR $insert->submission_score != $ids[$key]->submission_score
  3955. OR $insert->submission_modified != $ids[$key]->submission_modified
  3956. OR $insert->submission_attempts != $ids[$key]->submission_attempts
  3957. OR $insert->userid != $ids[$key]->userid
  3958. OR $insert->submission_unanon != $ids[$key]->submission_unanon ) {
  3959. $inserts[]=$insert;
  3960. }
  3961. $keys_found[] = $key;
  3962. }
  3963. // Purge old submissions listings
  3964. foreach ( $ids as $submission ) {
  3965. if ( !in_array( $submission->submission_objectid, $keys_found ) ) {
  3966. turnitintool_delete_records_select('turnitintool_submissions','submission_objectid='.$submission->submission_objectid.' AND submission_part='.$part->id);
  3967. }
  3968. }
  3969. // Now insert the new submissions and update existing submissions
  3970. foreach ($inserts as $insert) {
  3971. $key = $insert->submission_objectid;
  3972. if (isset($ids[$key])) {
  3973. $insert->id=$ids[$key]->id;
  3974. $insertid=turnitintool_update_record('turnitintool_submissions',$insert);
  3975. } else {
  3976. $insertid=turnitintool_insert_record('turnitintool_submissions',$insert);
  3977. }
  3978. $submission=$insert;
  3979. unset($insert);
  3980. // Update gradebook grades in Moodle 1.9 and above
  3981. @include_once($CFG->dirroot."/lib/gradelib.php");
  3982. if (function_exists('grade_update') AND $submission->userid!=0) {
  3983. $user=turnitintool_get_moodleuser($submission->userid,NULL,__FILE__,__LINE__);
  3984. $cm=get_coursemodule_from_instance("turnitintool", $turnitintool->id, $turnitintool->course);
  3985. $grades=turnitintool_buildgrades($turnitintool,$user);
  3986. $grades->userid=$user->id;
  3987. $params['idnumber'] = $cm->idnumber;
  3988. grade_update('mod/turnitintool', $turnitintool->course, 'mod', 'turnitintool', $turnitintool->id, 0, $grades, $params);
  3989. }
  3990. // ]]]]
  3991. }
  3992. }
  3993. }
  3994. if ( $api_error ) {
  3995. $notice=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  3996. $loaderbar->endloader();
  3997. return false;
  3998. }
  3999. $loaderbar->endloader();
  4000. if (isset($return)) {
  4001. $_SESSION['updatedscores'][$turnitintool->id]=0;
  4002. } else {
  4003. $_SESSION['updatedscores'][$turnitintool->id]=time();
  4004. }
  4005. $redirectlink=$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id;
  4006. $redirectlink.=(!is_null($param_do)) ? '&do='.$param_do : '&do=intro';
  4007. $redirectlink.=(!is_null($param_fr)) ? '&fr='.$param_fr : '';
  4008. $redirectlink.=(!is_null($param_sh)) ? '&sh='.$param_sh : '';
  4009. $redirectlink.=(!is_null($param_ob)) ? '&ob='.$param_ob : '';
  4010. turnitintool_redirect($redirectlink);
  4011. }
  4012. }
  4013. }
  4014. /**
  4015. * Processes the grade and makes sure it is no higher than the Max Grade (which is possible via GradeMark)
  4016. * the grade is set to the maximum grade if higher than maximum
  4017. *
  4018. * @param var $grade The grade input
  4019. * @param object $part The part object for this assignment part
  4020. * @param object $owner The moodle user object of the Turnitin owner of this class
  4021. * @return string Returns the corrected / processed grade
  4022. */
  4023. function turnitintool_processgrade($grade,$part,$owner,$post,$objectid,&$tii,&$loaderbar) {
  4024. $grade=($grade==='0' OR $grade===0 OR !empty($grade)) ? $grade : NULL;
  4025. if ($grade<=$part->maxmarks) { // If grade is LOWER or equal to max grade fine.... RETURN GRADE
  4026. $output=$grade;
  4027. } else { // If grade is HIGHER than max grade correct it.... UPDATE TII GRADE TO MAXMARKS and RETURN MAXMARKS
  4028. $output=$part->maxmarks;
  4029. $post = new stdClass();
  4030. $post->oid=$objectid;
  4031. $post->score=$output;
  4032. if (!is_null($loaderbar)) {
  4033. $loaderbar->total=$loaderbar->total+1;
  4034. }
  4035. $tii->setGradeMark($post,get_string('correctingovergrade','turnitintool'));
  4036. }
  4037. return $output;
  4038. }
  4039. /**
  4040. * Converts a percentage to the gradient position for colouring the Originality score block
  4041. *
  4042. * @param var $percent The percentage originality score input
  4043. * @param string $left The left offset of the coloured block part of the originality score output box
  4044. * @return string Outputs the style attribute for the originality box
  4045. */
  4046. function turnitintool_percent_to_gradpos($percent,$left='0') {
  4047. $pos=floor(($percent/100)*(-380));
  4048. $style=' style="background: url(pix/gradback.jpg) no-repeat '.$left.'px '.$pos.'px";';
  4049. return $style;
  4050. }
  4051. /**
  4052. * Deletes the submission from both Moodle and Turnitin OR just Moodle if the submission is a draft
  4053. *
  4054. * @param object $cm The moodle course module object for this instance
  4055. * @param object $turnitintool The turnitintool object for this activity
  4056. * @param var $userid The Moodle User ID of the user deletingh the submission
  4057. * @param object $submission The submission data object from turnitintool_submissions
  4058. */
  4059. function turnitintool_delete_submission($cm,$turnitintool,$userid,$submission) {
  4060. global $USER,$CFG;
  4061. $param_do=optional_param('do',null,PARAM_CLEAN);
  4062. // If user is student and has not finalized to turnitin OK
  4063. // If user is grader / tutor
  4064. // Or If resubmissions are allowed -- OK [[[[
  4065. if (empty($submission->submission_objectid)
  4066. OR
  4067. has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))
  4068. OR
  4069. $turnitintool->reportgenspeed==1
  4070. ) {
  4071. // Trap any possible attempt to delete someone elses submission unless they are a tutor
  4072. // Should not happen but trapping is easy [[[[
  4073. if ($userid!=$submission->userid AND !has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  4074. turnitintool_print_error('permissiondeniederror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4075. exit();
  4076. }
  4077. // ]]]]
  4078. // Everything is OK delete the Moodle Stored Submission data first [[[[
  4079. if (!turnitintool_delete_records('turnitintool_submissions','id',$submission->id)) {
  4080. turnitintool_print_error('submissiondeleteerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4081. exit();
  4082. }
  4083. // ]]]]
  4084. add_to_log($turnitintool->course, "turnitintool", "delete submission", "view.php?id=$cm->id", "User deleted submission '$submission->submission_title'", "$cm->id");
  4085. // Only do this at this point if the user is a grader OR resubmissions allowed [[[[
  4086. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))
  4087. OR
  4088. $turnitintool->reportgenspeed==1) {
  4089. // Has the submission been made to Turnitin if there is no stored TII Object ID
  4090. // We can assume this to be the case [[[
  4091. if (!empty($submission->submission_objectid)) {
  4092. // DELETE FROM TURNITIN
  4093. $owner=turnitintool_get_owner($turnitintool->course);
  4094. $loaderbar = new turnitintool_loaderbarclass(3);
  4095. $tii = new turnitintool_commclass(turnitintool_getUID($owner),$owner->firstname,$owner->lastname,$owner->email,2,$tii,$loaderbar);
  4096. $tii->startSession();
  4097. turnitintool_usersetup($owner,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  4098. if ($tii->getRerror()) {
  4099. if ($tii->getAPIunavailable()) {
  4100. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4101. } else {
  4102. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  4103. }
  4104. exit();
  4105. }
  4106. // Gather the variables required for this Function [[[[
  4107. $post = new stdClass();
  4108. $post->paperid=$submission->submission_objectid;
  4109. // ]]]]
  4110. $tii->deleteSubmission($post,get_string('deletingsubmission','turnitintool'));
  4111. if ($tii->getRerror()) {
  4112. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  4113. $reason.='<br />'.get_string('turnitindeletionerror','turnitintool');
  4114. turnitintool_print_error($reason,NULL,NULL,NULL,__FILE__,__LINE__);
  4115. exit();
  4116. }
  4117. $tii->endSession();
  4118. }
  4119. // ]]]]
  4120. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&user='.$userid.'&do='.$param_do);
  4121. exit();
  4122. } else {
  4123. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do='.$param_do);
  4124. exit();
  4125. }
  4126. // ]]]]
  4127. }
  4128. // ]]]]
  4129. }
  4130. /**
  4131. *
  4132. * @param object $turnitintool The turnitintool object for this activity
  4133. */
  4134. function turnitintool_update_choice_cookie($turnitintool) {
  4135. global $CFG;
  4136. // If a submission is deleted or submitted we need to update the cookie and correct the submission count
  4137. $userCookieArray = array();
  4138. $newUserCookie='';
  4139. $newCountCookie='';
  4140. if (isset($_COOKIE["turnitintool_choice_user"])) {
  4141. $userCookie=$_COOKIE["turnitintool_choice_user"];
  4142. $userCookieArray=explode("_",$userCookie);
  4143. }
  4144. if (isset($_COOKIE["turnitintool_choice_count"])) {
  4145. $countCookie=$_COOKIE["turnitintool_choice_count"];
  4146. $countCookieArray=explode("_",$countCookie);
  4147. }
  4148. for ($i=0;$i<count($userCookieArray);$i++) {
  4149. if (substr_count($userCookieArray[$i],'nm-')>0 AND !$turnitintool->anon) {
  4150. $nmuserid=str_replace('nm-','',$userCookieArray[$i]);
  4151. $numsubmissions = turnitintool_count_records('turnitintool_submissions','submission_nmuserid',$nmuserid,'turnitintoolid',$turnitintool->id);
  4152. } else if (!$turnitintool->anon) {
  4153. $numsubmissions = turnitintool_count_records('turnitintool_submissions','userid',$userCookieArray[$i],'turnitintoolid',$turnitintool->id);
  4154. } else {
  4155. $nmsubmissions = turnitintool_count_records('turnitintool_submissions','submission_part',$userCookieArray[$i],'turnitintoolid',$turnitintool->id,'userid',0);
  4156. $cm=get_coursemodule_from_instance('turnitintool',$turnitintool->id,$turnitintool->course);
  4157. $context = get_context_instance(CONTEXT_MODULE, $cm->id);
  4158. $studentusers=get_users_by_capability($context,'mod/turnitintool:submit','u.id','','','','','',false);
  4159. $numusers=(!is_array($studentusers)) ? 0 : count($studentusers);
  4160. $numsubmissions=$nmsubmissions+$numusers;
  4161. }
  4162. if ($numsubmissions!=0) {
  4163. $newUserCookie.=$userCookieArray[$i];
  4164. $newCountCookie.=$numsubmissions;
  4165. }
  4166. if ($i!=count($userCookieArray)-1) {
  4167. $newUserCookie.='_';
  4168. $newCountCookie.='_';
  4169. }
  4170. }
  4171. setcookie("turnitintool_choice_user",$newUserCookie,0,"/");
  4172. setcookie("turnitintool_choice_count",$newCountCookie,0,"/");
  4173. }
  4174. /**
  4175. * Function to get the email address of the tutor
  4176. *
  4177. * @param object $cm The moodle course module object for this instance
  4178. * @param object $turnitintool The turnitintool object for this activity
  4179. * @param var $userid The Moodle User ID of the user
  4180. * @return string The email address of the tutor
  4181. */
  4182. function turnitintool_get_tutor_email($userid) {
  4183. $user=turnitintool_get_moodleuser($userid,NULL,__FILE__,__LINE__);
  4184. // If the user has been deleted from Moodle there is a remnant of the Email address
  4185. // left in the username field of the database. So if the email address is empty we can
  4186. // get this email address by removing the timestamp by popping it off the end of the string [[[[
  4187. if (empty($user->email)) {
  4188. $email_array=explode('.',$user->username);
  4189. array_pop($email_array);
  4190. $email=join('.',$email_array);
  4191. } else {
  4192. // If the user has not been deleted this becomes simple get data
  4193. $email=$user->email;
  4194. }
  4195. // ]]]]
  4196. return $email;
  4197. }
  4198. /**
  4199. * Determines whether a user is allowed to submit to any part of this assignment
  4200. *
  4201. * @param object $cm The moodle course module object for this instance
  4202. * @param object $turnitintool The turnitintool object for this activity
  4203. * @param object $user The Moodle User Object for the user viewing the submission screen
  4204. * @return array Returns true if executed by a user and they can submit or returns an array of users that can submit if executed by a tutor
  4205. */
  4206. function turnitintool_cansubmit($cm,$turnitintool,$user) { // Returns an array of users that can still submit if executed by a tutor or true if executed by a user
  4207. $return=false;
  4208. $context = get_context_instance(CONTEXT_MODULE, $cm->id);
  4209. $studentusers=get_users_by_capability($context, 'mod/turnitintool:submit', 'u.id,u.firstname,u.lastname', 'u.lastname', '', '', turnitintool_module_group($cm), '', false);
  4210. // Count the number of parts still available to be submitted from start date and end date
  4211. if ($turnitintool->allowlate==1) {
  4212. $partsavailable=turnitintool_get_records_select('turnitintool_parts', "turnitintoolid=".$turnitintool->id." AND deleted=0 AND dtstart < ".time()."");
  4213. } else {
  4214. $partsavailable=turnitintool_get_records_select('turnitintool_parts', "turnitintoolid=".$turnitintool->id." AND deleted=0 AND dtstart < ".time()." AND dtdue > ".time()."");
  4215. }
  4216. if (!$partsavailable) {
  4217. $partsavailable=array();
  4218. }
  4219. $numpartsavailable=count($partsavailable);
  4220. // Check to see if the submitter is a tutor / grader
  4221. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  4222. $return=array();
  4223. foreach ($partsavailable as $partavailable) {
  4224. if (is_array($studentusers)) {
  4225. foreach ($studentusers as $studentuser) {
  4226. $submitted=(!turnitintool_get_records_select('turnitintool_submissions','turnitintoolid='.$turnitintool->id.
  4227. ' AND submission_part='.$partavailable->id.' AND userid='.$studentuser->id)) ? 0 : 1;
  4228. if (!$submitted // Student has made no submissions
  4229. OR
  4230. ( $turnitintool->reportgenspeed > 0 AND $partavailable->dtdue >= time() AND $submitted ) // Resubmissions Allowed and due date hasn't passed
  4231. ) {
  4232. // If the student has not made a submission or reportgenspeed is 1 or 2 ie reports can be overwritten add student to the array
  4233. // If late submissions is enabled one submission is allowed after due date even if resubmission is on
  4234. $return[$studentuser->id]=$studentuser;
  4235. }
  4236. }
  4237. }
  4238. }
  4239. } else {
  4240. foreach ($partsavailable as $partavailable) {
  4241. $submitted=(!turnitintool_get_records_select('turnitintool_submissions','turnitintoolid='.$turnitintool->id.
  4242. ' AND submission_part='.$partavailable->id.' AND userid='.$user->id)) ? 0 : 1;
  4243. if (!$submitted // Student has made no submissions
  4244. OR
  4245. ($turnitintool->reportgenspeed==1 AND $partavailable->dtdue>=time() AND $submitted) // Resubmissions Allowed and due date hasn't passed
  4246. ) {
  4247. // If the student has not made all possible submissions or is allowed to resubmit
  4248. // If late submissions is enabled one submission is allowed after due date even if resubmission is on
  4249. $return=true; // A boolean that tells me whether this student has more parts that they can submit to
  4250. }
  4251. }
  4252. }
  4253. return $return;
  4254. }
  4255. /**
  4256. * Outputs the HTML for the submission form
  4257. *
  4258. * @global object
  4259. * @global object
  4260. * @global object
  4261. * @param object $cm The moodle course module object for this instance
  4262. * @param object $turnitintool The turnitintool object for this activity
  4263. * @param var $submissionid The Submission ID of the submission in turnitintool_submission
  4264. * @return string returns the HTML of the form
  4265. */
  4266. function turnitintool_view_submission_form($cm,$turnitintool,$submissionid=NULL) {
  4267. global $CFG,$USER,$COURSE;
  4268. $param_type=optional_param('type',0,PARAM_CLEAN);
  4269. $param_userid=optional_param('userid',null,PARAM_CLEAN);
  4270. $param_agreement=optional_param('agreement',null,PARAM_CLEAN);
  4271. $cansubmit=turnitintool_cansubmit($cm,$turnitintool,$USER);
  4272. $totalusers = (!$cansubmit) ? 0 : count($cansubmit);
  4273. if ($cansubmit AND $totalusers>0) {
  4274. $output=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive', 'submitbox',true);
  4275. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  4276. $submissions=turnitintool_get_records_select('turnitintool_submissions','turnitintoolid='.$turnitintool->id);
  4277. } else {
  4278. $submissions=turnitintool_get_records_select('turnitintool_submissions','userid='.$USER->id.' AND turnitintoolid='.$turnitintool->id);
  4279. }
  4280. $output.='<script language="javascript" type="text/javascript">'.PHP_EOL;
  4281. $output.='var stringsArray = new Array("'.get_string('addsubmission','turnitintool').'","'
  4282. .get_string('resubmit','turnitintool').'","'
  4283. .get_string('resubmission','turnitintool').'","'
  4284. .get_string('resubmissionnotenabled','turnitintool').'","'
  4285. .get_string('anonenabled','turnitintool').'");'.PHP_EOL;
  4286. $output.='var submissionArray = new Array();'.PHP_EOL;
  4287. if ($turnitintool->allowlate==1) {
  4288. $parts=turnitintool_get_records_select('turnitintool_parts',
  4289. "turnitintoolid='".$turnitintool->id."' AND deleted=0 AND dtstart < '".time()."'",
  4290. 'dtstart,dtdue,dtpost,id');
  4291. } else {
  4292. $parts=turnitintool_get_records_select('turnitintool_parts',
  4293. "turnitintoolid='".$turnitintool->id."' AND deleted=0 AND dtstart < '".time()."' AND dtdue > '".time()."'",
  4294. 'dtstart,dtdue,dtpost,id');
  4295. }
  4296. if (is_array($submissions)) {
  4297. $i=0;
  4298. foreach ($submissions as $submission) {
  4299. $lockresubmission=0;
  4300. if (isset($parts[$submission->submission_part]) AND $parts[$submission->submission_part]->dtdue < time()) {
  4301. $lockresubmission=1;
  4302. }
  4303. $output.='submissionArray['.$i.'] = new Array("'.$submission->userid.'","'.$submission->submission_part.'","'.$submission->submission_title.'","'.$submission->submission_unanon.'",'.$lockresubmission.');'.PHP_EOL;
  4304. $submittedparts[]=$submission->submission_part;
  4305. $i++;
  4306. }
  4307. }
  4308. $output.='</script>'.PHP_EOL;
  4309. $table = new stdClass();
  4310. $table->width='100%';
  4311. $table->id='uploadtable';
  4312. $table->class='uploadtable';
  4313. unset($cells);
  4314. $cells=array();
  4315. $cells[0] = new stdClass();
  4316. $cells[0]->class='cell c0';
  4317. $cells[0]->data=get_string('submissiontype', 'turnitintool').turnitintool_help_icon('submissiontype',get_string('submissiontype','turnitintool'),'turnitintool',true,false,'',true);
  4318. if ($turnitintool->type==0) {
  4319. if ($param_type==1) {
  4320. $selected=array('',' selected','','');
  4321. } else if ($param_type==2) {
  4322. $selected=array('','',' selected','');
  4323. } else if ($param_type==3) {
  4324. $selected=array('','','',' selected');
  4325. } else {
  4326. $selected=array(' selected','','','');
  4327. $param_type=0;
  4328. }
  4329. $cells[1] = new stdClass();
  4330. $cells[1]->class='cell c1';
  4331. $cells[1]->data='<select onchange="turnitintool_jumptopage(this.value)">';
  4332. $cells[1]->data.='<option label="Select Submission Type" value="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.
  4333. $cm->id.'&do=submissions"'.$selected[0].'>Select Submission Type</option>';
  4334. $cells[1]->data.='<option label="-----------------" value="#">-----------------</option>';
  4335. $typearray=turnitintool_filetype_array(false);
  4336. foreach ($typearray as $typekey => $typevalue) {
  4337. $cells[1]->data.='
  4338. <option label="'.$typevalue.'" value="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=submissions&type='.
  4339. $typekey.'"'.$selected[$typekey].'>'.$typevalue.'</option>';
  4340. }
  4341. $cells[1]->data.='
  4342. </select>
  4343. <input id="submissiontype" name="submissiontype" type="hidden" value="'.$param_type.'" />';
  4344. } else if ($turnitintool->type==1) {
  4345. $param_type=1;
  4346. $cells[1] = new stdClass();
  4347. $cells[1]->data='<input id="submissiontype" name="submissiontype" type="hidden" value="1" />'.get_string('fileupload','turnitintool');
  4348. } else if ($turnitintool->type==2) {
  4349. $param_type=2;
  4350. $cells[1] = new stdClass();
  4351. $cells[1]->data='<input id="submissiontype" name="submissiontype" type="hidden" value="2" />'.get_string('textsubmission','turnitintool');
  4352. }
  4353. $output.='<b>'.get_string('submit','turnitintool').'</b><br />
  4354. <form enctype="multipart/form-data" action="'.$CFG->wwwroot.'/mod/turnitintool/view.php'.'?id='.$cm->id.'&do=submissions&type='.$param_type.'" method="POST" name="submissionform">';
  4355. $table->rows[0] = new stdClass();
  4356. $table->rows[0]->class='r0';
  4357. $table->rows[0]->cells=$cells;
  4358. $context = get_context_instance(CONTEXT_MODULE, $cm->id);
  4359. if ($param_type!=0) {
  4360. $submissiontitle=optional_param('submissiontitle','',PARAM_CLEAN);
  4361. $disableform=false;
  4362. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  4363. $utype="tutor";
  4364. // If tutor submitting on behalf of student
  4365. unset($cells);
  4366. $cells[0] = new stdClass();
  4367. $cells[0]->class='cell c0';
  4368. $cells[0]->data=get_string('studentsname', 'turnitintool').turnitintool_help_icon('studentsname',get_string('studentsname','turnitintool'),'turnitintool',true,false,'',true);
  4369. if (count($cansubmit)>0) {
  4370. $cells[1] = new stdClass();
  4371. $cells[1]->data='<select name="userid" id="userid" onchange="updateSubForm(submissionArray,stringsArray,this.form,'.$turnitintool->reportgenspeed.')">';
  4372. $module_group = turnitintool_module_group( $cm );
  4373. $studentusers = array_keys( get_users_by_capability($context,'mod/turnitintool:submit','u.id','','','',$module_group,'',false) );
  4374. foreach ($cansubmit as $courseuser) {
  4375. // Filter Guest users, admins and grader users
  4376. if (in_array( $courseuser->id, $studentusers ) ) {
  4377. if (!is_null($param_userid) AND $param_userid==$courseuser->id) {
  4378. $selected=' selected';
  4379. } else {
  4380. $selected='';
  4381. }
  4382. $cells[1]->data.='<option label="'.$courseuser->firstname.' '.$courseuser->lastname.
  4383. '" value="'.$courseuser->id.'"'.$selected.'>'.$courseuser->lastname.
  4384. ', '.$courseuser->firstname.'</option>';
  4385. }
  4386. }
  4387. $cells[1]->data.='</select>';
  4388. if ($cells[1]->data=='<select id="userid" name="userid">'.'</select>') {
  4389. $cells[1]->data='<i>'.get_string('allsubmissionsmade','turnitintool').'</i>';
  4390. $disableform=true;
  4391. }
  4392. } else {
  4393. $cells[1] = new stdClass();
  4394. $cells[1]->data='<i>'.get_string('noenrolledstudents','turnitintool').'</i>';
  4395. }
  4396. $table->rows[1] = new stdClass();
  4397. $table->rows[1]->class='r1';
  4398. $table->rows[1]->cells=$cells;
  4399. } else {
  4400. $utype="student";
  4401. // If student submitting
  4402. unset($cells);
  4403. $cells[0] = new stdClass();
  4404. $cells[0]->class='cell c0';
  4405. $cells[0]->data='';
  4406. $cells[1] = new stdClass();
  4407. $cells[1]->data='<input id="userid" name="userid" type="hidden" value="'.$USER->id.'" />';
  4408. $table->rows[1] = new stdClass();
  4409. $table->rows[1]->class='r1';
  4410. $table->rows[1]->cells=$cells;
  4411. }
  4412. if (!$disableform) {
  4413. unset($cells);
  4414. $cells[0] = new stdClass();
  4415. $cells[0]->class='cell c0';
  4416. $cells[0]->data=get_string('submissiontitle', 'turnitintool').turnitintool_help_icon('submissiontitle',
  4417. get_string('submissiontitle','turnitintool'),
  4418. 'turnitintool',
  4419. true,
  4420. false,
  4421. '',
  4422. true);
  4423. $cells[1] = new stdClass();
  4424. $cells[1]->data='<input type="text" name="submissiontitle" class="formwide" maxlength="200" value="'.$submissiontitle.'" />&nbsp;<span id="submissionnotice"></span>';
  4425. $table->rows[2] = new stdClass();
  4426. $table->rows[2]->class='r0';
  4427. $table->rows[2]->cells=$cells;
  4428. if (count($parts)>1) {
  4429. unset($cells);
  4430. $cells[0] = new stdClass();
  4431. $cells[0]->class='cell c0';
  4432. $cells[0]->data=get_string('submissionpart', 'turnitintool').turnitintool_help_icon('submissionpart', get_string('submissionpart','turnitintool'),
  4433. 'turnitintool',true,false,'',true);
  4434. $cells[1] = new stdClass();
  4435. $cells[1]->data='<select name="submissionpart" class="formwide" onchange="updateSubForm(submissionArray,stringsArray,this.form,'.$turnitintool->reportgenspeed.',\''.$utype.'\')">';
  4436. $i=0;
  4437. foreach ($parts as $part) { // Do parts that have not yet been submitted to
  4438. $cells[1]->data.='<option label="'.$part->partname.'" value="'.$part->id.'">'.$part->partname.'</option>';
  4439. $i++;
  4440. }
  4441. $cells[1]->data.='</select>';
  4442. $table->rows[3] = new stdClass();
  4443. $table->rows[3]->class='r1';
  4444. $table->rows[3]->cells=$cells;
  4445. } else {
  4446. unset($cells);
  4447. $cells[0] = new stdClass();
  4448. $cells[0]->class='cell c0';
  4449. $cells[0]->data=get_string('submissionpart', 'turnitintool').
  4450. turnitintool_help_icon('submissionpart',get_string('submissionpart','turnitintool'),'turnitintool',true,false,'',true);
  4451. foreach ($parts as $part) { // Do parts that have not yet been submitted to
  4452. $cells[1] = new stdClass();
  4453. $cells[1]->data=$part->partname.'<input type="hidden" name="submissionpart" value="'.$part->id.'" />';
  4454. break;
  4455. }
  4456. $table->rows[3] = new stdClass();
  4457. $table->rows[3]->class='r1';
  4458. $table->rows[3]->cells=$cells;
  4459. }
  4460. if ($param_type==1) {
  4461. unset($cells);
  4462. $cells[0] = new stdClass();
  4463. $cells[0]->class='cell c0';
  4464. $cells[0]->data=get_string('filetosubmit', 'turnitintool').turnitintool_help_icon('filetosubmit',get_string('filetosubmit','turnitintool'),'turnitintool',true,false,'',true);
  4465. $cells[1] = new stdClass();
  4466. $cells[1]->data='<input type="hidden" name="MAX_FILE_SIZE" value="'.$turnitintool->maxfilesize.'" />';
  4467. $cells[1]->data.='<input type="file" name="submissionfile" size="55%" />';
  4468. $table->rows[4] = new stdClass();
  4469. $table->rows[4]->class='r0';
  4470. $table->rows[4]->cells=$cells;
  4471. }
  4472. if ($param_type==2) {
  4473. unset($cells);
  4474. $submissiontext=optional_param('submissiontext','',PARAM_CLEAN);
  4475. $cells[0] = new stdClass();
  4476. $cells[0]->class='cell c0';
  4477. $cells[0]->data=get_string('texttosubmit', 'turnitintool').turnitintool_help_icon('texttosubmit',get_string('texttosubmit','turnitintool'),'turnitintool',true,false,'',true);
  4478. $cells[1] = new stdClass();
  4479. $cells[1]->data='<textarea name="submissiontext" class="submissionText">'.$submissiontext.'</textarea>';
  4480. $table->rows[5] = new stdClass();
  4481. $table->rows[5]->class='r1';
  4482. $table->rows[5]->cells=$cells;
  4483. }
  4484. if ($param_type==3) {
  4485. unset($cells);
  4486. $submissionurl=optional_param('submissionurl','',PARAM_CLEAN);
  4487. $cells[0] = new stdClass();
  4488. $cells[0]->class='cell c0';
  4489. $cells[0]->data=get_string('urltosubmit', 'turnitintool').turnitintool_help_icon('urltosubmit',get_string('urltosubmit','turnitintool'),'turnitintool',true,false,'',true);
  4490. $cells[1] = new stdClass();
  4491. $cells[1]->data='<input type="text" name="submissionurl" class="formwide" value="'.$submissionurl.'" />';
  4492. $table->rows[6] = new stdClass();
  4493. $table->rows[6]->class='r0';
  4494. $table->rows[6]->cells=$cells;
  4495. }
  4496. $checked='';
  4497. if (!is_null($param_agreement)) {
  4498. $checked=' checked';
  4499. }
  4500. if ( has_capability('mod/turnitintool:grade', $context) OR empty($CFG->turnitin_agreement) ) {
  4501. unset($cells);
  4502. $cells[0] = new stdClass();
  4503. $cells[0]->class='cell c0';
  4504. $cells[0]->data='';
  4505. $cells[1] = new stdClass();
  4506. $cells[1]->data='<input type="hidden" name="agreement" value="1" />';
  4507. $table->rows[7] = new stdClass();
  4508. $table->rows[7]->class='r1';
  4509. $table->rows[7]->cells=$cells;
  4510. } else {
  4511. unset($cells);
  4512. $cells[0] = new stdClass();
  4513. $cells[0]->class='cell c0';
  4514. $cells[0]->data='<input type="checkbox" name="agreement" value="1"'.$checked.' />';
  4515. $cells[1] = new stdClass();
  4516. $cells[1]->data=$CFG->turnitin_agreement;
  4517. $table->rows[7] = new stdClass();
  4518. $table->rows[7]->class='r1';
  4519. $table->rows[7]->cells=$cells;
  4520. }
  4521. unset($cells);
  4522. $cells[0] = new stdClass();
  4523. $cells[0]->class='cell c0';
  4524. $cells[0]->data='&nbsp;';
  4525. $cells[1] = new stdClass();
  4526. $cells[1]->data='<input name="submitbutton" type="submit" value="'.get_string('addsubmission', 'turnitintool').'" />';
  4527. $table->rows[8] = new stdClass();
  4528. $table->rows[8]->class='r0';
  4529. $table->rows[8]->cells=$cells;
  4530. }
  4531. }
  4532. $output.=turnitintool_print_table($table,true);
  4533. if ($param_type>0) {
  4534. $output.='
  4535. <script language="javascript" type="text/javascript">updateSubForm(submissionArray,stringsArray,document.submissionform,'.$turnitintool->reportgenspeed.',"'.$utype.'");</script>
  4536. </form>
  4537. ';
  4538. }
  4539. $output.=turnitintool_box_end(true).'<br />';
  4540. } else {
  4541. $output=turnitintool_box_start('generalbox boxwidthwide boxaligncenter eightyfive', 'submitbox',true);
  4542. if (turnitintool_count_records_select('turnitintool_parts', "turnitintoolid='".$turnitintool->id."' AND deleted=0 AND dtstart < ".time()." AND dtdue > ".time())==0) {
  4543. // Due date has passed
  4544. $output.=get_string('nosubmissionsdue','turnitintool');
  4545. } else {
  4546. // Due date has not passed
  4547. // Count the number of students (numusers) enrolled on this course
  4548. $context = get_context_instance(CONTEXT_MODULE, $cm->id);
  4549. $users=get_users_by_capability($context,'mod/turnitintool:submit','u.id','','','',turnitintool_module_group($cm),'',false);
  4550. $numusers=(!is_array($users)) ? 0 : count($users);
  4551. if ($numusers>0) {
  4552. $output.=get_string('submittedmax','turnitintool');
  4553. } else {
  4554. $output.=get_string('noenrolledstudents','turnitintool');
  4555. }
  4556. }
  4557. $output.=turnitintool_box_end(true).'<br />';
  4558. }
  4559. return $output;
  4560. }
  4561. /**
  4562. * Get the turnitintool_parts part name from the part number
  4563. *
  4564. * @param var $partid The Part ID of the part in turnitintool_parts
  4565. * @return string Returns the part name or false if the part is not found
  4566. */
  4567. function turnitintool_partnamefromnum($partid) {
  4568. if ($part=turnitintool_get_record('turnitintool_parts','id',$partid)) {
  4569. return $part->partname;
  4570. } else {
  4571. return false;
  4572. }
  4573. }
  4574. /**
  4575. * Checks to see if the same submission title has been used in the assignment already
  4576. *
  4577. * @param object $turnitintool The turnitintool object for this activity
  4578. * @param string $title The title to check against
  4579. * @return boolean Duplicate was found / not found
  4580. */
  4581. function turnitintool_duplicate_submission_title($turnitintool,$title,$userid) {
  4582. if (!$result=turnitintool_get_records_select('turnitintool_submissions',"turnitintoolid=".$turnitintool->id." AND submission_title='".$title."' AND userid=".$userid)) {
  4583. $return=false;
  4584. } else {
  4585. $return=true;
  4586. }
  4587. return $return;
  4588. }
  4589. /**
  4590. * Checks to see if the same submission has already been made to this assignment part
  4591. *
  4592. * @global object
  4593. * @global object
  4594. * @param object $cm The moodle course module object for this instance
  4595. * @param object $turnitintool The turnitintool object for this activity
  4596. * @param var $partid Part ID of the assignment part to check
  4597. * @param var $userid User ID of the user to check
  4598. * @return boolean Submission was found / not found
  4599. */
  4600. function turnitintool_checkforsubmission($cm,$turnitintool,$partid,$userid) {
  4601. global $USER,$CFG;
  4602. if (!$userdata=turnitintool_get_record('user','id',$userid)) {
  4603. turnitintool_print_error('usergeterror', 'turnitintool', NULL, NULL, __FILE__, __LINE__);
  4604. exit();
  4605. }
  4606. $loaderbar=NULL;
  4607. $tii = new turnitintool_commclass(turnitintool_getUID($userdata),$userdata->firstname,$userdata->lastname,$userdata->email,1,$loaderbar);
  4608. $tii->startSession();
  4609. $turnitinuser=turnitintool_usersetup($userdata,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  4610. if ($tii->getRerror()) {
  4611. if ($tii->getAPIunavailable()) {
  4612. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4613. } else {
  4614. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  4615. }
  4616. exit();
  4617. }
  4618. $tii->endSession();
  4619. $loaderbar = new turnitintool_loaderbarclass(2);
  4620. $owner=turnitintool_get_owner($turnitintool->course);
  4621. $post = new stdClass();
  4622. $post->ctl=turnitintool_getCTL($turnitintool->course);
  4623. $post->cid=turnitintool_getCID($turnitintool->course);
  4624. $post->tem=$owner->email;
  4625. if (!$part=turnitintool_get_record('turnitintool_parts','id',$partid)) {
  4626. turnitintool_print_error('partgeterror', 'turnitintool', null, null, __FILE__, __LINE__);
  4627. exit();
  4628. }
  4629. $post->assignid=turnitintool_getAID($part->id); // Get the Assignment ID for this Assignment / Turnitintool instance
  4630. $post->assign=$turnitintool->name.' - '.$part->partname.' (Moodle '.$post->assignid.')';
  4631. $status = new stdClass();
  4632. $status->user=get_string('student','turnitintool');
  4633. $status->proc=1;
  4634. $tii->listSubmissions($post,get_string('updatingscores','turnitintool',$status));
  4635. $tiisub_array=$tii->getSubmissionArray();
  4636. foreach ($tiisub_array as $key => $sub_object) {
  4637. // Check to see if we already have the submission entry for this Object ID
  4638. if (!$tiisubcheck=turnitintool_get_record('turnitintool_submissions','submission_objectid',$key)) {
  4639. // No we dont have it, add it to the submission table
  4640. $subinsert['userid']=$userid;
  4641. $subinsert['turnitintoolid']=$turnitintool->id;
  4642. $subinsert['submission_part']=$part->id;
  4643. $subinsert['submission_title']=$sub_object['title'];
  4644. $subinsert['submission_type']=1;
  4645. $subinsert['submission_filename']=str_replace(" ","_",$sub_object['title']).'.doc';
  4646. $subinsert['submission_objectid']=$key;
  4647. $subinsert['submission_score']=$sub_object['overlap'];
  4648. $subinsert['submission_grade']=$sub_object['grademark'];
  4649. $subinsert['submission_status']=get_string('submissionuploadsuccess','turnitintool');
  4650. $subinsert['submission_queued']=0;
  4651. $subinsert['submission_attempts']=( $sub_object["student_view"] > 0 ) ? strtotime($value["student_view"]) : 0;
  4652. $subinsert['submission_modified']=strtotime($sub_object['date_submitted']);
  4653. $subinsert['submission_nmuserid']=0;
  4654. $subinsert['submission_unanon']=(!isset($sub_object['anon']) AND !is_null($sub_object['anon']) AND !$sub_object['anon']) ? 1 : 0;
  4655. if (!$insertid=turnitintool_insert_record('turnitintool_submissions',$subinsert)) {
  4656. turnitintool_print_error('submissionupdateerror', 'turnitintool', null, null, __FILE__, __LINE__);
  4657. exit();
  4658. }
  4659. } else { // Found it, convert Non Moodle Entry to real user submission
  4660. $subupdate['id']=$tiisubcheck->id;
  4661. $subupdate['userid']=$userid;
  4662. $subupdate['submission_nmuserid']=0;
  4663. $subupdate['submission_nmfirstname']='';
  4664. $subupdate['submission_nmlastname']='';
  4665. if (!$updateid=turnitintool_update_record('turnitintool_submissions',$subupdate)) {
  4666. exit();
  4667. turnitintool_print_error('submissionupdateerror', 'turnitintool', null, null, __FILE__, __LINE__);
  4668. exit();
  4669. }
  4670. }
  4671. }
  4672. $submitted=turnitintool_get_records_select('turnitintool_submissions','submission_part='.$partid.' AND userid='.$userid);
  4673. $loaderbar->endloader();
  4674. unset($loaderbar);
  4675. if (!$submitted) {
  4676. return 0;
  4677. } else {
  4678. $submitted=current($submitted);
  4679. $part=turnitintool_get_record('turnitintool_parts','id',$partid);
  4680. $submitted->dtdue=$part->dtdue;
  4681. $submitted->dtpost=$part->dtpost;
  4682. return $submitted;
  4683. }
  4684. }
  4685. /**
  4686. * Takes the submitted file and adds it to the Moodle file area
  4687. *
  4688. * @global object
  4689. * @global object
  4690. * @param object $cm The moodle course module object for this instance
  4691. * @param object $turnitintool The turnitintool object for this activity
  4692. * @param var $userid User ID of the user to check
  4693. * @param array $post POST Array of the submission form of the user to check
  4694. * @return boolean Submission was found / not found
  4695. */
  4696. function turnitintool_dofileupload($cm,$turnitintool,$userid,$post) {
  4697. global $USER,$CFG;
  4698. $param_do=optional_param('do',null,PARAM_CLEAN);
  4699. $error=false;
  4700. $notice=array("error"=>'',"subid"=>'');
  4701. $submissiontitle='';
  4702. if (isset($post['submissiontitle'])) {
  4703. $submissiontitle=str_replace("<","",$post['submissiontitle']);
  4704. $submissiontitle=str_replace(">","",$submissiontitle);
  4705. }
  4706. if (empty($_FILES['submissionfile']['name'])) {
  4707. $notice["error"].=get_string('submissionfileerror','turnitintool').'<br />';
  4708. $error=true;
  4709. }
  4710. $allowed=array('doc','docx','rtf','txt','pdf','htm','html','odt','hwp','ps','wpd');
  4711. $explode = explode('.',$_FILES['submissionfile']['name']);
  4712. $pop = array_pop($explode);
  4713. if (!in_array($pop,$allowed)) {
  4714. $notice["error"].=get_string('submissionfiletypeerror','turnitintool',join(', ',$allowed)).'<br />';
  4715. $error=true;
  4716. }
  4717. if (empty($submissiontitle)) {
  4718. $notice["error"].=get_string('submissiontitleerror','turnitintool').'<br />';
  4719. $error=true;
  4720. }
  4721. if (!isset($post['agreement'])) {
  4722. $notice["error"].=get_string('submissionagreementerror','turnitintool').'<br />';
  4723. $error=true;
  4724. }
  4725. $checksubmission=turnitintool_checkforsubmission($cm,$turnitintool,$post['submissionpart'],$userid);
  4726. if (!$error AND isset($checksubmission->id) AND $turnitintool->reportgenspeed!=1) {
  4727. // Kill the script here as we do not want double errors
  4728. // We only get here if there are no other errors
  4729. turnitintool_print_error('alreadysubmitted','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4730. exit();
  4731. }
  4732. $resubmission=false;
  4733. if (isset($checksubmission->id) AND $turnitintool->reportgenspeed==1) {
  4734. $resubmission=true;
  4735. }
  4736. if ($resubmission AND $checksubmission->dtdue<time()) {
  4737. turnitintool_print_error('alreadysubmitted','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4738. exit();
  4739. }
  4740. $explode = explode('.',$_FILES['submissionfile']['name']);
  4741. $extension=array_pop($explode);
  4742. $_FILES['submissionfile']['name']=$post['submissionpart'].'_'.time().'_'.$userid.'.'.$extension;
  4743. $upload = new upload_manager();
  4744. if (!$upload->preprocess_files()) {
  4745. $notice["error"].=$upload->notify;
  4746. $error=true;
  4747. }
  4748. if (!$error) {
  4749. $submitobject = new object();
  4750. $submitobject->userid=$userid;
  4751. $submitobject->turnitintoolid=$turnitintool->id;
  4752. $submitobject->submission_part=$post['submissionpart'];
  4753. $submitobject->submission_type=$post['submissiontype'];
  4754. $submitobject->submission_filename=$_FILES['submissionfile']['name'];
  4755. $submitobject->submission_queued=null;
  4756. $submitobject->submission_attempts=0;
  4757. $submitobject->submission_gmimaged=0;
  4758. $submitobject->submission_status=null;
  4759. $submitobject->submission_modified=time();
  4760. $submitobject->submission_objectid=(!isset($checksubmission->submission_objectid))
  4761. ? null : $checksubmission->submission_objectid;
  4762. if (!isset($checksubmission->submission_unanon) OR $checksubmission->submission_unanon) {
  4763. // If non anon resubmission or new submission set the title as what was entered in the form
  4764. $submitobject->submission_title=$submissiontitle;
  4765. if (!$turnitintool->anon) {
  4766. // If not anon assignment and this is a non anon resubmission or a new submission set the unanon flag to true (1)
  4767. $submitobject->submission_unanon=1;
  4768. }
  4769. }
  4770. if (!$resubmission) {
  4771. if (!$submitobject->id=turnitintool_insert_record('turnitintool_submissions',$submitobject)) {
  4772. turnitintool_print_error('submissioninserterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4773. exit();
  4774. }
  4775. } else {
  4776. $submitobject->id=$checksubmission->id;
  4777. $submitobject->submission_score=null;
  4778. $submitobject->submission_grade=null;
  4779. if (!turnitintool_update_record('turnitintool_submissions',$submitobject)) {
  4780. turnitintool_print_error('submissionupdateerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4781. exit();
  4782. } else {
  4783. $submitobject->id=$checksubmission->id;
  4784. }
  4785. }
  4786. if (is_callable("get_file_storage")) {
  4787. $fs = get_file_storage();
  4788. $file_record = array('contextid'=>$cm->id,
  4789. 'component'=>'mod_turnitintool',
  4790. 'filearea'=>'submission',
  4791. 'itemid'=>$submitobject->id,
  4792. 'filepath'=>'/',
  4793. 'filename'=>$submitobject->submission_filename,
  4794. 'userid'=>$submitobject->userid);
  4795. if (!$fs->create_file_from_pathname($file_record, $_FILES['submissionfile']['tmp_name'])) {
  4796. turnitintool_delete_records('turnitintool_submissions','id',$submitobject->id);
  4797. turnitintool_print_error('fileuploaderror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4798. exit();
  4799. }
  4800. } else {
  4801. $destination=turnitintool_file_path($cm,$turnitintool,$userid);
  4802. if (!$upload->save_files($destination)) {
  4803. turnitintool_delete_records('turnitintool_submissions','id',$submitobject->id);
  4804. turnitintool_print_error('fileuploaderror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4805. exit();
  4806. }
  4807. }
  4808. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id)) AND !$turnitintool->autosubmission) {
  4809. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=allsubmissions');
  4810. exit();
  4811. } else if (!$turnitintool->autosubmission) {
  4812. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do='.$param_do);
  4813. exit();
  4814. }
  4815. $notice["subid"]=$submitobject->id;
  4816. }
  4817. return $notice;
  4818. }
  4819. /**
  4820. * Takes the submitted text and creates a file and adds it to the Moodle file area
  4821. *
  4822. * @global object
  4823. * @global object
  4824. * @param object $cm The moodle course module object for this instance
  4825. * @param object $turnitintool The turnitintool object for this activity
  4826. * @param var $userid User ID of the user to check
  4827. * @param array $post POST Array of the submission form of the user to check
  4828. * @return boolean Submission was found / not found
  4829. */
  4830. function turnitintool_dotextsubmission($cm,$turnitintool,$userid,$post) {
  4831. global $USER,$CFG;
  4832. $param_do=optional_param('do',null,PARAM_CLEAN);
  4833. $error=false;
  4834. $notice=array("error"=>'',"subid"=>'');
  4835. $submissiontitle='';
  4836. if (isset($post['submissiontitle'])) {
  4837. $submissiontitle=str_replace("<","",$post['submissiontitle']);
  4838. $submissiontitle=str_replace(">","",$submissiontitle);
  4839. }
  4840. if (empty($submissiontitle)) {
  4841. $notice["error"].=get_string('submissiontitleerror','turnitintool').'<br />';
  4842. $error=true;
  4843. }
  4844. if (empty($post['submissiontext'])) {
  4845. $notice["error"].=get_string('submissiontexterror','turnitintool').'<br />';
  4846. $error=true;
  4847. }
  4848. if (!isset($post['agreement'])) {
  4849. $notice["error"].=get_string('submissionagreementerror','turnitintool').'<br />';
  4850. $error=true;
  4851. }
  4852. $checksubmission=turnitintool_checkforsubmission($cm,$turnitintool,$post['submissionpart'],$userid);
  4853. if (!$error AND isset($checksubmission->id) AND $turnitintool->reportgenspeed!=1) {
  4854. // Kill the script here as we do not want double errors
  4855. // We only get here if there are no other errors
  4856. turnitintool_print_error('alreadysubmitted','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4857. exit();
  4858. }
  4859. $resubmission=false;
  4860. if (isset($checksubmission->id) AND $turnitintool->reportgenspeed==1) {
  4861. $resubmission=true;
  4862. }
  4863. if ($resubmission AND $checksubmission->dtdue<time()) {
  4864. turnitintool_print_error('alreadysubmitted','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4865. exit();
  4866. }
  4867. $filedata=stripslashes($post['submissiontext']);
  4868. if (!$error) {
  4869. $filename=$post['submissionpart'].'_'.time().'_'.$userid.'.txt';
  4870. $submitobject = new object();
  4871. $submitobject->userid=$userid;
  4872. $submitobject->turnitintoolid=$turnitintool->id;
  4873. $submitobject->submission_part=$post['submissionpart'];
  4874. $submitobject->submission_type=$post['submissiontype'];
  4875. $submitobject->submission_filename=$filename;
  4876. $submitobject->submission_queued=null;
  4877. $submitobject->submission_attempts=0;
  4878. $submitobject->submission_gmimaged=0;
  4879. $submitobject->submission_status=null;
  4880. $submitobject->submission_modified=time();
  4881. $submitobject->submission_objectid=(!isset($checksubmission->submission_objectid))
  4882. ? null : $checksubmission->submission_objectid;
  4883. if (!isset($checksubmission->submission_unanon) OR $checksubmission->submission_unanon) {
  4884. // If non anon resubmission or new submission set the title as what was entered in the form
  4885. $submitobject->submission_title=$submissiontitle;
  4886. if (!$turnitintool->anon) {
  4887. // If not anon assignment and this is a non anon resubmission or a new submission set the unanon flag to true (1)
  4888. $submitobject->submission_unanon=1;
  4889. }
  4890. }
  4891. if (!$resubmission) {
  4892. if (!$submitobject->id = turnitintool_insert_record('turnitintool_submissions',$submitobject)) {
  4893. turnitintool_print_error('submissioninserterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4894. exit();
  4895. }
  4896. } else {
  4897. $submitobject->id=$checksubmission->id;
  4898. $submitobject->submission_score=null;
  4899. $submitobject->submission_grade=null;
  4900. if (!turnitintool_update_record('turnitintool_submissions',$submitobject)) {
  4901. turnitintool_print_error('submissionupdateerror','turnitintool',NULL,null,__FILE__,__LINE__);
  4902. exit();
  4903. }
  4904. }
  4905. if (is_callable("get_file_storage")) {
  4906. $fs = get_file_storage();
  4907. $file_record = array('contextid'=>$cm->id,
  4908. 'component'=>'mod_turnitintool',
  4909. 'filearea'=>'submission',
  4910. 'itemid'=>$submitobject->id,
  4911. 'filepath'=>'/',
  4912. 'filename'=>$submitobject->submission_filename,
  4913. 'userid'=>$submitobject->userid);
  4914. if (!$fs->create_file_from_string($file_record, $filedata)) {
  4915. turnitintool_delete_records('turnitintool_submissions','id',$submitobject->id);
  4916. turnitintool_print_error('fileuploaderror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4917. exit();
  4918. }
  4919. } else {
  4920. $filedir=$CFG->dataroot.'/'.turnitintool_file_path($cm,$turnitintool,$userid);
  4921. if (!file_exists($filedir)) {
  4922. mkdir($filedir,0777,true);
  4923. }
  4924. $fOpen=fopen($filedir.'/'.$filename,'w+');
  4925. if (!fwrite($fOpen,$filedata)) {
  4926. turnitintool_delete_records('turnitintool_submissions','id',$submitobject->id);
  4927. turnitintool_print_error('filewriteerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4928. exit();
  4929. }
  4930. }
  4931. $notice["subid"]=$submitobject->id;
  4932. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id)) AND !$turnitintool->autosubmission) {
  4933. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=allsubmissions');
  4934. exit();
  4935. } else if (!$turnitintool->autosubmission) {
  4936. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do='.$param_do);
  4937. exit();
  4938. }
  4939. }
  4940. return $notice;
  4941. }
  4942. /**
  4943. * Creates a temp file for submission to Turnitin uses a random number
  4944. * suffixed with the stored filename
  4945. *
  4946. * @param string $suffix The file extension for the upload
  4947. * @return string $file The filepath of the temp file
  4948. */
  4949. function turnitintool_tempfile($suffix) {
  4950. global $CFG;
  4951. $fp=false;
  4952. $temp_dir=$CFG->dataroot.'/temp/turnitintool';
  4953. if ( !file_exists( $temp_dir ) ) {
  4954. mkdir( $temp_dir, $CFG->directorypermissions, true );
  4955. }
  4956. while(!$fp) {
  4957. $file = $temp_dir.DIRECTORY_SEPARATOR.mt_rand().'.'.$suffix;
  4958. $fp = @fopen($file, 'w');
  4959. }
  4960. fclose($fp);
  4961. return $file;
  4962. }
  4963. /**
  4964. * Takes the submission file and uploads it to Turnitin
  4965. *
  4966. * @global object
  4967. * @param object $cm The moodle course module object for this instance
  4968. * @param object $turnitintool The turnitintool object for this activity
  4969. * @param object $submission The submission object for this submission
  4970. */
  4971. function turnitintool_upload_submission($cm,$turnitintool,$submission) {
  4972. global $CFG, $USER;
  4973. if (!$course = turnitintool_get_record('course','id',$turnitintool->course)) {
  4974. turnitintool_print_error('coursegeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4975. exit();
  4976. }
  4977. if (!$part = turnitintool_get_record('turnitintool_parts','id',$submission->submission_part)) {
  4978. turnitintool_print_error('partgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4979. exit();
  4980. }
  4981. $user=turnitintool_get_moodleuser($submission->userid,NULL,__FILE__,__LINE__);
  4982. $owner = turnitintool_get_owner($turnitintool->course);
  4983. $post = new stdClass();
  4984. $post->oid=(!is_null($submission->submission_objectid)) ? $submission->submission_objectid : '';
  4985. $loaderbar = new turnitintool_loaderbarclass(4); // (2xStart/End Session and Submit Paper total 3
  4986. $tii = new turnitintool_commclass(turnitintool_getUID($user),$user->firstname,$user->lastname,$user->email,1,$loaderbar);
  4987. $tii->startSession();
  4988. // Set this user up with a Turnitin Account or check to see if an account has already been set up
  4989. // Either return the stored ID OR store the New Turnitin User ID then return it
  4990. // Use UTP student (1) as this is a submission [[[[
  4991. $turnitinuser=turnitintool_usersetup($user,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  4992. if ($tii->getRerror()) {
  4993. if ($tii->getAPIunavailable()) {
  4994. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  4995. } else {
  4996. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  4997. }
  4998. exit();
  4999. }
  5000. $turnitinuser_id=$turnitinuser->turnitin_uid;
  5001. // ]]]]
  5002. $post->cid=turnitintool_getCID($course->id); // Get the Turnitin Class ID for Course
  5003. $post->assignid=turnitintool_getAID($part->id); // Get the Assignment ID for this Assignment / Turnitintool instance
  5004. $post->ctl=turnitintool_getCTL($course->id);
  5005. $post->assignname=$turnitintool->name.' - '.$part->partname.' (Moodle '.$post->assignid.')';
  5006. $post->tem=turnitintool_get_tutor_email($owner->id);
  5007. $post->papertitle=$submission->submission_title;
  5008. if (is_callable("get_file_storage")) {
  5009. $fs = get_file_storage();
  5010. $file = $fs->get_file($cm->id,'mod_turnitintool','submission',$submission->id,'/',$submission->submission_filename);
  5011. $tempname = turnitintool_tempfile('_'.$submission->submission_filename);
  5012. $tempfile=fopen($tempname,"w");
  5013. fwrite($tempfile,$file->get_content());
  5014. fclose($tempfile);
  5015. $filepath=$tempname;
  5016. turnitintool_activitylog("SUBID: ".$submission->id." - Using 2.0 File API","UPLOAD");
  5017. } else {
  5018. $tempname=null;
  5019. $filepath=$CFG->dataroot.'/'.turnitintool_file_path($cm,$turnitintool,$submission->userid).'/'.$submission->submission_filename;
  5020. turnitintool_activitylog("SUBID: ".$submission->id." - Using pre 2.0 File API","UPLOAD");
  5021. }
  5022. // Give join class 3 tries, fix for 220 errors, fail over and log failure in activity logs
  5023. for ( $i = 0; $i < 3; $i++ ) {
  5024. $tii->joinClass($post,get_string('joiningclass','turnitintool',''));
  5025. if ( !$tii->getRerror() ) {
  5026. break;
  5027. } else {
  5028. $loaderbar->total = $loaderbar->total + 1;
  5029. turnitintool_activitylog( "Failed: " . $tii->getRcode(), "JOINCLASS FAILED" );
  5030. }
  5031. }
  5032. if ($tii->getRerror()) {
  5033. $reason=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  5034. turnitintool_print_error($reason." CODE: ".$tii->getRcode(),NULL,NULL,NULL,__FILE__,__LINE__);
  5035. exit();
  5036. }
  5037. // Upload the file to Turnitin
  5038. $tii->submitPaper($post,$filepath,get_string('uploadingtoturnitin','turnitintool'));
  5039. if (!is_null($tempname)) {
  5040. unlink($tempname); // If we made a temp file earlier for the Moodle 2 file API delete it here
  5041. }
  5042. $update=new object();
  5043. if ($tii->getRerror()) {
  5044. if ($tii->getAPIunavailable()) {
  5045. $status=get_string('apiunavailable','turnitintool');
  5046. $queued=1;
  5047. } else {
  5048. $status=$tii->getRmessage();
  5049. $queued=0;
  5050. }
  5051. if (!$queued) {
  5052. $update->submission_score=null;
  5053. $update->submission_status=$status;
  5054. $update->submission_queued=$queued;
  5055. $update->submission_modified=time();
  5056. $update->id=$submission->id;
  5057. if (!turnitintool_update_record('turnitintool_submissions',$update)) {
  5058. turnitintool_print_error('submissionupdateerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5059. exit();
  5060. }
  5061. turnitintool_print_error($tii->getRmessage()." CODE: ".$tii->getRcode(),NULL,NULL,NULL,__FILE__,__LINE__);
  5062. exit();
  5063. }
  5064. } else {
  5065. $status=get_string('submissionuploadsuccess','turnitintool');
  5066. $update->submission_objectid=$tii->getObjectid();
  5067. $queued=0;
  5068. }
  5069. $update->submission_status=$status;
  5070. $update->submission_queued=$queued;
  5071. $update->submission_attempts=0;
  5072. $update->submission_modified=time();
  5073. $update->id=$submission->id;
  5074. if (!turnitintool_update_record('turnitintool_submissions',$update)) {
  5075. turnitintool_print_error('submissionupdateerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5076. exit();
  5077. }
  5078. if (function_exists('events_trigger')) {
  5079. // Trigger assessable_submitted event on submission.
  5080. $eventdata = new stdClass();
  5081. $eventdata->modulename = 'turnitintool';
  5082. $eventdata->cmid = $cm->id;
  5083. $eventdata->itemid = $submission->id;
  5084. $eventdata->courseid = $course->id;
  5085. $eventdata->userid = $USER->id;
  5086. events_trigger('assessable_submitted', $eventdata);
  5087. }
  5088. add_to_log($turnitintool->course, "turnitintool", "submit", "view.php?id=$cm->id", "User submitted '$submission->submission_title'", "$cm->id", $user->id);
  5089. $tii->endSession();
  5090. if (has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id))) {
  5091. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=allsubmissions');
  5092. exit();
  5093. } else {
  5094. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php?id='.$cm->id.'&do=submissions');
  5095. exit();
  5096. }
  5097. unset($tii);
  5098. exit();
  5099. }
  5100. /**
  5101. * Outputs the file type array for acceptable file type uploads
  5102. *
  5103. * @param boolean $setup True if the call is from the assignment activity setup screen
  5104. * @param array The array of filetypes ready for the modform parameter
  5105. */
  5106. function turnitintool_filetype_array($setup=true) {
  5107. $output = array(
  5108. 1 => get_string('fileupload','turnitintool'),
  5109. 2 => get_string('textsubmission','turnitintool')
  5110. );
  5111. if ($setup) {
  5112. $output[3] = '--------------------';
  5113. $output[0] = get_string('anytype','turnitintool');
  5114. }
  5115. return $output;
  5116. }
  5117. /**
  5118. * A Standard Moodle function that moodle executes at the time the cron runs
  5119. */
  5120. function turnitintool_cron() {
  5121. }
  5122. /**
  5123. * Synchronises the assignment part settings with the settings that Turnitin has for the assignment parts
  5124. *
  5125. * @global object
  5126. * @param object $cm The moodle course module object for this instance
  5127. * @param object $turnitintool The turnitintool object for this activity
  5128. * @param boolean $forced True if we want ot force the operation otherwise determined by a session array updatedconfig
  5129. * @param object $loaderbar Passed by reference can be NULL if no loader bar is used
  5130. * @return boolean Returns false on failure
  5131. */
  5132. function turnitintool_synch_parts($cm,$turnitintool,$forced=false,$loaderbar=NULL) {
  5133. $param_type=optional_param('type',null,PARAM_CLEAN);
  5134. if (((isset($_SESSION['updatedconfig'][$turnitintool->id]) AND $_SESSION['updatedconfig'][$turnitintool->id]==1) OR !is_null($param_type)) AND !$forced) {
  5135. return false;
  5136. } else {
  5137. if (!$parts=turnitintool_get_records_select('turnitintool_parts','turnitintoolid='.$turnitintool->id.' AND deleted=0')) {
  5138. mtrace(get_string('partgeterror','turnitintool').' - ID: '.$turnitintool->id.'\n');
  5139. }
  5140. $partsarray=array();
  5141. $owner=turnitintool_get_owner($turnitintool->course);
  5142. $tii=new turnitintool_commclass(turnitintool_getUID($owner),$owner->firstname,$owner->lastname,$owner->email,2,$loaderbar);
  5143. $tii->startSession();
  5144. $tiitooldone=false;
  5145. foreach ($parts as $part) {
  5146. $post = new stdClass();
  5147. $post->cid=turnitintool_getCID($turnitintool->course);
  5148. $post->ctl=turnitintool_getCTL($turnitintool->course);
  5149. $post->assign=$turnitintool->name.' - '.$part->partname.' (Moodle: '.$part->tiiassignid.')';
  5150. $post->assignid=$part->tiiassignid;
  5151. $post->assignid=$part->maxmarks;
  5152. $tii->queryAssignment($post,get_string('synchassignments','turnitintool'));
  5153. $assignObj=$tii->getAssignmentObject();
  5154. if (!$tii->getRerror()) {
  5155. if (!$tiitooldone) {
  5156. $tiiupdate = new stdClass();
  5157. $tiiupdate->id=$turnitintool->id;
  5158. $tiiupdate->anon=$assignObj->anon;
  5159. $tiiupdate->reportgenspeed=$assignObj->report_gen_speed;
  5160. $tiiupdate->studentreports=$assignObj->s_view_report;
  5161. $tiiupdate->allowlate=$assignObj->late_accept_flag;
  5162. $tiiupdate->submitpapersto=$assignObj->submit_papers_to;
  5163. $tiiupdate->internetcheck=$assignObj->internet_check;
  5164. $tiiupdate->journalcheck=$assignObj->journal_check;
  5165. if (!$update=turnitintool_update_record('turnitintool',$tiiupdate)) {
  5166. mtrace(get_string('turnitintoolupdateerror','turnitintool').' - ID: '.$turnitintool->id.'\n');
  5167. }
  5168. $partupdate = new stdClass();
  5169. $partupdate->id=$part->id;
  5170. $partupdate->maxmarks=$assignObj->maxpoints;
  5171. $partupdate->dtstart=$assignObj->dtstart;
  5172. $partupdate->dtdue=$assignObj->dtdue;
  5173. $partupdate->dtpost=$assignObj->dtpost;
  5174. if (!$update=turnitintool_update_record('turnitintool_parts',$partupdate)) {
  5175. mtrace(get_string('partupdateerror','turnitintool').' - ID: '.$part->id.'\n');
  5176. }
  5177. }
  5178. }
  5179. }
  5180. $tii->endSession();
  5181. }
  5182. }
  5183. /**
  5184. * Function called by course/reset.php when resetting moodle course Moodle 1.8
  5185. *
  5186. * @param object $course The moodle course object for the course
  5187. */
  5188. function turnitintool_reset_course_form($course) {
  5189. echo '<p>'.get_string('turnitintoolresetinfo', 'turnitintool').'<br />';
  5190. $options = array(
  5191. '0'=>get_string('turnitintoolresetdata0','turnitintool').'<br />',
  5192. '1'=>get_string('turnitintoolresetdata1','turnitintool').'<br />',
  5193. '2'=>get_string('turnitintoolresetdata2','turnitintool').'<br />'
  5194. );
  5195. choose_from_menu($options,'reset_turnitintool','0');
  5196. echo '</p>';
  5197. }
  5198. /**
  5199. * Function called by course/reset.php when resetting moodle course Moodle 1.8
  5200. *
  5201. * @param object $data The data object passed by course reset
  5202. */
  5203. function turnitintool_delete_userdata($data) {
  5204. if ($data->reset_turnitintool==0) {
  5205. $action='NEWCLASS';
  5206. $status=turnitintool_duplicate_recycle($data->courseid,$action,true);
  5207. if (!$status['error']) {
  5208. notify(get_string('modulenameplural','turnitintool').': '.get_string('copyassigndata','turnitintool'), 'notifysuccess');
  5209. } else {
  5210. notify(get_string('modulenameplural','turnitintool').': '.get_string('copyassigndataerror','turnitintool'));
  5211. }
  5212. } else if ($data->reset_turnitintool==1) {
  5213. $action='OLDCLASS';
  5214. $status=turnitintool_duplicate_recycle($data->courseid,$action,true);
  5215. if (!$status['error']) {
  5216. notify(get_string('modulenameplural','turnitintool').': '.get_string('replaceassigndata','turnitintool'), 'notifysuccess');
  5217. } else {
  5218. notify(get_string('modulenameplural','turnitintool').': '.get_string('replaceassigndataerror','turnitintool'));
  5219. }
  5220. }
  5221. turnitintool_duplicate_recycle($data->courseid,$action);
  5222. }
  5223. /**
  5224. * Function called by course/reset.php when resetting moodle course on Moodle 1.9+
  5225. * To build the element for the reset form
  5226. *
  5227. * @param object $mform The mod form object passed by reference by course reset
  5228. */
  5229. function turnitintool_reset_course_form_definition(&$mform) {
  5230. $mform->addElement('header', 'turnitintoolheader', get_string('modulenameplural', 'turnitintool'));
  5231. $options = array(
  5232. '0'=>get_string('turnitintoolresetdata0','turnitintool').'<br />',
  5233. '1'=>get_string('turnitintoolresetdata1','turnitintool').'<br />',
  5234. '2'=>get_string('turnitintoolresetdata2','turnitintool').'<br />'
  5235. );
  5236. $mform->addElement('select', 'reset_turnitintool', get_string('selectoption','turnitintool'),$options);
  5237. }
  5238. /**
  5239. * Function called by course/reset.php when resetting moodle course on Moodle 1.9+
  5240. * To actually reset / recycle the data
  5241. *
  5242. * @param object $data The data object passed by course reset
  5243. * @return array The Result of the turnitintool_duplicate_recycle call
  5244. */
  5245. function turnitintool_reset_userdata($data) {
  5246. $status = array();
  5247. if ($data->reset_turnitintool==0) {
  5248. $status = turnitintool_duplicate_recycle($data->courseid,'NEWCLASS');
  5249. } else if ($data->reset_turnitintool==1) {
  5250. $status = turnitintool_duplicate_recycle($data->courseid,'OLDCLASS');
  5251. }
  5252. return $status;
  5253. }
  5254. /**
  5255. * Function called by course/reset.php when resetting moodle course on Moodle 1.9+
  5256. * To reset / recycle the course data using default values
  5257. *
  5258. * @param object $course The course object passed by moodle
  5259. * @return array The result array
  5260. */
  5261. function turnitintool_reset_course_form_defaults($course) {
  5262. return array('reset_turnitintool'=>0);
  5263. }
  5264. /**
  5265. * Function called by course/reset.php when resetting moodle course on Moodle 1.9+
  5266. * Used to duplicate or reset a courses Turnitin activities
  5267. *
  5268. * @global object
  5269. * @param var $courseid The course ID for the course to reset
  5270. * @param string $action The action to use OLDCLASS or NEWCLASS
  5271. * @param boolean $legacy True for 1.8 Moodle False for 1.9+ Moodle
  5272. * @return array The status array to pass to turnitintool_reset_userdata
  5273. */
  5274. function turnitintool_duplicate_recycle($courseid,$action,$legacy=false) {
  5275. set_time_limit(0);
  5276. global $CFG, $USER;
  5277. if (!$turnitintools=turnitintool_get_records('turnitintool','course',$courseid)) {
  5278. turnitintool_print_error('assigngeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5279. exit();
  5280. }
  5281. if (!$course=turnitintool_get_record('course','id',$courseid)) {
  5282. turnitintool_print_error('coursegeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5283. exit();
  5284. }
  5285. $partsarray=array();
  5286. $loaderbar=NULL;
  5287. $owner=turnitintool_get_owner($courseid);
  5288. $uid=turnitintool_getUID($owner);
  5289. if (is_null($uid)) {
  5290. // In the unlikely event we have no Turnitin owner for this class to reset/recycle then we need
  5291. // to make a new owner based on the logged in user. This scenario may occur if all classes have been reset
  5292. // or all of the Turnitin data has been imported from backups without user data.
  5293. $tii = new turnitintool_commclass(turnitintool_getUID($USER),$USER->firstname,$USER->lastname,$USER->email,2,$loaderbar);
  5294. $userid=turnitintool_usersetup($USER, '', $tii, $loaderbar);
  5295. $uid=$userid->turnitin_uid;
  5296. $owner=$USER;
  5297. } else {
  5298. $tii = new turnitintool_commclass(turnitintool_getUID($owner),$owner->firstname,$owner->lastname,$owner->email,2,$loaderbar);
  5299. }
  5300. $tii->startSession();
  5301. foreach ($turnitintools as $turnitintool) {
  5302. if (!$parts=turnitintool_get_records_select('turnitintool_parts','turnitintoolid='.$turnitintool->id.' AND deleted=0')) {
  5303. turnitintool_print_error('partgeterror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5304. }
  5305. // Now build up the part array
  5306. foreach ($parts as $part) {
  5307. $partsarray[$courseid][$turnitintool->id][$part->id]['cid']=turnitintool_getCID($courseid);
  5308. $partsarray[$courseid][$turnitintool->id][$part->id]['ctl']=turnitintool_getCTL($courseid);
  5309. $partsarray[$courseid][$turnitintool->id][$part->id]['assign']=$turnitintool->name.' - '.$part->partname.' (Moodle: '.$part->tiiassignid.')';
  5310. $partsarray[$courseid][$turnitintool->id][$part->id]['assignid']=$part->tiiassignid;
  5311. $partsarray[$courseid][$turnitintool->id][$part->id]['max_points']=$part->maxmarks;
  5312. $partsarray[$courseid][$turnitintool->id][$part->id]['turnitintool']=$turnitintool;
  5313. }
  5314. }
  5315. // ----------------------------------
  5316. // IF action EQUALS 'OLDCLASS'
  5317. // ----------------------------------
  5318. // Class on TII: Dont Create New
  5319. // Class in DB: Leave Alone
  5320. // Parts in DB: Replace IDs with New
  5321. // Old Parts on TII: Delete
  5322. // ----------------------------------
  5323. // ELSE IF action EQUALS 'NEWCLASS'
  5324. // ----------------------------------
  5325. // Class on TII: Create New
  5326. // Class in DB: Replace IDs with New
  5327. // Parts in DB: Replace IDs with New
  5328. // Old Parts on TII: Leave Alone
  5329. // ----------------------------------
  5330. if ($action=="OLDCLASS") {
  5331. $newclassid=turnitintool_getCID($courseid);
  5332. $newclasstitle=turnitintool_getCTL($courseid);
  5333. } else {
  5334. $oldclassid=turnitintool_getCID($courseid);
  5335. $oldclasstitle=turnitintool_getCTL($courseid);
  5336. // Delete old TII Class Link Data
  5337. if (!$delete=turnitintool_delete_records('turnitintool_courses','courseid',$courseid)) {
  5338. turnitintool_print_error('coursedeleteerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5339. exit();
  5340. }
  5341. // Create a new class to use with new parts
  5342. $turnitincourse=turnitintool_classsetup($course,$owner,'',$tii,$loaderbar);
  5343. $newclassid=$turnitincourse->turnitin_cid;
  5344. $newclasstitle=$turnitincourse->turnitin_ctl;
  5345. }
  5346. // Do the loop to create the new parts and swap over the stored TII Part IDs
  5347. foreach ($partsarray as $classid => $v1) {
  5348. foreach ($v1 as $assignid => $v2) {
  5349. foreach ($v2 as $partid => $data) {
  5350. // Get the current assignment part settings from Turnitin
  5351. $post = new stdClass();
  5352. $post->cid=$data['cid'];
  5353. $post->ctl=$data['ctl'];
  5354. $post->assign=$data['assign'];
  5355. $post->assignid=$data['assignid'];
  5356. $tii->queryAssignment($post,'');
  5357. $assignObj=$tii->getAssignmentObject();
  5358. if ($tii->getRerror()) {
  5359. $erroroutput[]=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  5360. }
  5361. $post->cid='';
  5362. $post->uid='';
  5363. $post->assignid='';
  5364. $post->ctl=$newclasstitle;
  5365. $uniquestring=strtoupper(uniqid());
  5366. $post->name=current(explode(' (Moodle: ',$post->assign)).' (Moodle: '.$uniquestring.')';
  5367. $post->dtstart=time();
  5368. $post->dtdue=strtotime('+7 days');
  5369. $post->dtpost=strtotime('+7 days');
  5370. $post->s_view_report=$assignObj->s_view_report;
  5371. $post->anon=$assignObj->anon;
  5372. $post->report_gen_speed=$assignObj->report_gen_speed;
  5373. $post->late_accept_flag=$assignObj->late_accept_flag;
  5374. $post->submit_papers_to=$assignObj->submit_papers_to;
  5375. $post->s_paper_check=$assignObj->s_paper_check;
  5376. $post->internet_check=$assignObj->internet_check;
  5377. $post->journal_check=$assignObj->journal_check;
  5378. $post->max_points=$assignObj->maxpoints;
  5379. // Synch the rest of the reset data from the turnitintool table
  5380. $post->exclude_biblio=$data['turnitintool']->excludebiblio;
  5381. $post->exclude_quoted=$data['turnitintool']->excludequoted;
  5382. $post->exclude_value=$data['turnitintool']->excludevalue;
  5383. $post->exclude_type=$data['turnitintool']->excludetype;
  5384. $post->erater=$data['turnitintool']->erater;
  5385. $post->erater_handbook=$data['turnitintool']->erater_handbook;
  5386. $post->erater_dictionary=$data['turnitintool']->erater_dictionary;
  5387. $post->erater_spelling=$data['turnitintool']->erater_spelling;
  5388. $post->erater_grammar=$data['turnitintool']->erater_grammar;
  5389. $post->erater_usage=$data['turnitintool']->erater_usage;
  5390. $post->erater_mechanics=$data['turnitintool']->erater_mechanics;
  5391. $post->erater_style=$data['turnitintool']->erater_style;
  5392. // Create the Part on TII without IDs
  5393. $tii->createAssignment($post,'INSERT','');
  5394. if ($tii->getRerror()) {
  5395. $erroroutput[]=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  5396. }
  5397. $newassignid=$tii->getAssignid();
  5398. $post->currentassign=current(explode(' (Moodle: ',$post->assign)).' (Moodle: '.$uniquestring.')';
  5399. $post->name=current(explode(' (Moodle: ',$post->name)).' (Moodle: '.$newassignid.')';
  5400. $post->assignid=$newassignid;
  5401. $post->dtstart=$assignObj->dtstart;
  5402. $post->dtdue=$assignObj->dtdue;
  5403. $post->dtpost=$assignObj->dtpost;
  5404. $post->cid=$newclassid;
  5405. // Create the Part on TII with IDs
  5406. $tii->createAssignment($post,'UPDATE','');
  5407. if ($tii->getRerror()) {
  5408. $erroroutput[]=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  5409. }
  5410. $dbpart=new object();
  5411. $dbpart->id=$partid;
  5412. $dbpart->tiiassignid=$newassignid;
  5413. if (!$update=turnitintool_update_record('turnitintool_parts',$dbpart)) {
  5414. turnitintool_print_error('partupdateerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5415. exit();
  5416. }
  5417. if (!$delete=turnitintool_delete_records('turnitintool_submissions','submission_part',$partid)) {
  5418. turnitintool_print_error('submissiondeleteerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5419. exit();
  5420. }
  5421. unset($post);
  5422. }
  5423. }
  5424. }
  5425. // Do the loop again for deletes this ensures we dont have a partly executed create delete run breaking things
  5426. if ($action=="OLDCLASS") { // Only do this if we are recycling the same TII class
  5427. foreach ($partsarray as $classid => $v1) {
  5428. foreach ($v1 as $assignid => $v2) {
  5429. foreach ($v2 as $partid => $data) {
  5430. //$null=NULL;
  5431. //$tii = new turnitintool_commclass($data['uid'],$data['ufn'],$data['uln'],$data['uem'],2,$null);
  5432. //$tii->startSession();
  5433. $post->cid=$data['cid'];
  5434. $post->ctl=$data['ctl'];
  5435. $post->name=$data['assign'];
  5436. $post->assignid=$data['assignid'];
  5437. $tii->deleteAssignment($post,'');
  5438. if ($tii->getRerror()) {
  5439. $erroroutput[]=($tii->getAPIunavailable()) ? get_string('apiunavailable','turnitintool') : $tii->getRmessage();
  5440. }
  5441. //$tii->endSession();
  5442. }
  5443. }
  5444. }
  5445. } else {
  5446. if (isset($erroroutput)) { // If there was a comms error roll back the class ID data changes
  5447. $classupdatedata=new object();
  5448. $classupdatedata->id=$courseid;
  5449. $classupdatedata->turnitin_cid=$oldclassid;
  5450. $classupdatedata->turnitin_ctl=$oldclasstitle;
  5451. if (!$classupdate=turnitintool_update_record('turnitintool_courses',$classupdatedata)) {
  5452. turnitintool_print_error('classupdateerror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5453. exit();
  5454. }
  5455. }
  5456. }
  5457. $tii->endSession();
  5458. if (isset($erroroutput) AND $CFG->turnitin_enablediagnostic=='1') {
  5459. $errors='-----------<br />['.join(']<br />-----------<br />[',$erroroutput).']';
  5460. } else {
  5461. $errors='';
  5462. }
  5463. $status=NULL;
  5464. if (!$legacy) {
  5465. if (isset($erroroutput) AND $action=="NEWCLASS") {
  5466. $status[] = array('component'=>get_string('modulenameplural','turnitintool'), 'item'=>get_string('copyassigndata','turnitintool').$errors, 'error'=>true);
  5467. } else if (!isset($erroroutput) AND $action=="NEWCLASS") {
  5468. $status[] = array('component'=>get_string('modulenameplural','turnitintool'), 'item'=>get_string('copyassigndata','turnitintool'), 'error'=>false);
  5469. } else if (isset($erroroutput) AND $action=="OLDCLASS") {
  5470. $status[] = array('component'=>get_string('modulenameplural','turnitintool'), 'item'=>get_string('replaceassigndata','turnitintool').$errors, 'error'=>true);
  5471. } else if (!isset($erroroutput) AND $action=="OLDCLASS") {
  5472. $status[] = array('component'=>get_string('modulenameplural','turnitintool'), 'item'=>get_string('replaceassigndata','turnitintool'), 'error'=>false);
  5473. }
  5474. } else {
  5475. if (isset($erroroutput) AND $action=="NEWCLASS") {
  5476. $status['error'] = true;
  5477. } else if (!isset($erroroutput) AND $action=="NEWCLASS") {
  5478. $status['error'] = false;
  5479. } else if (isset($erroroutput) AND $action=="OLDCLASS") {
  5480. $status['error'] = true;
  5481. } else if (!isset($erroroutput) AND $action=="OLDCLASS") {
  5482. $status['error'] = false;
  5483. }
  5484. }
  5485. return $status;
  5486. }
  5487. /**
  5488. * Function called by 1.9+ Moodles to populate gradebook
  5489. *
  5490. * @param object $turnitintool The turnitintool object for this activity
  5491. * @param object $thisuser The user object for this user
  5492. * @return object Returns a Grade Object
  5493. */
  5494. function turnitintool_buildgrades($turnitintool,$thisuser) {
  5495. if ($submissions=turnitintool_get_records_select('turnitintool_submissions','turnitintoolid='.$turnitintool->id.' AND userid='.$thisuser->id.' AND submission_unanon=1')) {
  5496. $grades = new stdClass();
  5497. $grades->userid = $thisuser->id;
  5498. $gradearray=turnitintool_grades($turnitintool->id);
  5499. if ($turnitintool->grade < 0) {
  5500. //Using a scale
  5501. $overallgrade=( $gradearray->grades[$thisuser->id]=='-' ) ? NULL : $gradearray->grades[$thisuser->id];
  5502. } else {
  5503. $overallgrade=( $gradearray->grades[$thisuser->id]=='-' ) ? NULL : number_format( $gradearray->grades[$thisuser->id],1 );
  5504. }
  5505. $grades->rawgrade=$overallgrade;
  5506. return $grades;
  5507. } else {
  5508. return new stdClass();
  5509. }
  5510. }
  5511. /**
  5512. * Function called by pre 1.9 Moodles to populate gradebook
  5513. *
  5514. * @param var $turnitintoolid The turnitintool id for this activity
  5515. * @return object Returns a Grade Object
  5516. */
  5517. function turnitintool_grades($turnitintoolid) {
  5518. $return=false;
  5519. if ($submissions=turnitintool_get_records_select('turnitintool_submissions','turnitintoolid='.$turnitintoolid.' AND submission_unanon=1')) {
  5520. $turnitintool=turnitintool_get_record('turnitintool','id',$turnitintoolid);
  5521. $parts=turnitintool_get_records_select('turnitintool_parts',"turnitintoolid=".$turnitintoolid." AND deleted=0","dtpost DESC");
  5522. $partsarray=array_keys($parts);
  5523. $cm=get_coursemodule_from_instance("turnitintool", $turnitintool->id, $turnitintool->course);
  5524. $scale=turnitintool_get_record('scale','id',$turnitintool->grade*-1);
  5525. // Convert the data object into a userid based more useful array
  5526. // ie submission[userid][submission][key]=data [[[[
  5527. foreach ($submissions as $submission) {
  5528. $submission=get_object_vars($submission);
  5529. $keys=array_keys($submission);
  5530. $thisuserid=$submission["userid"];
  5531. $thissubmissionid=$submission["id"];
  5532. $usersubmissions[$thisuserid][$thissubmissionid] = new stdClass();
  5533. for ($i=0;$i<count($keys);$i++) {
  5534. if (in_array($submission['submission_part'],$partsarray)) {
  5535. $thiskey=$keys[$i];
  5536. $thisvalue=$submission[$thiskey];
  5537. $usersubmissions[$thisuserid][$thissubmissionid]->$thiskey=$thisvalue;
  5538. }
  5539. }
  5540. }
  5541. // ]]]]
  5542. foreach ( $usersubmissions as $userid => $userdataarray ) {
  5543. $grades[$userid]=turnitintool_overallgrade($userdataarray,$turnitintool->grade,$parts,$scale);
  5544. }
  5545. $return = new stdClass();
  5546. $return->grades = $grades;
  5547. $return->maxgrade = $turnitintool->grade;
  5548. }
  5549. return $return;
  5550. }
  5551. /**
  5552. * Function called by moodle when installing module
  5553. *
  5554. * @return boolean
  5555. */
  5556. //function turnitintool_install() {
  5557. // return true;
  5558. //}
  5559. /**
  5560. * Function called by moodle when uninstalling module
  5561. *
  5562. * @return boolean
  5563. */
  5564. //function turnitintool_uninstall() {
  5565. // return true;
  5566. //}
  5567. /**
  5568. * Function called to check to see if the configuration screen has been populated
  5569. *
  5570. * @return boolean True if it has been populated False if it hasnt
  5571. */
  5572. function turnitintool_check_config() {
  5573. global $CFG;
  5574. if ( !isset($CFG->turnitin_account_id)
  5575. OR !isset($CFG->turnitin_enablediagnostic)
  5576. OR !isset($CFG->turnitin_secretkey)
  5577. OR !isset($CFG->turnitin_apiurl)
  5578. OR !isset($CFG->turnitin_usegrademark)
  5579. OR !isset($CFG->turnitin_useanon)
  5580. OR !isset($CFG->turnitin_studentemail)) {
  5581. return false;
  5582. } else {
  5583. return true;
  5584. }
  5585. }
  5586. /**
  5587. * Function called to check to see if the current user is the owner of the class
  5588. *
  5589. * @global object
  5590. * @global object
  5591. * @param var $courseid The ID of the course to check the owner of
  5592. * @return boolean True if the current user is the owner False if not
  5593. */
  5594. function turnitintool_is_owner($courseid) {
  5595. global $USER,$CFG;
  5596. if ($course=turnitintool_get_record('turnitintool_courses','courseid',$courseid)) {
  5597. $ownerid=$course->ownerid;
  5598. } else {
  5599. $ownerid=NULL;
  5600. }
  5601. if ($ownerid==$USER->id) {
  5602. return true;
  5603. } else {
  5604. return false;
  5605. }
  5606. }
  5607. /**
  5608. * Returns the Turnitin Class owner of the current course
  5609. *
  5610. * @global object
  5611. * @param var $courseid The ID of the course to check the owner of
  5612. * @return object The user object for the Turnitin Class Owner or NULL if there is no owner stored
  5613. */
  5614. function turnitintool_get_owner($courseid) {
  5615. global $CFG;
  5616. if ($course=turnitintool_get_record('turnitintool_courses','courseid',$courseid)) {
  5617. return turnitintool_get_moodleuser($course->ownerid,NULL,__FILE__,__LINE__);
  5618. } else {
  5619. return NULL;
  5620. }
  5621. }
  5622. /**
  5623. * Redirects the user to login to a Turnitin page
  5624. *
  5625. * @global object
  5626. * @param var $userid The User ID of the user requesting the Turnitin Page
  5627. * @param string $jumppage A string that represents the page to jump to possible strings are 'grade','report','submission' and 'download'
  5628. * @param array The Query Array passed to this function
  5629. */
  5630. function turnitintool_url_jumpto($userid,$jumppage,$turnitintool,$utp=null,$objectid=null,$partid=null,$export_data=null) {
  5631. global $CFG;
  5632. $thisuser=turnitintool_get_moodleuser($userid,NULL,__FILE__,__LINE__);
  5633. $cm=get_coursemodule_from_instance("turnitintool", $turnitintool->id, $turnitintool->course);
  5634. if ( $utp > 1 AND !has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id)) ) {
  5635. turnitintool_print_error('permissiondeniederror','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5636. }
  5637. $loaderbar = NULL;
  5638. $tii = new turnitintool_commclass(turnitintool_getUID($thisuser),$thisuser->firstname,$thisuser->lastname,$thisuser->email,$utp,$loaderbar,false);
  5639. $tii->startSession();
  5640. $newuser=turnitintool_usersetup($thisuser,get_string('userprocess','turnitintool'),$tii,$loaderbar);
  5641. $post = new stdClass();
  5642. $post->cid = turnitintool_getCID( $turnitintool->course );
  5643. $post->ctl = turnitintool_getCTL( $turnitintool->course );
  5644. $post->paperid = $objectid;
  5645. $owner = turnitintool_get_owner( $turnitintool->course ); // Get the default main tutor (used in tem only)
  5646. $post->tem = $owner->email;
  5647. $post->assignid = !is_null( $partid ) ? turnitintool_getAID( $partid ) : null;
  5648. $post->assign = !is_null( $partid ) ? $turnitintool->name . ' - ' . turnitintool_partnamefromnum( $partid ) . ' (Moodle '.$post->assignid.')' : null;
  5649. $post->export_data = $export_data;
  5650. if ($utp > 1 AND !is_null($turnitintool)) {
  5651. // If this is a tutor enrol them on the Turnitin class before redirecting
  5652. $tii->enrolTutor($post,get_string('turnitintutorsadding','turnitintool'));
  5653. }
  5654. if ($tii->getRerror()) {
  5655. if ($tii->getAPIunavailable()) {
  5656. turnitintool_print_error('apiunavailable','turnitintool',NULL,NULL,__FILE__,__LINE__);
  5657. } else {
  5658. turnitintool_print_error($tii->getRmessage(),NULL,NULL,NULL,__FILE__,__LINE__);
  5659. }
  5660. exit();
  5661. }
  5662. $tii->endSession();
  5663. $tii->uid=$newuser->turnitin_uid;
  5664. if ($jumppage=='grade') {
  5665. $url=$tii->getGradeMarkLink($post);
  5666. } else if ($jumppage=='report') {
  5667. $url=$tii->getReportLink($post);
  5668. } else if ($jumppage=='submission') {
  5669. $url=$tii->getSubmissionURL($post);
  5670. } else if ($jumppage=='zipfile') {
  5671. $url=$tii->bulkDownload($post);
  5672. } else {
  5673. header('Content-Disposition: attachment;');
  5674. $url=$tii->getSubmissionDownload($post);
  5675. }
  5676. turnitintool_redirect($url);
  5677. exit();
  5678. }
  5679. /**
  5680. * Redirect function uses Javascript / User click redirect if the headers have been sent or header() if not
  5681. *
  5682. * @param string $url The URL to redirect to
  5683. */
  5684. function turnitintool_redirect($url) {
  5685. if (!headers_sent($f,$l)) {
  5686. turnitintool_activitylog("header() REDIRECT START ".$url,"REDIRECT");
  5687. header('Location: '.$url);
  5688. turnitintool_activitylog("header() REDIRECT END ".$url,"REDIRECT");
  5689. } else {
  5690. turnitintool_activitylog("JS / META REDIRECT START ".$url,"REDIRECT");
  5691. echo '
  5692. <a href="'.$url.'" id="redirectlink">'.get_string('redirect','turnitintool').'</a>
  5693. <script language="javascript">
  5694. document.getElementById("redirectlink").style.display="none";
  5695. location.href="'.$url.'";
  5696. </script>
  5697. <noscript>
  5698. <meta http-equiv="Refresh" content="0;url='.$url.'" />
  5699. </noscript>
  5700. ';
  5701. turnitintool_activitylog("JS / META REDIRECT END ".$url,"REDIRECT");
  5702. }
  5703. exit();
  5704. }
  5705. /**
  5706. * Abstracted version of get_records_sql() to work with Moodle 1.8 through 2.0
  5707. *
  5708. * @param string $sql The SQL Query
  5709. * @param array $params array of sql parameters
  5710. * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set).
  5711. * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set).
  5712. * @return array An array of data objects
  5713. */
  5714. function turnitintool_get_records_sql($sql,$params=NULL,$limitfrom=0,$limitnum=0) {
  5715. global $DB, $CFG;
  5716. if (is_callable(array($DB,'get_records_sql'))) {
  5717. $return = $DB->get_records_sql($sql,$params,$limitfrom,$limitnum);
  5718. } else {
  5719. $sql = preg_replace('/\{([a-z][a-z0-9_]*)\}/', $CFG->prefix.'$1', $sql);
  5720. $params = addslashes_recursive( $params );
  5721. $sql = vsprintf( str_replace("?","'%s'",$sql), $params );
  5722. //$sql = sql_magic_quotes_hack( $sql );
  5723. $return = get_records_sql($sql,$limitfrom,$limitnum);
  5724. }
  5725. return $return;
  5726. }
  5727. /**
  5728. * Abstracted version of count_records_sql() to work with Moodle 1.8 through 2.0
  5729. *
  5730. * @param string $sql The SQL Query
  5731. * @param array $params array of sql parameters
  5732. * @return array An array of data objects
  5733. */
  5734. function turnitintool_count_records_sql($sql,$params=NULL) {
  5735. global $DB;
  5736. if (is_callable(array($DB,'count_records_sql'))) {
  5737. return $DB->count_records_sql($sql,$params);
  5738. } else {
  5739. return count_records_sql($sql,$params);
  5740. }
  5741. }
  5742. /**
  5743. * Abstracts the sql_concat function to work across versions
  5744. *
  5745. * @param string $element
  5746. * @return string
  5747. */
  5748. function turnitintool_sql_concat() {
  5749. global $DB;
  5750. $args = func_get_args();
  5751. if (is_callable(array($DB,'sql_concat'))) {
  5752. return call_user_func_array( array($DB, 'sql_concat'), $args );
  5753. } else {
  5754. return call_user_func_array( 'sql_concat', $args );
  5755. }
  5756. }
  5757. /**
  5758. * Abstracted version of get_record() to work with Moodle 1.8 through 2.0
  5759. *
  5760. * @param string $table The Database Table
  5761. * @param string $field1 the fieldname of the first field to check
  5762. * @param string $value1 the value of the first field to check
  5763. * @param string $field2 the fieldname of the second field to check
  5764. * @param string $value2 the value of the second field to check
  5765. * @param string $field3 the fieldname of the three field to check
  5766. * @param string $value3 the value of the three field to check
  5767. * @param string $fileds the fields to return in the array
  5768. * @return array An array of data objects
  5769. */
  5770. function turnitintool_get_record($table,$field1='',$value1='',$field2='',$value2='',$field3='',$value3='',$fields='*') {
  5771. global $DB;
  5772. if (is_callable(array($DB,'get_record'))) {
  5773. if (!empty($field1)) {
  5774. $select[$field1]=$value1;
  5775. }
  5776. if (!empty($field2)) {
  5777. $select[$field2]=$value2;
  5778. }
  5779. if (!empty($field3)) {
  5780. $select[$field3]=$value3;
  5781. }
  5782. $return = $DB->get_record($table,$select,$fields);
  5783. } else {
  5784. $return = get_record($table,$field1,$value1,$field2,$value2,$field3,$value3,$fields);
  5785. }
  5786. return $return;
  5787. }
  5788. /**
  5789. * Abstracted version of get_records() to work with Moodle 1.8 through 2.0
  5790. *
  5791. * @param string $table The Database Table
  5792. * @param string $field the fieldname of the field to check
  5793. * @param string $value the value of the field to check
  5794. * @param string $sort the sort order
  5795. * @param string $fields the columns to return
  5796. * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set).
  5797. * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set).
  5798. * @return array An array of data objects
  5799. */
  5800. function turnitintool_get_records($table,$field='',$value='',$sort='',$fields='*',$limitfrom='',$limitnum='') {
  5801. global $DB;
  5802. if (is_callable(array($DB,'get_records'))) {
  5803. if (!empty($field)) {
  5804. $select[$field]=$value;
  5805. } else {
  5806. $select=array();
  5807. }
  5808. $return = $DB->get_records($table,$select,$sort,$fields,$limitfrom,$limitnum);
  5809. } else {
  5810. $return = get_records($table,$field,$value,$sort,$fields,$limitfrom,$limitnum);
  5811. }
  5812. return $return;
  5813. }
  5814. /**
  5815. * Abstracted version of get_records_select() to work with Moodle 1.8 through 2.0
  5816. *
  5817. * @param string $table The Database Table
  5818. * @param string $select the select SQL query
  5819. * @param string $sort the sort order
  5820. * @param string $fields the columns to return
  5821. * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set).
  5822. * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set).
  5823. * @return array An array of data objects
  5824. */
  5825. function turnitintool_get_records_select($table,$select,$sort='',$fields='*',$limitfrom='',$limitnum='') {
  5826. global $DB;
  5827. if (is_callable(array($DB,'get_records_select'))) {
  5828. $return = $DB->get_records_select($table,$select,NULL,$sort,$fields,$limitfrom,$limitnum);
  5829. } else {
  5830. $return = get_records_select($table,$select,$sort,$fields,$limitfrom,$limitnum);
  5831. }
  5832. return $return;
  5833. }
  5834. /**
  5835. * Abstracted version of get_records_select() to work with Moodle 1.8 through 2.0
  5836. *
  5837. * @param string $table The Database Table
  5838. * @param string $select the select SQL query
  5839. * @param string $fields the columns to return
  5840. * @return array An array of data objects
  5841. */
  5842. function turnitintool_get_record_select($table,$select,$fields='*') {
  5843. global $DB;
  5844. if (is_callable(array($DB,'get_record_select'))) {
  5845. $return = $DB->get_record_select($table,$select,NULL,$fields);
  5846. } else {
  5847. $return = get_record_select($table,$select,$fields);
  5848. }
  5849. return $return;
  5850. }
  5851. /**
  5852. * Abstracted version of update_record() to work with Moodle 1.8 through 2.0
  5853. *
  5854. * @global object
  5855. * @param string $table The Database Table
  5856. * @param string $dataobject the data object to populate the database table with
  5857. * @return boolean
  5858. */
  5859. function turnitintool_update_record($table,$dataobject) {
  5860. global $DB;
  5861. $dataobject = json_decode(json_encode($dataobject));
  5862. if (is_callable(array($DB,'update_record'))) {
  5863. return $DB->update_record($table,$dataobject);
  5864. } else {
  5865. return update_record($table,$dataobject);
  5866. }
  5867. }
  5868. /**
  5869. * Abstracted version of insert_record() to work with Moodle 1.8 through 2.0
  5870. *
  5871. * @global object
  5872. * @param string $table The Database Table
  5873. * @param string $dataobject the data object to populate the database table with
  5874. * @param boolean $returnid return an ID or not
  5875. * @param string $primarykey sets the primary key
  5876. * @return int The ID of the row created
  5877. */
  5878. function turnitintool_insert_record($table,$dataobject,$returnid=true,$primarykey='id') {
  5879. global $DB;
  5880. $dataobject = json_decode(json_encode($dataobject));
  5881. if (is_callable(array($DB,'insert_record'))) {
  5882. return $DB->insert_record($table,$dataobject,$returnid,$primarykey);
  5883. } else {
  5884. return insert_record($table,$dataobject,$returnid,$primarykey);
  5885. }
  5886. }
  5887. /**
  5888. * Abstracted version of delete_records_select() to work with Moodle 1.8 through 2.0
  5889. *
  5890. * @param string $table The Database Table
  5891. * @param string $select the select SQL query
  5892. * @return boolean
  5893. */
  5894. function turnitintool_delete_records_select($table,$select='') {
  5895. global $DB;
  5896. if (is_callable(array($DB,'delete_records_select'))) {
  5897. return $DB->delete_records_select($table,$select);
  5898. } else {
  5899. return delete_records_select($table,$select);
  5900. }
  5901. }
  5902. /**
  5903. * Abstracted version of delete_records() to work with Moodle 1.8 through 2.0
  5904. *
  5905. * @param string $table The Database Table
  5906. * @param string $field1 the fieldname of the first field to check
  5907. * @param string $value1 the value of the first field to check
  5908. * @param string $field2 the fieldname of the second field to check
  5909. * @param string $value2 the value of the second field to check
  5910. * @param string $field3 the fieldname of the three field to check
  5911. * @param string $value3 the value of the three field to check
  5912. * @return boolean
  5913. */
  5914. function turnitintool_delete_records($table,$field1='',$value1='',$field2='',$value2='',$field3='',$value3='') {
  5915. global $DB;
  5916. if (is_callable(array($DB,'delete_records'))) {
  5917. if (!empty($field1)) {
  5918. $select[$field1]=(empty($value1)) ? null : $value1;
  5919. }
  5920. if (!empty($field2)) {
  5921. $select[$field2]=(empty($value2)) ? null : $value2;
  5922. }
  5923. if (!empty($field3)) {
  5924. $select[$field3]=(empty($value3)) ? null : $value3;
  5925. }
  5926. return $DB->delete_records($table,$select);
  5927. } else {
  5928. return delete_records($table,$field1,$value1,$field2,$value2,$field3,$value3);
  5929. }
  5930. }
  5931. /**
  5932. * Abstracted version of count_records_select() to work with Moodle 1.8 through 2.0
  5933. *
  5934. * @param string $table The Database Table
  5935. * @param string $select the select SQL query
  5936. * @param string $countitem The item to count
  5937. * @return int Result count
  5938. */
  5939. function turnitintool_count_records_select($table,$select='',$countitem='COUNT(*)') {
  5940. global $DB;
  5941. if (is_callable(array($DB,'count_records_select'))) {
  5942. return $DB->count_records_select($table,$select,NULL,$countitem);
  5943. } else {
  5944. return count_records_select($table,$select,$countitem);
  5945. }
  5946. }
  5947. /**
  5948. * Abstracted version of count_records() to work with Moodle 1.8 through 2.0
  5949. *
  5950. * @param string $table The Database Table
  5951. * @param string $field1 the fieldname of the first field to check
  5952. * @param string $value1 the value of the first field to check
  5953. * @param string $field2 the fieldname of the second field to check
  5954. * @param string $value2 the value of the second field to check
  5955. * @param string $field3 the fieldname of the three field to check
  5956. * @param string $value3 the value of the three field to check
  5957. * @return int Result count
  5958. */
  5959. function turnitintool_count_records($table,$field1='',$value1='',$field2='',$value2='',$field3='',$value3='') {
  5960. global $DB;
  5961. if (is_callable(array($DB,'count_records'))) {
  5962. if (!empty($field1)) {
  5963. $select[$field1]=(empty($value1)) ? null : $value1;
  5964. }
  5965. if (!empty($field2)) {
  5966. $select[$field2]=(empty($value2)) ? null : $value2;
  5967. }
  5968. if (!empty($field3)) {
  5969. $select[$field3]=(empty($value3)) ? null : $value3;
  5970. }
  5971. return $DB->count_records($table,$select);
  5972. } else {
  5973. return count_records($table,$field1,$value1,$field2,$value2,$field3,$value3);
  5974. }
  5975. }
  5976. /**
  5977. * Abstracted version of search_users() to work with Moodle 1.8 through 2.0
  5978. *
  5979. * @param int $courseid The ID of the course
  5980. * @param int $groupid The ID of the group
  5981. * @param string $searchtext The text to search for
  5982. * @param string $sort The column sort order
  5983. * @param string $exceptions Comma separated list of users to exclude from the search
  5984. * @return array
  5985. */
  5986. function turnitintool_search_users($courseid, $groupid, $searchtext, $sort='', $exceptions='') {
  5987. global $DB;
  5988. if (is_callable(array($DB,'count_records')) AND !empty($exceptions)) {
  5989. $explode=explode(",",$exceptions);
  5990. } else if (is_callable(array($DB,'count_records'))) {
  5991. $explode=array();
  5992. } else {
  5993. $explode=$exceptions;
  5994. }
  5995. return search_users($courseid, $groupid, $searchtext, $sort, $explode);
  5996. }
  5997. /**
  5998. * Abstracted version of box_start() / print_box_start() to work with Moodle 1.8 through 2.0
  5999. *
  6000. * @param string $classes The CSS class for the box HTML element
  6001. * @param string $ids An optional ID
  6002. * @param boolean Return the output or print it to screen directly
  6003. * @return string the HTML to output.
  6004. */
  6005. function turnitintool_box_start($classes='generalbox', $ids='', $return=false) {
  6006. global $OUTPUT;
  6007. if (is_callable(array($OUTPUT,'box_start')) AND !$return) {
  6008. echo $OUTPUT->box_start($classes,$ids);
  6009. } else if (is_callable(array($OUTPUT,'box_start'))) {
  6010. return $OUTPUT->box_start($classes,$ids);
  6011. } else {
  6012. return print_box_start($classes,$ids,$return);
  6013. }
  6014. }
  6015. /**
  6016. * Abstracted version of box_end() / print_box_end() to work with Moodle 1.8 through 2.0
  6017. *
  6018. * @param boolean Return the output or print it to screen directly
  6019. * @return string the HTML to output.
  6020. */
  6021. function turnitintool_box_end($return=false) {
  6022. global $OUTPUT;
  6023. if (is_callable(array($OUTPUT,'box_end')) AND !$return) {
  6024. echo $OUTPUT->box_end();
  6025. } else if (is_callable(array($OUTPUT,'box_end'))) {
  6026. return $OUTPUT->box_end();
  6027. } else {
  6028. return print_box_end($return);
  6029. }
  6030. }
  6031. /**
  6032. * Abstracted version of helpbutton() / help_icon() to work with Moodle 1.8 through 2.0
  6033. *
  6034. * @param string $page The keyword that defines a help page
  6035. * @param string $title The title of links
  6036. * @param string $module Which module is the page defined in
  6037. * @param mixed $image Use a help image for the link? (true/false/"both")
  6038. * @param boolean $linktext If true, display the title next to the help icon.
  6039. * @param string $text If defined then this text is used in the page
  6040. * @param boolean $return If true then the output is returned as a string, if false it is printed to the current page.
  6041. * @param string $imagetext The full text for the helpbutton icon. If empty use default help.gif
  6042. * @return string|void Depending on value of $return
  6043. */
  6044. function turnitintool_help_icon($page, $title, $module='moodle', $image=true, $linktext=false, $text='', $return=false, $imagetext='') {
  6045. global $OUTPUT;
  6046. if (is_callable(array($OUTPUT,'help_icon'))) {
  6047. if (!$return) {
  6048. echo $OUTPUT->help_icon($page, 'turnitintool');
  6049. } else {
  6050. return $OUTPUT->help_icon($page, 'turnitintool');
  6051. }
  6052. } else {
  6053. return helpbutton($page, $title, $module, $image, $linktext, $text, $return, $imagetext);
  6054. }
  6055. }
  6056. /**
  6057. * Abstracted version of mod_form help_icon to work with Moodle 1.8 through 2.0
  6058. *
  6059. * @param string $element The form element to apply help icon to
  6060. * @param string $string The language string to use
  6061. * @param string $module Which module is the page defined in
  6062. * @param object $mform The mod_form object
  6063. */
  6064. function turnitintool_modform_help_icon($element, $string, $module, $mform) {
  6065. if (is_callable(array($mform,'addHelpButton'))) {
  6066. $mform->addHelpButton($element, $string, $module);
  6067. } else {
  6068. $mform->setHelpButton($element, array($string, get_string($string, $module), $module));
  6069. }
  6070. }
  6071. /**
  6072. * Custom replacement for print_table removes dependencies on Moodles various table
  6073. * methods and serve the turnitintool use perfectly and be backwards compatible
  6074. *
  6075. * @param object $table The table data object
  6076. * @param boolean Return the output or print it to screen directly
  6077. * @return string the HTML to output.
  6078. */
  6079. function turnitintool_print_table($table, $return=false) {
  6080. // Table Object use:
  6081. // $table = new stdClass();
  6082. // $table->width = '';
  6083. // $table->id = '';
  6084. // $table->class = '';
  6085. // $table->tablealign = '';
  6086. // $table->rows[0] = new stdClass();
  6087. // $table->rows[0]->id = '';
  6088. // $table->rows[0]->class = '';
  6089. // $table->rows[0]->cells[0]->id = '';
  6090. // $table->rows[0]->cells[0]->class = '';
  6091. // $table->rows[0]->cells[0]->data = '';
  6092. $width=(isset($table->width) AND strlen($table->width)>0) ? " width=\"".$table->width."\"" : "";
  6093. $id=(isset($table->id) AND strlen($table->id)>0) ? " id=\"".$table->id."\"" : "";
  6094. $class=(isset($table->class) AND strlen($table->class)>0) ? " class=\"".$table->class."\"" : "";
  6095. $tablealign=(isset($table->tablealign) AND strlen($table->tablealign)>0) ? " align=\"".$table->tablealign."\"" : "";
  6096. $style=(isset($table->style) AND strlen($table->style)>0) ? " style=\"".$table->style."\"" : "";
  6097. $output="<table".$width.$id.$class.$tablealign.$style."><thead>\n";
  6098. $thead = false;
  6099. foreach ($table->rows as $row) {
  6100. $class=(isset($row->class) AND strlen($row->class)>0) ? " class=\"".$row->class."\"" : "";
  6101. $id=(isset($row->id) AND strlen($row->id)>0) ? " id=\"".$row->id."\"" : "";
  6102. $output.="\t<tr".$id.$class.">\n";
  6103. if ( isset( $row->cells ) ) {
  6104. $celltag = 'td';
  6105. $cells = $row->cells;
  6106. } else if ( isset( $row->hcells ) ) {
  6107. $celltag = 'th';
  6108. $cells = $row->hcells;
  6109. }
  6110. foreach ($cells as $cell) {
  6111. $class=(isset($cell->class) AND strlen($cell->class)>0) ? " class=\"".$cell->class."\"" : "";
  6112. $id=(isset($cell->id) AND strlen($cell->id)>0) ? " id=\"".$cell->id."\"" : "";
  6113. $data=(isset($cell->data) AND strlen($cell->data)>0) ? $cell->data : "&nbsp;";
  6114. $output.="\t\t<".$celltag.$id.$class.">".$data."</".$celltag.">\n";
  6115. }
  6116. if ( !$thead ) {
  6117. $thead = true;
  6118. $body_ot = ( count( $table->rows ) == 1 ) ? '' : '<tbody>';
  6119. $body_ct = ( count( $table->rows ) == 1 ) ? '' : '</tbody>';
  6120. $output.="\t</tr></thead>$body_ot\n";
  6121. } else {
  6122. $output.="\t</tr>\n";
  6123. }
  6124. }
  6125. $output.="$body_ct</table><br /><br />\n";
  6126. if ($return) {
  6127. return $output;
  6128. } else {
  6129. echo $output;
  6130. }
  6131. }
  6132. /**
  6133. * Abstracted version of print_header() / header() to work with Moodle 1.8 through 2.0
  6134. *
  6135. * @param object $cm The moodle course module object for this instance
  6136. * @param object $course The course object for this activity
  6137. * @param string $title Appears at the top of the window
  6138. * @param string $heading Appears at the top of the page
  6139. * @param string $navigation Array of $navlinks arrays (keys: name, link, type) for use as breadcrumbs links
  6140. * @param string $focus Indicates form element to get cursor focus on load eg inputform.password
  6141. * @param string $meta Meta tags to be added to the header
  6142. * @param boolean $cache Should this page be cacheable?
  6143. * @param string $button HTML code for a button (usually for module editing)
  6144. * @param string $menu HTML code for a popup menu
  6145. * @param boolean $usexml use XML for this page
  6146. * @param string $bodytags This text will be included verbatim in the <body> tag (useful for onload() etc)
  6147. * @param bool $return If true, return the visible elements of the header instead of echoing them.
  6148. * @return mixed If return=true then string else void
  6149. */
  6150. function turnitintool_header($cm,$course,$url,$title='', $heading='', $navigation='', $focus='',
  6151. $meta='', $cache=true, $button='&nbsp;', $menu=null,
  6152. $usexml=false, $bodytags='', $return=false) {
  6153. global $DB,$PAGE,$OUTPUT,$CFG;
  6154. if (is_callable(array($OUTPUT,'header'))) {
  6155. $cmid=($cm!=NULL) ? $cm->id : NULL;
  6156. $courseid=($course!=NULL) ? $course->id : NULL;
  6157. if (!is_null($cmid)) {
  6158. $category = $DB->get_record('course_categories', array('id'=>$course->category));
  6159. $PAGE->navbar->ignore_active();
  6160. if (isset($category->name)) $PAGE->navbar->add($category->name, new moodle_url($CFG->wwwroot.'/course/category.php', array('id'=>$course->category)));
  6161. $PAGE->navbar->add($course->shortname, new moodle_url($CFG->wwwroot.'/course/view.php', array('id'=>$course->id)));
  6162. $PAGE->navbar->add(get_string('modulenameplural', 'turnitintool'), new moodle_url($CFG->wwwroot.'/mod/turnitintool/index.php', array('id'=>$course->id)));
  6163. $PAGE->navbar->add($title);
  6164. $PAGE->set_button(update_module_button($cmid, $courseid, get_string('modulename', 'turnitintool')));
  6165. }
  6166. $url_array = explode( '/mod/turnitintool', $url, 2 );
  6167. $url = '/mod/turnitintool/'.$url_array[1];
  6168. $PAGE->set_url($url);
  6169. $PAGE->set_title($title);
  6170. $PAGE->set_heading($heading);
  6171. if ($return) {
  6172. return $OUTPUT->header();
  6173. } else {
  6174. echo $OUTPUT->header();
  6175. }
  6176. } else {
  6177. return print_header($title,$heading,$navigation,$focus,$meta,$cache,$button,$menu,$usexml,$bodytags,$return);
  6178. }
  6179. }
  6180. /**
  6181. * Abstracted version of print_footer() / footer() to work with Moodle 1.8 through 2.0
  6182. *
  6183. * @param object $course The moodle course module object for this instance
  6184. * @param object $usercourse The usercourse object
  6185. * @param bool $return If true, return the visible elements of the header instead of echoing them.
  6186. * @return mixed If return=true then string else void
  6187. */
  6188. function turnitintool_footer($course = NULL, $usercourse = NULL, $return = false) {
  6189. global $PAGE,$OUTPUT;
  6190. if (is_callable(array($OUTPUT,'footer'))) {
  6191. if ($return) {
  6192. return $OUTPUT->footer();
  6193. } else {
  6194. echo $OUTPUT->footer();
  6195. }
  6196. } else {
  6197. return print_footer($course,$usercourse,$return);
  6198. }
  6199. }
  6200. /**
  6201. * Warning display to indicate duplicated assignments, normally as a result of a backup and restore
  6202. *
  6203. * @param object $cm The moodle course module object for this instance
  6204. * @param object $turnitintool The turnitin assignment data object
  6205. * @return mixed Returns HTML duplication warning if the logged in users has grade rights otherwise null
  6206. */
  6207. function turnitintool_duplicatewarning($cm, $turnitintool) {
  6208. global $CFG;
  6209. if ( has_capability('mod/turnitintool:grade', get_context_instance(CONTEXT_MODULE, $cm->id)) ) {
  6210. $parts = turnitintool_get_records('turnitintool_parts','turnitintoolid',$turnitintool->id);
  6211. $dups = array();
  6212. $output = '';
  6213. foreach ($parts as $part) {
  6214. $dup_parts = turnitintool_get_records_select('turnitintool_parts',
  6215. 'tiiassignid='.$part->tiiassignid.
  6216. ' AND turnitintoolid!='.$part->turnitintoolid.' AND deleted=0');
  6217. $dup_parts = (is_array($dup_parts)) ? $dup_parts : array();
  6218. foreach ($dup_parts as $dup_part) {
  6219. $dups[] = $dup_part;
  6220. } if (is_array($dup_parts));
  6221. }
  6222. if ( count($dups) > 0 ) {
  6223. $output .= turnitintool_box_start('generalbox boxwidthwide boxaligncenter notepost', 'warning', true);
  6224. $output .= '<h3 class="error">' . get_string('notice') . '</h3>';
  6225. $output .= '<p>' . get_string('duplicatesfound','turnitintool') . '</p>';
  6226. $output .= '<ul>'.PHP_EOL;
  6227. }
  6228. foreach ( $dups as $dup_part ) {
  6229. $dup_tii = turnitintool_get_record('turnitintool','id',$dup_part->turnitintoolid);
  6230. $dup_cm = get_coursemodule_from_instance('turnitintool',$dup_tii->id);
  6231. $dup_course = turnitintool_get_record('course','id',$dup_tii->course);
  6232. $output .= '<li><a href="'.$CFG->wwwroot.'/mod/turnitintool/view.php?id='.$dup_cm->id.'">';
  6233. $output .= $dup_course->fullname.' (' . $dup_course->shortname . ') - '.$dup_tii->name.' - ' . $dup_part->partname . '<br />';
  6234. $output .= '</a></li>'.PHP_EOL;
  6235. }
  6236. if ( count($dups) > 0 ) {
  6237. $output .= '</ul>'.PHP_EOL;
  6238. $output .= turnitintool_box_end(true);
  6239. }
  6240. return $output;
  6241. } else {
  6242. return '';
  6243. }
  6244. }
  6245. /**
  6246. * Abstracted version of print_error() to work with Moodle 1.8 through 2.0
  6247. *
  6248. * @param string $input The error string if module=NULL otherwise the language string called by get_string()
  6249. * @param string $module The module string
  6250. * @param string $param The parameter to send to use as the $a optional object in get_string()
  6251. * @param string $file The file where the error occured
  6252. * @param string $line The line number where the error occured
  6253. */
  6254. function turnitintool_print_error($input,$module=NULL,$link=NULL,$param=NULL,$file=__FILE__,$line=__LINE__) {
  6255. global $CFG;
  6256. turnitintool_activitylog($input,"PRINT_ERROR");
  6257. if (is_null($module)) {
  6258. $message=$input;
  6259. } else {
  6260. $message=get_string($input,$module,$param);
  6261. }
  6262. $linkid=optional_param('id',null,PARAM_CLEAN);
  6263. if (is_null($link) AND substr_count($_SERVER["PHP_SELF"],"turnitintool/view.php")>0) {
  6264. $link=(!is_null($linkid)) ? $CFG->wwwroot.'/mod/turnitintool/view.php?id='.$linkid : $CFG->wwwroot;
  6265. }
  6266. if (isset($CFG->turnitin_enablediagnostic) AND $CFG->turnitin_enablediagnostic=="1") {
  6267. $message.=' ('.basename($file).' | '.$line.')';
  6268. }
  6269. if (!headers_sent()) { // If there nothing in the output buffer then the loaderbar wasn't used print the error
  6270. print_error('string','turnitintool',$link,'<span style="color: #888888;">'.$message.'</span>');
  6271. exit();
  6272. } else {
  6273. // If there is something in the output buffer then the loaderbar was used and we need to redirect out and show an error afterwards
  6274. // Reason for this is we have printed the HTML and BODY tags to the screen print_error will do the same and disrupt the loader bar javascript
  6275. $errorarray['input']=$input;
  6276. $errorarray['module']=$module;
  6277. $errorarray['link']=$link;
  6278. $errorarray['param']=$param;
  6279. $errorarray['file']=$file;
  6280. $errorarray['line']=$line;
  6281. $_SESSION['turnitintool_errorarray']=$errorarray;
  6282. turnitintool_redirect($CFG->wwwroot.'/mod/turnitintool/view.php');
  6283. exit();
  6284. }
  6285. }
  6286. /**
  6287. * Logging function to log activity / errors
  6288. *
  6289. * @param string $string The string describing the activity
  6290. * @param string $activity The activity prompting the log
  6291. * e.g. PRINT_ERROR (default), API_ERROR, INCLUDE, REQUIRE_JS, REQUIRE_ONCE, REQUEST, REDIRECT
  6292. */
  6293. function turnitintool_activitylog($string,$activity) {
  6294. global $CFG;
  6295. if (isset($CFG->turnitin_enablediagnostic) AND $CFG->turnitin_enablediagnostic) {
  6296. // ###### DELETE SURPLUS LOGS #########
  6297. $numkeeps=10;
  6298. $prefix="activitylog_";
  6299. $dirpath=$CFG->dataroot."/temp/turnitintool/logs";
  6300. if (!file_exists($dirpath)) {
  6301. mkdir($dirpath,0777,true);
  6302. }
  6303. $dir=opendir($dirpath);
  6304. $files=array();
  6305. while ($entry=readdir($dir)) {
  6306. if (substr(basename($entry),0,1)!="." AND substr_count(basename($entry),$prefix)>0) {
  6307. $files[]=basename($entry);
  6308. }
  6309. }
  6310. sort($files);
  6311. for ($i=0;$i<count($files)-$numkeeps;$i++) {
  6312. unlink($dirpath."/".$files[$i]);
  6313. }
  6314. // ####################################
  6315. $filepath=$dirpath."/".$prefix.date('Ymd',time()).".log";
  6316. $file=fopen($filepath,'a');
  6317. $output=date('Y-m-d H:i:s O')." (".$activity.")"." - ".$string."\r\n";
  6318. fwrite($file,$output);
  6319. fclose($file);
  6320. }
  6321. }
  6322. /**
  6323. * Checks for error session array and if it is present display the error stored and exit
  6324. */
  6325. function turnitintool_process_api_error() {
  6326. if (isset($_SESSION['turnitintool_errorarray'])) {
  6327. $errorarray=$_SESSION['turnitintool_errorarray'];
  6328. turnitintool_activitylog($errorarray['input'],"API_ERROR");
  6329. unset($_SESSION['turnitintool_errorarray']);
  6330. turnitintool_print_error($errorarray['input'],$errorarray['module'],$errorarray['link'],$errorarray['param'],$errorarray['file'],$errorarray['line']);
  6331. exit();
  6332. }
  6333. }
  6334. /**
  6335. * Abstract 1.8 and 1.9+ get group for module function
  6336. *
  6337. * @param object $cm The course module
  6338. * @param object $user The user module
  6339. * @return array Array of groups the user belongs to
  6340. */
  6341. function turnitintool_module_group($cm) {
  6342. if (!is_callable('groups_get_activity_group')) {
  6343. return $cm->currentgroup;
  6344. } else {
  6345. return groups_get_activity_group($cm);
  6346. }
  6347. }
  6348. /**
  6349. * Convert a regular email into the pseudo equivelant for student data privacy purpose
  6350. *
  6351. * @param string $email The user' module's lastname
  6352. * @return string A psuedo email address
  6353. */
  6354. function turnitintool_pseudoemail( $email ) {
  6355. global $CFG;
  6356. $salt = !isset( $CFG->turnitin_pseudosalt ) ? '' : $CFG->turnitin_pseudosalt;
  6357. $domain = empty( $CFG->turnitin_pseudoemaildomain ) ? '@tiimoodle.com' : $CFG->turnitin_pseudoemaildomain;
  6358. if ( substr( $domain, 0, 1 ) != '@' ) {
  6359. $domain = '@' . $domain;
  6360. }
  6361. return sha1( $email.$salt ) . $domain;
  6362. }
  6363. /**
  6364. * Convert a regular firstname into the pseudo equivelant for student data privacy purpose
  6365. *
  6366. * @return string A psuedo firstname address
  6367. */
  6368. function turnitintool_pseudofirstname() {
  6369. global $CFG;
  6370. return $CFG->turnitin_pseudofirstname;
  6371. }
  6372. /**
  6373. * Convert a regular lastname into the pseudo equivelant for student data privacy purpose
  6374. *
  6375. * @param string $email The users email address
  6376. * @return string A psuedo lastname address
  6377. */
  6378. function turnitintool_pseudolastname( $email ) {
  6379. global $CFG;
  6380. $user = turnitintool_get_record( 'user', 'email', $email );
  6381. $user_info = turnitintool_get_record( 'user_info_data', 'userid', $user->id, 'fieldid', $CFG->turnitin_pseudolastname );
  6382. if ( ( !isset( $user_info->data ) OR empty( $user_info->data ) ) AND $CFG->turnitin_pseudolastname != 0 AND $CFG->turnitin_lastnamegen == 1 ) {
  6383. $uniqueid = strtoupper(strrev(uniqid()));
  6384. $userinfo = new stdClass();
  6385. $userinfo->userid = $user->id;
  6386. $userinfo->fieldid = $CFG->turnitin_pseudolastname;
  6387. $userinfo->data = $uniqueid;
  6388. if ( isset( $user_info->data ) ) {
  6389. $userinfo->id = $user_info->id;
  6390. turnitintool_update_record( 'user_info_data', $userinfo );
  6391. } else {
  6392. turnitintool_insert_record( 'user_info_data', $userinfo );
  6393. }
  6394. } else if ( $CFG->turnitin_pseudolastname != 0 ) {
  6395. $uniqueid = isset( $user_info->data ) ? $user_info->data : 'Unset';
  6396. } else {
  6397. $uniqueid = get_string( 'user' );
  6398. }
  6399. return $uniqueid;
  6400. }
  6401. /**
  6402. * Checks to see if the user is a turnitin tutor based on email address
  6403. *
  6404. * @param string $email The users email address
  6405. * @return boolean True if user is a tutor
  6406. */
  6407. function turnitintool_istutor( $email ) {
  6408. $user = turnitintool_get_record( 'user', 'email', $email );
  6409. $tiiuser = turnitintool_get_record( 'turnitintool_users', 'userid', $user->id );
  6410. return ( isset($tiiuser->turnitin_utp) AND $tiiuser->turnitin_utp == 2 ) ? true : false;
  6411. }
  6412. /**
  6413. * Get the latest version info from the XML file https://www.turnitin.com/static/resources/files/moodledirect_latest.xml
  6414. *
  6415. * @return string url of latest if this version is not the latest null if update is not available
  6416. */
  6417. function turnitintool_updateavailable( $module ) {
  6418. $basedir = "https://www.turnitin.com/static/resources/files/";
  6419. $loaderbar = null;
  6420. // Use the comms class so we can make sure the call is using any proxy in place
  6421. $tii = new turnitintool_commclass('','','','','',$loaderbar);
  6422. $result = $tii->doRequest("GET", $basedir . "moodledirect_latest.xml", "");
  6423. $tii->xmlToSimple( $result, false );
  6424. $moduleversion = ( isset( $module->version ) ) ? $module->version : $module->versiondb;
  6425. if ( strlen( $result ) > 0 AND isset( $tii->simplexml->version ) ) {
  6426. $version = $tii->simplexml->version;
  6427. if ( $version <= $moduleversion ) {
  6428. // No update available
  6429. return null;
  6430. } else {
  6431. // Update available return URL
  6432. return $tii->simplexml->filename;
  6433. }
  6434. }
  6435. // Could not find the xml file can't return URL so return null
  6436. return null;
  6437. }
  6438. /**
  6439. * Build a datatables localization array
  6440. *
  6441. * @return array Array of translatable Datatable strings
  6442. */
  6443. function turnitintool_datatables_strings() {
  6444. $return = array();
  6445. $return["oPaginate"]["sPrevious"] = get_string( 'sprevious', 'turnitintool' );
  6446. $return["oPaginate"]["sNext"] = get_string( 'snext', 'turnitintool' );
  6447. $return["sEmptyTable"] = get_string( 'semptytable', 'turnitintool' );
  6448. $a = '<select>
  6449. <option value="10">10</option>
  6450. <option value="20">20</option>
  6451. <option value="30">30</option>
  6452. <option value="40">40</option>
  6453. <option value="50">50</option>
  6454. <option value="-1">All</option>
  6455. </select>';
  6456. $return["sLengthMenu"] = get_string( 'slengthmenu', 'turnitintool', $a );
  6457. $return["sSearch"] = get_string( 'ssearch', 'turnitintool' );
  6458. $return["sProcessing"] = get_string( 'sprocessing', 'turnitintool' );
  6459. $return["sZeroRecords"] = get_string( 'szerorecords', 'turnitintool' );
  6460. $a = new stdClass();
  6461. $a->start = '_START_';
  6462. $a->end = '_END_';
  6463. $a->total = '_TOTAL_';
  6464. $return["sInfo"] = get_string( 'sinfo', 'turnitintool', $a );
  6465. return json_encode($return);
  6466. }
  6467. /**
  6468. * Moodle participation hook method for views
  6469. *
  6470. * @return array Array of available log labels
  6471. */
  6472. function turnitintool_get_view_actions() {
  6473. return array('view');
  6474. }
  6475. /**
  6476. * Moodle participation hook method for views
  6477. *
  6478. * @return array Array of available log labels
  6479. */
  6480. function turnitintool_get_post_actions() {
  6481. return array('submit');
  6482. }
  6483. /* ?> */