Skip to content

Commit 2b043bc

Browse files
authored
Merge pull request #185 from turnitin/develop
Release 25th November
2 parents 3ccbc32 + c5b0edc commit 2b043bc

19 files changed

+194
-87
lines changed

CHANGELOG.md

+17
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,20 @@
1+
### Date: 2024-November-25
2+
### Release: v2024112501
3+
4+
#### Fixed a bug with Anonymous Marking
5+
6+
Previously, if a student submitted with anonymous marking enabled for the assignment, their email would sometimes be visible when viewing the online similarity report. This has now been fixed.
7+
8+
#### Streamlined Eula Workflow
9+
10+
In line with our other plagiarism plugin we have removed the Eula decline button, simplifying the Eula acceptance workflow.
11+
12+
#### Added Userlist Provider for Privacy Compliance
13+
14+
Previously we were missing a userlist provider for this plugin. We have now added this.
15+
16+
---
17+
118
### Date: 2023-June-29
219
### Release: v2023062901
320
(Moodle Integration Only graphic)

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Useful Links
1919

2020
Installation
2121
-
22-
Before installing this plugin firstly make sure you are logged in as an Administrator and that you are using Moodle 3.5 or higher.
22+
Before installing this plugin firstly make sure you are logged in as an Administrator and that you are using Moodle 4.1 or higher.
2323

2424
To install, all you need to do is copy all the files into the plagiarism/turnitinsim directory on your Moodle installation. You should then go to `"Site Administration" > "Notifications"` and follow the on screen instructions.
2525

amd/build/eula_response.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

amd/build/eula_response.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

amd/src/eula_response.js

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ define(['jquery', 'core/str'], function($, str) {
3232
$(document).ready(function() {
3333
if ($("#turnitinsim_eulacontainer").length) {
3434
$('input[name=submitbutton]').prop('disabled', 'disabled');
35+
$('.editsubmissionform').hide();
36+
$('.mform').hide();
3537
}
3638
});
3739

@@ -50,6 +52,8 @@ define(['jquery', 'core/str'], function($, str) {
5052

5153
str.get_string('submissiondisplaystatus:queued', 'plagiarism_turnitinsim').done(function(text) {
5254
$('.tii_status_text').html(text);
55+
$('.editsubmissionform').show();
56+
$('.mform').show();
5357
});
5458
});
5559
}

backup/moodle2/backup_plagiarism_turnitinsim_plugin.class.php

+12-5
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class backup_plagiarism_turnitinsim_plugin extends backup_plagiarism_plugin {
3838
* @throws base_element_struct_exception
3939
*/
4040
protected function define_module_plugin_structure() {
41+
global $DB;
42+
4143
$plugin = $this->get_plugin_element();
4244

4345
$pluginelement = new backup_nested_element($this->get_recommended_name());
@@ -71,18 +73,23 @@ protected function define_module_plugin_structure() {
7173
$pluginelement->add_child($submissions);
7274
$submissions->add_child($submission);
7375

74-
// Get submission details along with contenthash from files table.
75-
$submission->set_source_sql(
76+
// Get submission details
77+
$submissiondetails = $DB->get_records_sql(
7678
'SELECT PTS.userid, PTS.turnitinid, PTS.status, PTS.identifier, PTS.itemid, PTS.type,
7779
PTS.submittedtime, PTS.togenerate, PTS.generationtime, PTS.overallscore, PTS.requestedtime,
78-
PTS.errormessage, F.contenthash
80+
PTS.errormessage
7981
FROM {plagiarism_turnitinsim_sub} PTS
80-
LEFT JOIN {files} F
81-
ON PTS.identifier = F.pathnamehash
8282
WHERE PTS.cm = ? ',
8383
array(backup::VAR_PARENTID)
8484
);
8585

86+
// Use file API to get content hash
87+
$fs = get_file_storage();
88+
$file = $fs->get_file_by_hash($submissiondetails->identifier);
89+
$submissiondetails['contenthash'] = $file->contenthash;
90+
91+
$submission->set_source_array($submissiondetails);
92+
8693
// Backup users who have submitted to this module.
8794
$users = new backup_nested_element('turnitinsim_usrs');
8895
$user = new backup_nested_element(

classes/defaults_form.class.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function definition () {
4343
$mform =& $this->_form;
4444

4545
$plugin = new plagiarism_plugin_turnitinsim();
46-
$plugin->get_form_elements_module($mform, context_system::instance());
46+
$plugin->add_elements_to_settings_form($mform, context_system::instance());
4747

4848
$this->add_action_buttons(true);
4949
}

classes/privacy/provider.php

+70
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@
2828
defined('MOODLE_INTERNAL') || die();
2929

3030
use core_privacy\local\metadata\collection;
31+
use core_privacy\local\request\approved_userlist;
3132
use core_privacy\local\request\contextlist;
3233
use core_privacy\local\request\helper;
34+
use core_privacy\local\request\userlist;
3335
use core_privacy\local\request\writer;
3436

3537
/**
@@ -38,6 +40,7 @@
3840
class provider implements
3941
// This plugin does store personal user data.
4042
\core_privacy\local\metadata\provider,
43+
\core_privacy\local\request\core_userlist_provider,
4144
\core_plagiarism\privacy\plagiarism_provider {
4245

4346
// This trait must be included to provide the relevant polyfill for the metadata provider.
@@ -204,4 +207,71 @@ public static function _delete_plagiarism_for_user($userid, \context $context) {
204207
$DB->delete_records('plagiarism_turnitinsim_sub', ['userid' => $userid]);
205208
$DB->delete_records('plagiarism_turnitinsim_users', ['userid' => $userid]);
206209
}
210+
211+
/**
212+
* Get a list of users who have data within a context.
213+
*
214+
* @param userlist $userlist The userlist containing the list of users who have data in this context/plugin combination.
215+
*/
216+
public static function get_users_in_context(userlist $userlist) {
217+
$context = $userlist->get_context();
218+
219+
if ($context->contextlevel != CONTEXT_MODULE) {
220+
return;
221+
}
222+
223+
$sql = "SELECT pts.userid
224+
FROM {plagiarism_turnitinsim_sub} pts
225+
JOIN {course_modules} c
226+
ON pts.cm = c.id
227+
JOIN {modules} m
228+
ON m.id = c.module AND m.name = :modname
229+
WHERE c.id = :cmid";
230+
231+
$params = [
232+
'modname' => 'plagiarism_turnitinsim',
233+
'cmid' => $context->instanceid
234+
];
235+
236+
$userlist->add_from_sql('userid', $sql, $params);
237+
}
238+
239+
/**
240+
* Delete data for multiple users within a single context.
241+
*
242+
* @param approved_userlist $userlist The approved context and user information to delete information for.
243+
*/
244+
public static function delete_data_for_users(approved_userlist $userlist) {
245+
global $DB;
246+
247+
$context = $userlist->get_context();
248+
249+
if ($context->contextlevel != CONTEXT_MODULE) {
250+
return;
251+
}
252+
253+
$userids = $userlist->get_userids();
254+
255+
list($insql, $inparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED);
256+
257+
$sql1 = "SELECT pts.id
258+
FROM {plagiarism_turnitinsim_sub} pts
259+
JOIN {course_modules} c
260+
ON pts.cm = c.id
261+
JOIN {modules} m
262+
ON m.id = c.module AND m.name = :modname
263+
WHERE pts.userid $insql
264+
AND c.id = :cmid";
265+
266+
$params = [
267+
'modname' => 'plagiarism_turnitinsim',
268+
'cmid' => $context->instanceid
269+
];
270+
271+
$params = array_merge($params, $inparams);
272+
273+
$attempt = $DB->get_fieldset_sql($sql1, $params);
274+
275+
$DB->delete_records_list('plagiarism_turnitinsim_sub', 'id', array_values($attempt));
276+
}
207277
}

classes/quiz.class.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public function get_onlinetext($itemid) {
5757
public function get_itemid($params) {
5858
global $DB;
5959

60-
$item = $DB->get_record_sql('SELECT DISTINCT(q.id) FROM {question_attempt_steps} s
60+
$item = $DB->get_record_sql('SELECT DISTINCT(q.uniqueid) FROM {question_attempt_steps} s
6161
RIGHT JOIN {question_attempts} a
6262
ON s.questionattemptid = a.id
6363
RIGHT JOIN {quiz_attempts} q
@@ -69,7 +69,7 @@ public function get_itemid($params) {
6969
array($params->moduleid, $params->userid, $params->onlinetext, 'finished')
7070
);
7171

72-
return ($item) ? $item->id : 0;
72+
return ($item) ? $item->uniqueid : 0;
7373
}
7474

7575
/**

classes/submission.class.php

+15-16
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ class plagiarism_turnitinsim_submission {
140140
*/
141141
public $tsrequest;
142142

143+
/**
144+
* @var object The plugin object.
145+
*/
146+
public $plugin;
147+
143148
/**
144149
* plagiarism_turnitinsim_submission constructor.
145150
*
@@ -152,7 +157,7 @@ public function __construct(plagiarism_turnitinsim_request $tsrequest = null, $i
152157

153158
$this->setid($id);
154159
$this->tsrequest = ($tsrequest) ? $tsrequest : new plagiarism_turnitinsim_request();
155-
$this->plagiarism_plugin_turnitinsim = new plagiarism_plugin_turnitinsim();
160+
$this->plugin = new plagiarism_plugin_turnitinsim();
156161

157162
if (!empty($id)) {
158163
$submission = $DB->get_record('plagiarism_turnitinsim_sub', array('id' => $id));
@@ -209,7 +214,7 @@ public function calculate_generation_time($generated = false) {
209214
return;
210215
}
211216

212-
$plagiarismsettings = $this->plagiarism_plugin_turnitinsim->get_settings($cm->id);
217+
$plagiarismsettings = $this->plugin->get_settings($cm->id);
213218

214219
// Create module object.
215220
$moduleclass = 'plagiarism_turnitinsim_'.$cm->modname;
@@ -290,7 +295,7 @@ public function build_user_array_entry($user) {
290295

291296
$userdata = array('id' => $tsuser->get_turnitinid());
292297

293-
if (!get_config('plagiarism_turnitinsim', 'turnitinhideidentity')) {
298+
if (!$this->is_submission_anonymous()) {
294299
$userdata["family_name"] = $user->lastname;
295300
$userdata["given_name"] = $user->firstname;
296301
$userdata["email"] = $user->email;
@@ -737,8 +742,7 @@ public function send_digital_receipts($filename) {
737742
*/
738743
public function request_turnitin_report_generation($regenerateonduedate = false) {
739744
// Get module settings.
740-
$plugin = new plagiarism_plugin_turnitinsim();
741-
$modulesettings = $plugin->get_settings($this->getcm());
745+
$modulesettings = $this->plugin->get_settings($this->getcm());
742746
$cm = get_coursemodule_from_id('', $this->getcm());
743747

744748
// Create module helper object.
@@ -967,7 +971,7 @@ public function create_report_viewer_permissions() {
967971
return array(
968972
'may_view_submission_full_source' => (!empty($turnitinviewerviewfullsource)) ? true : false,
969973
'may_view_match_submission_info' => (!empty($turnitinviewermatchsubinfo)) &&
970-
!$this->is_submission_anonymous() ? true : false,
974+
!$this->is_submission_anonymous(),
971975
'may_view_save_viewer_changes' => (!empty($turnitinviewersavechanges)) ? true : false
972976
);
973977
}
@@ -1060,18 +1064,13 @@ public function is_submission_anonymous() {
10601064
$cm = get_coursemodule_from_id('', $this->getcm());
10611065
$moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance));
10621066

1063-
$blindmarkingon = !empty($moduledata->blindmarking);
1064-
$identitiesrevealed = !empty($moduledata->revealidentities);
1065-
1066-
// Return true if hide identities is on, otherwise go by module blind marking settings.
1067+
// Check if Hide Student's Identity is set at the plugin settings level, otherwise go by module blind marking settings.
10671068
$turnitinhideidentity = get_config('plagiarism_turnitinsim', 'turnitinhideidentity');
1068-
if ($turnitinhideidentity) {
1069-
$anon = true;
1070-
} else {
1071-
$anon = $blindmarkingon && !$identitiesrevealed;
1072-
}
10731069

1074-
return $anon;
1070+
// Check if blind marking is on and revealidentities is not set yet.
1071+
$blindon = (!empty($moduledata->blindmarking) && empty($moduledata->revealidentities));
1072+
1073+
return $blindon || $turnitinhideidentity;
10751074
}
10761075

10771076
/**

0 commit comments

Comments
 (0)