From 744a3438d87cd37efa8285c8b994f0e9ec123605 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Mon, 22 May 2023 18:47:07 +0100 Subject: [PATCH] MDL-78322 tool_cohortroles: don't assign roles to deleted users. --- admin/tool/cohortroles/classes/api.php | 1 + admin/tool/cohortroles/classes/observers.php | 43 ++++++++++++++++++++ admin/tool/cohortroles/db/events.php | 32 +++++++++++++++ admin/tool/cohortroles/db/upgrade.php | 8 ++++ admin/tool/cohortroles/version.php | 3 +- 5 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 admin/tool/cohortroles/classes/observers.php create mode 100644 admin/tool/cohortroles/db/events.php diff --git a/admin/tool/cohortroles/classes/api.php b/admin/tool/cohortroles/classes/api.php index 89f54aea73d..335272c99f0 100644 --- a/admin/tool/cohortroles/classes/api.php +++ b/admin/tool/cohortroles/classes/api.php @@ -179,6 +179,7 @@ class api { AND ra.roleid = :roleid AND ra.userid = :userid WHERE cm.cohortid ' . $cohortsql . ' + AND u.deleted = 0 AND ra.id IS NULL'; $toadd = $DB->get_records_sql($sql, $params); diff --git a/admin/tool/cohortroles/classes/observers.php b/admin/tool/cohortroles/classes/observers.php new file mode 100644 index 00000000000..4e2d6907ad0 --- /dev/null +++ b/admin/tool/cohortroles/classes/observers.php @@ -0,0 +1,43 @@ +. + +declare(strict_types=1); + +namespace tool_cohortroles; + +use core\event\user_deleted; + +/** + * Plugin event observer callbacks + * + * @package tool_cohortroles + * @copyright 2023 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class observers { + + /** + * User deleted event, remove cohort role assignments specific to them + * + * @param user_deleted $event + */ + public static function user_deleted(user_deleted $event): void { + $cohortroleassignments = cohort_role_assignment::get_records(['userid' => $event->objectid]); + foreach ($cohortroleassignments as $cohortroleassignment) { + $cohortroleassignment->delete(); + } + } +} diff --git a/admin/tool/cohortroles/db/events.php b/admin/tool/cohortroles/db/events.php new file mode 100644 index 00000000000..53d982aa150 --- /dev/null +++ b/admin/tool/cohortroles/db/events.php @@ -0,0 +1,32 @@ +. + +/** + * Plugin event observers + * + * @package tool_cohortroles + * @copyright 2023 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$observers = [ + [ + 'eventname' => '\core\event\user_deleted', + 'callback' => '\tool_cohortroles\observers::user_deleted', + ], +]; diff --git a/admin/tool/cohortroles/db/upgrade.php b/admin/tool/cohortroles/db/upgrade.php index 899c39e5438..1fba2526d82 100644 --- a/admin/tool/cohortroles/db/upgrade.php +++ b/admin/tool/cohortroles/db/upgrade.php @@ -47,5 +47,13 @@ function xmldb_tool_cohortroles_upgrade($oldversion) { // Automatically generated Moodle v4.0.0 release upgrade line. // Put any upgrade step following this. + if ($oldversion < 2022041901) { + // Delete any tool_cohortroles mappings for users who no longer exist. + $DB->delete_records_select('tool_cohortroles', 'userid NOT IN (SELECT id FROM {user} WHERE deleted = 0)'); + + // Cohortroles savepoint reached. + upgrade_plugin_savepoint(true, 2022041901, 'tool', 'cohortroles'); + } + return true; } diff --git a/admin/tool/cohortroles/version.php b/admin/tool/cohortroles/version.php index ca5f9a77c33..e180ae8eb09 100644 --- a/admin/tool/cohortroles/version.php +++ b/admin/tool/cohortroles/version.php @@ -24,8 +24,7 @@ defined('MOODLE_INTERNAL') || die(); - -$plugin->version = 2022041900; // The current plugin version (Date: YYYYMMDDXX). +$plugin->version = 2022041901; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2022041200; // Requires this Moodle version. $plugin->component = 'tool_cohortroles'; // Full name of the plugin (used for diagnostics).