From 16111a3359f83ca2de0504533c1d0822ac831688 Mon Sep 17 00:00:00 2001 From: meirzamoodle Date: Mon, 7 Apr 2025 18:24:52 +0700 Subject: [PATCH] MDL-84058 cli: Add a backup check for course module names Co-authored-by: Jun Pataleta --- admin/cli/restore_backup.php | 57 +++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/admin/cli/restore_backup.php b/admin/cli/restore_backup.php index 2ee45af2d9a..bde39121e63 100644 --- a/admin/cli/restore_backup.php +++ b/admin/cli/restore_backup.php @@ -55,13 +55,14 @@ If courseid is set, course module/s will be added into the course. Options: -f, --file=STRING Path to the backup file. --c, --categoryid=INT ID of the course category to restore to. --C, --courseid=INT ID of the course to restore to. This option is ignored if categoryid is set. +-c, --categoryid=INT ID of the course category to restore to. This option is ignored when restoring an activity and courseid is set. +-C, --courseid=INT ID of the course to restore to. This option is ignored when restoring a course and the categoryid is set. -s, --showdebugging Show developer level debugging information -h, --help Print out this help. Example: -\$sudo -u www-data /usr/bin/php admin/cli/restore_backup.php --file=/path/to/backup/file.mbz --categoryid=1\n +\$sudo -u www-data /usr/bin/php admin/cli/restore_backup.php --file=/path/to/backup/coursebackup.mbz --categoryid=1\n +\$sudo -u www-data /usr/bin/php admin/cli/restore_backup.php --file=/path/to/backup/activitybackup.mbz --courseid=1\n EOL; echo $help; @@ -84,11 +85,15 @@ if ($options['categoryid']) { if (!$category = $DB->get_record('course_categories', ['id' => $options['categoryid']], 'id')) { throw new \moodle_exception('invalidcategoryid'); } -} else if ($options['courseid']) { +} + +if ($options['courseid']) { if (!$course = $DB->get_record('course', ['id' => $options['courseid']], 'id')) { throw new \moodle_exception('invalidcourseid'); } -} else { +} + +if (empty($category) && empty($course)) { throw new \moodle_exception('invalidoption'); } @@ -100,28 +105,46 @@ $fp = get_file_packer('application/vnd.moodle.backup'); $fp->extract_to_pathname($options['file'], $path); cli_heading(get_string('preprocessingbackupfile')); -try { - list($fullname, $shortname) = restore_dbops::calculate_course_names(0, get_string('restoringcourse', 'backup'), - get_string('restoringcourseshortname', 'backup')); - if (!empty($course)) { - $courseid = $course->id; - $rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO, - backup::MODE_GENERAL, $admin->id, backup::TARGET_EXISTING_ADDING); - } else { +try { + // Create a temporary restore controller to determine the restore type. + $tmprc = new restore_controller($backupdir, SITEID, backup::INTERACTIVE_NO, + backup::MODE_GENERAL, $admin->id, backup::TARGET_EXISTING_ADDING); + // Restore the backup into a new course if: + // - It is a course backup and the category is set. + // - It is an activity backup and the course is not set. + $restoreasnewcourse = ($tmprc->get_type() === backup::TYPE_1COURSE && !empty($category)) || + ($tmprc->get_type() !== backup::TYPE_1COURSE && empty($course)); + // Make sure to clean up the temporary restore controller. + $tmprc->destroy(); + + if ($restoreasnewcourse) { + list($fullname, $shortname) = restore_dbops::calculate_course_names(0, get_string('restoringcourse', 'backup'), + get_string('restoringcourseshortname', 'backup')); $courseid = restore_dbops::create_new_course($fullname, $shortname, $category->id); $rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO, backup::MODE_GENERAL, $admin->id, backup::TARGET_NEW_COURSE); + } else { + $courseid = $course->id; + $rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO, + backup::MODE_GENERAL, $admin->id, backup::TARGET_EXISTING_ADDING); } $rc->execute_precheck(); $rc->execute_plan(); $rc->destroy(); - // Rename course name if the backup is from course module and restore to category. - if (empty($course)) { + // Rename the course's full and short names with the backup file's original names if the backup file is an activity backup + // that is restored to a new course. + if ($restoreasnewcourse && $rc->get_type() !== backup::TYPE_1COURSE) { $course = get_course($courseid); - list($fullname, $shortname) = restore_dbops::calculate_course_names(0, get_string('restoretonewcourse', 'backup'), - get_string('newcourse')); + $backupinfo = $rc->get_info(); + $tmpfullname = $backupinfo->original_course_fullname ?? get_string('restoretonewcourse', 'backup'); + $tmpshortname = $backupinfo->original_course_shortname ?? get_string('newcourse'); + list($fullname, $shortname) = restore_dbops::calculate_course_names( + courseid: 0, + fullname: $tmpfullname, + shortname: $tmpshortname, + ); $course->fullname = $fullname; $course->shortname = $shortname; $course->visible = 1;