From e4290b49453b79eea97c7db7d352603aa0e2fd44 Mon Sep 17 00:00:00 2001 From: Shamim Rezaie Date: Sun, 14 Oct 2018 01:39:58 +1100 Subject: [PATCH] MDL-63647 enrol_flatfile: support removal of multiple users in context This issue is a part of the MDL-62560 Epic. --- enrol/flatfile/classes/privacy/provider.php | 51 ++++++++++++++++++- .../flatfile/tests/privacy_provider_test.php | 51 +++++++++++++++++++ 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/enrol/flatfile/classes/privacy/provider.php b/enrol/flatfile/classes/privacy/provider.php index 93e5d831791..f83f5678c20 100644 --- a/enrol/flatfile/classes/privacy/provider.php +++ b/enrol/flatfile/classes/privacy/provider.php @@ -13,22 +13,29 @@ // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . + /** * Privacy Subsystem implementation for enrol_flatfile. * * @package enrol_flatfile + * @category privacy * @copyright 2018 Carlos Escobedo * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ + namespace enrol_flatfile\privacy; + use core_privacy\local\metadata\collection; use core_privacy\local\request\approved_contextlist; +use core_privacy\local\request\approved_userlist; use core_privacy\local\request\context; use core_privacy\local\request\contextlist; +use core_privacy\local\request\userlist; use core_privacy\local\request\writer; use core_privacy\local\request\transform; defined('MOODLE_INTERNAL') || die(); + /** * Privacy Subsystem for enrol_flatfile implementing null_provider. * @@ -37,7 +44,8 @@ defined('MOODLE_INTERNAL') || die(); */ class provider implements \core_privacy\local\metadata\provider, - \core_privacy\local\request\plugin\provider { + \core_privacy\local\request\plugin\provider, + \core_privacy\local\request\core_userlist_provider { /** * Returns meta data about this system. @@ -75,6 +83,23 @@ class provider implements return $contextlist->add_from_sql($sql, $params); } + /** + * 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->contextlevel != CONTEXT_COURSE) { + return; + } + + $sql = "SELECT userid FROM {enrol_flatfile} WHERE courseid = ?"; + $params = [$context->instanceid]; + $userlist->add_from_sql('userid', $sql, $params); + } + /** * Export all user data for the specified user, in the specified contexts. * @@ -146,7 +171,7 @@ class provider implements * @param approved_contextlist $contextlist The approved contexts and user information to delete information for. */ public static function delete_data_for_user(approved_contextlist $contextlist) { - // Only delete data from contexts which are at the COURSE_MODULE contextlevel. + // Only delete data from contexts which are at the CONTEXT_COURSE contextlevel. $contexts = self::validate_contextlist_contexts($contextlist); if (empty($contexts)) { return; @@ -165,6 +190,28 @@ class provider implements $DB->delete_records_select('enrol_flatfile', $sql, $params); } + /** + * 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) { + global $DB; + + $context = $userlist->get_context(); + + if ($context->contextlevel != CONTEXT_COURSE) { + return; + } + + $userids = $userlist->get_userids(); + + list($insql, $inparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED); + $params = array_merge(['courseid' => $context->instanceid], $inparams); + $sql = "courseid = :courseid AND userid $insql"; + $DB->delete_records_select('enrol_flatfile', $sql, $params); + } + /** * Simple sanity check on the contextlist contexts, making sure they're of CONTEXT_COURSE contextlevel. * diff --git a/enrol/flatfile/tests/privacy_provider_test.php b/enrol/flatfile/tests/privacy_provider_test.php index 5ad5dbbf175..d2b4b153072 100644 --- a/enrol/flatfile/tests/privacy_provider_test.php +++ b/enrol/flatfile/tests/privacy_provider_test.php @@ -199,6 +199,57 @@ class enrol_flatfile_privacy_testcase extends provider_testcase { $this->assertEquals(0, $DB->count_records('enrol_flatfile', ['userid' => $this->user1->id])); } + /** + * Test for provider::get_users_in_context(). + */ + public function test_get_users_in_context() { + global $DB; + // Create, via flatfile syncing, the future enrolments entries in the enrol_flatfile table. + $this->create_future_enrolments(); + + $this->assertEquals(3, $DB->count_records('enrol_flatfile')); + + // We expect to see 1 entry for course1, and that's user1. + $userlist = new \core_privacy\local\request\userlist($this->coursecontext1, 'enrol_flatfile'); + provider::get_users_in_context($userlist); + $this->assertEquals([$this->user1->id], $userlist->get_userids()); + + // And 1 for course2 which is for user2. + $userlist = new \core_privacy\local\request\userlist($this->coursecontext2, 'enrol_flatfile'); + provider::get_users_in_context($userlist); + $this->assertEquals([$this->user2->id], $userlist->get_userids()); + + // And 1 for course3 which is for user1 again. + $userlist = new \core_privacy\local\request\userlist($this->coursecontext3, 'enrol_flatfile'); + provider::get_users_in_context($userlist); + $this->assertEquals([$this->user1->id], $userlist->get_userids()); + } + + /** + * Test for provider::delete_data_for_users(). + */ + public function test_delete_data_for_users() { + global $DB; + + // Create, via flatfile syncing, the future enrolments entries in the enrol_flatfile table. + $this->create_future_enrolments(); + + // Verify we have 1 future enrolment for user 1. + $userlist = new \core_privacy\local\request\userlist($this->coursecontext1, 'enrol_flatfile'); + provider::get_users_in_context($userlist); + $this->assertEquals([$this->user1->id], $userlist->get_userids()); + + $approveduserlist = new \core_privacy\local\request\approved_userlist($this->coursecontext1, 'enrol_flatfile', + [$this->user1->id]); + + // Now, run delete for user and confirm that the record is removed. + provider::delete_data_for_users($approveduserlist); + $userlist = new \core_privacy\local\request\userlist($this->coursecontext1, 'enrol_flatfile'); + provider::get_users_in_context($userlist); + $this->assertEquals(0, $userlist->count()); + $this->assertEquals(0, $DB->count_records('enrol_flatfile', ['courseid' => $this->coursecontext1->instanceid])); + } + /** * Helper to sync a file and create the enrol_flatfile DB entries, for use with the get, export and delete tests. */