MDL-66034 core_role: implement capability unassigned event
authorSimey Lameze <simey@moodle.com>
Wed, 17 Jul 2019 12:24:00 +0000 (20:24 +0800)
committerSimey Lameze <simey@moodle.com>
Mon, 5 Aug 2019 05:09:18 +0000 (13:09 +0800)
lang/en/role.php
lib/accesslib.php
lib/classes/event/capability_unassigned.php [new file with mode: 0644]

index 6399698..3f2a16f 100644 (file)
@@ -226,6 +226,7 @@ $string['errorexistsrolename'] = 'Role name already exists';
 $string['errorexistsroleshortname'] = 'Role name already exists';
 $string['errorroleshortnametoolong'] = 'The short name must not exceed 100 characters';
 $string['eventcapabilityassigned'] = 'Capability assigned';
+$string['eventcapabilityunassigned'] = 'Capability unassigned';
 $string['eventroleallowassignupdated'] = 'Allow role assignment';
 $string['eventroleallowoverrideupdated'] = 'Allow role override';
 $string['eventroleallowswitchupdated'] = 'Allow role switch';
index 67f0b0e..2383769 100644 (file)
@@ -1406,7 +1406,7 @@ function assign_capability($capability, $permission, $roleid, $contextid, $overw
  * @return boolean true or exception
  */
 function unassign_capability($capability, $roleid, $contextid = null) {
-    global $DB;
+    global $DB, $USER;
 
     // Capability must exist.
     if (!$capinfo = get_capability_info($capability)) {
@@ -1425,6 +1425,16 @@ function unassign_capability($capability, $roleid, $contextid = null) {
         $DB->delete_records('role_capabilities', array('capability'=>$capability, 'roleid'=>$roleid));
     }
 
+    // Trigger capability_assigned event.
+    \core\event\capability_unassigned::create([
+        'userid' => $USER->id,
+        'context' => $context ?? context_system::instance(),
+        'objectid' => $roleid,
+        'other' => [
+            'capability' => $capability,
+        ]
+    ])->trigger();
+
     // Reset any cache of this role, including MUC.
     accesslib_clear_role_cache($roleid);
 
diff --git a/lib/classes/event/capability_unassigned.php b/lib/classes/event/capability_unassigned.php
new file mode 100644 (file)
index 0000000..928795f
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Capability unassigned event.
+ *
+ * @package    core
+ * @since      Moodle 3.8
+ * @copyright  2019 Simey Lameze <simey@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace core\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Capability unassigned event class.
+ *
+ * @package    core
+ * @since      Moodle 3.8
+ * @copyright  2019 Simey Lameze <simey@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class capability_unassigned extends base {
+    /**
+     * Initialise event parameters.
+     */
+    protected function init() {
+        $this->data['objecttable'] = 'role_capabilities';
+        $this->data['crud'] = 'u';
+        $this->data['edulevel'] = self::LEVEL_OTHER;
+    }
+
+    /**
+     * Returns localised event name.
+     *
+     * @return string
+     */
+    public static function get_name() {
+        return get_string('eventcapabilityunassigned', 'role');
+    }
+
+    /**
+     * Returns non-localised event description with id's for admin use only.
+     *
+     * @return string
+     */
+    public function get_description() {
+        $capability = $this->other['capability'];
+
+        return "The user id id '$this->userid' has unassigned the '$capability' capability for role '$this->objectid'";
+    }
+
+    /**
+     * Returns relevant URL.
+     *
+     * @return \moodle_url
+     */
+    public function get_url() {
+        if ($this->contextlevel == CONTEXT_SYSTEM) {
+            return new \moodle_url('/admin/roles/define.php', ['action' => 'view', 'roleid' => $this->objectid]);
+        } else {
+            return new \moodle_url('/admin/roles/override.php', ['contextid' => $this->contextid,
+                'roleid' => $this->objectid]);
+        }
+    }
+}