MDL-63647 enrol_flatfile: support removal of multiple users in context

This issue is a part of the MDL-62560 Epic.
This commit is contained in:
Shamim Rezaie
2018-10-22 12:50:11 +02:00
committed by David Monllao
parent 46bb823e04
commit e4290b4945
2 changed files with 100 additions and 2 deletions
+49 -2
View File
@@ -13,22 +13,29 @@
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Privacy Subsystem implementation for enrol_flatfile.
*
* @package enrol_flatfile
* @category privacy
* @copyright 2018 Carlos Escobedo <[email protected]>
* @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.
*
@@ -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.
*/