diff --git a/mod/scorm/report/interactions/classes/privacy/provider.php b/mod/scorm/report/interactions/classes/privacy/provider.php new file mode 100644 index 00000000000..06c10dbb0cb --- /dev/null +++ b/mod/scorm/report/interactions/classes/privacy/provider.php @@ -0,0 +1,110 @@ +. + +/** + * Privacy Subsystem implementation for scormreport_interactions. + * + * @package scormreport_interactions + * @copyright 2018 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace scormreport_interactions\privacy; + +defined('MOODLE_INTERNAL') || die(); + +use \core_privacy\local\metadata\collection; +use \core_privacy\local\request\transform; +use \core_privacy\local\request\writer; + +/** + * Privacy Subsystem for scormreport_interactions. + * + * @copyright 2018 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class provider implements + \core_privacy\local\metadata\provider, + \core_privacy\local\request\user_preference_provider { + + /** + * Returns meta data about this system. + * + * @param collection $collection The initialised item collection to add items to. + * @return collection A listing of user data stored through this system. + */ + public static function get_metadata(collection $collection) : collection { + // User preferences shared between different scorm reports. + $collection->add_user_preference('scorm_report_pagesize', 'privacy:metadata:preference:scorm_report_pagesize'); + + // User preferences specific for this scorm report. + $collection->add_user_preference( + 'scorm_report_interactions_qtext', + 'privacy:metadata:preference:scorm_report_interactions_qtext' + ); + $collection->add_user_preference( + 'scorm_report_interactions_resp', + 'privacy:metadata:preference:scorm_report_interactions_resp' + ); + $collection->add_user_preference( + 'scorm_report_interactions_right', + 'privacy:metadata:preference:scorm_report_interactions_right' + ); + $collection->add_user_preference( + 'scorm_report_interactions_result', + 'privacy:metadata:preference:scorm_report_interactions_result' + ); + + return $collection; + } + + /** + * Store all user preferences for the plugin. + * + * @param int $userid The userid of the user whose data is to be exported. + */ + public static function export_user_preferences(int $userid) { + static::get_and_export_user_preference($userid, 'scorm_report_pagesize'); + static::get_and_export_user_preference($userid, 'scorm_report_interactions_qtext', true); + static::get_and_export_user_preference($userid, 'scorm_report_interactions_resp', true); + static::get_and_export_user_preference($userid, 'scorm_report_interactions_right', true); + static::get_and_export_user_preference($userid, 'scorm_report_interactions_result', true); + } + + /** + * Get and export a user preference. + * + * @param int $userid The userid of the user whose data is to be exported. + * @param string $userpreference The user preference to export. + * @param boolean $transform If true, transform value to yesno. + */ + protected static function get_and_export_user_preference(int $userid, string $userpreference, $transform = false) { + $prefvalue = get_user_preferences($userpreference, null, $userid); + if ($prefvalue !== null) { + if ($transform) { + $transformedvalue = transform::yesno($prefvalue); + } else { + $transformedvalue = $prefvalue; + } + writer::export_user_preference( + 'scormreport_interactions', + $userpreference, + $transformedvalue, + get_string('privacy:metadata:preference:'.$userpreference, 'scormreport_interactions') + ); + } + } +} diff --git a/mod/scorm/report/interactions/lang/en/scormreport_interactions.php b/mod/scorm/report/interactions/lang/en/scormreport_interactions.php index ed66f59fa65..5cd1450a291 100644 --- a/mod/scorm/report/interactions/lang/en/scormreport_interactions.php +++ b/mod/scorm/report/interactions/lang/en/scormreport_interactions.php @@ -26,6 +26,11 @@ defined('MOODLE_INTERNAL') || die(); $string['pluginname'] = 'Interactions report'; +$string['privacy:metadata:preference:scorm_report_interactions_qtext'] = 'Whether to display the summary of questions in the SCORM interactions report'; +$string['privacy:metadata:preference:scorm_report_interactions_resp'] = 'Whether to display the summary of responses in the SCORM interactions report'; +$string['privacy:metadata:preference:scorm_report_interactions_result'] = 'Whether to display the summary of results in the SCORM interactions report'; +$string['privacy:metadata:preference:scorm_report_interactions_right'] = 'Whether to display the summary of right anwers in the SCORM interactions report'; +$string['privacy:metadata:preference:scorm_report_pagesize'] = 'Number of users to display in the SCORM reports'; $string['questionx'] = 'Question {$a}'; $string['responsex'] = 'Response {$a}'; $string['rightanswerx'] = 'Right answer {$a}'; diff --git a/mod/scorm/report/interactions/tests/privacy_test.php b/mod/scorm/report/interactions/tests/privacy_test.php new file mode 100644 index 00000000000..80c63d2ce46 --- /dev/null +++ b/mod/scorm/report/interactions/tests/privacy_test.php @@ -0,0 +1,89 @@ +. + +/** + * Unit tests for the scormreport_interactions implementation of the privacy API. + * + * @package scormreport_interactions + * @category test + * @copyright 2018 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +use core_privacy\local\request\writer; +use scormreport_interactions\privacy\provider; + +/** + * Unit tests for the scormreport_interactions implementation of the privacy API. + * + * @copyright 2018 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class scormreport_interactions_privacy_testcase extends \core_privacy\tests\provider_testcase { + + /** + * Basic setup for these tests. + */ + public function setUp() { + $this->resetAfterTest(true); + } + + /** + * Ensure that export_user_preferences returns no data if the user has no data. + */ + public function test_export_user_preferences_not_defined() { + $user = \core_user::get_user_by_username('admin'); + provider::export_user_preferences($user->id); + + $writer = writer::with_context(\context_system::instance()); + $this->assertFalse($writer->has_any_data()); + } + + /** + * Ensure that export_user_preferences returns single preferences. + */ + public function test_export_user_preferences_single() { + // Define a user preference. + $user = $this->getDataGenerator()->create_user(); + $this->setUser($user); + set_user_preference('scorm_report_pagesize', 50); + set_user_preference('scorm_report_interactions_qtext', 1); + set_user_preference('scorm_report_interactions_resp', 0); + set_user_preference('scorm_report_interactions_right', 1); + set_user_preference('scorm_report_interactions_result', 1); + + // Validate exported data. + provider::export_user_preferences($user->id); + $context = \context_user::instance($user->id); + $writer = writer::with_context($context); + $this->assertTrue($writer->has_any_data()); + $prefs = $writer->get_user_preferences('scormreport_interactions'); + $this->assertCount(5, (array) $prefs); + $this->assertEquals( + get_string('privacy:metadata:preference:scorm_report_pagesize', 'scormreport_interactions'), + $prefs->scorm_report_pagesize->description + ); + $this->assertEquals(50, $prefs->scorm_report_pagesize->value); + $this->assertEquals( + get_string('privacy:metadata:preference:scorm_report_interactions_qtext', 'scormreport_interactions'), + $prefs->scorm_report_interactions_qtext->description + ); + $this->assertEquals(get_string('yes'), $prefs->scorm_report_interactions_qtext->value); + $this->assertEquals(get_string('no'), $prefs->scorm_report_interactions_resp->value); + } +}