From 0c30e89f3401c3ef1faef9e7381b2182541f7705 Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Wed, 8 Feb 2017 16:46:48 +0800 Subject: [PATCH] MDL-55547 tool_monitor: fix exceptions when course was deleted Delete subscriptions when course is deleted --- admin/tool/monitor/classes/eventobservers.php | 3 ++ admin/tool/monitor/classes/subscription.php | 8 +++-- .../monitor/classes/subscription_manager.php | 30 +++++++++++++++++-- admin/tool/monitor/db/upgrade.php | 16 ++++++++++ admin/tool/monitor/version.php | 2 +- 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/admin/tool/monitor/classes/eventobservers.php b/admin/tool/monitor/classes/eventobservers.php index 793b11f315b..bc9a0fae3e0 100644 --- a/admin/tool/monitor/classes/eventobservers.php +++ b/admin/tool/monitor/classes/eventobservers.php @@ -53,10 +53,13 @@ class eventobservers { * @param \core\event\course_deleted $event The course deleted event. */ public static function course_deleted(\core\event\course_deleted $event) { + // Delete rules defined inside this course and associated subscriptions. $rules = rule_manager::get_rules_by_courseid($event->courseid, 0, 0, false); foreach ($rules as $rule) { rule_manager::delete_rule($rule->id, $event->get_context()); } + // Delete remaining subscriptions inside this course (from site-wide rules). + subscription_manager::remove_all_subscriptions_in_course($event->get_context()); } /** diff --git a/admin/tool/monitor/classes/subscription.php b/admin/tool/monitor/classes/subscription.php index 5beddbbc8fc..828eff635d7 100644 --- a/admin/tool/monitor/classes/subscription.php +++ b/admin/tool/monitor/classes/subscription.php @@ -176,8 +176,12 @@ class subscription { if (empty($courseid)) { return get_string('site'); } else { - $course = get_course($courseid); - return format_string($course->fullname, true, array('context' => $context)); + try { + $course = get_course($courseid); + return format_string($course->fullname, true, array('context' => $context)); + } catch (\dml_exception $e) { + return '-'; + } } } diff --git a/admin/tool/monitor/classes/subscription_manager.php b/admin/tool/monitor/classes/subscription_manager.php index c4382e79a7f..8fa592c146e 100644 --- a/admin/tool/monitor/classes/subscription_manager.php +++ b/admin/tool/monitor/classes/subscription_manager.php @@ -118,9 +118,10 @@ class subscription_manager { // If successful trigger a subscription_deleted event. if ($success) { - if (!empty($subscription->courseid)) { + if (!empty($subscription->courseid) && + ($coursecontext = \context_course::instance($subscription->courseid, IGNORE_MISSING))) { $courseid = $subscription->courseid; - $context = \context_course::instance($subscription->courseid); + $context = $coursecontext; } else { $courseid = 0; $context = \context_system::instance(); @@ -222,6 +223,31 @@ class subscription_manager { return $success; } + /** + * Delete all subscriptions in a course. + * + * This is called after a course was deleted, context no longer exists but we kept the object + * + * @param \context_course $coursecontext the context of the course + */ + public static function remove_all_subscriptions_in_course($coursecontext) { + global $DB; + + // Store all the subscriptions we have to delete. + if ($subscriptions = $DB->get_records('tool_monitor_subscriptions', array('courseid' => $coursecontext->instanceid))) { + // Delete subscriptions in bulk. + $DB->delete_records('tool_monitor_subscriptions', array('courseid' => $coursecontext->instanceid)); + + // Trigger events one by one. + foreach ($subscriptions as $subscription) { + $params = ['objectid' => $subscription->id, 'context' => $coursecontext]; + $event = \tool_monitor\event\subscription_deleted::create($params); + $event->add_record_snapshot('tool_monitor_subscriptions', $subscription); + $event->trigger(); + } + } + } + /** * Get a subscription instance for an given subscription id. * diff --git a/admin/tool/monitor/db/upgrade.php b/admin/tool/monitor/db/upgrade.php index b96b1056220..a7a7ef0c440 100644 --- a/admin/tool/monitor/db/upgrade.php +++ b/admin/tool/monitor/db/upgrade.php @@ -80,5 +80,21 @@ function xmldb_tool_monitor_upgrade($oldversion) { // Automatically generated Moodle v3.2.0 release upgrade line. // Put any upgrade step following this. + if ($oldversion < 2017021300) { + + // Delete "orphaned" subscriptions. + $deletedcourses = $DB->get_field_sql("SELECT DISTINCT s.courseid + FROM {tool_monitor_subscriptions} s + LEFT OUTER JOIN {course} c ON c.id = s.courseid + WHERE s.courseid <> 0 and c.id IS NULL"); + if ($deletedcourses) { + list($sql, $params) = $DB->get_in_or_equal($deletedcourses); + $DB->execute("DELETE FROM {tool_monitor_subscriptions} WHERE courseid " . $sql, $params); + } + + // Monitor savepoint reached. + upgrade_plugin_savepoint(true, 2017021300, 'tool', 'monitor'); + } + return true; } diff --git a/admin/tool/monitor/version.php b/admin/tool/monitor/version.php index 6724fb0f1f5..2a46e91d22b 100644 --- a/admin/tool/monitor/version.php +++ b/admin/tool/monitor/version.php @@ -26,6 +26,6 @@ defined('MOODLE_INTERNAL') || die; -$plugin->version = 2016120500; // The current plugin version (Date: YYYYMMDDXX). +$plugin->version = 2017021300; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2016112900; // Requires this Moodle version. $plugin->component = 'tool_monitor'; // Full name of the plugin (used for diagnostics).