diff --git a/admin/cli/import.php b/admin/cli/import.php new file mode 100644 index 00000000000..91bcb91d60a --- /dev/null +++ b/admin/cli/import.php @@ -0,0 +1,132 @@ +. + +/** + * This script allows to import a course from CLI. + * + * @package core + * @subpackage cli + * @author Tomo Tsuyuki + * @copyright 2023 Catalyst IT + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +define('CLI_SCRIPT', 1); + +require(__DIR__ . '/../../config.php'); +require_once($CFG->libdir . '/clilib.php'); +require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php'); +require_once($CFG->dirroot . "/backup/util/includes/restore_includes.php"); + +list($options, $unrecognized) = cli_get_params([ + 'srccourseid' => '', + 'srccmid' => '', + 'dstcourseid' => '', + 'showdebugging' => false, + 'help' => false, +], [ + 's' => 'showdebugging', + 'h' => 'help', +]); + +if ($unrecognized) { + $unrecognized = implode("\n ", $unrecognized); + cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); +} + +if ($options['help'] || + !(($options['srccourseid'] && $options['dstcourseid']) + || ($options['srccmid'] && $options['dstcourseid']))) { + $help = <<get_record('course', ['id' => $options['srccourseid']], 'id')) { + throw new \moodle_exception('invalidcourseid'); + } + if (!$dstcourse = $DB->get_record('course', ['id' => $options['dstcourseid']], 'id')) { + throw new \moodle_exception('invalidcourseid'); + } + + cli_heading(get_string('importfromcoursetocourse', 'backup', (object)$options)); + $bc = new backup_controller(backup::TYPE_1COURSE, $srccourse->id, backup::FORMAT_MOODLE, + backup::INTERACTIVE_NO, backup::MODE_IMPORT, $admin->id); + $backupid = $bc->get_backupid(); + $bc->execute_plan(); + $bc->destroy(); + cli_heading(get_string('backupthenrestore', 'backup')); + + $rc = new restore_controller($backupid, $dstcourse->id, backup::INTERACTIVE_NO, + backup::MODE_SAMESITE, $admin->id, backup::TARGET_EXISTING_ADDING); + $rc->execute_precheck(); + $rc->execute_plan(); + $rc->destroy(); + cli_heading(get_string('restoredcourseid', 'backup', $dstcourse->id)); +} else if (!empty($options['srccmid']) && !empty($options['dstcourseid'])) { + // Import from course module into course. + if (!$cm = $DB->get_record('course_modules', ['id' => $options['srccmid']], 'id')) { + throw new \moodle_exception('invalidcoursemoduleid', 'error', '', $options['srccmid']); + } + if (!$course = $DB->get_record('course', ['id' => $options['dstcourseid']], 'id')) { + throw new \moodle_exception('invalidcourseid'); + } + + cli_heading(get_string('importfromccmidtocourse', 'backup', (object)$options)); + $bc = new backup_controller(backup::TYPE_1ACTIVITY, $cm->id, backup::FORMAT_MOODLE, + backup::INTERACTIVE_NO, backup::MODE_IMPORT, $admin->id); + $backupid = $bc->get_backupid(); + $bc->execute_plan(); + $bc->destroy(); + cli_heading(get_string('backupthenrestore', 'backup')); + + $rc = new restore_controller($backupid, $course->id, backup::INTERACTIVE_NO, + backup::MODE_SAMESITE, $admin->id, backup::TARGET_EXISTING_ADDING); + $rc->execute_precheck(); + $rc->execute_plan(); + $rc->destroy(); + cli_heading(get_string('restoredcourseid', 'backup', $course->id)); +} else { + throw new \moodle_exception('invalidoption'); +} + +exit(0); diff --git a/lang/en/backup.php b/lang/en/backup.php index c7ac6645ced..061aab53ff6 100644 --- a/lang/en/backup.php +++ b/lang/en/backup.php @@ -101,6 +101,7 @@ $string['backupstage2action'] = 'Next'; $string['backupstage4action'] = 'Perform backup'; $string['backupstage8action'] = 'Continue'; $string['backupstage16action'] = 'Continue'; +$string['backupthenrestore'] = 'Backup completed. Start to restore.'; $string['backuptype'] = 'Type'; $string['backuptypeactivity'] = 'Activity'; $string['backuptypecourse'] = 'Course'; @@ -265,6 +266,8 @@ $string['importcurrentstage2'] = 'Schema settings'; $string['importcurrentstage4'] = 'Confirmation and review'; $string['importcurrentstage8'] = 'Perform import'; $string['importcurrentstage16'] = 'Complete'; +$string['importfromccmidtocourse'] = 'Import from cmid:{$a->srccmid} into course:{$a->dstcourseid}'; +$string['importfromcoursetocourse'] = 'Import from course:{$a->srccourseid} into course:{$a->dstcourseid}'; $string['importrootsettings'] = 'Import settings'; $string['importsettings'] = 'General import settings'; $string['importsuccess'] = 'Import complete. Click continue to return to the course.';