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));