]> git.mjollnir.org Git - moodle.git/commitdiff
merged fix for MDL-8681, course imports creates duplicate roles
authortoyomoyo <toyomoyo>
Fri, 9 Mar 2007 02:39:44 +0000 (02:39 +0000)
committertoyomoyo <toyomoyo>
Fri, 9 Mar 2007 02:39:44 +0000 (02:39 +0000)
backup/restorelib.php

index 9ce15781e47a11ef6f1b31b4f8dfd5c160304fce..1441d90f37b3566ca73365d2b91e2e1c85f75870 100644 (file)
         if (!empty($restore->rolesmapping)) {
             $rolemappings = $restore->rolesmapping;
         }
+        // $info->roles will be empty for backups pre 1.7
         if (isset($info->roles) && $info->roles) {
-            foreach ($info->roles as $oldroleid=>$roledata) {
             
-            /// first we check if the roles are in the mappings
+            foreach ($info->roles as $oldroleid=>$roledata) {
+                if (empty($restore->rolesmapping)) {                   
+                    // if this is empty altogether, we came from import or there's no roles used in course at all
+                    // in this case, write the same oldid as this is the same site
+                    // no need to do mapping
+                    $status = backup_putid($restore->backup_unique_code,"role",$oldroleid,
+                                     $oldroleid); // adding a new id                           
+                    continue;  // do not create additonal roles;
+                }
+            // first we check if the roles are in the mappings
             // if so, we just do a mapping i.e. update oldids table
                 if (isset($rolemappings[$oldroleid]) && $rolemappings[$oldroleid]) {
                     $status = backup_putid($restore->backup_unique_code,"role",$oldroleid,
         }
         $course = restore_read_xml_course_header($xmlfile);
         
-        if (!empty($course->roleassignments)) {
+        if (!isset($restore->rolesmapping)) {
+            $isimport = true; // course import from another course, or course with no role assignments
+        } else {
+            $isimport = false; // course restore with role assignments
+        }
+        
+        if (!empty($course->roleassignments) && !$isimport) {
             $courseassignments = $course->roleassignments;
 
             foreach ($courseassignments as $oldroleid => $courseassignment) {    
          * Restoring from course level overrides *
          *****************************************************/     
         
-        if (!empty($course->roleoverrides)) {
+        if (!empty($course->roleoverrides) && !$isimport) {
             $courseoverrides = $course->roleoverrides;
             foreach ($courseoverrides as $oldroleid => $courseoverride) {
                 // if not importing into exiting course, or creating new role, we are ok
         foreach ($secs as $section) {
             if (isset($section->mods)) {
                 foreach ($section->mods as $modid=>$mod) {
-                    if (isset($mod->roleassignments)) {
+                    if (isset($mod->roleassignments) && !$isimport) {
                         foreach ($mod->roleassignments as $oldroleid=>$modassignment) {
                             restore_write_roleassignments($restore, $modassignment->assignments, "course_modules", CONTEXT_MODULE, $modid, $oldroleid);                       
                         }  
                     } 
+                    // role overrides always applies, in import or backup/restore
                     if (isset($mod->roleoverrides)) {
                         foreach ($mod->roleoverrides as $oldroleid=>$modoverride) {
                             restore_write_roleoverrides($restore, $modoverride->overrides, "course_modules", CONTEXT_MODULE, $modid, $oldroleid);
             $blocks = restore_read_xml_blocks($xmlfile);
             if (isset($blocks->instances)) {
                 foreach ($blocks->instances as $instance) {
-                    if (isset($instance->roleassignments)) {
+                    if (isset($instance->roleassignments) && !$isimport) {
                         foreach ($instance->roleassignments as $oldroleid=>$blockassignment) {
                             restore_write_roleassignments($restore, $blockassignment->assignments, "block_instance", CONTEXT_BLOCK, $instance->id, $oldroleid);
                       
                         }
                     }
-                    if (isset($instance->roleoverrides)) {
+                    // likewise block overrides should always be restored like mods
+                    if (isset($instance->roleoverrides)) {                    
                         foreach ($instance->roleoverrides as $oldroleid=>$blockoverride) {
                             restore_write_roleoverrides($restore, $blockoverride->overrides, "block_instance", CONTEXT_BLOCK, $instance->id, $oldroleid);
                         }
             echo "<li>".get_string("creatinguserroles").'</li>';
         }
         $info = restore_read_xml_users($restore, $xmlfile);
-        if (!empty($info->users)) {
+        if (!empty($info->users) && !$isimport) { // no need to restore user assignments for imports (same course)
             //For each user, take its info from backup_ids
             foreach ($info->users as $userid) {
                 $rec = backup_getid($restore->backup_unique_code,"user",$userid);