Merge branch 'MDL-40912_master' of https://github.com/markn86/moodle
authorDan Poltawski <dan@moodle.com>
Wed, 15 Jan 2014 03:41:05 +0000 (11:41 +0800)
committerDan Poltawski <dan@moodle.com>
Wed, 15 Jan 2014 03:41:05 +0000 (11:41 +0800)
lang/en/moodle.php
lib/classes/event/course_category_created.php [new file with mode: 0644]
lib/classes/event/course_category_updated.php [new file with mode: 0644]
lib/coursecatlib.php
lib/tests/events_test.php [new file with mode: 0644]

index 9c08415..9e3dcef 100644 (file)
@@ -715,7 +715,9 @@ $string['errorwhenconfirming'] = 'You are not confirmed yet because an error occ
 $string['eventcommentcreated'] = 'Comment created';
 $string['eventcommentdeleted'] = 'Comment deleted';
 $string['eventcommentsviewed'] = 'Comments viewed';
+$string['eventcoursecategorycreated'] = 'Category created';
 $string['eventcoursecategorydeleted'] = 'Category deleted';
+$string['eventcoursecategoryupdated'] = 'Category updated';
 $string['eventcoursecontentdeleted'] = 'Course content deleted';
 $string['eventcoursecreated'] = 'Course created';
 $string['eventcoursedeleted'] = 'Course deleted';
diff --git a/lib/classes/event/course_category_created.php b/lib/classes/event/course_category_created.php
new file mode 100644 (file)
index 0000000..33a4ea1
--- /dev/null
@@ -0,0 +1,66 @@
+<?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/>.
+
+namespace core\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Course category created event.
+ *
+ * @package    core
+ * @copyright  2014 Mark Nelson <markn@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class course_category_created extends base {
+
+    /**
+     * Initialise the event data.
+     */
+    protected function init() {
+        $this->data['objecttable'] = 'course_categories';
+        $this->data['crud'] = 'c';
+        $this->data['level'] = self::LEVEL_OTHER;
+    }
+
+    /**
+     * Returns localised general event name.
+     *
+     * @return string
+     */
+    public static function get_name() {
+        return get_string('eventcoursecategorycreated');
+    }
+
+    /**
+     * Returns non-localised description of what happened.
+     *
+     * @return string
+     */
+    public function get_description() {
+        return 'The course category with the id ' . $this->objectid . ' was created by the user with the id ' .
+            $this->userid;
+    }
+
+    /**
+     * Return legacy data for add_to_log().
+     *
+     * @return array
+     */
+    protected function get_legacy_logdata() {
+        return array(SITEID, 'category', 'add', 'editcategory.php?id=' . $this->objectid, $this->objectid);
+    }
+}
diff --git a/lib/classes/event/course_category_updated.php b/lib/classes/event/course_category_updated.php
new file mode 100644 (file)
index 0000000..978c9e4
--- /dev/null
@@ -0,0 +1,82 @@
+<?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/>.
+
+namespace core\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Course category updated event.
+ *
+ * @package    core
+ * @copyright  2014 Mark Nelson <markn@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class course_category_updated extends base {
+
+    /** @var array The legacy log data. */
+    private $legacylogdata;
+
+    /**
+     * Initialise the event data.
+     */
+    protected function init() {
+        $this->data['objecttable'] = 'course_categories';
+        $this->data['crud'] = 'u';
+        $this->data['level'] = self::LEVEL_OTHER;
+    }
+
+    /**
+     * Returns localised general event name.
+     *
+     * @return string
+     */
+    public static function get_name() {
+        return get_string('eventcoursecategoryupdated');
+    }
+
+    /**
+     * Returns non-localised description of what happened.
+     *
+     * @return string
+     */
+    public function get_description() {
+        return 'The course category with the id ' . $this->objectid . ' was updated by the user with the id ' .
+            $this->userid;
+    }
+
+    /**
+     * Set the legacy data used for add_to_log().
+     *
+     * @param array $logdata
+     */
+    public function set_legacy_logdata($logdata) {
+        $this->legacylogdata = $logdata;
+    }
+
+    /**
+     * Return legacy data for add_to_log().
+     *
+     * @return array
+     */
+    protected function get_legacy_logdata() {
+        if (!empty($this->legacylogdata)) {
+            return $this->legacylogdata;
+        }
+
+        return array(SITEID, 'category', 'update', 'editcategory.php?id=' . $this->objectid, $this->objectid);
+    }
+}
index 078659a..d4e30dc 100644 (file)
@@ -427,7 +427,12 @@ class coursecat implements renderable, cacheable_object, IteratorAggregate {
             $DB->update_record('course_categories', $updatedata);
         }
 
-        add_to_log(SITEID, "category", 'add', "editcategory.php?id=$newcategory->id", $newcategory->id);
+        $event = \core\event\course_category_created::create(array(
+            'objectid' => $newcategory->id,
+            'context' => $categorycontext
+        ));
+        $event->trigger();
+
         cache_helper::purge_by_event('changesincoursecat');
 
         return self::get($newcategory->id, MUST_EXIST, true);
@@ -516,13 +521,19 @@ class coursecat implements renderable, cacheable_object, IteratorAggregate {
 
         $newcategory->timemodified = time();
 
+        $categorycontext = $this->get_context();
         if ($editoroptions) {
-            $categorycontext = $this->get_context();
             $newcategory = file_postupdate_standard_editor($newcategory, 'description', $editoroptions, $categorycontext,
                                                            'coursecat', 'description', 0);
         }
         $DB->update_record('course_categories', $newcategory);
-        add_to_log(SITEID, "category", 'update', "editcategory.php?id=$this->id", $this->id);
+
+        $event = \core\event\course_category_updated::create(array(
+            'objectid' => $newcategory->id,
+            'context' => $categorycontext
+        ));
+        $event->trigger();
+
         fix_course_sortorder();
         // Purge cache even if fix_course_sortorder() did not do it.
         cache_helper::purge_by_event('changesincoursecat');
@@ -1741,7 +1752,13 @@ class coursecat implements renderable, cacheable_object, IteratorAggregate {
             foreach ($children as $childcat) {
                 $childcat->change_parent_raw($newparentcat);
                 // Log action.
-                add_to_log(SITEID, "category", "move", "editcategory.php?id=$childcat->id", $childcat->id);
+                $event = \core\event\course_category_updated::create(array(
+                    'objectid' => $childcat->id,
+                    'context' => $childcat->get_context()
+                ));
+                $event->set_legacy_logdata(array(SITEID, 'category', 'move', 'editcategory.php?id=' . $childcat->id,
+                    $childcat->id));
+                $event->trigger();
             }
             fix_course_sortorder();
         }
@@ -1909,7 +1926,13 @@ class coursecat implements renderable, cacheable_object, IteratorAggregate {
             fix_course_sortorder();
             cache_helper::purge_by_event('changesincoursecat');
             $this->restore();
-            add_to_log(SITEID, "category", "move", "editcategory.php?id=$this->id", $this->id);
+
+            $event = \core\event\course_category_updated::create(array(
+                'objectid' => $this->id,
+                'context' => $this->get_context()
+            ));
+            $event->set_legacy_logdata(array(SITEID, 'category', 'move', 'editcategory.php?id=' . $this->id, $this->id));
+            $event->trigger();
         }
     }
 
@@ -1975,7 +1998,13 @@ class coursecat implements renderable, cacheable_object, IteratorAggregate {
     public function hide() {
         if ($this->hide_raw(0)) {
             cache_helper::purge_by_event('changesincoursecat');
-            add_to_log(SITEID, "category", "hide", "editcategory.php?id=$this->id", $this->id);
+
+            $event = \core\event\course_category_updated::create(array(
+                'objectid' => $this->id,
+                'context' => $this->get_context()
+            ));
+            $event->set_legacy_logdata(array(SITEID, 'category', 'hide', 'editcategory.php?id=' . $this->id, $this->id));
+            $event->trigger();
         }
     }
 
@@ -2028,7 +2057,13 @@ class coursecat implements renderable, cacheable_object, IteratorAggregate {
     public function show() {
         if ($this->show_raw()) {
             cache_helper::purge_by_event('changesincoursecat');
-            add_to_log(SITEID, "category", "show", "editcategory.php?id=$this->id", $this->id);
+
+            $event = \core\event\course_category_updated::create(array(
+                'objectid' => $this->id,
+                'context' => $this->get_context()
+            ));
+            $event->set_legacy_logdata(array(SITEID, 'category', 'show', 'editcategory.php?id=' . $this->id, $this->id));
+            $event->trigger();
         }
     }
 
@@ -2530,7 +2565,15 @@ class coursecat implements renderable, cacheable_object, IteratorAggregate {
             $DB->set_field('course_categories', 'sortorder', $swapcategory->sortorder, array('id' => $this->id));
             $DB->set_field('course_categories', 'sortorder', $this->sortorder, array('id' => $swapcategory->id));
             $this->sortorder = $swapcategory->sortorder;
-            add_to_log(SITEID, "category", "move", "management.php?categoryid={$this->id}", $this->id);
+
+            $event = \core\event\course_category_updated::create(array(
+                'objectid' => $this->id,
+                'context' => $this->get_context()
+            ));
+            $event->set_legacy_logdata(array(SITEID, 'category', 'move', 'management.php?categoryid=' . $this->id,
+                $this->id));
+            $event->trigger();
+
             // Finally reorder courses.
             fix_course_sortorder();
             cache_helper::purge_by_event('changesincoursecat');
diff --git a/lib/tests/events_test.php b/lib/tests/events_test.php
new file mode 100644 (file)
index 0000000..ee5797c
--- /dev/null
@@ -0,0 +1,143 @@
+<?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/>.
+
+/**
+ * Events tests.
+ *
+ * @package   core
+ * @category  test
+ * @copyright 2014 Mark Nelson <markn@moodle.com>
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+class core_events_testcase extends advanced_testcase {
+
+    /**
+     * Test set up.
+     *
+     * This is executed before running any test in this file.
+     */
+    public function setUp() {
+        $this->resetAfterTest();
+    }
+
+    /**
+     * Test the course category created event.
+     */
+    public function test_course_category_created() {
+        // Trigger and capture the event.
+        $sink = $this->redirectEvents();
+        $category = $this->getDataGenerator()->create_category();
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        // Check that the event data is valid.
+        $this->assertInstanceOf('\core\event\course_category_created', $event);
+        $this->assertEquals(context_coursecat::instance($category->id), $event->get_context());
+        $expected = array(SITEID, 'category', 'add', 'editcategory.php?id=' . $category->id, $category->id);
+        $this->assertEventLegacyLogData($expected, $event);
+    }
+
+    /**
+     * Test the course category updated event.
+     */
+    public function test_course_category_updated() {
+        // Create a category.
+        $category = $this->getDataGenerator()->create_category();
+
+        // Create some data we are going to use to update this category.
+        $data = new stdClass();
+        $data->name = 'Category name change';
+
+        // Trigger and capture the event for updating a category.
+        $sink = $this->redirectEvents();
+        $category->update($data);
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        // Check that the event data is valid.
+        $this->assertInstanceOf('\core\event\course_category_updated', $event);
+        $this->assertEquals(context_coursecat::instance($category->id), $event->get_context());
+        $expected = array(SITEID, 'category', 'update', 'editcategory.php?id=' . $category->id, $category->id);
+        $this->assertEventLegacyLogData($expected, $event);
+
+        // Create another category and a child category.
+        $category2 = $this->getDataGenerator()->create_category();
+        $childcat = $this->getDataGenerator()->create_category(array('parent' => $category2->id));
+
+        // Trigger and capture the event for changing the parent of a category.
+        $sink = $this->redirectEvents();
+        $childcat->change_parent($category);
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        // Check that the event data is valid.
+        $this->assertInstanceOf('\core\event\course_category_updated', $event);
+        $this->assertEquals(context_coursecat::instance($childcat->id), $event->get_context());
+        $expected = array(SITEID, 'category', 'move', 'editcategory.php?id=' . $childcat->id, $childcat->id);
+        $this->assertEventLegacyLogData($expected, $event);
+
+        // Trigger and capture the event for changing the sortorder of a category.
+        $sink = $this->redirectEvents();
+        $category2->change_sortorder_by_one(true);
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        // Check that the event data is valid.
+        $this->assertInstanceOf('\core\event\course_category_updated', $event);
+        $this->assertEquals(context_coursecat::instance($category2->id), $event->get_context());
+        $expected = array(SITEID, 'category', 'move', 'management.php?categoryid=' . $category2->id, $category2->id);
+        $this->assertEventLegacyLogData($expected, $event);
+
+        // Trigger and capture the event for deleting a category and moving it's children to another.
+        $sink = $this->redirectEvents();
+        $category->delete_move($category->id);
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        // Check that the event data is valid.
+        $this->assertInstanceOf('\core\event\course_category_updated', $event);
+        $this->assertEquals(context_coursecat::instance($childcat->id), $event->get_context());
+        $expected = array(SITEID, 'category', 'move', 'editcategory.php?id=' . $childcat->id, $childcat->id);
+        $this->assertEventLegacyLogData($expected, $event);
+
+        // Trigger and capture the event for hiding a category.
+        $sink = $this->redirectEvents();
+        $category2->hide();
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        // Check that the event data is valid.
+        $this->assertInstanceOf('\core\event\course_category_updated', $event);
+        $this->assertEquals(context_coursecat::instance($category2->id), $event->get_context());
+        $expected = array(SITEID, 'category', 'hide', 'editcategory.php?id=' . $category2->id, $category2->id);
+        $this->assertEventLegacyLogData($expected, $event);
+
+        // Trigger and capture the event for unhiding a category.
+        $sink = $this->redirectEvents();
+        $category2->show();
+        $events = $sink->get_events();
+        $event = reset($events);
+
+        // Check that the event data is valid.
+        $this->assertInstanceOf('\core\event\course_category_updated', $event);
+        $this->assertEquals(context_coursecat::instance($category2->id), $event->get_context());
+        $expected = array(SITEID, 'category', 'show', 'editcategory.php?id=' . $category2->id, $category2->id);
+        $this->assertEventLegacyLogData($expected, $event);
+    }
+}