MDL-41508 move_courses() bug fix and DB query improvement
authorMarina Glancy <marina@moodle.com>
Fri, 30 Aug 2013 06:29:59 +0000 (16:29 +1000)
committerMarina Glancy <marina@moodle.com>
Fri, 30 Aug 2013 06:47:25 +0000 (16:47 +1000)
course/lib.php
course/tests/courselib_test.php

index a0b5f5a..395268b 100644 (file)
@@ -2051,10 +2051,11 @@ function move_courses($courseids, $categoryid) {
     $newparent = context_coursecat::instance($category->id);
     $i = 1;
 
-    foreach ($courseids as $courseid) {
-        if ($dbcourse = $DB->get_record('course', array('id' => $courseid))) {
+    list($where, $params) = $DB->get_in_or_equal($courseids);
+    if ($dbcourses = $DB->get_records_select('course', 'id ' . $where, $params)) {
+        foreach ($dbcourses as $dbcourse) {
             $course = new stdClass();
-            $course->id = $courseid;
+            $course->id = $dbcourse->id;
             $course->category  = $category->id;
             $course->sortorder = $category->sortorder + MAX_COURSES_IN_CATEGORY - $i++;
             if ($category->visible == 0) {
@@ -2071,6 +2072,9 @@ function move_courses($courseids, $categoryid) {
             // Update the course object we are passing to the event.
             $dbcourse->category = $course->category;
             $dbcourse->sortorder = $course->sortorder;
+            if (isset($course->visible)) {
+                $dbcourse->visible = $course->visible;
+            }
 
             // Trigger a course updated event.
             $event = \core\event\course_updated::create(array(
index 28837fc..8b07e41 100644 (file)
@@ -1364,6 +1364,9 @@ class core_course_courselib_testcase extends advanced_testcase {
         // Create a category we are going to move this course to.
         $category = $this->getDataGenerator()->create_category();
 
+        // Create a hidden category we are going to move this course to.
+        $categoryhidden = $this->getDataGenerator()->create_category(array('visible' => 0));
+
         // Catch the update events.
         $sink = $this->redirectEvents();
 
@@ -1382,11 +1385,18 @@ class core_course_courselib_testcase extends advanced_testcase {
         // Return the moved course information from the DB.
         $movedcourse = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST);
 
+        // Now move the course to the hidden category, this will also trigger an event.
+        move_courses(array($course->id), $categoryhidden->id);
+
+        // Return the moved course information from the DB.
+        $movedcoursehidden = $DB->get_record('course', array('id' => $course->id), '*', MUST_EXIST);
+
         // Now we want to set the sortorder back to what it was before fix_course_sortorder() was called. The reason for
         // this is because update_course() and move_courses() call fix_course_sortorder() which alters the sort order in
         // the DB, but it does not set the value of the sortorder for the course object passed to the event.
         $updatedcourse->sortorder = $sortorder;
         $movedcourse->sortorder = $category->sortorder + MAX_COURSES_IN_CATEGORY - 1;
+        $movedcoursehidden->sortorder = $categoryhidden->sortorder + MAX_COURSES_IN_CATEGORY - 1;
 
         // Capture the events.
         $events = $sink->get_events();
@@ -1414,6 +1424,17 @@ class core_course_courselib_testcase extends advanced_testcase {
         $this->assertEventLegacyData($movedcourse, $event);
         $expectedlog = array($movedcourse->id, 'course', 'move', 'edit.php?id=' . $movedcourse->id, $movedcourse->id);
         $this->assertEventLegacyLogData($expectedlog, $event);
+
+        $event = $events[2];
+        $this->assertInstanceOf('\core\event\course_updated', $event);
+        $this->assertEquals('course', $event->objecttable);
+        $this->assertEquals($movedcoursehidden->id, $event->objectid);
+        $this->assertEquals(context_course::instance($movedcoursehidden->id)->id, $event->contextid);
+        $this->assertEquals($movedcoursehidden, $event->get_record_snapshot('course', $movedcoursehidden->id));
+        $this->assertEquals('course_updated', $event->get_legacy_eventname());
+        $this->assertEventLegacyData($movedcoursehidden, $event);
+        $expectedlog = array($movedcoursehidden->id, 'course', 'move', 'edit.php?id=' . $movedcoursehidden->id, $movedcoursehidden->id);
+        $this->assertEventLegacyLogData($expectedlog, $event);
     }
 
     /**