Diff for /loncom/interface/londocs.pm between versions 1.702 and 1.709

version 1.702, 2023/07/11 22:24:29 version 1.709, 2024/01/10 20:07:37
Line 102  sub authorhosts { Line 102  sub authorhosts {
     my %outhash=();      my %outhash=();
     my $home=0;      my $home=0;
     my $other=0;      my $other=0;
       my @ids=&Apache::lonnet::current_machine_ids();
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
  if ($key=~/^user\.role\.(au|ca)\.(.+)$/) {   if ($key=~/^user\.role\.(au|ca)\.(.+)$/) {
     my $role=$1;      my $role=$1;
Line 118  sub authorhosts { Line 119  sub authorhosts {
     }      }
     my $allowed=0;      my $allowed=0;
     my $myhome=&Apache::lonnet::homeserver($ca,$cd);      my $myhome=&Apache::lonnet::homeserver($ca,$cd);
     my @ids=&Apache::lonnet::current_machine_ids();  
     foreach my $id (@ids) {      foreach my $id (@ids) {
                 if ($id eq $myhome) {                  if ($id eq $myhome) {
                     $allowed=1;                      $allowed=1;
Line 263  ENDJS Line 263  ENDJS
                          add_entries => {'onload' => "hide_searching();"},                           add_entries => {'onload' => "hide_searching();"},
                      };                       };
     }      }
     $r->print(&Apache::loncommon::start_page('Copy '.$crstype.' Content to Authoring Space',$js,$starthash)."\n".      $r->print(&Apache::loncommon::start_page('Copy uploaded content to Authoring Space',$js,$starthash)."\n".
               &Apache::lonhtmlcommon::breadcrumbs('Copy '.$crstype.' Content to Authoring Space')."\n");                &Apache::lonhtmlcommon::breadcrumbs('Copy uploaded content to Authoring Space')."\n");
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     unless ($home) {      unless ($home) {
Line 1419  sub print_paste_buffer { Line 1419  sub print_paste_buffer {
     }      }
   
     my @currpaste = split(/,/,$env{'docs.markedcopies'});      my @currpaste = split(/,/,$env{'docs.markedcopies'});
     my ($pasteitems,@pasteable);      my ($pasteitems,@pasteable,$same_institution,$checkedsameinst);
     my $clipboardcount = 0;      my $clipboardcount = 0;
   
 # Construct identifiers for current contents of user's paste buffer  # Construct identifiers for current contents of user's paste buffer
Line 1432  sub print_paste_buffer { Line 1432  sub print_paste_buffer {
             ($url ne '')) {              ($url ne '')) {
             $clipboardcount ++;              $clipboardcount ++;
             my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,              my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,
                 $canpaste,$nopaste,$othercrs,$areachange,$is_exttool);                  $canpaste,$nopaste,$othercrs,$areachange,$is_exttool,$toolcdom,
                   $toolcnum,$marker);
             my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];              my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];
             if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) {              if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) {
                 $is_external = 1;                  $is_external = 1;
             } elsif ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) {              } elsif ($url =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) {
                   ($toolcdom,$toolcnum,$marker) = ($1,$2,$3);
                 $is_exttool = 1;                  $is_exttool = 1;
             }              }
             if ($folder =~ /^supplemental/) {              if ($folder =~ /^supplemental/) {
Line 1474  sub print_paste_buffer { Line 1476  sub print_paste_buffer {
                     if ($cid ne $env{'request.course.id'}) {                      if ($cid ne $env{'request.course.id'}) {
                         my ($srcdom,$srcnum) = split(/_/,$cid);                          my ($srcdom,$srcnum) = split(/_/,$cid);
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {                          if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
                             if (($is_exttool) && ($srcdom ne $coursedom)) {                              if ($is_exttool) {
                                 $canpaste = 0;                                  if ($toolcdom ne $coursedom) {
                                 $nopaste = &mt('Paste from another domain unavailable.');                                      $canpaste = 0;
                             } else {                                      $nopaste = &mt('Paste from another domain unavailable.');
                                 $othercrs = '<br />'.&mt('(from another course)');                                  } elsif ($toolcnum ne $coursenum) {
                                       my %toolsettings =
                                           &Apache::lonnet::dump('exttool_'.$marker,$toolcdom,$toolcnum);
                                       my %tooltypes = &Apache::loncommon::usable_exttools();
                                       if ((($toolsettings{'id'} =~ /^c\d+$/) && (!$tooltypes{'crs'})) ||
                                           (($toolsettings{'id'} =~ /^\d+$/) && (!$tooltypes{'dom'}))) {
                                           $canpaste = 0;
                                           $nopaste = &mt('Paste from another course unavailable.');
                                       } elsif ($toolsettings{'id'} =~ /^c\d+$/) {
                                           unless ($checkedsameinst) {
                                               my $primary_id = &Apache::lonnet::domain($coursedom,'primary');
                                               my $intdom = &Apache::lonnet::internet_dom($primary_id);
                                               if ($intdom ne '') {
                                                   my $internet_names =
                                                       &Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'});
                                                   if (ref($internet_names) eq 'ARRAY') {
                                                       if (grep(/^\Q$intdom\E$/,@{$internet_names})) {
                                                           $same_institution = 1;
                                                       }
                                                   }
                                               }
                                               $checkedsameinst = 1;
                                           }
                                           if ($same_institution) {
                                               $othercrs = '<br />'.&mt('(from another course)');
                                           } else {
                                               $nopaste = &mt('Paste from another course unavailable.');
                                           }
                                       } else {
                                           $othercrs = '<br />'.&mt('(from another course)');
                                       }
                                   }
                             }                              }
                         } else {                          } else {
                             $canpaste = 0;                              $canpaste = 0;
                             $nopaste = &mt('Paste from another course unavailable.');                              $nopaste = &mt('Paste from another course unavailable.');
                         }                          }
                     }                      }
                   } elsif ($url =~ m{/res/($match_domain)/($match_username)/}) {
                       my ($audom,$auname) = ($1,$2);
                       unless (($auname eq $coursenum) && ($audom eq $coursedom)) {
                           if (&Apache::lonnet::is_course($audom,$auname)) {
                               $canpaste = 0;
                               $nopaste = &mt('Paste from another course unavailable.');
                           }
                       }
                 }                  }
                 if ($canpaste) {                  if ($canpaste) {
                     push(@pasteable,$suffix);                      push(@pasteable,$suffix);
Line 1777  sub do_paste_from_buffer { Line 1818  sub do_paste_from_buffer {
         return();          return();
     }      }
   
     my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%notindom,%duplicate,      my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%notindom,
         %prefixchg,%srcdom,%srcnum,%srcmapidx,%marktomove,$save_err,$lockerrors,$allresult);          %othcrstool,%othcrsres,%duplicate,%prefixchg,%srcdom,%srcnum,%srcmapidx,
           %marktomove,$save_err,$lockerrors,$allresult,%currcrsltitools,
           %currltititles,$currltimax,$gotcrsltitools);
       $currltimax = 0;
       $gotcrsltitools = 0;
     foreach my $suffix (@topaste) {      foreach my $suffix (@topaste) {
         my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});          my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});
         my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix});          my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix});
Line 1818  sub do_paste_from_buffer { Line 1862  sub do_paste_from_buffer {
                 }                  }
             }              }
 # When buffer was populated using an active role in a different course  # When buffer was populated using an active role in a different course
 # disallow pasting of External Tool if course is in a different domain.  # disallow pasting of External Tool if course is in a different domain,
             if (($url =~ m{/ext\.tool$}) && ($srcd ne $coursedom)) {  # or if External Tool use is not permitted in this course.
                 $notindom{$suffix} = 1;              if ($url =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) {
                 next;                  my ($toolcdom,$toolcnum,$marker) = ($1,$2,$3);
                   if ($toolcdom ne $coursedom) {
                       $notindom{$suffix} = 1;
                       next;
                   } elsif ($toolcnum ne $coursenum) {
                       my %toolsettings =
                           &Apache::lonnet::dump('exttool_'.$marker,$toolcdom,$toolcnum);
                       my %tooltypes = &Apache::loncommon::usable_exttools();
                       if ((($toolsettings{'id'} =~ /^c\d+$/) && (!$tooltypes{'crs'})) ||
                           (($toolsettings{'id'} =~ /^\d+$/) && (!$tooltypes{'dom'}))) {
                           $othcrstool{$suffix} = 1;
                           next;
                       }
                       if ($toolsettings{'id'} =~ /^c\d+$/) {
                           unless ($gotcrsltitools) {
                               %currcrsltitools =
                                   &Apache::lonnet::get_course_lti($coursenum,$coursedom,'consumer');
                               foreach my $item (sort(keys(%currcrsltitools))) {
                                   if (ref($currcrsltitools{$item}) eq 'HASH') {
                                       $currltimax ++;
                                       if (ref($currltititles{$currcrsltitools{$item}{'title'}}) eq 'ARRAY') {
                                           push(@{$currltititles{$currcrsltitools{$item}{'title'}}},$item);
                                       } else {
                                           $currltititles{$currcrsltitools{$item}{'title'}} = [$item];
                                       }
                                   }
                               }
                               $gotcrsltitools = 1;
                           }
                       }
                   }
             }              }
             $srcdom{$suffix} = $srcd;              $srcdom{$suffix} = $srcd;
             $srcnum{$suffix} = $srcn;              $srcnum{$suffix} = $srcn;
           } elsif ($url =~ m{^/res/($match_domain)/($match_courseid)/}) {
               my ($audom,$auname) = ($1,$2);
   # When buffer was populated using an active role in a different course
   # disallow pasting of published resources from Course Authoring Space
               unless (($auname eq $coursenum) && ($audom eq $coursedom)) {
                   if (&Apache::lonnet::is_course($audom,$auname)) {
                       $othcrsres{$suffix} = 1;
                       next;
                   }
               }
         }          }
         $srcmapidx{$suffix} = $mapidx;          $srcmapidx{$suffix} = $mapidx;
         push(@dopaste,$suffix);          push(@dopaste,$suffix);
Line 1876  sub do_paste_from_buffer { Line 1960  sub do_paste_from_buffer {
                 notinsupp => 'Paste failed: content type is not supported within Supplemental Content',                  notinsupp => 'Paste failed: content type is not supported within Supplemental Content',
                 notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',                  notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',
                 notindom  => 'Paste failed: Item is an external tool from a course in a different domain.',                  notindom  => 'Paste failed: Item is an external tool from a course in a different domain.',
                   othcrstool => 'Paste failed: Item is an external tool from a different course, for which use is not allowed in this course.',
                   othcrsres => 'Paste failed: Item is a course-authored resource from a different course',
                 duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',                  duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',
             );              );
   
Line 1904  sub do_paste_from_buffer { Line 1990  sub do_paste_from_buffer {
 # Retrieve information about all course maps in main content area   # Retrieve information about all course maps in main content area 
   
     my $allmaps = {};      my $allmaps = {};
     my (@toclear,%mapurls,%lockerrs,%msgerrs,%results,$donechk);      my (@toclear,%mapurls,%lockerrs,%msgerrs,%results,$donechk,
           @updatetoolsenc,$updatetoolscache,$checkedsameinst,
           $same_institution);
   
 # Loop over the items to paste  # Loop over the items to paste
     foreach my $suffix (@dopaste) {      foreach my $suffix (@dopaste) {
Line 2003  sub do_paste_from_buffer { Line 2091  sub do_paste_from_buffer {
                     $fromothercrs = 1;                      $fromothercrs = 1;
                     $info{'cdom'} = $srcdom{$suffix};                      $info{'cdom'} = $srcdom{$suffix};
                     $info{'cnum'} = $srcnum{$suffix};                      $info{'cnum'} = $srcnum{$suffix};
                       unless ($checkedsameinst) {
                           my $primary_id = &Apache::lonnet::domain($coursedom,'primary');
                           my $intdom = &Apache::lonnet::internet_dom($primary_id);
                           if ($intdom ne '') {
                               my $internet_names =
                                   &Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'});
                               if (ref($internet_names) eq 'ARRAY') {
                                   if (grep(/^\Q$intdom\E$/,@{$internet_names})) {
                                       $same_institution = 1;
                                   }
                               }
                           }
                           $checkedsameinst = 1;
                       }
                 }                  }
             }              }
             unless (($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') && (!$fromothercrs)) {              unless (($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') && (!$fromothercrs)) {
                 my (%lockerr,$msg);                  my (%lockerr,$msg);
                 my ($newurl,$result,$errtext) =                  my ($newurl,$result,$errtext) =
                     &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);                      &dbcopy(\%info,$coursedom,$coursenum,\%lockerr,\%currltititles,
                               \$currltimax,\@updatetoolsenc,\$updatetoolscache,$same_institution);
                 if ($result eq 'ok') {                  if ($result eq 'ok') {
                     $url = $newurl;                      $url = $newurl;
                     $title=&mt('Copy of').' '.$title;                      $title=&mt('Copy of').' '.$title;
Line 2177  sub do_paste_from_buffer { Line 2280  sub do_paste_from_buffer {
             }              }
         }          }
     }      }
       if (($updatetoolscache) || (@updatetoolsenc)) {
           &update_ltitools_caches($coursedom,$coursenum,$updatetoolscache,
                                   \@updatetoolsenc);
       }
     &clear_from_buffer(\@toclear,\@currpaste);      &clear_from_buffer(\@toclear,\@currpaste);
     my $msgsarray;      my $msgsarray;
     foreach my $suffix (keys(%msgs)) {      foreach my $suffix (keys(%msgs)) {
Line 2225  sub clear_from_buffer { Line 2332  sub clear_from_buffer {
     return $numdel;      return $numdel;
 }  }
   
   sub update_ltitools_caches {
       my ($coursedom,$coursenum,$updatetoolscache,$updatetoolsenc) = @_;
       my $hashid=$coursedom.'_'.$coursenum;
       if ($updatetoolscache) {
           &Apache::lonnet::devalidate_cache_new('courseltitools',$hashid);
       }
       if ((ref($updatetoolsenc) eq 'ARRAY') &&
           (@{$updatetoolsenc})) {
           my @ids=&Apache::lonnet::current_machine_ids();
           my $updatedone;
           foreach my $lonhost (@{$updatetoolsenc}) {
               if (grep(/^\Q$lonhost\E$/,@ids)) {
                   unless ($updatedone) {
                       &Apache::lonnet::devalidate_cache_new('crsltitoolsenc',$hashid);
                   }
                   $updatedone = 1;
               } else {
                   &Apache::lonnet::remote_devalidate_cache($lonhost,["crsltitoolsenc:$hashid"]);
               }
           }
       }
       return;
   }
   
 sub get_newmap_url {  sub get_newmap_url {
     my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum,      my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum,
         $titleref,$allmaps,$newurls) = @_;          $titleref,$allmaps,$newurls) = @_;
Line 2286  sub get_newmap_url { Line 2417  sub get_newmap_url {
 }  }
   
 sub dbcopy {  sub dbcopy {
     my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;      my ($dbref,$coursedom,$coursenum,$lockerrorsref,$currltititles,
           $currltimax,$updatetoolsenc,$updatetoolscache,$same_institution) = @_;
     my ($url,$result,$errtext);      my ($url,$result,$errtext);
     if (ref($dbref) eq 'HASH') {      if (ref($dbref) eq 'HASH') {
         $url = $dbref->{'src'};          $url = $dbref->{'src'};
Line 2330  sub dbcopy { Line 2462  sub dbcopy {
                     my %contents=&Apache::lonnet::dump($db_name,                      my %contents=&Apache::lonnet::dump($db_name,
                                                        $dbref->{'cdom'},                                                         $dbref->{'cdom'},
                                                        $dbref->{'cnum'});                                                         $dbref->{'cnum'});
                       my ($toolcopyerror,$toolpassback,$toolroster,%toolinfo,$oldtoolid,$defincrs);
                       if ($url eq '/adm/'.$dbref->{'cdom'}.'/'.$dbref->{'cnum'}."/$marker/ext.tool") {
                           if ($contents{'id'} =~ /^(|c)(\d+)$/) {
                               $oldtoolid = $2;
                               if ($1 eq 'c') {
                                   $defincrs = 1;
                                   %toolinfo =
                                       &Apache::lonnet::get('ltitools',[$oldtoolid],$dbref->{'cdom'},$dbref->{'cnum'});
                               } else {
                                   %toolinfo= &Apache::lonnet::get_domain_lti($dbref->{'cdom'},'consumer');
                               }
                               if (ref($toolinfo{$oldtoolid}) eq 'HASH') {
                                   if ($toolinfo{$oldtoolid}{'passback'}) {
                                       $toolpassback = 1;
                                   }
                                   if ($toolinfo{$oldtoolid}{'roster'}) {
                                       $toolroster = 1;
                                   }
                               } else {
                                   $toolcopyerror = 1;
                                   $errtext = &mt('Could not retrieve original settings for pasted external tool.');
                               }
                           }
                           unless (($dbref->{'cnum'} eq $coursenum) && ($dbref->{'cdom'} eq $coursedom)) {
                               $url = "/adm/$coursedom/$coursenum/$marker/ext.tool";
                               if ($contents{'crstitle'} ne '') {
                                   $contents{'crstitle'} = $env{'course.'.$coursedom.'_'.$coursenum.'.description'};
                               }
                               if (($defincrs) && (!$toolcopyerror)) {
                                   my %newtool;
                                   my $oldcdom = $dbref->{'cdom'};
                                   my $oldcnum = $dbref->{'cnum'};
                                   my $title = $toolinfo{$oldtoolid}{'title'};
                                   if (ref($currltititles) eq 'HASH') {
                                       if (exists($currltititles->{$title})) {
                                           $title .= ' (copied from another course)';
                                       }
                                   }
                                   my ($newid,$iderror) =
                                       &Apache::lonnet::get_ltitools_id('course',$coursedom,$coursenum,$title);
                                   if ($newid =~ /^\d+$/) {
                                       %{$newtool{$newid}} = %{$toolinfo{$oldtoolid}};
                                       $newtool{$newid}{'title'} = $title;
                                       if (ref($currltimax)) {
                                           $newtool{$newid}{'order'} = $$currltimax;
                                       }
                                       if ($newtool{$newid}{'image'} =~ m{^\Q/uploaded/$oldcdom/$oldcnum/toollogo/$oldtoolid/\E([^/]+)$}) {
                                           my $fname = $1;
                                           my $content = &Apache::lonnet::getfile($newtool{$newid}{'image'});
                                           if ($content eq '-1') {
                                               delete($newtool{$newid}{'image'});
                                           } else {
                                               $env{'form.'.$suffix.'.image'} = $content;
                                               my $newlogo =
                                                   &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.image',"toollogo/$newid/$fname");
                                               delete($env{'form.'.$suffix.'.image'});
                                               if ($newlogo =~ m{^/uploaded/}) {
                                                   $newtool{$newid}{'image'} = $newlogo;
                                               } else {
                                                   delete($newtool{$newid}{'image'});
                                               }
                                           }
                                       }
                                       my $newusable;
                                       if ($same_institution) {
                                           my %oldtoolsenc = &Apache::lonnet::eget('nohist_toolsenc',[$oldtoolid],$oldcdom,$oldcnum);
                                           if (ref($oldtoolsenc{$oldtoolid}) eq 'HASH') {
                                               my %newtoolsenc;
                                               %{$newtoolsenc{$newid}} = %{$oldtoolsenc{$oldtoolid}};
                                               my $putres = &Apache::lonnet::put('nohist_toolsenc',\%newtoolsenc,$coursedom,$coursenum,1);
                                               if ($putres eq 'ok') {
                                                   if (ref($updatetoolsenc) eq 'ARRAY') {
                                                       my $newhome = &Apache::lonnet::homeserver($coursenum,$coursedom);
                                                       unless (grep(/^\Q$newhome\E$/,@{$updatetoolsenc})) {
                                                           push(@{$updatetoolsenc},$newhome);
                                                       }
                                                   }
                                                   $newusable = 1;
                                               }
                                           }
                                       }
                                       if ($newtool{$newid}{'usable'}) {
                                           unless ($newusable) {
                                               delete($newtool{$newid}{'usable'});
                                           }
                                       }
                                       my $putres = &Apache::lonnet::put('ltitools',\%newtool,$coursedom,$coursenum);
                                       if ($putres eq 'ok') {
                                           $contents{'id'} = "c$newid";
                                           if (ref($updatetoolscache)) {
                                               $$updatetoolscache ++;
                                           }
                                           if (ref($currltititles->{$title}) eq 'ARRAY') {
                                               push(@{$currltititles->{$title}},$newid);
                                           } else {
                                               $currltititles->{$title} = [$newid];
                                           }
                                           if (ref($currltimax)) {
                                               $$currltimax ++;
                                           }
                                       } else {
                                           $toolcopyerror = 1;
                                           $errtext = &mt('Unable to save external tool definition in Course Settings.');
                                       }
                                   } else {
                                       $toolcopyerror = 1;
                                       $errtext = &mt('Unable to retrieve new tool ID when adding external tool definition to Course Settings.');
                                   }
                               }
                           }
                       }
                     if (exists($contents{'uploaded.photourl'})) {                      if (exists($contents{'uploaded.photourl'})) {
                         my $photo = $contents{'uploaded.photourl'};                          my $photo = $contents{'uploaded.photourl'};
                         my ($subdir,$fname) =                          my ($subdir,$fname) =
Line 2349  sub dbcopy { Line 2592  sub dbcopy {
                         }                          }
                     }                      }
                     $db_name =~ s{_\d*$ }{_$suffix}x;                      $db_name =~ s{_\d*$ }{_$suffix}x;
                     if (($prefix eq 'exttool') && ($dbref->{'delgradable'}) && ($contents{'gradable'})) {                      if ($prefix eq 'exttool') {
                         delete($contents{'gradable'});                          unless ($toolcopyerror) {
                               foreach my $key ('oldgradesecret','gradesecret','gradesecretdate','oldrostersecret','rostersecret','rostersecretdate') {
                                   if (exists($contents{$key})) {
                                       delete($contents{$key});
                                   }
                               }
                               if ($dbref->{'delgradable'}) {
                                   if (exists($contents{'gradable'})) {
                                       delete($contents{'gradable'});
                                   }
                               }
                               if ($toolpassback) {
                                   if ($contents{'gradable'}) {
                                       my $gradesecret = UUID::Tiny::create_uuid_as_string(UUID_V4);
                                       $contents{'gradesecret'} = $gradesecret;
                                       $contents{'gradesecretdate'} = time;
                                   }
                               }
                               if ($toolroster) {
                                   my $rostersecret = UUID::Tiny::create_uuid_as_string(UUID_V4);
                                   $contents{'rostersecret'} = $rostersecret;
                                   $contents{'rostersecretdate'} = time;
                               }
                           }
                     }                      }
                     $result=&Apache::lonnet::put($db_name,\%contents,                      if (($prefix eq 'exttool') && ($toolcopyerror)) {
                                                  $coursedom,$coursenum);                          $result = 'error';
                     if ($result eq 'ok') {                      } else {
                         $url =~ s{/(\d*)/(smppg|bulletinboard|ext\.tool)$}{/$suffix/$2}x;                          $result=&Apache::lonnet::put($db_name,\%contents,
                                                        $coursedom,$coursenum);
                           if ($result eq 'ok') {
                               $url =~ s{/(\d*)/(smppg|bulletinboard|ext\.tool)$}{/$suffix/$2}x;
                           }
                     }                      }
                 }                  }
                 if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {                  if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {
Line 2510  sub contained_map_check { Line 2780  sub contained_map_check {
             if ($token->[1] eq 'resource') {              if ($token->[1] eq 'resource') {
                 next if ($token->[2]->{'type'} eq 'zombie');                  next if ($token->[2]->{'type'} eq 'zombie');
                 my $ressrc = $token->[2]->{'src'};                  my $ressrc = $token->[2]->{'src'};
                 if ($ressrc =~ m{^/adm/($match_domain)/$match_courseid/\d+/ext\.tool$}) {                  if ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) {
                     my $srcdom = $1;                      my ($srcdom,$srcnum,$marker) = ($1,$2,$3);
                     unless ($srcdom eq $coursedom) {                      unless ($srcdom eq $coursedom) {
                         $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;                          $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                         next;                          next;
                     }                      }
                       unless ($srcnum eq $coursenum) {
                           my %toolsettings =
                               &Apache::lonnet::dump('exttool_'.$marker,$srcdom,$srcnum);
                           my %tooltypes = &Apache::loncommon::usable_exttools();
                           if ((($toolsettings{'id'} =~ /^c\d+$/) && (!$tooltypes{'crs'})) ||
                               (($toolsettings{'id'} =~ /^\d+$/) && (!$tooltypes{'dom'}))) {
                               $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                               next;
                           }
                       }
                 } elsif ($folder =~ /^supplemental/) {                  } elsif ($folder =~ /^supplemental/) {
                     unless (&supp_pasteable($ressrc)) {                      unless (&supp_pasteable($ressrc)) {
                         $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;                          $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                         next;                          next;
                     }                      }
                 }                  }
                   if ($ressrc =~ m{^/res/($match_domain)/($match_courseid)/}) {
                       my ($srcdom,$srcnum) = ($1,$2);
                       unless (($srcnum eq $coursenum) && ($srcdom eq $coursedom)) {
                           if (&Apache::lonnet::is_course($srcdom,$srcnum)) {
                               $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                               next;
                           }
                       }
                   }
                 if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) {                  if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) {
                     if ($1 eq 'uploaded') {                      if ($1 eq 'uploaded') {
                         $hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc;                          $hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc;
Line 2716  sub apply_fixups { Line 3005  sub apply_fixups {
         $oldurl,$url,$caller) = @_;          $oldurl,$url,$caller) = @_;
     my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,      my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,
         %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,          %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,
         %resdatacopy,%lockerrors,$lockmsg);          %resdatacopy,%lockerrors,$lockmsg,%currcrsltitools,$gotcrsltitools,
           %currltititles,$currltimax);
       $currltimax = 0;
     if (ref($updated) eq 'HASH') {      if (ref($updated) eq 'HASH') {
         if (ref($updated->{'rewrites'}) eq 'HASH') {          if (ref($updated->{'rewrites'}) eq 'HASH') {
             %rewrites = %{$updated->{'rewrites'}};              %rewrites = %{$updated->{'rewrites'}};
Line 2867  sub apply_fixups { Line 3158  sub apply_fixups {
                 }                  }
             }              }
         }          }
           my ($updatetoolscache,@updatetoolsenc,$same_institution,$checkedsameinst);
         foreach my $key (keys(%updates)) {          foreach my $key (keys(%updates)) {
             my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb);              my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb);
             if (ref($rewrites{$key}) eq 'HASH') {              if (ref($rewrites{$key}) eq 'HASH') {
Line 2887  sub apply_fixups { Line 3179  sub apply_fixups {
             if (ref($dbcopies{$key}) eq 'HASH') {              if (ref($dbcopies{$key}) eq 'HASH') {
                 foreach my $idx (keys(%{$dbcopies{$key}})) {                  foreach my $idx (keys(%{$dbcopies{$key}})) {
                     if (ref($dbcopies{$key}{$idx}) eq 'HASH') {                      if (ref($dbcopies{$key}{$idx}) eq 'HASH') {
                           my $oldurl = $dbcopies{$key}{$idx}{'src'};
                           my $oldcdom = $dbcopies{$key}{$idx}{'cdom'};
                           my $oldcnum = $dbcopies{$key}{$idx}{'cnum'};
                           my $oldmarker;
                           if ($oldurl =~ m{^\Q/adm/$oldcdom/$oldcnum/\E(\d+)/ext\.tool$}) {
                               $oldmarker = $1;
                               unless (($gotcrsltitools) ||
                                       (($oldcnum eq $cnum) && ($oldcdom eq $cdom))) {
                                   my %oldtoolsettings=&Apache::lonnet::dump('exttool_'.$oldmarker,$oldcdom,$oldcnum);
                                   if ($oldtoolsettings{'id'} =~ /^c\d+$/) {
                                       unless ($gotcrsltitools) {
                                           %currcrsltitools =
                                               &Apache::lonnet::get_course_lti($cnum,$cdom,'consumer');
                                           foreach my $item (sort(keys(%currcrsltitools))) {
                                               if (ref($currcrsltitools{$item}) eq 'HASH') {
                                                   $currltimax ++;
                                                   if (ref($currltititles{$currcrsltitools{$item}{'title'}}) eq 'ARRAY') {
                                                       push(@{$currltititles{$currcrsltitools{$item}{'title'}}},$item);
                                                   } else {
                                                       $currltititles{$currcrsltitools{$item}{'title'}} = [$item];
                                                   }
                                               }
                                           }
                                           $gotcrsltitools = 1;
                                       }
                                       unless ($checkedsameinst) {
                                           my $primary_id = &Apache::lonnet::domain($cdom,'primary');
                                           my $intdom = &Apache::lonnet::internet_dom($primary_id);
                                           if ($intdom ne '') {
                                               my $internet_names =
                                                   &Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'});
                                               if (ref($internet_names) eq 'ARRAY') {
                                                   if (grep(/^\Q$intdom\E$/,@{$internet_names})) {
                                                       $same_institution = 1;
                                                   }
                                               }
                                           }
                                           $checkedsameinst = 1;
                                       }
                                   }
                               }
                           }
                         my ($newurl,$result,$errtext) =                          my ($newurl,$result,$errtext) =
                             &dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors);                              &dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors,\%currltititles,
                                       \$currltimax,\@updatetoolsenc,\$updatetoolscache,$same_institution);
                         if ($result eq 'ok') {                          if ($result eq 'ok') {
                             $newdb{$idx} = $newurl;                              $newdb{$idx} = $newurl;
                               if ($newurl =~ /ext\.tool$/) {
                                   if ($torewrite{$idx} eq "/adm/$oldcdom/$oldcnum/$oldmarker/ext.tool") {
                                       if ($newurl =~ m{^\Q/adm/$cdom/$cnum/\E(\d+)/ext.tool$}) {
                                           my $newmarker = $1;
                                           unless ($oldmarker eq $newmarker) {
                                               $torewrite{$idx} = "/adm/$oldcdom/$oldcnum/$newmarker/ext.tool";
                                           }
                                       }
                                   }
                               }
                         } elsif (ref($errors) eq 'HASH') {                          } elsif (ref($errors) eq 'HASH') {
                             $errors->{$key} = 1;                              $errors->{$key} = 1;
                         }                          }
Line 3029  sub apply_fixups { Line 3374  sub apply_fixups {
                 }                  }
             }              }
         }          }
           if (($updatetoolscache) || (@updatetoolsenc)) {
               &update_ltitools_caches($cdom,$cnum,$updatetoolscache,
                                       \@updatetoolsenc);
           }
     }      }
     return ('ok',\@msgs,$lockmsg);      return ('ok',\@msgs,$lockmsg);
 }  }
Line 4385  END Line 4734  END
                 }                  }
                 $nomodal = 1;                  $nomodal = 1;
             }              }
         } elsif (($uploaded) && (!$allowed) && ($url ne '/adm/supplemental?')) {          } elsif (($uploaded) && ($url ne '/adm/supplemental?') && ($url ne '/adm/coursedocs?')) {
             my $embstyle=&Apache::loncommon::fileembstyle($extension);              my $embstyle=&Apache::loncommon::fileembstyle($extension);
             unless ($embstyle eq 'ssi') {              unless ($embstyle eq 'ssi') {
                 if (($embstyle eq 'img')                  if (($embstyle eq 'img')
Line 4491  $form_common."\n". Line 4840  $form_common."\n".
 '<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder','settings'".');" '.$ro_set.$disabled.' /> '.&mt('Random Order').' </label></span>'.  '<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder','settings'".');" '.$ro_set.$disabled.' /> '.&mt('Random Order').' </label></span>'.
 $form_end;   $form_end; 
         }          }
     } elsif ($supplementalflag && !$allowed) {      } elsif ($supplementalflag) {
         my $isexttool;          my $isexttool;
         if ($url=~m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {          if ($url=~m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {
             $url='/adm/wrapper'.$url;              $url='/adm/wrapper'.$url;
Line 4586  $form_end; Line 4935  $form_end;
                $anchor = '#'.&HTML::Entities::encode($anchor,'"<>&');                 $anchor = '#'.&HTML::Entities::encode($anchor,'"<>&');
            }             }
        }         }
        if ((!$supplementalflag) && ($nomodal) && ($hostname ne '')) {         if (($nomodal) && ($hostname ne '')) {
            $link = 'http://'.$hostname.$url;             $link = 'http://'.$hostname.$url;
        } else {         } else {
            $link = $url;             $link = $url;
        }         }
        $link = &js_escape($link.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes'.$anchor);         my $inhibitmenu;
          if ((($supplementalflag) && ($allowed) && ($url =~ m{^/adm/wrapper/})) ||
              (($allowed) && (($url =~ m{^/adm/(viewclasslist|$match_domain/$match_username/aboutme)(\?|$)}) ||
                              ($url =~ m{^/public/$match_domain/$match_courseid/syllabus(\?|$)})))) {
              $inhibitmenu = 'only_body=1';
          } else {
              $inhibitmenu = 'inhibitmenu=yes';
          }
          $link = &js_escape($link.(($url=~/\?/)?'&amp;':'?').$inhibitmenu.$anchor);
        if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage && !$uploaded) {         if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage && !$uploaded) {
            if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {             if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                $nolink = 1;                 $nolink = 1;
Line 5535  sub handler { Line 5892  sub handler {
                'Load_Map','Supplemental','Score_Upload_Form',                 'Load_Map','Supplemental','Score_Upload_Form',
                'Adding_Pages','Importing_LON-CAPA_Resource',                 'Adding_Pages','Importing_LON-CAPA_Resource',
                'Importing_IMS_Course','Uploading_From_Harddrive',                 'Importing_IMS_Course','Uploading_From_Harddrive',
                        'Course_Roster','Web_Page','Dropbox','Simple_Problem') {                         'Course_Roster','Web_Page','Dropbox','Simple_Problem',
                          'Standard_Problem','Course_Resources',
                          'Search_LON-CAPA_Resource','Import_Stored_Links') {
  $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);   $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
     }      }
     # Composite help files      # Composite help files
Line 5606  sub handler { Line 5965  sub handler {
       &init_breadcrumbs('versions','Check/Set Resource Versions','Docs_Check_Resource_Versions');        &init_breadcrumbs('versions','Check/Set Resource Versions','Docs_Check_Resource_Versions');
       &checkversions($r,$canedit);        &checkversions($r,$canedit);
   } elsif ($canedit && $env{'form.dumpcourse'}) {    } elsif ($canedit && $env{'form.dumpcourse'}) {
       &init_breadcrumbs('dumpcourse','Copy '.&Apache::loncommon::course_type().' Content to Authoring Space');        &init_breadcrumbs('dumpcourse','Copy uploaded content to Authoring Space');
       &dumpcourse($r);        &dumpcourse($r);
   } elsif ($canedit && $env{'form.exportcourse'}) {    } elsif ($canedit && $env{'form.exportcourse'}) {
       &init_breadcrumbs('exportcourse','IMS Export');        &init_breadcrumbs('exportcourse','IMS Export');
Line 5710  sub handler { Line 6069  sub handler {
     }      }
     if ($env{'form.forcesupplement'}) { $supplementalflag=1; }      if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
     if ($env{'form.forcestandard'})   { $supplementalflag=0; }      if ($env{'form.forcestandard'})   { $supplementalflag=0; }
     unless ($allowed) { $supplementalflag=1; }      unless (($supplementalflag) ||
     unless ($standard) { $supplementalflag=1; }              ($r->uri =~ m{^/adm/coursedocs/showdoc/uploaded/\Q$coursedom\E/\Q$coursenum\E/docs/})) {
           unless ($allowed) { $supplementalflag=1; }
           unless ($standard) { $supplementalflag=1; }
       }
     my $toolsflag=0;      my $toolsflag=0;
     if ($env{'form.tools'}) { $toolsflag=1; }      if ($env{'form.tools'}) { $toolsflag=1; }
   
Line 5787  sub handler { Line 6149  sub handler {
             &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);              &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
         }          }
     }      }
      
 # If we are not allowed to make changes, all we can see are supplemental docs  # Set folderpath if we are not allowed to make changes and this is supplemental content
     if (!$allowed) {      if ((!$allowed) && ($supplementalflag)) {
         unless ($env{'form.folderpath'} =~ /^supplemental/) {          unless ($env{'form.folderpath'} =~ /^supplemental/) {
             $env{'form.folderpath'} = &supplemental_base();              $env{'form.folderpath'} = &supplemental_base();
         }          }
Line 6020  sub handler { Line 6382  sub handler {
         if ($supplementalflag) {          if ($supplementalflag) {
             my $title = &HTML::Entities::encode($env{'form.title'},'\'"<>&');              my $title = &HTML::Entities::encode($env{'form.title'},'\'"<>&');
             my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);              my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
             $args = {'bread_crumbs' => $brcrum};              $args = {'bread_crumbs' => $brcrum,
                        'bread_crumbs_nomenu' => 1};
         } else {          } else {
             $args = {'force_register' => $showdoc};              $args = {'force_register' => $showdoc};
         }          }
Line 6049  sub handler { Line 6412  sub handler {
             }              }
         }          }
         my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);          my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);
           my $args = {'bread_crumbs' => $brcrum};
           unless (($env{'form.folderpath'} eq '') ||
                   ($env{'form.folder'} eq 'supplemental')) {
               $args->{'bread_crumbs_nomenu'} = 1;
           }
         $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,          $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,
                                                 {'bread_crumbs' => $brcrum,}));                                                   $args));
     } else {      } else {
         my ($breadtext,$breadtitle,$helpitem);          my ($breadtext,$breadtitle,$helpitem);
         $breadtext = "$crstype Editor";          $breadtext = "$crstype Editor";
Line 6135  sub handler { Line 6503  sub handler {
   
   if ($allowed && $toolsflag) {    if ($allowed && $toolsflag) {
       $r->print(&startContentScreen('tools'));        $r->print(&startContentScreen('tools'));
       $r->print(&generate_admin_menu($crstype,$canedit));        $r->print(&generate_admin_menu($crstype,$canedit,$coursenum,$coursedom));
       $r->print(&endContentScreen());        $r->print(&endContentScreen());
   } elsif ((!$showdoc) && (!$uploadphase)) {    } elsif ((!$showdoc) && (!$uploadphase)) {
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
Line 6143  sub handler { Line 6511  sub handler {
  'copm' => 'All documents out of a published map into this folder',   'copm' => 'All documents out of a published map into this folder',
                 'upfi' => 'Upload File',                  'upfi' => 'Upload File',
                 'upld' => 'Upload Content',                  'upld' => 'Upload Content',
                 'srch' => 'Search',                  'srch' => 'Search Repository',
                 'impo' => 'Import',                  'impo' => 'Import from Repository',
  'lnks' => 'Import from Stored Links',   'lnks' => 'Import from Stored Links',
                 'impm' => 'Import from Assembled Map',                  'impm' => 'Import from Assembled Map',
                 'imcr' => 'Import from Course Resources',                  'imcr' => 'Import from Course Resources',
Line 6321  FUFORM Line 6689  FUFORM
         </form>          </form>
   
 SEDFFORM  SEDFFORM
         my $importcrsresform;          my ($importcrsresform,$checkcrsres);
         my ($numdirs,$pickfile) =           if ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.crsauthor'}) {
             &Apache::loncommon::import_crsauthor_form('coursepath','coursefile',              $checkcrsres = 1;
                                                       "resize_scrollbox('contentscroll','1','0');",          } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.crsauthor'} ne '0') {
                                                       undef,'res');              my %domdefs=&Apache::lonnet::get_domain_defaults($coursedom);
         if ($pickfile) {              if ($domdefs{'crsauthor'}) {
             $importcrsresform=(<<CRSFORM);                  $checkcrsres = 1;
               }
           }
           if ($checkcrsres) {
               my ($numdirs,$pickfile) = 
                   &Apache::loncommon::import_crsauthor_form('coursepath','coursefile',
                                                             "resize_scrollbox('contentscroll','1','0');",
                                                             undef,'res');
               if ($pickfile) {
                   $importcrsresform=(<<CRSFORM);
         <a class="LC_menubuttons_link" href="javascript:toggleImportCrsres('res');">          <a class="LC_menubuttons_link" href="javascript:toggleImportCrsres('res');">
         $lt{'imcr'}</a>$help{'Course_Resources'}          $lt{'imcr'}</a>$help{'Course_Resources'}
         <form action="/adm/coursedocs" method="post" name="crsresimportform" onsubmit="return validImportCrsRes();">          <form action="/adm/coursedocs" method="post" name="crsresimportform" onsubmit="return validImportCrsRes();">
Line 6350  SEDFFORM Line 6727  SEDFFORM
         </fieldset>          </fieldset>
         </form>          </form>
 CRSFORM  CRSFORM
               }
         }          }
   
         my $fromstoredjs;          my $fromstoredjs;
Line 6360  CRSFORM Line 6738  CRSFORM
         }          }
   
  my @importpubforma = (   my @importpubforma = (
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => $pathitem."<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => $pathitem."<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>$help{'Search_LON-CAPA_Resource'}" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:'.$fromstoredjs.';" />' => '<a class="LC_menubuttons_link" href="javascript:'.$fromstoredjs.';">'.$lt{'lnks'}.'</a>' },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:'.$fromstoredjs.';" />' => '<a class="LC_menubuttons_link" href="javascript:'.$fromstoredjs.';">'.$lt{'lnks'}.'</a>'.$help{'Import_Stored_Links'} },
         { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform },          { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform },
         );          );
         if ($pickfile) {          if ($importcrsresform) {
             push(@importpubforma,{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{imcr}.'"  onclick="javascript:toggleImportCrsres(\'res\');" />' => $importcrsresform});              push(@importpubforma,{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/impcrsau.png" alt="'.$lt{imcr}.'"  onclick="javascript:toggleImportCrsres(\'res\');" />' => $importcrsresform});
  }   }
  $importpubform = &create_form_ul(&create_list_elements(@importpubforma));   $importpubform = &create_form_ul(&create_list_elements(@importpubforma));
         my $extresourcesform =          my $extresourcesform =
Line 6618  NWEBFORM Line 6996  NWEBFORM
                 }                  }
             }              }
         }          }
         $pickdir .= '<option value="course">'.&mt('Course Resource').'</option>'."\n".          if ($checkcrsres) {
                     '</select><br />'."\n".              $pickdir .= '<option value="course">'.&mt('Course Resource').'</option>'."\n";
           }
           $pickdir .= '</select><br />'."\n".
                     $lt{'dire'}.                      $lt{'dire'}.
                     '<select name="authorpath" onchange="toggleCrsResTitle();">'.                      '<select name="authorpath" onchange="toggleCrsResTitle();">'.
                     '<option value=""></option>'.                      '<option value=""></option>'.
                     '</select><br />'."\n";                      '</select><br />'."\n";
   
         my %seltemplate_menus;          my %seltemplate_menus;
         my @files = &Apache::lonhomework::get_template_list('problem');          my @files = &Apache::lonhomework::get_template_list('problem');
         my @noexamplelink = ('blank.problem','blank.library','script.library');          my @noexamplelink = ('blank.problem','blank.library','script.library');
Line 6665  NWEBFORM Line 7044  NWEBFORM
                                                                 "toggleExampleText();",'template').'<br />';                                                                  "toggleExampleText();",'template').'<br />';
         my $templatepreview =  '<a href="#" target="sample" onclick="javascript:getExample(600,420,\'yes\',true);  return false;">'.          my $templatepreview =  '<a href="#" target="sample" onclick="javascript:getExample(600,420,\'yes\',true);  return false;">'.
                                '<span id="newresexample">'.&mt('Example').'</span></a>';                                 '<span id="newresexample">'.&mt('Example').'</span></a>';
         my $crsresform=(<<RESFORM);          my $crsresform;
           if (($env{'user.author'}) || ($checkcrsres)) {
               $crsresform=(<<RESFORM);
         <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res');">          <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res');">
         $lt{'stpr'}</a>$help{'Course_Resource'}          $lt{'stpr'}</a>$help{'Standard_Problem'}
         <form action="/adm/coursedocs" method="post" name="courseresform">          <form action="/adm/coursedocs" method="post" name="courseresform">
         <fieldset id="crsresform" style="display:none;">          <fieldset id="crsresform" style="display:none;">
         <legend>$lt{'stpr'}</legend>          <legend>$lt{'stpr'}</legend>
Line 6721  NWEBFORM Line 7102  NWEBFORM
         </form>          </form>
   
 RESFORM  RESFORM
           }
   
 my $specialdocumentsform;  my $specialdocumentsform;
 my @specialdocumentsforma;  my @specialdocumentsforma;
Line 6814  NGFFORM Line 7196  NGFFORM
         @gradingforma=(          @gradingforma=(
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform}
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{stpr}.'" onclick="javascript:toggleCrsRes(\'res\');" />'=>$crsresform},  
         );          );
           if ($crsresform) {
               push(@gradingforma,
                    {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{stpr}.'" onclick="javascript:toggleCrsRes(\'res\');" />'=>$crsresform}
               );
           }
         $gradingform = &create_form_ul(&create_list_elements(@gradingforma));          $gradingform = &create_form_ul(&create_list_elements(@gradingforma));
   
         @communityforma=(          @communityforma=(
Line 6830  NGFFORM Line 7216  NGFFORM
   
 my %orderhash = (  my %orderhash = (
                 'aa' => ['Upload',$fileuploadform],                  'aa' => ['Upload',$fileuploadform],
                 'bb' => ['Import',$importpubform],                  'bb' => ['External',$externalform],
                 'cc' => ['External',$externalform],                  'cc' => ['Import',$importpubform],
                 'dd' => ['Assessment',$gradingform],                  'dd' => ['Assessment',$gradingform],
                 'ff' => ['Other',$specialdocumentsform],                  'ff' => ['Other',$specialdocumentsform],
                 );                  );
Line 7211  sub remove_archive { Line 7597  sub remove_archive {
 }  }
   
 sub generate_admin_menu {  sub generate_admin_menu {
     my ($crstype,$canedit) = @_;      my ($crstype,$canedit,$coursenum,$coursedom) = @_;
     my $lc_crstype = lc($crstype);      my $lc_crstype = lc($crstype);
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     my %lt= ( # do not translate here      my %lt= ( # do not translate here
Line 7219  sub generate_admin_menu { Line 7605  sub generate_admin_menu {
                                          'cv'   => 'Check/Set Resource Versions',                                           'cv'   => 'Check/Set Resource Versions',
                                          'ls'   => 'List Resource Identifiers',                                           'ls'   => 'List Resource Identifiers',
                                          'ct'   => 'Display/Set Shortened URLs for Deep-linking',                                           'ct'   => 'Display/Set Shortened URLs for Deep-linking',
                                            'ca'   => "Enter $crstype Authoring Space",
                                          'imse' => 'Export contents to IMS Archive',                                           'imse' => 'Export contents to IMS Archive',
                                          'dcd'  => "Copy $crstype Content to Authoring Space",                                           'dcd'  => "Copy $crstype Content to Authoring Space",
             );              );
Line 7279  sub generate_admin_menu { Line 7666  sub generate_admin_menu {
                 ]                  ]
         });          });
     if ($canedit) {      if ($canedit) {
           my ($crsauname,$crsaudom,$crshome);
           if (($coursenum ne '') && ($coursedom ne '')) {
               my $crsauthorurl = "/priv/$coursedom/$coursenum/";
               ($crsauname,$crsaudom,$crshome) = &Apache::lonnet::constructaccess($crsauthorurl);
               if (($crsauname eq $coursenum) && ($crsaudom eq $coursedom)) {
                   my @ids=&Apache::lonnet::current_machine_ids();
                   my $linkurl;
                   if (grep(/^\Q$crshome\E$/,@ids)) {
                       $linkurl = $crsauthorurl;
                   } else {
                       $linkurl =
                           &Apache::lonhtmlcommon::jump_to_editres($crsauthorurl,$crshome,1);
                   }
                   if ((ref($menu[0]) eq 'HASH') && (ref($menu[0]->{'items'}) eq 'ARRAY')) {
                        push(@{$menu[0]->{items}},
                        {   linktext   => $lt{'ca'},
                            url        => $linkurl,
                            permission => 'F',
                            help       => 'Docs_Course_Authorspace',
                            icon       => 'impcrsau.png',
                            linktitle  => $lt{'ca'},
                        });
                   }
               }
           }
         push(@menu,          push(@menu,
         {   categorytitle=>'Export',          {   categorytitle=>'Export',
             items =>[              items =>[
Line 7816  function toggleMap(caller) { Line 8228  function toggleMap(caller) {
             }              }
         }          }
         document.getElementById('importmapform').style.display=disp;          document.getElementById('importmapform').style.display=disp;
           if (disp == 'block') {
               if (document.getElementById('importcrsresform')) {
                   if (document.getElementById('importcrsresform').style.display == 'block') {
                       document.getElementById('importcrsresform').style.display = 'none';
                   }
               }
           }
         resize_scrollbox('contentscroll','1','1');          resize_scrollbox('contentscroll','1','1');
     }      }
     return;      return;
Line 8016  function toggleImportCrsres(caller) { Line 8435  function toggleImportCrsres(caller) {
             }              }
         }          }
         document.getElementById('importcrsresform').style.display=disp;          document.getElementById('importcrsresform').style.display=disp;
           if (disp == 'block') {
               if (document.getElementById('importmapform')) {
                   if (document.getElementById('importmapform').style.display == 'block') {
                       document.getElementById('importmapform').style.display = 'none';
                   }
               }
           }
         resize_scrollbox('contentscroll','1','0');          resize_scrollbox('contentscroll','1','0');
     }      }
     return;      return;
Line 8067  function populateDirSelects(form,locsel, Line 8493  function populateDirSelects(form,locsel,
                 }                  }
             }              }
         }          }
           var templateradio = document.courseresform.elements['newresusetemp'];
         if (athome) {          if (athome) {
             if (document.getElementById('stdprobswitch')) {              if (document.getElementById('stdprobswitch')) {
                 document.getElementById('stdprobswitch').style.display = 'none';                  document.getElementById('stdprobswitch').style.display = 'none';
Line 8074  function populateDirSelects(form,locsel, Line 8501  function populateDirSelects(form,locsel,
             if (document.getElementById('newstdproblem')) {              if (document.getElementById('newstdproblem')) {
                 document.getElementById('newstdproblem').style.display = 'none';                  document.getElementById('newstdproblem').style.display = 'none';
             }              }
               var canedit = '$canedit';
               if (canedit) {
                   if (templateradio.length > 1) {
                       for (var i=0; i<templateradio.length; i++) {
                           templateradio[i].disabled = false;
                       }
                   }
                   document.courseresform.newresourcename.disabled = false;
                   document.courseresform.newcrs.disabled = false;
               }
             var http = new XMLHttpRequest();              var http = new XMLHttpRequest();
             var url = "/adm/courseauthor";              var url = "/adm/courseauthor";
             var params = "role="+role+"&rec="+recurse+"&nonempty="+nonemptydir+"&addtop=1";              var params = "role="+role+"&rec="+recurse+"&nonempty="+nonemptydir+"&addtop=1";
Line 8112  function populateDirSelects(form,locsel, Line 8549  function populateDirSelects(form,locsel,
             if (document.getElementById('newstdproblem')) {              if (document.getElementById('newstdproblem')) {
                 document.getElementById('newstdproblem').style.display = 'none';                  document.getElementById('newstdproblem').style.display = 'none';
             }              }
               if (templateradio.length > 1) {
                   for (var i=0; i<templateradio.length; i++) {
                       templateradio[i].disabled = true;
                   }
               }
               document.courseresform.newresourcename.disabled = true;
               document.courseresform.newcrs.disabled = true;
         }          }
     }      }
     return;      return;
Line 8963  sub dump_switchserver_js { Line 9407  sub dump_switchserver_js {
     );      );
     my %html_js_lt = &Apache::lonlocal::texthash(      my %html_js_lt = &Apache::lonlocal::texthash(
         swit => 'Switch server?',          swit => 'Switch server?',
         duco => 'Copying Content to Authoring Space',          duco => 'Copying uploaded content to Authoring Space',
         yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',          yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',
         chos => 'Choose server',          chos => 'Choose server',
     );      );
Line 9104  sub makenewproblem { Line 9548  sub makenewproblem {
                         if ($redirect) {                          if ($redirect) {
                             my $rightsfile = 'default.rights';                              my $rightsfile = 'default.rights';
                             my $sourcerights = "$path/$rightsfile";                              my $sourcerights = "$path/$rightsfile";
                               &Apache::loncommon::crsauthor_rights($rightsfile,$path,$docroot,$coursenum,$coursedom);
                             my $targetrights = $docroot."/res/$coursedom/$coursenum/$rightsfile";                              my $targetrights = $docroot."/res/$coursedom/$coursenum/$rightsfile";
                             my $now = time;  
                             if (!-e $sourcerights) {  
                                 my $cid = $coursedom.'_'.$coursenum;  
                                 if (open(my $fh,">$sourcerights")) {  
                                     print $fh <<END;  
 <accessrule effect="deny" realm="" type="course" role="" />  
 <accessrule effect="allow" realm="$cid" type="course" role="" />  
 END  
                                     close($fh);  
                                 }  
                             }  
                             if (!-e "$sourcerights.meta") {  
                                 if (open(my $fh,">$sourcerights.meta")) {  
                                     my $author=$env{'environment.firstname'}.' '.  
                                                $env{'environment.middlename'}.' '.  
                                                $env{'environment.lastname'}.' '.  
                                                $env{'environment.generation'};  
                                     $author =~ s/\s+$//;  
                                     print $fh <<"END";  
   
 <abstract></abstract>  
 <author>$author</author>  
 <authorspace>$coursenum:$coursedom</authorspace>  
 <copyright>private</copyright>  
 <creationdate>$now</creationdate>  
 <customdistributionfile></customdistributionfile>  
 <dependencies></dependencies>  
 <domain>$coursedom</domain>  
 <highestgradelevel>0</highestgradelevel>  
 <keywords></keywords>  
 <language>notset </language>  
 <lastrevisiondate>$now</lastrevisiondate>  
 <lowestgradelevel>0</lowestgradelevel>  
 <mime>rights</mime>  
 <modifyinguser>$env{'user.name'}:$env{'user.domain'}</modifyinguser>  
 <notes></notes>  
 <obsolete></obsolete>  
 <obsoletereplacement></obsoletereplacement>  
 <owner>$coursenum:$coursedom</owner>  
 <rule>deny:::course,allow:$cid::course</rule>  
 <sourceavail></sourceavail>  
 <standards></standards>  
 <subject></subject>  
 <title></title>  
 END  
                                     close($fh);  
                                 }  
                             }  
                             if ((-e $sourcerights) && (-e "$sourcerights.meta")) {                              if ((-e $sourcerights) && (-e "$sourcerights.meta")) {
                                 if (!-e "$docroot/res/$coursedom") {                                  if (!-e "$docroot/res/$coursedom") {
                                     mkdir("$docroot/res/$coursedom",0755);                                      mkdir("$docroot/res/$coursedom",0755);

Removed from v.1.702  
changed lines
  Added in v.1.709


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>