diff --git a/course/changenumsections.php b/course/changenumsections.php index deed3670e85..beeaea930bf 100644 --- a/course/changenumsections.php +++ b/course/changenumsections.php @@ -52,8 +52,8 @@ if (isset($courseformatoptions['numsections'])) { // Don't go less than 0, intentionally redirect silently (for the case of // double clicks). if ($courseformatoptions['numsections'] >= 0) { - course_get_format($course)->update_course_format_options( - array('numsections' => $courseformatoptions['numsections'])); + update_course((object)array('id' => $course->id, + 'numsections' => $courseformatoptions['numsections'])); } } diff --git a/course/format/topics/lib.php b/course/format/topics/lib.php index f5a8067f7fb..034b58e00c2 100644 --- a/course/format/topics/lib.php +++ b/course/format/topics/lib.php @@ -315,8 +315,8 @@ class format_topics extends format_base { */ public function update_course_format_options($data, $oldcourse = null) { global $DB; + $data = (array)$data; if ($oldcourse !== null) { - $data = (array)$data; $oldcourse = (array)$oldcourse; $options = $this->course_format_options(); foreach ($options as $key => $unused) { @@ -337,7 +337,19 @@ class format_topics extends format_base { } } } - return $this->update_format_options($data); + $changed = $this->update_format_options($data); + if ($changed && array_key_exists('numsections', $data)) { + // If the numsections was decreased, try to completely delete the orphaned sections (unless they are not empty). + $numsections = (int)$data['numsections']; + $maxsection = $DB->get_field_sql('SELECT max(section) from {course_sections} + WHERE course = ?', array($this->courseid)); + for ($sectionnum = $maxsection; $sectionnum > $numsections; $sectionnum--) { + if (!$this->delete_section($sectionnum, false)) { + break; + } + } + } + return $changed; } /** diff --git a/course/format/topics/tests/format_topics_test.php b/course/format/topics/tests/format_topics_test.php new file mode 100644 index 00000000000..09dea51a6cd --- /dev/null +++ b/course/format/topics/tests/format_topics_test.php @@ -0,0 +1,64 @@ +. + +/** + * format_topics related unit tests + * + * @package format_topics + * @copyright 2015 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->dirroot . '/course/lib.php'); + +/** + * format_topics related unit tests + * + * @package format_topics + * @copyright 2015 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class format_topics_testcase extends advanced_testcase { + + public function test_update_course_numsections() { + global $DB; + $this->resetAfterTest(true); + + $generator = $this->getDataGenerator(); + + $course = $generator->create_course(array('numsections' => 10, 'format' => 'topics'), + array('createsections' => true)); + $generator->create_module('assign', array('course' => $course, 'section' => 7)); + + $this->setAdminUser(); + + $this->assertEquals(11, $DB->count_records('course_sections', array('course' => $course->id))); + + // Change the numsections to 8, last two sections did not have any activities, they should be deleted. + update_course((object)array('id' => $course->id, 'numsections' => 8)); + $this->assertEquals(9, $DB->count_records('course_sections', array('course' => $course->id))); + $this->assertEquals(9, count(get_fast_modinfo($course)->get_section_info_all())); + + // Change the numsections to 5, section 8 should be deleted but section 7 should remain as it has activities. + update_course((object)array('id' => $course->id, 'numsections' => 6)); + $this->assertEquals(8, $DB->count_records('course_sections', array('course' => $course->id))); + $this->assertEquals(8, count(get_fast_modinfo($course)->get_section_info_all())); + $this->assertEquals(6, course_get_format($course)->get_course()->numsections); + } +} diff --git a/course/format/weeks/lib.php b/course/format/weeks/lib.php index 1e472d1f134..59a58b302f2 100644 --- a/course/format/weeks/lib.php +++ b/course/format/weeks/lib.php @@ -324,8 +324,8 @@ class format_weeks extends format_base { */ public function update_course_format_options($data, $oldcourse = null) { global $DB; + $data = (array)$data; if ($oldcourse !== null) { - $data = (array)$data; $oldcourse = (array)$oldcourse; $options = $this->course_format_options(); foreach ($options as $key => $unused) { @@ -346,7 +346,19 @@ class format_weeks extends format_base { } } } - return $this->update_format_options($data); + $changed = $this->update_format_options($data); + if ($changed && array_key_exists('numsections', $data)) { + // If the numsections was decreased, try to completely delete the orphaned sections (unless they are not empty). + $numsections = (int)$data['numsections']; + $maxsection = $DB->get_field_sql('SELECT max(section) from {course_sections} + WHERE course = ?', array($this->courseid)); + for ($sectionnum = $maxsection; $sectionnum > $numsections; $sectionnum--) { + if (!$this->delete_section($sectionnum, false)) { + break; + } + } + } + return $changed; } /** diff --git a/course/format/weeks/tests/format_weeks_test.php b/course/format/weeks/tests/format_weeks_test.php new file mode 100644 index 00000000000..a388b59706e --- /dev/null +++ b/course/format/weeks/tests/format_weeks_test.php @@ -0,0 +1,64 @@ +. + +/** + * format_weeks related unit tests + * + * @package format_weeks + * @copyright 2015 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->dirroot . '/course/lib.php'); + +/** + * format_weeks related unit tests + * + * @package format_weeks + * @copyright 2015 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class format_weeks_testcase extends advanced_testcase { + + public function test_update_course_numsections() { + global $DB; + $this->resetAfterTest(true); + + $generator = $this->getDataGenerator(); + + $course = $generator->create_course(array('numsections' => 10, 'format' => 'weeks'), + array('createsections' => true)); + $generator->create_module('assign', array('course' => $course, 'section' => 7)); + + $this->setAdminUser(); + + $this->assertEquals(11, $DB->count_records('course_sections', array('course' => $course->id))); + + // Change the numsections to 8, last two sections did not have any activities, they should be deleted. + update_course((object)array('id' => $course->id, 'numsections' => 8)); + $this->assertEquals(9, $DB->count_records('course_sections', array('course' => $course->id))); + $this->assertEquals(9, count(get_fast_modinfo($course)->get_section_info_all())); + + // Change the numsections to 5, section 8 should be deleted but section 7 should remain as it has activities. + update_course((object)array('id' => $course->id, 'numsections' => 6)); + $this->assertEquals(8, $DB->count_records('course_sections', array('course' => $course->id))); + $this->assertEquals(8, count(get_fast_modinfo($course)->get_section_info_all())); + $this->assertEquals(6, course_get_format($course)->get_course()->numsections); + } +}