Diff for /loncom/interface/londocs.pm between versions 1.714 and 1.715

version 1.714, 2024/12/27 02:32:55 version 1.715, 2024/12/28 12:19:21
Line 579  $contents{webreferences}.' Line 579  $contents{webreferences}.'
     $title=~s/[\/\s]+/\_/gs;      $title=~s/[\/\s]+/\_/gs;
     $title=&clean($title);      $title=&clean($title);
     my $formname = 'dumpdoc';      my $formname = 'dumpdoc';
     my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash);      my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash).
                              '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
     my %uploadedfiles;      my %uploadedfiles;
     &tiehash();      &tiehash();
     foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {      foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
Line 643  sub authorspace_selector { Line 644  sub authorspace_selector {
     }      }
     $preamble .= '<div class="LC_left_float">'.      $preamble .= '<div class="LC_left_float">'.
                  '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.                   '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.
                  '<input type="text" size="50" name="authorfolder" value="'.$title.'" />'."\n".                   '<input type="text" size="30" name="authorfolder" value="'.$title.'" />'."\n".
                  '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";                   '</fieldset></div>'."\n";
     return $preamble;      return $preamble;
 }  }
   
Line 694  sub recurse_html { Line 695  sub recurse_html {
   
 sub copycrsauthored {  sub copycrsauthored {
     my ($r,$coursenum,$coursedom,$coursehome,$readonly) = @_;      my ($r,$coursenum,$coursedom,$coursehome,$readonly) = @_;
     my ($starthash,$js);      my ($starthash,$js,$title,$formname);
       my %origcrsdata=&Apache::lonnet::coursedescription($env{'request.course.id'});
       $title=$origcrsdata{'description'};
       $title=~s/[\/\s]+/\_/gs;
       $title=&clean($title);
       my ($home,$other,%outhash)=&authorhosts();
     unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {      unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
         $js = <<"ENDJS";          my %js_lt;
           $formname = 'copycrsauthored';
           if ($home) {
               %js_lt =
                   &Apache::lonlocal::texthash(
                       yomu => 'You must select an Authoring Space',
                       whco => 'When Copyright set to "custom", URL of a published rights file is needed.',
               );
               &js_escape(\%js_lt);
           }
           if ($home > 1) {
               $js = <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
   
   function validCrsCopy() {
       var dest = document.$formname.authorspace.options[document.$formname.authorspace.selectedIndex].value;
       if (dest == '') {
           alert("$js_lt{'yomu'}");
           return false;
       }
       var dist = document.$formname.copyright.options[document.$formname.copyright.selectedIndex].value;
       if (dist == 'custom') {
           if (document.$formname.customrights.value == '') {
               alert("$js_lt{'whco'}");
               return false;
           }
       }   
       return true;
   }
   
   function init_copycrs_form() {
       document.$formname.authorspace.selectedIndex = "0";
       document.$formname.authorfolder.value = '$title';
       document.$formname.copyright.selectedIndex = "0";
   }
   
   // ]]>
   </script>
   
   ENDJS
           } elsif ($home) {
               $js = <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
   
   function init_copycrs_form() {
       document.$formname.authorfolder.value = '$title';
       document.$formname.copyright.selectedIndex = "0";
   }
   
   // ]]>
   </script>
   
   ENDJS
           }
           $js .= <<"ENDJS";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
   
Line 707  function hide_searching() { Line 769  function hide_searching() {
     return;      return;
 }  }
   
   function showHideCustom(caller,divid) {
       if (document.getElementById(divid)) {
           if (caller.options[caller.selectedIndex].value == 'custom') {
               document.getElementById(divid).style.display="inline-block";
           } else {
               document.getElementById(divid).style.display="none";
           }
       }
       return;
   }
   
 // ]]>  // ]]>
 </script>  </script>
 ENDJS  ENDJS
   
           $js .= "\n".&Apache::lonhtmlcommon::scripttag(&Apache::loncommon::browser_and_searcher_javascript())."\n";
         $starthash = {          $starthash = {
                          add_entries => {'onload' => "hide_searching();"},                           add_entries => {'onload' => "hide_searching(); init_copycrs_form();"},
                      };                       };
     }      }
     $r->print(&Apache::loncommon::start_page('Copy from Course Authoring to User Authoring',$js,$starthash)."\n".      $r->print(&Apache::loncommon::start_page('Copy from Course Authoring to User Authoring',$js,$starthash)."\n".
               &Apache::lonhtmlcommon::breadcrumbs('Copy from Course Authoring Space')."\n");                &Apache::lonhtmlcommon::breadcrumbs('Copy from Course Authoring Space')."\n");
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
     my ($home,$other,%outhash)=&authorhosts();  
     unless ($home) {      unless ($home) {
         $r->print('<p class="LC_info">'.&mt('No author or co-author roles on this server.').'</p>');          $r->print('<p class="LC_info">'.&mt('No author or co-author roles on this server.').'</p>');
         $r->print(&endContentScreen());          $r->print(&endContentScreen());
         return '';          return '';
     }      }
       my $docroot = $r->dir_config('lonDocRoot');
     my $is_course_home;      my $is_course_home;
     my @ids=&Apache::lonnet::current_machine_ids();      my @ids=&Apache::lonnet::current_machine_ids();
     if (($coursehome ne '') && (grep(/^\Q$coursehome\E$/,@ids))) {      if (($coursehome ne '') && (grep(/^\Q$coursehome\E$/,@ids))) {
         $is_course_home = 1;          $is_course_home = 1;
     }      }
     my %origcrsdata=&Apache::lonnet::coursedescription($env{'request.course.id'});  
     my $exclude = &Apache::lonnet::priv_exclude();      my $exclude = &Apache::lonnet::priv_exclude();
     my $srcurl = "/priv/$coursedom/$coursenum";      my $srcurl = "/priv/$coursedom/$coursenum";
     my $srctop = $r->dir_config('lonDocRoot').$srcurl;      my $srctop = $docroot.$srcurl;
       my $resurl = "/res/$coursedom/$coursenum";
       my $res_exclude = &Apache::lonnet::res_exclude();
     if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {      if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
         $r->print('<h3>'.&mt('Copying Files and/or Sub-directories').'</h3>');          $r->print('<h3>'.&mt('Copying Files and/or Sub-directories').'</h3>');
         if ($readonly) {          if ($readonly) {
Line 748  ENDJS Line 824  ENDJS
         }          }
         my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});          my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});
         my $desturl = "/priv/$cd/$ca";          my $desturl = "/priv/$cd/$ca";
         my $desttop = $r->dir_config('lonDocRoot').$desturl;          my $destresurl = "/res/$cd/$ca";
           my $desttop = $docroot.$desturl;
         my $subdir = &clean($env{'form.authorfolder'});          my $subdir = &clean($env{'form.authorfolder'});
         $subdir = &cleandir($subdir);          $subdir = &cleandir($subdir);
         if ($subdir eq '') {          if ($subdir eq '') {
Line 806  ENDJS Line 883  ENDJS
         }          }
         if (keys(%tocopy)) {          if (keys(%tocopy)) {
             my (%resdirs,%resfiles);              my (%resdirs,%resfiles);
             my $resurl = "/res/$coursedom/$coursenum";  
             my $res_exclude = &Apache::lonnet::res_exclude();  
             &Apache::lonnet::recursedirs($is_course_home,1,undef,$res_exclude,0,0,$resurl,'',\%resdirs,\%resfiles);              &Apache::lonnet::recursedirs($is_course_home,1,undef,$res_exclude,0,0,$resurl,'',\%resdirs,\%resfiles);
             my ($notopdir,%newdir,%newfile,%checkdeps);              my ($notopdir,%newdir,%newfile,%checkdeps);
             $r->print('<p>'.&mt('Copy to: [_1]',              $r->print('<p>'.&mt('Copy to: [_1]',
Line 851  ENDJS Line 926  ENDJS
                 }                  }
                 if (-e $desttop.'/'.$subdir) {                  if (-e $desttop.'/'.$subdir) {
                     my $num = 0;                      my $num = 0;
                       my ($copyright,$customdistfile);
                       if ($env{'form.copyright'} eq 'default' || $env{'form.copyright'} eq 'domain' || $env{'form.copyright'} eq 'public') {
                           $copyright = $env{'form.copyright'};
                       } elsif ($env{'form.copyright'} eq 'custom') {
                           if ($env{'form.customrights'} =~ m{^/res/$match_domain/$match_username/.+\.rights$}) {
                               my ($rightsdom,$rightsuname) = ($1,$2);
                               my $rightshome = &Apache::lonnet::homeserver($rightsdom,$rightsuname);
                               if (($rightshome eq 'no_host') || ($rightshome eq '')) {
                                   $copyright = 'default';
                               } elsif (grep(/^\Q$rightshome\E$/,@ids)) {
                                   if (-e $docroot.$env{'form.customrights'}) {
                                       $copyright = 'custom';
                                       $customdistfile = $env{'form.customrights'};
                                   } else {
                                       $copyright = 'default';
                                   }
                               } else {
                                   my $rightsfile = &Apache::lonnet::filelocation('',$env{'form.customrights'});
                                   unless (&Apache::lonnet::getfile($rightsfile) eq '-1') {
                                       $customdistfile = $env{'form.customrights'};
                                   }
                               }
                           }
                       }
                       my $sourceavail;
                       if ($env{'form.sourceavail'} =~ /^(open|closed)$/) {
                           $sourceavail = $env{'form.sourceavail'};
                       }
                       my $respublish;
                       if ($env{'form.respublish'}) {
                           $respublish = 1;
                       }
                       my $nokeyref = &Apache::lonpublisher::getnokey($r->dir_config('lonIncludes'));
                     foreach my $file (keys(%files_to_copy)) {                      foreach my $file (keys(%files_to_copy)) {
                         my ($fail,$dup,$dir_is_file,$src,$dest,$path,$fname);                          my ($fail,$dup,$dir_is_file,$src,$dest,$path,$fname);
                         if ($file =~ m{/}) {                          if ($file =~ m{/}) {
Line 911  ENDJS Line 1019  ENDJS
                                 }                                  }
                                 if ($gotmeta) {                                  if ($gotmeta) {
                                     if (open(my $fh,'<',$dest.'.meta')) {                                      if (open(my $fh,'<',$dest.'.meta')) {
                                         my ($output,$now);                                          my ($output,$now,setsourceavail);
                                         $now = time;                                          $now = time;
                                           if (($file =~ /\.(xml|html|htm|xhtml|xhtm)$/i) || ($file =~ /$LONCAPA::assess_re/)) {
                                               $setsourceavail = 1;
                                           }
                                         while (my $line=<$fh>) {                                          while (my $line=<$fh>) {
                                             chomp($line);                                              chomp($line);
                                             if ($line eq "<authorspace>$coursenum:$coursedom</authorspace>") {                                              if ($line eq "<authorspace>$coursenum:$coursedom</authorspace>") {
                                                 $output .= "<authorspace>$ca:$cd</authorspace>\n";                                                  $output .= "<authorspace>$ca:$cd</authorspace>\n";
                                             } elsif ($line eq '<copyright>custom</copyright>') {                                              } elsif ($line eq '<copyright>custom</copyright>') {
                                                 $output .= "<copyright>default</copyright>\n";                                                  $output .= "<copyright>$copyright</copyright>\n";
                                             } elsif ($line =~ m{^<creationdate>\d+</creationdate>$}) {                                              } elsif ($line =~ m{^<creationdate>\d+</creationdate>$}) {
                                                 $output .= "<creationdate>$now</creationdate>\n";                                                  $output .= "<creationdate>$now</creationdate>\n";
                                             } elsif ($line eq "<customdistributionfile>/res/$coursedom/$coursenum/default.rights</customdistributionfile>") {                                              } elsif ($line eq "<customdistributionfile>/res/$coursedom/$coursenum/default.rights</customdistributionfile>") {
                                                 $output .= "<customdistributionfile></customdistributionfile>\n";                                                  $output .= "<customdistributionfile>$customdistfile</customdistributionfile>\n";
                                               } elsif ($line =~ m{^<sourceavail>(open|closed)</sourceavail>$}) {
                                                   if ($setsourceavail) {
                                                       $output .= "<sourceavail>$sourceavail</sourceavail>\n";
                                                   }
                                             } elsif ($line eq "<domain>$coursedom</domain>") {                                              } elsif ($line eq "<domain>$coursedom</domain>") {
                                                 $output .= "<domain>$cd</domain>\n";                                                  $output .= "<domain>$cd</domain>\n";
                                             } elsif ($line =~ m{^<lastrevisiondate>\d+</lastrevisiondate>$}) {                                              } elsif ($line =~ m{^<lastrevisiondate>\d+</lastrevisiondate>$}) {
Line 1095  ENDJS Line 1210  ENDJS
                                         }                                          }
                                     }                                      }
                                 }                                  }
                                   if ($respublish) {
                                       my $destresfile = $docroot.$destresurl.'/'.$subdir.'/'.$file;
                                       if ($path eq '') {
                                           if ((ref($resfiles{'/'}) eq 'HASH') &&
                                               (exists($resfiles{'/'}{$fname}))) {
                                               my $output = &Apache::lonpublisher::batchpublish($r,$dest,$destresfile,$nokeyref,1);
                                           }
                                       } elsif ((ref($resfiles{$path}) eq 'HASH') &&
                                                (exists($resfiles{$path}{$fname}))) {
                                           my $output = &Apache::lonpublisher::batchpublish($r,$dest,$destresfile,$nokeyref,1);
                                       }
                                   }
                             }                              }
                         }                          }
                     }                      }
Line 1138  ENDJS Line 1265  ENDJS
             return '';              return '';
         }          }
     } else {      } else {
         my $formname = 'copycrsauthored';  
         my $chkname = 'copytouser';          my $chkname = 'copytouser';
         my $context = 'crsauthored';          my $context = 'crsauthored';
         my (%subdirs,%files,@dirs_by_depth,@files_by_depth,%parent,%children,%hierarchy,@checked_maps);          my (%subdirs,%files,@dirs_by_depth,@files_by_depth,%parent,%children,%hierarchy,@checked_maps);
Line 1172  ENDJS Line 1298  ENDJS
         }          }
         my ($info,$display,$onsubmit,$togglebuttons,$disabled);          my ($info,$display,$onsubmit,$togglebuttons,$disabled);
         my (%resdirs,%resfiles);          my (%resdirs,%resfiles);
         my $resurl = "/res/$coursedom/$coursenum";          &Apache::lonnet::recursedirs($is_course_home,1,undef,$res_exclude,0,0,$resurl,'',\%resdirs,\%resfiles);
         my $resexclude = &Apache::lonnet::res_exclude();          my $numpub = 0;
         &Apache::lonnet::recursedirs($is_course_home,1,undef,$resexclude,0,0,$resurl,'',\%resdirs,\%resfiles);          if (keys(%resfiles)) {
               foreach my $dir (keys(%resfiles)) {
                   if (ref($resfiles{$dir}) eq 'HASH') {
                       foreach my $file (keys(%{$resfiles{$dir}})) {
                           if (exists($files{$dir}{$file})) {
                               $numpub ++;
                           }
                       }
                   }
               }
           }
         if ($readonly) {          if ($readonly) {
             $disabled = ' disabled="disabled"';              $disabled = ' disabled="disabled"';
         }          }
Line 1186  ENDJS Line 1322  ENDJS
                              '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.                               '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.
                              ' onclick="javascript:uncheckAll(document.'.$formname.'.'.$chkname.')" />';                               ' onclick="javascript:uncheckAll(document.'.$formname.'.'.$chkname.')" />';
         }          }
         my $title=$origcrsdata{'description'};          my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash).
         $title=~s/[\/\s]+/\_/gs;                         &courseresource_options($formname,$numpub).
         $title=&clean($title);                         '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
         my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash);          my $display = '<form name="'.$formname.'" action="" method="post" onsubmit="return validCrsCopy();">'."\n".
         my $display = '<form name="'.$formname.'" action="" method="post">'."\n".  
                       $preamble."\n".                        $preamble."\n".
                       '<div class="LC_float_left">'."\n".                        '<div class="LC_float_left">'."\n".
                       '<fieldset>'."\n".                        '<fieldset>'."\n".
Line 1326  sub recurse_crsauthored { Line 1461  sub recurse_crsauthored {
     return $count;      return $count;
 }  }
   
   sub courseresource_options {
       my ($formname,$numpub) = @_;
       my %lt = &Apache::lonlocal::texthash(
                                             'default' => 'System wide - can be used for any courses system wide',
                                             'domain'  => 'Domain only - use limited to courses in the domain',
                                             'custom'  => 'Customized right of use ...',
                                             'public'  => 'Public - no authentication or authorization required for use',
                                             'closed'  => 'Closed - XML source is closed to everyone',
                                             'open'    => 'Open - XML source is open to people who want to use it',
                                             'sel'     => 'Select',
                                           );
       my $output;
       if ($numpub) {
           $output .= '<div class="LC_left_float">'.
                      '<fieldset><legend>'.&mt('Published Resources').'</legend>'.
                      &mt('[quant,_1,file] in Course Authoring Space also exist in Resource Space.',
                          $numpub).'</br />'.
                      &mt('Publish copied files in selected Authoring Space?').': '."\n".
                      '<label><input type="radio" name="respublish" checked="checked" value="1" />'.
                      &mt('Yes').'</label>'."\n".
                      '<label><input type="radio" name="respublish" value="0" />'.
                      &mt('No').'</label>'."\n".
                      '</fieldset></div>'."\n";
       }
       $output .= '<div class="LC_left_float">'.
                  '<fieldset><legend>'.&mt('Distribution to set in metadata').'</legend>'.
                  &mt('Copyright').': '.
                  '<select name="copyright" onchange="showHideCustom(this,'."'LC_customfile'".');">'."\n".
                  '<option value="default" selected="selected">'.$lt{'default'}.'</option>'."\n".
                  '<option value="domain">'.$lt{'domain'}.'</option>'."\n".
                  '<option value="public">'.$lt{'public'}.'</option>'."\n".
                  '<option value="custom">'.$lt{'custom'}.'</option>'."\n".
                  '</select><div id="LC_customfile" style="padding:0;clear:both;margin:0;border:0;display:none">'."\n".
                  '<input type="text" name="customrights" size="60" value="" />'.
                  '<a href="javascript:openbrowser('."'$formname','customrights','rights'".');">'.
                  $lt{'sel'}.'</a></div><br />'."\n".
                  &mt('Source').' :'.
                  '<select name="sourceavail">'."\n".
                  '<option value="closed" selected="selected">'.$lt{'closed'}.'</option>'."\n".
                  '<option value="open">'.$lt{'open'}.'</option>'."\n".
                  '</select><br />'."\n".
                  '</fieldset></div>'."\n";
       return $output;
   }
   
 sub group_import {  sub group_import {
     my ($coursenum, $coursedom, $folder, $container, $caller, $ltitoolsref, @files) = @_;      my ($coursenum, $coursedom, $folder, $container, $caller, $ltitoolsref, @files) = @_;
     my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,      my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,

Removed from v.1.714  
changed lines
  Added in v.1.715


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