Uploaded image for project: 'Moodle'
  1. Moodle
  2. MDL-42498

Improve backup/restore within Moodle (eg. course and activity duplication) for 2.4 and 2.5

XMLWordPrintable

    • Icon: Improvement Improvement
    • Resolution: Won't Fix
    • Icon: Minor Minor
    • None
    • 2.4.3, 2.5
    • Backup, Performance
    • None
    • Any
    • MOODLE_24_STABLE, MOODLE_25_STABLE
    • Hide

      On backup/moodle2/backup_custom_fields.php change fill_values function of file_nested_element class

          public function fill_values($values) {
              // Fill values
              parent::fill_values($values);
              // Do our own tasks (copy file from moodle to backup)
       
              //ADD THIS!
              $bc = backup_ui::load_controller($backupid);
                  if($bc && $bc->get_plan()->get_mode() != backup::MODE_IMPORT){
                  try {
                      backup_file_manager::copy_file_moodle2backup($this->backupid, $values);
                  } catch (file_exception $e) {
                      $this->add_result(array('missing_files_in_pool' => true));
                      $this->add_log('missing file in pool: ' . $e->debuginfo, backup::LOG_WARNING);
                  }
              }
          }
      

      On backup/util/dbops/restore_dbops.class.php on funcion send_files_to_pool change the contents inside "if (empty($file->repositoryid)) {"

      if (empty($file->repositoryid)) {
                      // create the file in the filepool if it does not exist yet
                      if (!$fs->file_exists($newcontextid, $component, $filearea, $rec->newitemid, $file->filepath, $file->filename)) {
                          //ADD THIS
                          if($copy_fileid = $DB->get_field('files','id',array('contenthash'=>$file->contenthash))){
                              $file_record = array(
                                  'contextid'   => $newcontextid,
                                  'component'   => $component,
                                  'filearea'    => $filearea,
                                  'itemid'      => $rec->newitemid,
                                  'filepath'    => $file->filepath,
                                  'filename'    => $file->filename,
                                  'timecreated' => $file->timecreated,
                                  'timemodified'=> $file->timemodified,
                                  'userid'      => $mappeduserid,
                                  'author'      => $file->author,
                                  'license'     => $file->license,
                                  'sortorder'   => $file->sortorder
                              );
                              $fs->create_file_from_storedfile($file_record, $copy_fileid);
                          } else {
                              // this is a regular file, it must be present in the backup pool
                              $backuppath = $basepath . backup_file_manager::get_backup_content_file_location($file->contenthash);
       
                              // The file is not found in the backup.
                              if (!file_exists($backuppath)) {
                                  $result = new stdClass();
                                  $result->code = 'file_missing_in_backup';
                                  $result->message = sprintf('missing file %s%s in backup', $file->filepath, $file->filename);
                                  $result->level = backup::LOG_WARNING;
                                  $results[] = $result;
                                  continue;
                              }
                              
                              $file_record = array(
                                  'contextid'   => $newcontextid,
                                  'component'   => $component,
                                  'filearea'    => $filearea,
                                  'itemid'      => $rec->newitemid,
                                  'filepath'    => $file->filepath,
                                  'filename'    => $file->filename,
                                  'timecreated' => $file->timecreated,
                                  'timemodified'=> $file->timemodified,
                                  'userid'      => $mappeduserid,
                                  'author'      => $file->author,
                                  'license'     => $file->license,
                                  'sortorder'   => $file->sortorder
                              );
                              $fs->create_file_from_pathname($file_record, $backuppath);
                          }
      }
      
      

      Show
      On backup/moodle2/backup_custom_fields.php change fill_values function of file_nested_element class public function fill_values($values) { // Fill values parent::fill_values($values); // Do our own tasks (copy file from moodle to backup)   //ADD THIS! $bc = backup_ui::load_controller($backupid); if($bc && $bc->get_plan()->get_mode() != backup::MODE_IMPORT){ try { backup_file_manager::copy_file_moodle2backup($this->backupid, $values); } catch (file_exception $e) { $this->add_result(array('missing_files_in_pool' => true)); $this->add_log('missing file in pool: ' . $e->debuginfo, backup::LOG_WARNING); } } } On backup/util/dbops/restore_dbops.class.php on funcion send_files_to_pool change the contents inside "if (empty($file->repositoryid)) {" if (empty($file->repositoryid)) { // create the file in the filepool if it does not exist yet if (!$fs->file_exists($newcontextid, $component, $filearea, $rec->newitemid, $file->filepath, $file->filename)) { //ADD THIS if($copy_fileid = $DB->get_field('files','id',array('contenthash'=>$file->contenthash))){ $file_record = array( 'contextid' => $newcontextid, 'component' => $component, 'filearea' => $filearea, 'itemid' => $rec->newitemid, 'filepath' => $file->filepath, 'filename' => $file->filename, 'timecreated' => $file->timecreated, 'timemodified'=> $file->timemodified, 'userid' => $mappeduserid, 'author' => $file->author, 'license' => $file->license, 'sortorder' => $file->sortorder ); $fs->create_file_from_storedfile($file_record, $copy_fileid); } else { // this is a regular file, it must be present in the backup pool $backuppath = $basepath . backup_file_manager::get_backup_content_file_location($file->contenthash);   // The file is not found in the backup. if (!file_exists($backuppath)) { $result = new stdClass(); $result->code = 'file_missing_in_backup'; $result->message = sprintf('missing file %s%s in backup', $file->filepath, $file->filename); $result->level = backup::LOG_WARNING; $results[] = $result; continue; } $file_record = array( 'contextid' => $newcontextid, 'component' => $component, 'filearea' => $filearea, 'itemid' => $rec->newitemid, 'filepath' => $file->filepath, 'filename' => $file->filename, 'timecreated' => $file->timecreated, 'timemodified'=> $file->timemodified, 'userid' => $mappeduserid, 'author' => $file->author, 'license' => $file->license, 'sortorder' => $file->sortorder ); $fs->create_file_from_pathname($file_record, $backuppath); } }

      MDL-37761 has resolved this issue in master, but was not backported due to numerous API changes. We should consider introducing the same improvement in 2.4 and 2.5 using another method where no new API is introduced.

            markn Mark Nelson
            pferre22 Pau Ferrer
            Votes:
            1 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved:

                Error rendering 'clockify-timesheets-time-tracking-reports:timer-sidebar'. Please contact your Jira administrators.