MDL-46214 event: Support deprecation of events
authorAndrew Nicols <andrew@nicols.co.uk>
Thu, 11 Aug 2016 03:14:02 +0000 (11:14 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Mon, 15 Aug 2016 01:17:02 +0000 (09:17 +0800)
This patch adds two new functions to the event base to allow deprecation of
the individual events, without entirely removing them from the UI.

This is different to our normal deprecation procedure because all events
must support display of historical data. It must also be possible to view
the event information in the event monitor.

admin/tool/monitor/classes/eventlist.php
admin/tool/monitor/classes/rule.php
admin/tool/monitor/classes/subscription.php
admin/tool/monitor/edit.php
lang/en/moodle.php
lib/classes/event/base.php
lib/classes/event/mnet_access_control_updated.php
lib/upgrade.txt
report/eventlist/classes/list_generator.php
report/eventlist/eventdetail.php

index 989bc3c..9800bd4 100644 (file)
@@ -67,7 +67,7 @@ class eventlist {
                 $ref = new \ReflectionClass($classname);
                 // Ignore abstracts.
                 if (!$ref->isAbstract() && $file != 'manager') {
-                    $eventinformation[$classname] = $classname::get_name();
+                    $eventinformation[$classname] = $classname::get_name_with_info();
                 }
             }
         }
@@ -109,9 +109,9 @@ class eventlist {
                         $ref = new \ReflectionClass($plugineventname);
                         if (!$ref->isAbstract() && $plugin != 'legacy') {
                             if ($withoutcomponent) {
-                                $noncorepluginlist[$plugineventname] = $plugineventname::get_name();
+                                $noncorepluginlist[$plugineventname] = $plugineventname::get_name_with_info();
                             } else {
-                                $noncorepluginlist[$plugintype . '_' . $plugin][$plugineventname] = $plugineventname::get_name();
+                                $noncorepluginlist[$plugintype . '_' . $plugin][$plugineventname] = $plugineventname::get_name_with_info();
                             }
                         }
                     }
index 2a23eb1..3c5e6d2 100644 (file)
@@ -202,7 +202,7 @@ class rule {
     public function get_event_name() {
         $eventclass = $this->eventname;
         if (class_exists($eventclass)) {
-            return $eventclass::get_name();
+            return $eventclass::get_name_with_info();
         }
         return get_string('eventnotfound', 'tool_monitor');
     }
index 98518e9..5beddbb 100644 (file)
@@ -111,7 +111,7 @@ class subscription {
     public function get_event_name() {
         $eventclass = $this->eventname;
         if (class_exists($eventclass)) {
-            return $eventclass::get_name();
+            return $eventclass::get_name_with_info();
         }
         return get_string('eventnotfound', 'tool_monitor');
     }
index 20bd3c4..1e01a32 100644 (file)
@@ -54,12 +54,6 @@ $PAGE->set_heading($coursename);
 // Get data ready for mform.
 $eventlist = tool_monitor\eventlist::get_all_eventlist(true);
 $pluginlist = tool_monitor\eventlist::get_plugin_list();
-$eventlist = array_merge(array('' => get_string('choosedots')), $eventlist);
-$pluginlist = array_merge(array('' => get_string('choosedots')), $pluginlist);
-
-// Set up the yui module.
-$PAGE->requires->yui_module('moodle-tool_monitor-dropdown', 'Y.M.tool_monitor.DropDown.init',
-        array(array('eventlist' => $eventlist)));
 
 // Site level report.
 if (empty($courseid)) {
@@ -74,11 +68,25 @@ if (!empty($ruleid)) {
     $rule = \tool_monitor\rule_manager::get_rule($ruleid)->get_mform_set_data();
     $rule->minutes = $rule->timewindow / MINSECS;
     $subscriptioncount = \tool_monitor\subscription_manager::count_rule_subscriptions($ruleid);
+
+    // Filter out events which cannot be triggered for some reason.
+    $eventlist = array_filter($eventlist, function($classname) use ($rule) {
+        // Filter out all deprecated events, except for the current one.
+        return $classname === $rule->eventname || !$classname::is_deprecated();
+    }, ARRAY_FILTER_USE_KEY);
 } else {
     $rule = new stdClass();
     $subscriptioncount = 0;
+
+    // Filter out events which cannot be triggered for some reason.
+    $eventlist = array_filter($eventlist, function($classname) {
+        return !$classname::is_deprecated();
+    }, ARRAY_FILTER_USE_KEY);
 }
 
+// Modify the lists to add the choosers.
+$eventlist = array_merge(array('' => get_string('choosedots')), $eventlist);
+$pluginlist = array_merge(array('' => get_string('choosedots')), $pluginlist);
 $mform = new tool_monitor\rule_form(null, array('eventlist' => $eventlist, 'pluginlist' => $pluginlist, 'rule' => $rule,
         'courseid' => $courseid, 'subscriptioncount' => $subscriptioncount));
 
@@ -98,6 +106,10 @@ if ($mformdata = $mform->get_data()) {
 
     redirect($manageurl);
 } else {
+    // Set up the yui module.
+    $PAGE->requires->yui_module('moodle-tool_monitor-dropdown', 'Y.M.tool_monitor.DropDown.init',
+            array(array('eventlist' => $eventlist)));
+
     echo $OUTPUT->header();
     $mform->set_data($rule);
     // If there's any subscription for this rule, display an information message.
index b6e7255..7148c61 100644 (file)
@@ -2027,6 +2027,7 @@ $string['yourself'] = 'yourself';
 $string['yourteacher'] = 'your {$a}';
 $string['yourwordforx'] = 'Your word for \'{$a}\'';
 $string['zippingbackup'] = 'Zipping backup';
+$string['deprecatedeventname'] = '{$a} (no longer in use)';
 
 // Deprecated since Moodle 3.1.
 $string['filetoolarge'] = 'is too large to upload';
index 17d399b..8036019 100644 (file)
@@ -305,6 +305,26 @@ abstract class base implements \IteratorAggregate {
         return $parts[0].': '.str_replace('_', ' ', $parts[2]);
     }
 
+    /**
+     * Returns the event name complete with metadata information.
+     *
+     * This includes information about whether the event has been deprecated so should not be used in all situations -
+     * for example within reports themselves.
+     *
+     * If overriding this function, please ensure that you call the parent version too.
+     *
+     * @return string
+     */
+    public static function get_name_with_info() {
+        $return = static::get_name();
+
+        if (static::is_deprecated()) {
+            $return = get_string('deprecatedeventname', 'core', $return);
+        }
+
+        return $return;
+    }
+
     /**
      * Returns non-localised event description with id's for admin use only.
      *
@@ -961,4 +981,17 @@ abstract class base implements \IteratorAggregate {
     public function getIterator() {
         return new \ArrayIterator($this->data);
     }
+
+    /**
+     * Whether this event has been marked as deprecated.
+     *
+     * Events cannot be deprecated in the normal fashion as they must remain to support historical data.
+     * Once they are deprecated, there is no way to trigger the event, so it does not make sense to list it in some
+     * parts of the UI (e.g. Event Monitor).
+     *
+     * @return boolean
+     */
+    public static function is_deprecated() {
+        return false;
+    }
 }
index b2e9332..9ac0048 100644 (file)
@@ -123,4 +123,8 @@ class mnet_access_control_updated extends base {
         // Nothing to map.
         return false;
     }
+
+    public static function is_deprecated() {
+        return true;
+    }
 }
index 4f72273..10a5207 100644 (file)
@@ -52,6 +52,9 @@ information provided here is intended especially for developers.
 * All file_packer implementations now accept an additional parameter to allow a simple boolean return value instead of
   an array of individual file statuses.
 * "I set the field "field_string" to multiline:" now end with colon (:), as PyStrings is supposed to end with ":"
+* New functions to support deprecation of events have been added to the base event. See MDL-46214 for further details.
+* A new function `get_name_with_info` has been added to the base event. This function adds information about event
+  deprecations and should be used where this information is relevant.
 
 === 3.1 ===
 
index b7483d6..5ccb71c 100644 (file)
@@ -243,7 +243,7 @@ class report_eventlist_list_generator {
         $eventdata[$eventfullpath] = $eventfullpath::get_static_info();
         // Create a link for further event detail.
         $url = new \moodle_url('eventdetail.php', array('eventname' => $eventfullpath));
-        $link = \html_writer::link($url, $eventfullpath::get_name());
+        $link = \html_writer::link($url, $eventfullpath::get_name_with_info());
         $eventdata[$eventfullpath]['fulleventname'] = \html_writer::span($link);
         $eventdata[$eventfullpath]['fulleventname'] .= \html_writer::empty_tag('br');
         $eventdata[$eventfullpath]['fulleventname'] .= \html_writer::span($eventdata[$eventfullpath]['eventname'],
@@ -275,7 +275,7 @@ class report_eventlist_list_generator {
         }
 
         // Raw event data to be used to sort the "Event name" column.
-        $eventdata[$eventfullpath]['raweventname'] = $eventfullpath::get_name() . ' ' . $eventdata[$eventfullpath]['eventname'];
+        $eventdata[$eventfullpath]['raweventname'] = $eventfullpath::get_name_with_info() . ' ' . $eventdata[$eventfullpath]['eventname'];
 
         // Unset information that is not currently required.
         unset($eventdata[$eventfullpath]['action']);
index 2949aaf..baa46bb 100644 (file)
@@ -49,7 +49,7 @@ if (!is_dir($directory)) {
 }
 $filename = end($component);
 $eventfiles = $directory . '/' . $filename . '.php';
-$title = $eventname::get_name();
+$title = $eventname::get_name_with_info();
 
 // Define event information.
 $eventinformation = array('title' => $title);