From 8091629306d650ac3906cdc0c48b565e374aec91 Mon Sep 17 00:00:00 2001 From: Shamim Rezaie Date: Fri, 5 Oct 2018 03:09:08 +1000 Subject: [PATCH] MDL-63500 enrol_meta: Support for removal of multiple context users This issue is part of the MDL-62560 Epic. --- enrol/meta/classes/privacy/provider.php | 53 +++++++++-- enrol/meta/tests/privacy_test.php | 112 +++++++++++++++++++++++- 2 files changed, 155 insertions(+), 10 deletions(-) diff --git a/enrol/meta/classes/privacy/provider.php b/enrol/meta/classes/privacy/provider.php index 31fd319a4ca..b31c6af0694 100644 --- a/enrol/meta/classes/privacy/provider.php +++ b/enrol/meta/classes/privacy/provider.php @@ -13,18 +13,25 @@ // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . + /** * Privacy Subsystem implementation for enrol_meta. * * @package enrol_meta + * @category privacy * @copyright 2018 Carlos Escobedo * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ + namespace enrol_meta\privacy; + defined('MOODLE_INTERNAL') || die(); -use \core_privacy\local\metadata\collection; -use \core_privacy\local\request\contextlist; -use \core_privacy\local\request\approved_contextlist; + +use core_privacy\local\metadata\collection; +use core_privacy\local\request\approved_userlist; +use core_privacy\local\request\contextlist; +use core_privacy\local\request\approved_contextlist; +use core_privacy\local\request\userlist; /** * Privacy provider for enrol_meta. @@ -33,8 +40,15 @@ use \core_privacy\local\request\approved_contextlist; * @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\plugin\provider { + // This plugin stores user data. + \core_privacy\local\metadata\provider, + + // This plugin contains user's enrolments. + \core_privacy\local\request\plugin\provider, + + // This plugin is capable of determining which users have data within it. + \core_privacy\local\request\core_userlist_provider { + /** * Returns meta data about this system. * @@ -46,6 +60,7 @@ class provider implements $collection->add_subsystem_link('core_group', [], 'privacy:metadata:core_group'); return $collection; } + /** * Get the list of contexts that contain user information for the specified user. * @@ -71,6 +86,22 @@ class provider implements return $contextlist; } + + /** + * Get the list of users who have data within a context. + * + * @param userlist $userlist The userlist containing the list of users who have data in this context/plugin combination. + */ + public static function get_users_in_context(userlist $userlist) { + $context = $userlist->get_context(); + + if (!$context instanceof \context_course) { + return; + } + + \core_group\privacy\provider::get_group_members_in_context($userlist, 'enrol_meta'); + } + /** * Export all user data for the specified user, in the specified contexts. * @@ -105,6 +136,7 @@ class provider implements \core_group\privacy\provider::delete_groups_for_all_users($context, 'enrol_meta'); } } + /** * Delete all user data for the specified user, in the specified contexts. * @@ -116,4 +148,13 @@ class provider implements } \core_group\privacy\provider::delete_groups_for_user($contextlist, 'enrol_meta'); } -} \ No newline at end of file + + /** + * Delete multiple users within a single context. + * + * @param approved_userlist $userlist The approved context and user information to delete information for. + */ + public static function delete_data_for_users(approved_userlist $userlist) { + \core_group\privacy\provider::delete_groups_for_users($userlist, 'enrol_meta'); + } +} diff --git a/enrol/meta/tests/privacy_test.php b/enrol/meta/tests/privacy_test.php index 4e1966df5f4..d9951b2b483 100644 --- a/enrol/meta/tests/privacy_test.php +++ b/enrol/meta/tests/privacy_test.php @@ -13,6 +13,7 @@ // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . + /** * Base class for unit tests for enrol_meta. * @@ -21,10 +22,13 @@ * @copyright 2018 Carlos Escobedo * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ + defined('MOODLE_INTERNAL') || die(); -use \core_privacy\local\request\writer; -use \core_privacy\local\request\approved_contextlist; -use \enrol_meta\privacy\provider; + +use core_privacy\local\request\writer; +use core_privacy\local\request\approved_contextlist; +use enrol_meta\privacy\provider; + /** * Unit tests for the enrol_meta implementation of the privacy API. * @@ -32,6 +36,7 @@ use \enrol_meta\privacy\provider; * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class enrol_meta_privacy_testcase extends \core_privacy\tests\provider_testcase { + /** * Enable enrol_meta plugin. */ @@ -41,6 +46,7 @@ class enrol_meta_privacy_testcase extends \core_privacy\tests\provider_testcase $enabled = array_keys($enabled); set_config('enrol_plugins_enabled', implode(',', $enabled)); } + /** * Test getting the context for the user ID related to this plugin. */ @@ -111,6 +117,7 @@ class enrol_meta_privacy_testcase extends \core_privacy\tests\provider_testcase } } } + /** * Test for provider::delete_data_for_all_users_in_context(). */ @@ -150,6 +157,7 @@ class enrol_meta_privacy_testcase extends \core_privacy\tests\provider_testcase WHERE g.courseid = ?", [$course1->id]) ); } + /** * Test for provider::delete_data_for_user(). */ @@ -195,4 +203,100 @@ class enrol_meta_privacy_testcase extends \core_privacy\tests\provider_testcase WHERE g.courseid = ?", [$course1->id]) ); } -} \ No newline at end of file + + /** + * Test for provider::delete_data_for_users(). + */ + public function test_delete_data_for_users() { + global $DB; + + $this->resetAfterTest(); + + $metaplugin = enrol_get_plugin('meta'); + + $user1 = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $user3 = $this->getDataGenerator()->create_user(); + + $course1 = $this->getDataGenerator()->create_course(); + $course2 = $this->getDataGenerator()->create_course(); + + $group1 = $this->getDataGenerator()->create_group(array('courseid' => $course1->id)); + + $this->enable_plugin(); + $metaplugin->add_instance($course1, array('customint1' => $course2->id, 'customint2' => $group1->id)); + + $this->getDataGenerator()->enrol_user($user1->id, $course2->id, 'student'); + $this->getDataGenerator()->enrol_user($user2->id, $course2->id, 'student'); + $this->getDataGenerator()->enrol_user($user3->id, $course2->id, 'student'); + + $this->assertEquals( + 3, + $DB->count_records_sql("SELECT COUNT(gm.id) + FROM {groups_members} gm + JOIN {groups} g ON gm.groupid = g.id + WHERE g.courseid = ?", [$course1->id]) + ); + + $coursecontext1 = context_course::instance($course1->id); + + $approveduserlist = new \core_privacy\local\request\approved_userlist($coursecontext1, 'enrol_meta', + [$user1->id, $user2->id]); + provider::delete_data_for_users($approveduserlist); + + // Check we have 1 user in groups because we have deleted user1 and user2. + $this->assertEquals( + 1, + $DB->count_records_sql("SELECT COUNT(gm.id) + FROM {groups_members} gm + JOIN {groups} g ON gm.groupid = g.id + WHERE g.courseid = ?", [$course1->id]) + ); + } + + /** + * Test for provider::get_users_in_context(). + */ + public function test_get_users_in_context() { + global $DB; + + $this->resetAfterTest(); + + $metaplugin = enrol_get_plugin('meta'); + + $course1 = $this->getDataGenerator()->create_course(); + $course2 = $this->getDataGenerator()->create_course(); + + $user1 = $this->getDataGenerator()->create_user(); + $user2 = $this->getDataGenerator()->create_user(); + $user3 = $this->getDataGenerator()->create_user(); + + $group1 = $this->getDataGenerator()->create_group(array('courseid' => $course1->id)); + + $this->enable_plugin(); + $metaplugin->add_instance($course1, array('customint1' => $course2->id, 'customint2' => $group1->id)); + + $this->getDataGenerator()->enrol_user($user1->id, $course2->id, 'student'); + $this->getDataGenerator()->enrol_user($user2->id, $course2->id, 'student'); + + // Check if user1 is enrolled into course1 in group 1. + $this->assertTrue(groups_is_member($group1->id, $user1->id)); + $this->assertTrue($DB->record_exists('groups_members', + array( + 'groupid' => $group1->id, + 'userid' => $user1->id, + 'component' => 'enrol_meta' + ) + )); + + $context = \context_course::instance($course1->id); + + $userlist = new \core_privacy\local\request\userlist($context, 'enrol_meta'); + \enrol_meta\privacy\provider::get_users_in_context($userlist); + + $this->assertEquals( + [$user1->id, $user2->id], + $userlist->get_userids(), + '', 0.0, 10, true); + } +}