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:
committed by
David Monllao
parent
46bb823e04
commit
e4290b4945
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user