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 98518e9a4df..e057441850b 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 33ba9c3cad5..ff8ba16fb80 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 aaea29a1503..55a7446f10c 100644 --- a/admin/tool/monitor/db/upgrade.php +++ b/admin/tool/monitor/db/upgrade.php @@ -77,5 +77,21 @@ function xmldb_tool_monitor_upgrade($oldversion) { upgrade_plugin_savepoint(true, 2016052305, 'tool', 'monitor'); } + if ($oldversion < 2016052306) { + + // 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, 2016052306, 'tool', 'monitor'); + } + return true; } diff --git a/admin/tool/monitor/version.php b/admin/tool/monitor/version.php index 9e5a5a394ba..925d18f8061 100644 --- a/admin/tool/monitor/version.php +++ b/admin/tool/monitor/version.php @@ -26,6 +26,6 @@ defined('MOODLE_INTERNAL') || die; -$plugin->version = 2016052305; // The current plugin version (Date: YYYYMMDDXX). +$plugin->version = 2016052306; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2016051900; // Requires this Moodle version. $plugin->component = 'tool_monitor'; // Full name of the plugin (used for diagnostics).