Merge branch 'MDL-52811_prevent_forcelang' of git://github.com/davosmith/moodle
authorDavid Monllao <davidm@moodle.com>
Tue, 6 Feb 2018 07:00:11 +0000 (08:00 +0100)
committerDavid Monllao <davidm@moodle.com>
Tue, 6 Feb 2018 07:00:11 +0000 (08:00 +0100)
1  2 
backup/moodle2/restore_stepslib.php

@@@ -1827,6 -1827,7 +1827,7 @@@ class restore_course_structure_step ext
          // When restoring to a new course we can set all the things except for the ID number.
          $canchangeidnumber = $isnewcourse || has_capability('moodle/course:changeidnumber', $context, $userid);
          $canchangesummary = $isnewcourse || has_capability('moodle/course:changesummary', $context, $userid);
+         $canforcelanguage = has_capability('moodle/course:setforcedlanguage', $context, $userid);
  
          $data = (object)$data;
          $data->id = $this->get_courseid();
              unset($data->summaryformat);
          }
  
+         // Unset lang if user can't change it.
+         if (!$canforcelanguage) {
+             unset($data->lang);
+         }
          // Only allow the idnumber to be set if the user has permission and the idnumber is not already in use by
          // another course on this site.
          if (!empty($data->idnumber) && $canchangeidnumber && $this->task->is_samesite()
              $data->completionnotify = 0;
          }
          $languages = get_string_manager()->get_list_of_translations(); // Get languages for quick search
-         if (!array_key_exists($data->lang, $languages)) {
+         if (isset($data->lang) && !array_key_exists($data->lang, $languages)) {
              $data->lang = '';
          }
  
@@@ -4394,21 -4400,6 +4400,21 @@@ class restore_create_categories_and_que
          }
          $data->contextid = $mapping->parentitemid;
  
 +        // Before 3.5, question categories could be created at top level.
 +        // From 3.5 onwards, all question categories should be a child of a special category called the "top" category.
 +        $backuprelease = floatval($this->get_task()->get_info()->backup_release);
 +        preg_match('/(\d{8})/', $this->get_task()->get_info()->moodle_release, $matches);
 +        $backupbuild = (int)$matches[1];
 +        $before35 = false;
 +        if ($backuprelease < 3.5 || $backupbuild < 20180205) {
 +            $before35 = true;
 +        }
 +        if (empty($mapping->info->parent) &&
 +                ($before35 || $mapping->info->contextlevel == CONTEXT_MODULE)) {
 +            $top = question_get_top_category($data->contextid, true);
 +            $data->parent = $top->id;
 +        }
 +
          // Before 3.1, the 'stamp' field could be erroneously duplicated.
          // From 3.1 onwards, there's a unique index of (contextid, stamp).
          // If we encounter a duplicate in an old restore file, just generate a new stamp.
                       'backupid' => $this->get_restoreid(),
                       'itemname' => 'question_category_created'));
          foreach ($qcats as $qcat) {
 -            $newparent = 0;
              $dbcat = $DB->get_record('question_categories', array('id' => $qcat->newitemid));
              // Get new parent (mapped or created, so we look in quesiton_category mappings)
              if ($newparent = $DB->get_field('backup_ids_temp', 'newitemid', array(
                  }
              }
              // Here with $newparent empty, problem with contexts or remapping, set it to top cat
 -            if (!$newparent) {
 -                $DB->set_field('question_categories', 'parent', 0, array('id' => $dbcat->id));
 +            if (!$newparent && $dbcat->parent) {
 +                $topcat = question_get_top_category($dbcat->contextid, true);
 +                if ($dbcat->parent != $topcat->id) {
 +                    $DB->set_field('question_categories', 'parent', $topcat->id, array('id' => $dbcat->id));
 +                }
              }
          }
  
                    'backupid' => $this->get_restoreid(),
                    'itemname' => 'question_created'));
          foreach ($qs as $q) {
 -            $newparent = 0;
              $dbq = $DB->get_record('question', array('id' => $q->newitemid));
              // Get new parent (mapped or created, so we look in question mappings)
              if ($newparent = $DB->get_field('backup_ids_temp', 'newitemid', array(
@@@ -4625,38 -4615,18 +4631,38 @@@ class restore_move_module_questions_cat
      protected function define_execution() {
          global $DB;
  
 +        $backuprelease = floatval($this->task->get_info()->backup_release);
 +        preg_match('/(\d{8})/', $this->task->get_info()->moodle_release, $matches);
 +        $backupbuild = (int)$matches[1];
 +        $before35 = false;
 +        if ($backuprelease < 3.5 || $backupbuild < 20180205) {
 +            $before35 = true;
 +        }
 +
          $contexts = restore_dbops::restore_get_question_banks($this->get_restoreid(), CONTEXT_MODULE);
          foreach ($contexts as $contextid => $contextlevel) {
              // Only if context mapping exists (i.e. the module has been restored)
              if ($newcontext = restore_dbops::get_backup_ids_record($this->get_restoreid(), 'context', $contextid)) {
                  // Update all the qcats having their parentitemid set to the original contextid
 -                $modulecats = $DB->get_records_sql("SELECT itemid, newitemid
 +                $modulecats = $DB->get_records_sql("SELECT itemid, newitemid, info
                                                        FROM {backup_ids_temp}
                                                       WHERE backupid = ?
                                                         AND itemname = 'question_category'
                                                         AND parentitemid = ?", array($this->get_restoreid(), $contextid));
                  foreach ($modulecats as $modulecat) {
 -                    $DB->set_field('question_categories', 'contextid', $newcontext->newitemid, array('id' => $modulecat->newitemid));
 +                    $cat = new stdClass();
 +                    $cat->id = $modulecat->newitemid;
 +                    $cat->contextid = $newcontext->newitemid;
 +
 +                    // Before 3.5, question categories could be created at top level.
 +                    // From 3.5 onwards, all question categories should be a child of a special category called the "top" category.
 +                    $info = backup_controller_dbops::decode_backup_temp_info($modulecat->info);
 +                    if ($before35 && empty($info->parent)) {
 +                        $top = question_get_top_category($newcontext->newitemid, true);
 +                        $cat->parent = $top->id;
 +                    }
 +                    $DB->update_record('question_categories', $cat);
 +
                      // And set new contextid also in question_category mapping (will be
                      // used by {@link restore_create_question_files} later
                      restore_dbops::set_backup_ids_record($this->get_restoreid(), 'question_category', $modulecat->itemid, $modulecat->newitemid, $newcontext->newitemid);