diff --git a/lang/en/moodle.php b/lang/en/moodle.php index 9c08415ee5c..9e3dcef3b2b 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -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 index 00000000000..33a4ea1a970 --- /dev/null +++ b/lib/classes/event/course_category_created.php @@ -0,0 +1,66 @@ +. + +namespace core\event; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Course category created event. + * + * @package core + * @copyright 2014 Mark Nelson + * @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 index 00000000000..978c9e43dfc --- /dev/null +++ b/lib/classes/event/course_category_updated.php @@ -0,0 +1,82 @@ +. + +namespace core\event; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Course category updated event. + * + * @package core + * @copyright 2014 Mark Nelson + * @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); + } +} diff --git a/lib/coursecatlib.php b/lib/coursecatlib.php index 078659a0b93..d4e30dcb023 100644 --- a/lib/coursecatlib.php +++ b/lib/coursecatlib.php @@ -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 index 00000000000..ee5797cb64d --- /dev/null +++ b/lib/tests/events_test.php @@ -0,0 +1,143 @@ +. + +/** + * Events tests. + * + * @package core + * @category test + * @copyright 2014 Mark Nelson + * @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); + } +}