diff --git a/mod/scorm/report/basic/classes/privacy/provider.php b/mod/scorm/report/basic/classes/privacy/provider.php new file mode 100644 index 00000000000..1f0c72c6c0a --- /dev/null +++ b/mod/scorm/report/basic/classes/privacy/provider.php @@ -0,0 +1,92 @@ +. + +/** + * Privacy Subsystem implementation for scormreport_basic. + * + * @package scormreport_basic + * @copyright 2018 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace scormreport_basic\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_basic. + * + * @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_detailed', 'privacy:metadata:preference:scorm_report_detailed'); + + 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_detailed', 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_basic', + $userpreference, + $transformedvalue, + get_string('privacy:metadata:preference:'.$userpreference, 'scormreport_basic') + ); + } + } +} diff --git a/mod/scorm/report/basic/lang/en/scormreport_basic.php b/mod/scorm/report/basic/lang/en/scormreport_basic.php index 7a031521aba..55171eb9778 100644 --- a/mod/scorm/report/basic/lang/en/scormreport_basic.php +++ b/mod/scorm/report/basic/lang/en/scormreport_basic.php @@ -24,3 +24,5 @@ */ $string['pluginname'] = 'Basic report'; +$string['privacy:metadata:preference:scorm_report_detailed'] = 'Whether to track details in the SCORM basic report'; +$string['privacy:metadata:preference:scorm_report_pagesize'] = 'Number of users to display in the SCORM reports'; diff --git a/mod/scorm/report/basic/tests/privacy_test.php b/mod/scorm/report/basic/tests/privacy_test.php new file mode 100644 index 00000000000..ff06ce57658 --- /dev/null +++ b/mod/scorm/report/basic/tests/privacy_test.php @@ -0,0 +1,85 @@ +. + +/** + * Unit tests for the scormreport_basic implementation of the privacy API. + * + * @package scormreport_basic + * @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_basic\privacy\provider; + +/** + * Unit tests for the scormreport_basic implementation of the privacy API. + * + * @copyright 2018 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class scormreport_basic_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_detailed', 1); + set_user_preference('scorm_report_pagesize', 50); + + // 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_basic'); + $this->assertCount(2, (array) $prefs); + $this->assertEquals( + get_string('privacy:metadata:preference:scorm_report_detailed', 'scormreport_basic'), + $prefs->scorm_report_detailed->description + ); + $this->assertEquals(get_string('yes'), $prefs->scorm_report_detailed->value); + $this->assertEquals( + get_string('privacy:metadata:preference:scorm_report_pagesize', 'scormreport_basic'), + $prefs->scorm_report_pagesize->description + ); + $this->assertEquals(50, $prefs->scorm_report_pagesize->value); + } +}