From 0bac49dc1983824e4861086ed1ab9e13af99d76d Mon Sep 17 00:00:00 2001 From: Marina Glancy <marina@moodle.com> Date: Tue, 3 Sep 2013 17:14:13 +1000 Subject: [PATCH] MDL-37028 Integrity check for course modules and sections If section mentioned in 'orphaned' module does not exist module is added to the first available section. Also corrected whitespaces --- course/lib.php | 35 +++++++++++++++++---------------- course/tests/courselib_test.php | 9 ++++----- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/course/lib.php b/course/lib.php index 99055f9a431..9825a55fa32 100644 --- a/course/lib.php +++ b/course/lib.php @@ -871,7 +871,8 @@ function print_log_ods($course, $user, $date, $order='l.time DESC', $modname, * * Course cache is NOT rebuilt if there are any errors! * - * Used in CLI script admin/cli/fix_course_sequence.php + * This function is used each time when course cache is being rebuilt with $fullcheck = false + * and in CLI script admin/cli/fix_course_sequence.php with $fullcheck = true * * @param int $courseid id of the course * @param array $rawmods result of funciton {@link get_course_mods()} - containst @@ -918,23 +919,23 @@ function course_integrity_check($courseid, $rawmods = null, $sections = null, $f ksort($sequenceunique); // Preserve initial order of modules. $sequence = array_values($sequenceunique); $sections[$sectionid]->newsequence = join(',', $sequence); - $messages[] = $debuggingprefix. 'Sequence for course section ['. - $sectionid. '] is "'. $sections[$sectionid]->sequence. '", must be "'. $sections[$sectionid]->newsequence. '"'; + $messages[] = $debuggingprefix.'Sequence for course section ['. + $sectionid.'] is "'.$sections[$sectionid]->sequence.'", must be "'.$sections[$sectionid]->newsequence.'"'; } foreach ($sequence as $cmid) { if (array_key_exists($cmid, $modsection) && isset($rawmods[$cmid])) { // Some course module id appears to be in more than one section's sequences. $wrongsectionid = $modsection[$cmid]; - $sections[$wrongsectionid]->newsequence = trim(preg_replace("/,$cmid,/", ',', ','. $sections[$wrongsectionid]->newsequence. ','), ','); - $messages[] = $debuggingprefix. 'Course module ['. $cmid. '] must be removed from sequence of section ['. - $wrongsectionid. '] because it is also present in sequence of section ['. $sectionid. ']'; + $sections[$wrongsectionid]->newsequence = trim(preg_replace("/,$cmid,/", ',', ','.$sections[$wrongsectionid]->newsequence. ','), ','); + $messages[] = $debuggingprefix.'Course module ['.$cmid.'] must be removed from sequence of section ['. + $wrongsectionid.'] because it is also present in sequence of section ['.$sectionid.']'; } $modsection[$cmid] = $sectionid; } } } - // Add orphaned modules to their sections. + // Add orphaned modules to their sections if they exist or to section 0 otherwise. if ($fullcheck) { foreach ($rawmods as $cmid => $mod) { if (!isset($modsection[$cmid])) { @@ -943,20 +944,20 @@ function course_integrity_check($courseid, $rawmods = null, $sections = null, $f if ($mod->section && isset($sections[$mod->section])) { $modsection[$cmid] = $mod->section; } else { - $lastsection = end($sections); - $modsection[$cmid] = $lastsection->id; + $firstsection = reset($sections); + $modsection[$cmid] = $firstsection->id; } - $sections[$modsection[$cmid]]->newsequence = trim($sections[$modsection[$cmid]]->newsequence. ','. $cmid, ','); - $messages[] = $debuggingprefix. 'Course module ['. $cmid. '] is missing from sequence of section ['. - $sectionid. ']'; + $sections[$modsection[$cmid]]->newsequence = trim($sections[$modsection[$cmid]]->newsequence.','.$cmid, ','); + $messages[] = $debuggingprefix.'Course module ['.$cmid.'] is missing from sequence of section ['. + $sectionid.']'; } } foreach ($modsection as $cmid => $sectionid) { if (!isset($rawmods[$cmid])) { // Section $sectionid refers to module id that does not exist. - $sections[$sectionid]->newsequence = trim(preg_replace("/,$cmid,/", ',', ','. $sections[$sectionid]->newsequence. ','), ','); - $messages[] = $debuggingprefix. 'Course module ['. $cmid. - '] does not exist but is present in the sequence of section ['. $sectionid. ']'; + $sections[$sectionid]->newsequence = trim(preg_replace("/,$cmid,/", ',', ','.$sections[$sectionid]->newsequence.','), ','); + $messages[] = $debuggingprefix.'Course module ['.$cmid. + '] does not exist but is present in the sequence of section ['.$sectionid.']'; } } } @@ -976,8 +977,8 @@ function course_integrity_check($courseid, $rawmods = null, $sections = null, $f if (!$checkonly) { $DB->update_record('course_modules', array('id' => $cmid, 'section' => $modsection[$cmid])); } - $messages[] = $debuggingprefix. 'Course module ['. $cmid. - '] points to section ['. $mod->section.'] instead of ['. $modsection[$cmid]. ']'; + $messages[] = $debuggingprefix.'Course module ['.$cmid. + '] points to section ['.$mod->section.'] instead of ['.$modsection[$cmid].']'; } } diff --git a/course/tests/courselib_test.php b/course/tests/courselib_test.php index cd011f027c5..39c2764ee36 100644 --- a/course/tests/courselib_test.php +++ b/course/tests/courselib_test.php @@ -1782,21 +1782,20 @@ class core_course_courselib_testcase extends advanced_testcase { 'Failed integrity check for course ['. $course->id. ']. Course module ['. $page->cmid. '] is missing from sequence of section ['. $section1->id. ']', 'Failed integrity check for course ['. $course->id. ']. Course module ['. $page->cmid. - '] points to section [8765] instead of ['. $section1->id. ']'), + '] points to section [8765] instead of ['. $section0->id. ']'), course_integrity_check($course->id, null, null, true)); $section0 = $DB->get_record('course_sections', array('course' => $course->id, 'section' => 0)); $section1 = $DB->get_record('course_sections', array('course' => $course->id, 'section' => 1)); $cms = $DB->get_records('course_modules', array('course' => $course->id), 'id', 'id,section'); - $this->assertEquals($forum->cmid. ','. $quiz->cmid, $section0->sequence); - $this->assertEquals(''. $page->cmid, $section1->sequence); // Module added to section. + $this->assertEquals($forum->cmid. ','. $quiz->cmid. ','. $page->cmid, $section0->sequence); // Module added to section. $this->assertEquals($section0->id, $cms[$forum->cmid]->section); - $this->assertEquals($section1->id, $cms[$page->cmid]->section); // Section changed to section1. + $this->assertEquals($section0->id, $cms[$page->cmid]->section); // Section changed to section0. $this->assertEquals($section0->id, $cms[$quiz->cmid]->section); // 6. Module is deleted from course_modules but not deleted in sequence (integrity check with $fullcheck = true). $DB->delete_records('course_modules', array('id' => $page->cmid)); $this->assertEquals(array('Failed integrity check for course ['. $course->id. ']. Course module ['. - $page->cmid. '] does not exist but is present in the sequence of section ['. $section1->id. ']'), + $page->cmid. '] does not exist but is present in the sequence of section ['. $section0->id. ']'), course_integrity_check($course->id, null, null, true)); $section0 = $DB->get_record('course_sections', array('course' => $course->id, 'section' => 0)); $section1 = $DB->get_record('course_sections', array('course' => $course->id, 'section' => 1));