$bulkmovecourses = optional_param('bulkmovecourses', false, PARAM_BOOL); $bulkmovecategories = optional_param('bulkmovecategories', false, PARAM_BOOL); $bulkresortcategories = optional_param('bulksort', false, PARAM_BOOL); if ($bulkmovecourses) { // Move courses out of the current category and into a new category. // They must have specified a category. required_param('categoryid', PARAM_INT); $movetoid = required_param('movecoursesto', PARAM_INT); $courseids = optional_param_array('bc', false, PARAM_INT); if ($courseids === false) { break; } $moveto = coursecat::get($movetoid); try { // If this fails we want to catch the exception and report it. $redirectback = \core_course\management\helper::move_courses_into_category($moveto, $courseids); if ($redirectback) { $a = new stdClass(); $a->category = $moveto->get_formatted_name(); $a->courses = count($courseids); $redirectmessage = get_string('bulkmovecoursessuccess', 'moodle', $a); } } catch (moodle_exception $ex) { $redirectback = false; $notificationsfail[] = $ex->getMessage(); } } else { if ($bulkmovecategories) { $categoryids = optional_param_array('bcat', array(), PARAM_INT); $movetocatid = required_param('movecategoriesto', PARAM_INT); $movetocat = coursecat::get($movetocatid);
public function test_move_courses_into_category() { global $DB, $CFG; $this->resetAfterTest(true); $generator = $this->getDataGenerator(); $cat1 = $generator->create_category(); $cat2 = $generator->create_category(); $sub1 = $generator->create_category(array('parent' => $cat1->id)); $sub2 = $generator->create_category(array('parent' => $cat1->id)); $course1 = $generator->create_course(array('category' => $cat1->id)); $course2 = $generator->create_course(array('category' => $sub1->id)); $course3 = $generator->create_course(array('category' => $sub1->id)); $course4 = $generator->create_course(array('category' => $cat2->id)); $syscontext = context_system::instance(); list($user, $roleid) = $this->get_user_objects($generator, $syscontext->id); course_capability_assignment::allow(array(self::CATEGORY_MANAGE, self::CATEGORY_VIEWHIDDEN), $roleid, $syscontext->id); // Check they are where we think they are. $this->assertEquals(1, $cat1->get_courses_count()); $this->assertEquals(1, $cat2->get_courses_count()); $this->assertEquals(2, $sub1->get_courses_count()); $this->assertEquals(0, $sub2->get_courses_count()); // Move the courses in sub category 1 to sub category 2. $this->assertTrue(\core_course\management\helper::move_courses_into_category($sub2->id, array($course2->id, $course3->id))); $this->assertEquals(1, $cat1->get_courses_count()); $this->assertEquals(1, $cat2->get_courses_count()); $this->assertEquals(0, $sub1->get_courses_count()); $this->assertEquals(2, $sub2->get_courses_count()); $courses = $DB->get_records('course', array('category' => $sub2->id), 'id'); $this->assertEquals(array((int) $course2->id, (int) $course3->id), array_keys($courses)); // Move the courses in sub category 2 back into to sub category 1. $this->assertTrue(\core_course\management\helper::move_courses_into_category($sub1->id, array($course2->id, $course3->id))); $this->assertEquals(1, $cat1->get_courses_count()); $this->assertEquals(1, $cat2->get_courses_count()); $this->assertEquals(2, $sub1->get_courses_count()); $this->assertEquals(0, $sub2->get_courses_count()); $courses = $DB->get_records('course', array('category' => $sub1->id), 'id'); $this->assertEquals(array((int) $course2->id, (int) $course3->id), array_keys($courses)); // Try moving just one course. $this->assertTrue(\core_course\management\helper::move_courses_into_category($sub2->id, $course4->id)); $this->assertEquals(1, $cat1->get_courses_count()); $this->assertEquals(0, $cat2->get_courses_count()); $this->assertEquals(2, $sub1->get_courses_count()); $this->assertEquals(1, $sub2->get_courses_count()); $courses = $DB->get_records('course', array('category' => $sub2->id), 'id'); $this->assertEquals(array((int) $course4->id), array_keys($courses)); // Current state: // * $cat1 => $course1 // * $sub1 => $course2, $course3 // * $sub2 => $course4 // * $cat2 =>. // Prevent the user from being able to move into $sub2. $sub2cap = course_capability_assignment::prohibit(self::CATEGORY_MANAGE, $roleid, $sub2->get_context()->id); $sub2 = coursecat::get($sub2->id); // Suppress debugging messages for a moment. $olddebug = $CFG->debug; $CFG->debug = 0; // Try to move a course into sub2. This shouldn't be possible because you should always be able to undo what you've done. // Try moving just one course. try { \core_course\management\helper::move_courses_into_category($sub2->id, array($course2->id)); $this->fail('Invalid move of course between categories, action can\'t be undone.'); } catch (moodle_exception $ex) { $this->assertEquals(get_string('cannotmovecourses', 'error'), $ex->getMessage()); } // Nothing should have changed. $this->assertEquals(1, $cat1->get_courses_count()); $this->assertEquals(0, $cat2->get_courses_count()); $this->assertEquals(2, $sub1->get_courses_count()); $this->assertEquals(1, $sub2->get_courses_count()); // Now try moving a course out of sub2. Again should not be possible. // Try to move a course into sub2. This shouldn't be possible because you should always be able to undo what you've done. // Try moving just one course. try { \core_course\management\helper::move_courses_into_category($cat2->id, array($course4->id)); $this->fail('Invalid move of course between categories, action can\'t be undone.'); } catch (moodle_exception $ex) { $this->assertEquals(get_string('cannotmovecourses', 'error'), $ex->getMessage()); } // Nothing should have changed. $this->assertEquals(1, $cat1->get_courses_count()); $this->assertEquals(0, $cat2->get_courses_count()); $this->assertEquals(2, $sub1->get_courses_count()); $this->assertEquals(1, $sub2->get_courses_count()); $CFG->debug = $olddebug; }
switch ($action) { case 'movecourseup': $courseid = required_param('courseid', PARAM_INT); $outcome->outcome = \core_course\management\helper::action_course_change_sortorder_up_one_by_record($courseid); break; case 'movecoursedown': $courseid = required_param('courseid', PARAM_INT); $outcome->outcome = \core_course\management\helper::action_course_change_sortorder_down_one_by_record($courseid); break; case 'movecourseintocategory': $courseid = required_param('courseid', PARAM_INT); $categoryid = required_param('categoryid', PARAM_INT); $course = get_course($courseid); $oldcategory = coursecat::get($course->category); $category = coursecat::get($categoryid); $outcome->outcome = \core_course\management\helper::move_courses_into_category($category, $courseid); $perpage = (int) get_user_preferences('coursecat_management_perpage', $CFG->coursesperpage); $totalcourses = $oldcategory->get_courses_count(); $totalpages = ceil($totalcourses / $perpage); if ($totalpages == 0) { $str = get_string('nocoursesyet'); } else { if ($totalpages == 1) { $str = get_string('showingacourses', 'moodle', $totalcourses); } else { $a = new stdClass(); $a->start = $page * $perpage + 1; $a->end = min(($page + 1) * $perpage, $totalcourses); $a->total = $totalcourses; $str = get_string('showingxofycourses', 'moodle', $a); }