mirror of
https://github.com/moodle/moodle.git
synced 2025-08-06 09:26:35 +02:00
MDL-63497 mod_feedback: Add support for removal of context users
This issue is a part of the MDL-62560 Epic.
This commit is contained in:
parent
55d1ef377c
commit
e917288971
2 changed files with 214 additions and 0 deletions
|
@ -31,9 +31,11 @@ use context_helper;
|
|||
use stdClass;
|
||||
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\contextlist;
|
||||
use core_privacy\local\request\helper;
|
||||
use core_privacy\local\request\transform;
|
||||
use core_privacy\local\request\userlist;
|
||||
use core_privacy\local\request\writer;
|
||||
|
||||
require_once($CFG->dirroot . '/mod/feedback/lib.php');
|
||||
|
@ -48,6 +50,7 @@ require_once($CFG->dirroot . '/mod/feedback/lib.php');
|
|||
*/
|
||||
class provider implements
|
||||
\core_privacy\local\metadata\provider,
|
||||
\core_privacy\local\request\core_userlist_provider,
|
||||
\core_privacy\local\request\plugin\provider {
|
||||
|
||||
/**
|
||||
|
@ -102,6 +105,38 @@ 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 (!is_a($context, \context_module::class)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Find users with feedback entries.
|
||||
$sql = "
|
||||
SELECT fc.userid
|
||||
FROM {%s} fc
|
||||
JOIN {modules} m
|
||||
ON m.name = :feedback
|
||||
JOIN {course_modules} cm
|
||||
ON cm.instance = fc.feedback
|
||||
AND cm.module = m.id
|
||||
JOIN {context} ctx
|
||||
ON ctx.instanceid = cm.id
|
||||
AND ctx.contextlevel = :modlevel
|
||||
WHERE ctx.id = :contextid";
|
||||
$params = ['feedback' => 'feedback', 'modlevel' => CONTEXT_MODULE, 'contextid' => $context->id];
|
||||
|
||||
$userlist->add_from_sql('userid', sprintf($sql, 'feedback_completed'), $params);
|
||||
$userlist->add_from_sql('userid', sprintf($sql, 'feedback_completedtmp'), $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Export all user data for the specified user, in the specified contexts.
|
||||
*
|
||||
|
@ -272,6 +307,48 @@ class provider implements
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
$userids = $userlist->get_userids();
|
||||
|
||||
// Prepare SQL to gather all completed IDs.
|
||||
list($insql, $inparams) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED);
|
||||
$completedsql = "
|
||||
SELECT fc.id
|
||||
FROM {%s} fc
|
||||
JOIN {modules} m
|
||||
ON m.name = :feedback
|
||||
JOIN {course_modules} cm
|
||||
ON cm.instance = fc.feedback
|
||||
AND cm.module = m.id
|
||||
WHERE cm.id = :instanceid
|
||||
AND fc.userid $insql";
|
||||
$completedparams = array_merge($inparams, ['instanceid' => $context->instanceid, 'feedback' => 'feedback']);
|
||||
|
||||
// Delete all submissions in progress.
|
||||
$completedtmpids = $DB->get_fieldset_sql(sprintf($completedsql, 'feedback_completedtmp'), $completedparams);
|
||||
if (!empty($completedtmpids)) {
|
||||
list($insql, $inparams) = $DB->get_in_or_equal($completedtmpids, SQL_PARAMS_NAMED);
|
||||
$DB->delete_records_select('feedback_valuetmp', "completed $insql", $inparams);
|
||||
$DB->delete_records_select('feedback_completedtmp', "id $insql", $inparams);
|
||||
}
|
||||
|
||||
// Delete all final submissions.
|
||||
$completedids = $DB->get_fieldset_sql(sprintf($completedsql, 'feedback_completed'), $completedparams);
|
||||
if (!empty($completedids)) {
|
||||
list($insql, $inparams) = $DB->get_in_or_equal($completedids, SQL_PARAMS_NAMED);
|
||||
$DB->delete_records_select('feedback_value', "completed $insql", $inparams);
|
||||
$DB->delete_records_select('feedback_completed', "id $insql", $inparams);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract an item record from a database record.
|
||||
*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue