Skip to content

Commit

Permalink
MDL-63495 privacy: Add support for removal of multiple users in a con…
Browse files Browse the repository at this point in the history
…text

This issue is a part of the MDL-62560 Epic.
  • Loading branch information
andrewnicols committed Oct 17, 2018
1 parent c2f1dbc commit 8ba35e3
Show file tree
Hide file tree
Showing 12 changed files with 1,307 additions and 2 deletions.
7 changes: 5 additions & 2 deletions lang/en/privacy.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,12 @@
$string['trace:exportingrelated'] = 'Performing related export for {$a->total} components ({$a->datetime})';
$string['trace:finalisingexport'] = 'Finalising export';
$string['trace:processingcomponent'] = 'Processing {$a->component} ({$a->progress}/{$a->total}) ({$a->datetime})';
$string['trace:fetchcomponents'] = 'Fetching {$a->total} components ({$a->datetime})';
$string['trace:deletingapproved'] = 'Performing removal of approved {$a->total} contexts ({$a->datetime})';
$string['trace:preprocessingcomponent'] = 'Pre-processing {$a->component} ({$a->progress}/{$a->total}) ({$a->datetime})';
$string['trace:fetchcomponents'] = 'Fetching data from {$a->total} components ({$a->datetime})';
$string['trace:deletingapproved'] = 'Performing removal of {$a->total} approved contexts ({$a->datetime})';
$string['trace:deletingapprovedusers'] = 'Performing removal of users in {$a->total} approved component for context {$a->contextid} ({$a->datetime})';
$string['trace:deletingcontext'] = 'Performing removal of context from {$a->total} components ({$a->datetime})';
$string['navigation'] = 'Navigation';
$string['trace:deletinguser'] = 'Performing removal of user from {$a->total} components ({$a->datetime})';
$string['privacy:subsystem:empty'] = 'This subsystem does not store any data.';
$string['viewdata'] = 'Click on a link in the navigation to view data.';
61 changes: 61 additions & 0 deletions privacy/classes/local/request/approved_userlist.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* An implementation of a userlist which has been filtered and approved.
*
* @package core_privacy
* @copyright 2018 Andrew Nicols <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

namespace core_privacy\local\request;

defined('MOODLE_INTERNAL') || die();

/**
* An implementation of a userlist which has been filtered and approved.
*
* @copyright 2018 Andrew Nicols <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class approved_userlist extends userlist_base {

/**
* Create a new approved userlist.
*
* @param \context $context The context.
* @param string $component the frankenstyle component name.
* @param \int[] $userids The list of userids present in this list.
*/
public function __construct(\context $context, string $component, array $userids) {
parent::__construct($context, $component);

$this->set_userids($userids);
}

/**
* Create an approved userlist from a userlist.
*
* @param userlist $userlist The source list
* @return approved_userlist The newly created approved userlist.
*/
public static function create_from_userlist(userlist $userlist) : approved_userlist {
$newlist = new static($userlist->get_context(), $userlist->get_component(), $userlist->get_userids());

return $newlist;
}
}
51 changes: 51 additions & 0 deletions privacy/classes/local/request/core_userlist_provider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* This file contains an interface to describe classes which provide user data in some form to core.
*
* @package core_privacy
* @copyright 2018 Andrew Nicols <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_privacy\local\request;

defined('MOODLE_INTERNAL') || die();

/**
* The interface is used to describe a provider which is capable of identifying the users who have data within it.
*
* It describes data how these requests are serviced in a specific format.
*
* @package core_privacy
* @copyright 2018 Andrew Nicols <[email protected]>
*/
interface core_userlist_provider {

/**
* Get the list of contexts that contain user information for the specified user.
*
* @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);

/**
* 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);
}
12 changes: 12 additions & 0 deletions privacy/classes/local/request/helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,18 @@ public static function add_shared_contexts_to_contextlist_for(int $userid, conte
return $contextlist;
}

/**
* Add core-controlled contexts which are related to a component but that component may know about.
*
* For example, most activities are not aware of activity completion, but the course implements it for them.
* These should be included.
*
* @param \core_privacy\local\request\userlist $userlist
* @return contextlist The final contextlist
*/
public static function add_shared_users_to_userlist(\core_privacy\local\request\userlist $userlist) {
}

/**
* Handle export of standard data for a plugin which implements the null provider and does not normally store data
* of its own.
Expand Down
103 changes: 103 additions & 0 deletions privacy/classes/local/request/userlist.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* List of users from the Privacy API Search functions.
*
* @package core_privacy
* @copyright 2018 Andrew Nicols <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

namespace core_privacy\local\request;

defined('MOODLE_INTERNAL') || die();

/**
* List of users from the Privacy API Search functions.
*
* @copyright 2018 Andrew Nicols <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class userlist extends userlist_base {

/**
* Add a set of users from SQL.
*
* The SQL should only return a list of user IDs.
*
* @param string $fieldname The name of the field which holds the user id
* @param string $sql The SQL which will fetch the list of * user IDs
* @param array $params The set of SQL parameters
* @return $this
*/
public function add_from_sql(string $fieldname, string $sql, array $params) : userlist {
global $DB;

// Able to guess a field name.
$wrapper = "
SELECT DISTINCT u.id
FROM {user} u
JOIN ({$sql}) target ON u.id = target.{$fieldname}";

$users = $DB->get_records_sql($wrapper, $params);
$this->add_userids(array_keys($users));

return $this;
}

/**
* Adds the user user for a given user.
*
* @param int $userid
* @return $this
*/
public function add_user(int $userid) : userlist {
$this->add_users([$userid]);

return $this;
}

/**
* Adds the user users for given users.
*
* @param int[] $userids
* @return $this
*/
public function add_users(array $userids) : userlist {
global $DB;

list($useridsql, $useridparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED);
$sql = "SELECT DISTINCT u.id
FROM {user} u
WHERE u.id {$useridsql}";
$this->add_from_sql('id', $sql, $useridparams);

return $this;
}

/**
* Sets the component for this userlist.
*
* @param string $component the frankenstyle component name.
* @return $this
*/
public function set_component($component) : userlist_base {
parent::set_component($component);

return $this;
}
}
Loading

0 comments on commit 8ba35e3

Please sign in to comment.