* @return bool whether section was deleted
*/
function course_delete_section($course, $section, $forcedeleteifnotempty = true) {
- return course_get_format($course)->delete_section($section, $forcedeleteifnotempty);
+ global $DB;
+
+ // Prepare variables.
+ $courseid = (is_object($course)) ? $course->id : (int)$course;
+ $sectionnum = (is_object($section)) ? $section->section : (int)$section;
+ $section = $DB->get_record('course_sections', array('course' => $courseid, 'section' => $sectionnum));
+ if (!$section) {
+ // No section exists, can't proceed.
+ return false;
+ }
+ $format = course_get_format($course);
+ $sectionname = $format->get_section_name($section);
+
+ // Delete section.
+ $result = $format->delete_section($section, $forcedeleteifnotempty);
+
+ // Trigger an event for course section deletion.
+ if ($result) {
+ $context = context_course::instance($courseid);
+ $event = \core\event\course_section_deleted::create(
+ array(
+ 'objectid' => $section->id,
+ 'courseid' => $courseid,
+ 'context' => $context,
+ 'other' => array(
+ 'sectionnum' => $section->section,
+ 'sectionname' => $sectionname,
+ )
+ )
+ );
+ $event->add_record_snapshot('course_sections', $section);
+ $event->trigger();
+ }
+ return $result;
}
/**
$this->assertEventContextNotUsed($event);
}
+ /**
+ * Test that triggering a course_section_deleted event works as expected.
+ */
+ public function test_course_section_deleted_event() {
+ global $USER, $DB;
+ $this->resetAfterTest();
+ $sink = $this->redirectEvents();
+
+ // Create the course with sections.
+ $course = $this->getDataGenerator()->create_course(array('numsections' => 10), array('createsections' => true));
+ $sections = $DB->get_records('course_sections', array('course' => $course->id));
+ $coursecontext = context_course::instance($course->id);
+ $section = array_pop($sections);
+ course_delete_section($course, $section);
+ $events = $sink->get_events();
+ $event = array_pop($events); // Delete section event.
+ $sink->close();
+
+ // Validate event data.
+ $this->assertInstanceOf('\core\event\course_section_deleted', $event);
+ $this->assertEquals('course_sections', $event->objecttable);
+ $this->assertEquals($section->id, $event->objectid);
+ $this->assertEquals($course->id, $event->courseid);
+ $this->assertEquals($coursecontext->id, $event->contextid);
+ $this->assertEquals($section->section, $event->other['sectionnum']);
+ $expecteddesc = "The user with id '{$event->userid}' deleted section number '{$event->other['sectionnum']}' " .
+ "(section name '{$event->other['sectionname']}') for the course with id '{$event->courseid}'";
+ $this->assertEquals($expecteddesc, $event->get_description());
+ $this->assertEquals($section, $event->get_record_snapshot('course_sections', $event->objectid));
+ $this->assertNull($event->get_url());
+
+ // Test legacy data.
+ $sectionnum = $section->section;
+ $expectedlegacydata = array($course->id, "course", "delete section", 'view.php?id=' . $course->id, $sectionnum);
+ $this->assertEventLegacyLogData($expectedlegacydata, $event);
+ $this->assertEventContextNotUsed($event);
+ }
+
public function test_course_integrity_check() {
global $DB;
$string['eventcourseresetstarted'] = 'Course reset started';
$string['eventcourserestored'] = 'Course restored';
$string['eventcourseupdated'] = 'Course updated';
+$string['eventcoursesectiondeleted'] = 'Course section deleted';
$string['eventcoursesectionupdated'] = 'Course section updated';
$string['eventcoursemoduleinstancelistviewed'] = 'Course module instance list viewed';
$string['eventcourseuserreportviewed'] = 'Course user report viewed';
--- /dev/null
+<?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/>.
+
+/**
+ * Course section deleted event.
+ *
+ * @package core
+ * @copyright 2015 Ruslan Kabalin, Lancaster University.
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace core\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Course section deleted event class.
+ *
+ * @property-read array $other {
+ * Extra information about event.
+ *
+ * - int sectionnum: section number.
+ * - string sectionname: section name.
+ * }
+ *
+ * @package core
+ * @since Moodle 3.1
+ * @copyright 2015 Ruslan Kabalin, Lancaster University.
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class course_section_deleted extends base {
+
+ /**
+ * Init method.
+ *
+ * @return void
+ */
+ protected function init() {
+ $this->data['objecttable'] = 'course_sections';
+ $this->data['crud'] = 'd';
+ $this->data['edulevel'] = self::LEVEL_TEACHING;
+ }
+
+ /**
+ * Return localised event name.
+ *
+ * @return string
+ */
+ public static function get_name() {
+ return get_string('eventcoursesectiondeleted');
+ }
+
+ /**
+ * Returns non-localised event description with id's for admin use only.
+ *
+ * @return string
+ */
+ public function get_description() {
+ return "The user with id '$this->userid' deleted section number '{$this->other['sectionnum']}' " .
+ "(section name '{$this->other['sectionname']}') for the course with id '$this->courseid'";
+ }
+
+ /**
+ * Return legacy data for add_to_log().
+ *
+ * @return array
+ */
+ protected function get_legacy_logdata() {
+ return array($this->courseid, 'course', 'delete section', 'view.php?id=' . $this->courseid, $this->other['sectionnum']);
+ }
+
+ /**
+ * Custom validation.
+ *
+ * @throws \coding_exception
+ * @return void
+ */
+ protected function validate_data() {
+ parent::validate_data();
+
+ if (!isset($this->other['sectionnum'])) {
+ throw new \coding_exception('The \'sectionnum\' value must be set in other.');
+ }
+ if (!isset($this->other['sectionname'])) {
+ throw new \coding_exception('The \'sectionname\' value must be set in other.');
+ }
+ }
+}