From 54d35aec033c6c8859b825bcc35f44568f20bb92 Mon Sep 17 00:00:00 2001 From: Sara Arjona Date: Thu, 12 Apr 2018 10:38:01 +0200 Subject: [PATCH] MDL-61957 gradereport_user: Implement privacy API --- .../report/user/classes/privacy/provider.php | 76 +++++++++++++++++ .../report/user/lang/en/gradereport_user.php | 1 + grade/report/user/tests/privacy_test.php | 81 +++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 grade/report/user/classes/privacy/provider.php create mode 100644 grade/report/user/tests/privacy_test.php diff --git a/grade/report/user/classes/privacy/provider.php b/grade/report/user/classes/privacy/provider.php new file mode 100644 index 0000000000000..d569dc6c2ac79 --- /dev/null +++ b/grade/report/user/classes/privacy/provider.php @@ -0,0 +1,76 @@ +. + +/** + * Privacy Subsystem implementation for gradereport_user. + * + * @package gradereport_user + * @copyright 2018 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace gradereport_user\privacy; + +defined('MOODLE_INTERNAL') || die(); + +use \core_privacy\local\metadata\collection; +use \core_privacy\local\request\transform; +use \core_privacy\local\request\writer; + +require_once $CFG->libdir.'/grade/constants.php'; + + +/** + * Privacy Subsystem for gradereport_user implementing null_provider. + * + * @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 $itemcollection 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 $items) : collection { + // User preferences (shared between different courses). + $items->add_user_preference('gradereport_user_view_user', 'privacy:metadata:preference:gradereport_user_view_user'); + + return $items; + } + + /** + * 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) { + $prefvalue = get_user_preferences('gradereport_user_view_user', null, $userid); + if ($prefvalue !== null) { + $transformedvalue = transform::yesno($prefvalue); + writer::export_user_preference( + 'gradereport_user', + 'gradereport_user_view_user', + $transformedvalue, + get_string('privacy:metadata:preference:gradereport_user_view_user', 'gradereport_user') + ); + } + } +} diff --git a/grade/report/user/lang/en/gradereport_user.php b/grade/report/user/lang/en/gradereport_user.php index 953b1e7969ca2..e30cbdef5fffb 100644 --- a/grade/report/user/lang/en/gradereport_user.php +++ b/grade/report/user/lang/en/gradereport_user.php @@ -27,5 +27,6 @@ $string['user:view'] = 'View your own grade report'; $string['myself'] = 'Myself'; $string['otheruser'] = 'User'; +$string['privacy:metadata:preference:gradereport_user_view_user'] = 'Whether to view report as current user or another user in the gradebook reports'; $string['tablesummary'] = 'The table is arranged as a list of graded items including categories of graded items. When items are in a category they will be indicated as such.'; $string['viewas'] = 'View report as'; diff --git a/grade/report/user/tests/privacy_test.php b/grade/report/user/tests/privacy_test.php new file mode 100644 index 0000000000000..b44f8bff3784c --- /dev/null +++ b/grade/report/user/tests/privacy_test.php @@ -0,0 +1,81 @@ +. + +/** + * Unit tests for the gradereport_user implementation of the privacy API. + * + * @package gradereport_user + * @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\metadata\collection; +use \core_privacy\local\request\writer; +use \gradereport_user\privacy\provider; + +/** + * Unit tests for the gradereport_user implementation of the privacy API. + * + * @copyright 2018 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class gradereport_user_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. + * These preferences can be set on each course, but the value is shared in the whole site. + */ + public function test_export_user_preferences_single() { + // Define a user preference. + $user = $this->getDataGenerator()->create_user(); + $this->setUser($user); + set_user_preference('gradereport_user_view_user', 1, $user); + + // 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('gradereport_user'); + $this->assertCount(1, (array) $prefs); + $this->assertEquals( + get_string('privacy:metadata:preference:gradereport_user_view_user', 'gradereport_user'), + $prefs->gradereport_user_view_user->description + ); + $this->assertEquals(get_string('yes'), $prefs->gradereport_user_view_user->value); + } +}