Diff for /loncom/interface/londocs.pm between versions 1.182 and 1.205

version 1.182, 2005/06/08 21:38:44 version 1.205, 2005/09/01 23:20:05
Line 166  sub dumpcourse { Line 166  sub dumpcourse {
  $crs=~s/\_/\//g;   $crs=~s/\_/\//g;
  foreach (keys %replacehash) {   foreach (keys %replacehash) {
     my $newfilename=$title.'/'.$replacehash{$_};      my $newfilename=$title.'/'.$replacehash{$_};
       $newfilename=~s/\.(\w+)$//;
       my $ext=$1;
     $newfilename=&clean($newfilename);      $newfilename=&clean($newfilename);
       $newfilename.='.'.$ext;
     my @dirs=split(/\//,$newfilename);      my @dirs=split(/\//,$newfilename);
     my $path='/home/'.$ca.'/public_html';      my $path='/home/'.$ca.'/public_html';
     my $makepath=$path;      my $makepath=$path;
Line 249  sub dumpcourse { Line 252  sub dumpcourse {
 # ------------------------------------------------------ Generate "export" button  # ------------------------------------------------------ Generate "export" button
   
 sub exportbutton {  sub exportbutton {
     return '';  
     return '</td><td bgcolor="#DDDDCC">'.      return '</td><td bgcolor="#DDDDCC">'.
             '<input type="submit" name="exportcourse" value="'.              '<input type="submit" name="exportcourse" value="'.
             &mt('Export Course to IMS').'" />'.              &mt('Export Course to IMS').'" />'.
             &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs');      &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs');
 }  }
   
 sub exportcourse {  sub exportcourse {
Line 491  sub create_ims_store { Line 493  sub create_ims_store {
 ' identifier="MANIFEST-'.$env{'request.course.id'}.'-'.$now.'"'.  ' identifier="MANIFEST-'.$env{'request.course.id'}.'-'.$now.'"'.
 '  xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1imscp_v1p1.xsd'.  '  xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1imscp_v1p1.xsd'.
 '  http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">'."\n".  '  http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">'."\n".
   '  <metadata>
       <schema></schema>
       <imsmd:lom>
         <imsmd:general>
           <imsmd:identifier>'.$env{'request.course.id'}.'</imsmd:identifier>
           <imsmd:title>
             <imsmd:langstring xml:lang="en">'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</imsmd:langstring>
           </imsmd:title>
         </imsmd:general>
       </imsmd:lom>
     </metadata>'."\n".
 '  <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".  '  <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".
 '    <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.  '    <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.
 ' structure="hierarchical">'."\n".  ' structure="hierarchical">'."\n".
 '      <title>'.$env{'request.'.$env{'request.course.id'}.'.description'}.'</title>'  '      <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'
     } else {      } else {
         $$outcome .= 'An error occurred opening the IMS manifest file.<br />'          $$outcome .= 'An error occurred opening the IMS manifest file.<br />'
 ;  ;
Line 542  sub build_package { Line 555  sub build_package {
     $count = 0;      $count = 0;
     my $imsresources;      my $imsresources;
     my $pkgdepth;      my $pkgdepth;
     my $included = 0;  
     while ($curRes = $it->next()) {      while ($curRes = $it->next()) {
         if ($curRes == $it->BEGIN_MAP()) {          if ($curRes == $it->BEGIN_MAP()) {
             $prevdepth = $depth;              $prevdepth = $depth;
Line 565  sub build_package { Line 577  sub build_package {
                 unless ($curRes->is_sequence()) {                  unless ($curRes->is_sequence()) {
                     $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"';                      $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"';
                 }                  }
                 if (($depth <= $prevdepth) && ($count > 1) && ($included)) {                  my $step = $prevdepth - $depth;
                     print $ims_manifest "\n".'  </item>'."\n";                  if (($step >= 0) && ($count > 1)) {
                       while ($step >= 0) {
                           print $ims_manifest "\n".'  </item>'."\n";
                           $step --;
                       }
                 }                  }
                 $included = 1;  
                 $prevdepth = $depth;                  $prevdepth = $depth;
   
                 my $itementry =                  my $itementry =
Line 610  sub build_package { Line 625  sub build_package {
                     }                      }
                 }                  }
                 $pkgdepth = $depth;                  $pkgdepth = $depth;
             } else {  
                 $included = 0;  
             }              }
         }          }
     }      }
Line 646  sub process_content { Line 659  sub process_content {
     my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_;      my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_;
     my $content_type;      my $content_type;
     my $message;      my $message;
 # find where user is author or co-author  
     my @uploads = ();      my @uploads = ();
     if ($curRes->is_sequence()) {      if ($curRes->is_sequence()) {
         $content_type = 'sequence';          $content_type = 'sequence';
Line 679  sub process_content { Line 691  sub process_content {
         if ($contents) {          if ($contents) {
             $$content_file = &store_template($contents,$tempexport,$count,$content_type);              $$content_file = &store_template($contents,$tempexport,$count,$content_type);
         }          }
     } elsif ($symb =~ m-lib/templates/examupload\.problem-m) {      } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
         $content_type = 'examupload';          $content_type = 'examupload';
     } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {      } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {
         $content_type = 'bulletinboard';          $content_type = 'bulletinboard';
Line 700  sub process_content { Line 712  sub process_content {
         if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'})  {          if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'})  {
             $canedit= 1;              $canedit= 1;
         }          }
   # only include problem code where current user is author
         if ($canedit) {          if ($canedit) {
             $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');              $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');
         } else {          } else {
Line 748  sub replicate_content { Line 761  sub replicate_content {
         if ($copiedfile = Apache::File->new('>'.$destination)) {          if ($copiedfile = Apache::File->new('>'.$destination)) {
             my $content;              my $content;
             if ($caller eq 'resource') {              if ($caller eq 'resource') {
                 $content = &Apache::lonnet::getfile('/home/httpd/html/res/'.$url);                  my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';
                   my $filepath = &Apache::lonnet::filelocation($respath,$url);
                   $content = &Apache::lonnet::getfile($filepath);
                 if ($content eq -1) {                  if ($content eq -1) {
                     $$message = 'Could not copy file '.$filename;                      $$message = 'Could not copy file '.$filename;
                 } else {                  } else {
                     &extract_media($content,$count,$tempexport,$href,'resource');                      &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'resource');
                     $repstatus = 'ok';                      $repstatus = 'ok';
                 }                  }
             } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') {              } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') {
Line 760  sub replicate_content { Line 775  sub replicate_content {
                 $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);                  $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);
                 if ($repstatus eq 'ok') {                  if ($repstatus eq 'ok') {
                     if ($url =~ /\.html?$/i) {                      if ($url =~ /\.html?$/i) {
                         &extract_media(\$content,$count,$tempexport,$href,'uploaded');                          &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'uploaded');
                     }                      }
                 } else {                  } else {
                     $$message = 'Could not render '.$url.' server message - '.$rtncode;                      $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n";
                 }                  }
             } elsif ($caller eq 'noedit') {              } elsif ($caller eq 'noedit') {
 # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this.   # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this. 
Line 775  sub replicate_content { Line 790  sub replicate_content {
             }              }
             close($copiedfile);              close($copiedfile);
         } else {          } else {
             $$message = 'Could not open destination file for '.$filename."\n";              $$message = 'Could not open destination file for '.$filename."<br />\n";
         }          }
     } else {      } else {
         $$message = 'Could not determine name of file for '.$symb."\n";          $$message = 'Could not determine name of file for '.$symb."<br />\n";
     }      }
     if ($repstatus eq 'ok') {      if ($repstatus eq 'ok') {
         $content_name = $count.'/'.$filename;          $content_name = 'resources/'.$count.'/'.$filename;
     }      }
     return $content_name;      return $content_name;
 }  }
   
 sub extract_media {  sub extract_media {
     my ($content,$count,$tempexport,$href,$caller) = @_;      my ($url,$cdom,$cnum,$content,$count,$tempexport,$href,$message,$caller) = @_;
 # @$href will contain path to any embedded resources in the content.      my ($dirpath,$container);
 # For LON-CAPA problems this would be images. applets etc.       my %allfiles = ();
 # For uploaded HTML files this would be images etc.      my %codebase = ();
 # paths will be in the form $count/res/$file, and urls in the $content will be rewritten with the new paths.       if ($url =~ m-(.*/)([^/]+)$-) {
           $dirpath = $1;
           $container = $2;
       } else {
           $dirpath = $url;
           $container = '';
       }
       &Apache::lonnet::extract_embedded_items(undef,undef,\%allfiles,\%codebase,$content);
       foreach my $embed_file (keys(%allfiles)) {
           my $filename;
           if ($embed_file =~ m#([^/]+)$#) {
               $filename = $1;
           } else {
               $filename = $embed_file;
           }
           my $newname = 'res/'.$filename;
           my ($rtncode,$embed_content,$repstatus);
           my $embed_url;
           if ($embed_file =~ m-^/-) {
               $embed_url = $embed_file;           # points to absolute path
           } else {
               if ($embed_file =~ m-https?://-) {
                   next;                           # points to url
               } else {
                   $embed_url = $dirpath.$embed_file;  # points to relative path
               }
           }
           if ($caller eq 'resource') {
               my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';  
               my $embed_path = &Apache::lonnet::filelocation($respath,$embed_url); 
               $embed_content = &Apache::lonnet::getfile($embed_path);
               unless ($embed_content eq -1) {
                   $repstatus = 'ok';
               }
           } elsif ($caller eq 'uploaded') {
               
               $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode);
           }
           if ($repstatus eq 'ok') {
               my $destination = $tempexport.'/resources/'.$count.'/res';
               if (!-e "$destination") {
                   mkdir($destination,0755);
               }
               $destination .= '/'.$filename;
               my $copiedfile;
               if ($copiedfile = Apache::File->new('>'.$destination)) {
                   print $copiedfile $embed_content;
                   push @{$href}, 'resources/'.$count.'/res/'.$filename;
                   my $attrib_regexp = '';
                   if (@{$allfiles{$embed_file}} > 1) {
                       $attrib_regexp = join('|',@{$allfiles{$embed_file}});
                   } else {
                       $attrib_regexp = $allfiles{$embed_file}[0];
                   }
                   $$content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$embed_file\E(['"]?)#$1$newname$2#gi;
                   if ($caller eq 'resource' && $container =~ /\.(problem|library)$/) {
                       $$content =~ s#\Q$embed_file\E#$newname#gi;
                   }
               }
           } else {
               $$message .= 'replication of embedded file - '.$embed_file.' in '.$url.' failed, reason -'.$rtncode."<br />\n";
           }
       }
     return;      return;
 }  }
   
Line 812  sub store_template { Line 889  sub store_template {
                 close($storetemplate);                  close($storetemplate);
             }              }
             if ($content_type eq 'external') {              if ($content_type eq 'external') {
                 return $count.'/'.$content_type.'.html';                  return 'resources/'.$count.'/'.$content_type.'.html';
             } else {              } else {
                 return $count.'/'.$content_type.'.xml';                  return 'resources/'.$count.'/'.$content_type.'.xml';
             }              }
         }          }
     }      }
Line 840  sub group_import { Line 917  sub group_import {
                             '<resource id="2" src="" type="finish"></resource>'."\n".                              '<resource id="2" src="" type="finish"></resource>'."\n".
                             '</map>';                              '</map>';
             $env{'form.output'}=$newmapstr;              $env{'form.output'}=$newmapstr;
             my $home=&Apache::lonnet::homeserver($coursenum,$coursedom);              my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
             my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$home,  
                                                 'output',$1.$2);                                                  'output',$1.$2);
             if ($result != m|^/uploaded/|) {              if ($result != m|^/uploaded/|) {
                 $errtext.='Map not saved: A network error occured when trying to save the new map. ';                  $errtext.='Map not saved: A network error occured when trying to save the new map. ';
Line 904  sub breadcrumbs { Line 980  sub breadcrumbs {
 }  }
   
 sub editor {  sub editor {
     my ($r,$coursenum,$coursedom,$folder,$allowed)=@_;      my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_;
     my $errtext='';      my $errtext='';
     my $fatal=0;      my $fatal=0;
     my $container='sequence';      my $container='sequence';
Line 1032  sub editor { Line 1108  sub editor {
  }   }
   
     }      }
 # upload a file, if present              $r->print($upload_output);
            if (($env{'form.uploaddoc.filename'}) &&  
                ($env{'form.cmd'}=~/^upload_(\w+)/)) {  
     if ( ($folder=~/^$1/) || ($1 eq 'default') ) {  
             my $destination = 'docs/';  
             if ($folder eq 'default') {  
                $destination .= 'default/';  
                 } elsif ($folder =~ /^default_(\d+)$/) {  
                     $destination .=  $1.'/';  
                 }  
 # this is for a course, not a user, so set coursedoc flag  
 # probably the only place in the system where this should be "1"  
   
               my $newidx=&Apache::lonratedt::getresidx();  
               $destination .= $newidx;  
       my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination);  
   
               my $ext='false';  
               if ($url=~/^http\:\/\//) { $ext='true'; }  
               $url=~s/\:/\&colon;/g;  
       my $comment=$env{'form.comment'};  
               $comment=~s/\</\&lt\;/g;  
               $comment=~s/\>/\&gt\;/g;  
               $comment=~s/\:/\&colon;/g;  
               if ($folder=~/^supplemental/) {  
   $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.  
       $env{'user.domain'}.'___&&&___'.$comment;  
               }  
               $Apache::lonratedt::resources[$newidx]=  
                   $comment.':'.$url.':'.$ext.':normal:res';  
               $Apache::lonratedt::order[$#Apache::lonratedt::order+1]=  
                                                               $newidx;         
   
       ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);  
       if ($fatal) {  
   $r->print('<p><font color="red">'.$errtext.'</font></p>');  
   return;  
       }  
      }  
             }  
     if ($env{'form.cmd'}) {      if ($env{'form.cmd'}) {
                 my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});                  my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});
                 if ($cmd eq 'del') {                  if ($cmd eq 'del') {
     my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]);      my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]);
     if ($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) {      if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
    ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library)$/)) {
  &Apache::lonnet::removeuploadedurl($url);   &Apache::lonnet::removeuploadedurl($url);
       } else {
    &Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]);
     }      }
     &Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]);  
     for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {      for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {
                         $Apache::lonratedt::order[$i]=                          $Apache::lonratedt::order[$i]=
                           $Apache::lonratedt::order[$i+1];                            $Apache::lonratedt::order[$i+1];
Line 1212  FOLDERINFO Line 1251  FOLDERINFO
     }      }
 }  }
   
   sub process_file_upload {
       my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
   # upload a file, if present
       my $parseaction;
      if ($env{'form.parserflag'}) {
           $parseaction = 'parse';
       }
       my $phase_status;
       my $folder=$env{'form.folder'};
       if ($folder eq '') {
           $folder='default';
       }
       if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
           my $errtext='';
           my $fatal=0;
           my $container='sequence';
           if ($env{'form.pagepath'}) {
               $container='page';
           }
           ($errtext,$fatal)=
                 &mapread($coursenum,$coursedom,$folder.'.'.$container);
           if ($#Apache::lonratedt::order<1) {
               $Apache::lonratedt::order[0]=1;
               $Apache::lonratedt::resources[1]='';
           }
           if ($fatal) {
               return 'failed';
           }
           my $destination = 'docs/';
           if ($folder =~ /^supplemental/) {
               $destination = 'supplemental/';
           }
           if (($folder eq 'default') || ($folder eq 'supplemental')) {
               $destination .= 'default/';
           } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
               $destination .=  $2.'/';
           }
   # this is for a course, not a user, so set coursedoc flag
   # probably the only place in the system where this should be "1"
           my $newidx=&Apache::lonratedt::getresidx();
           $destination .= $newidx;
           my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
    $parseaction,$allfiles,
    $codebase);
           my $ext='false';
           if ($url=~/^http\:\/\//) { $ext='true'; }
           $url=~s/\:/\&colon;/g;
           my $comment=$env{'form.comment'};
           $comment=~s/\</\&lt\;/g;
           $comment=~s/\>/\&gt\;/g;
           $comment=~s/\:/\&colon;/g;
           if ($folder=~/^supplemental/) {
                 $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                     $env{'user.domain'}.'___&&&___'.$comment;
           }
   
           $Apache::lonratedt::resources[$newidx]=
                     $comment.':'.$url.':'.$ext.':normal:res';
           $Apache::lonratedt::order[$#Apache::lonratedt::order+1]= $newidx;
           ($errtext,$fatal)=&storemap($coursenum,$coursedom,
       $folder.'.'.$container);
           if ($fatal) {
               $$upload_output .= '<p><font color="red">'.$errtext.'</font></p>';
               return 'failed';
           } else {
               if ($parseaction eq 'parse') {
                   my $total_embedded = keys(%{$allfiles});
                   if ($total_embedded > 0) {
                       my $num = 0;
                       $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />
      <form name="upload_embedded" action="/adm/coursedocs"
                     method="post" enctype="multipart/form-data">
      <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />   <input type="hidden" name="cmd" value="upload_embedded" />
      <input type="hidden" name="newidx" value="'.$newidx.'" />
      <input type="hidden" name="primaryurl" value="'.&Apache::lonnet::escape($url).'" />
      <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
                       $$upload_output .= '<b>Upload embedded files</b>:<br />
      <table>';
                       foreach my $embed_file (keys(%{$allfiles})) {
                           $$upload_output .= '<tr><td>'.$embed_file.
             '<input name="embedded_item_'.$num.'" type="file" />
              <input name="embedded_orig_'.$num.'" type="hidden" value="'.&Apache::lonnet::escape($embed_file).'" />';
                           my $attrib;
                           if (@{$$allfiles{$embed_file}} > 1) {
                               $attrib = join(':',@{$$allfiles{$embed_file}});
                           } else {
                               $attrib = $$allfiles{$embed_file}[0];
                           }
                           $$upload_output .=
              '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />';
                           if (exists($$codebase{$embed_file})) {
                               $$upload_output .= 
             '<input name="codebase_'.$num.'" type="hidden" value="'.&Apache::lonnet::escape($$codebase{$embed_file}).'" />';
                           }
                           $$upload_output .= '</td></tr>';
                           $num ++;
                       }
                       $phase_status = 'phasetwo';
                       $$upload_output .= '</table><br />
      <input type ="submit" value="Complete upload" />
      </form>';
                   } else {
                       $$upload_output .= 'No embedded items identified<br />';
                   }
               }
           }
       }
       return $phase_status;
   }
   
   sub process_secondary_uploads {
       my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
       my $folder=$env{'form.folder'};
       my $destination = 'docs/';
       if ($folder =~ /^supplemental/) {
           $destination = 'supplemental/';
       }
       if (($folder eq 'default') || ($folder eq 'supplemental')) {
           $destination .= 'default/';
       } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
           $destination .=  $1.'/';
       }
       $destination .= $newidx;
       my ($url,$filename);
       $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
       ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);
       return $filename;
   }
   
 # --------------------------------------------------------------- An entry line  # --------------------------------------------------------------- An entry line
   
 sub entryline {  sub entryline {
Line 1582  sub verifycontent { Line 1750  sub verifycontent {
      &mt('Return to DOCS').'</a>');       &mt('Return to DOCS').'</a>');
 }  }
   
   
 # -------------------------------------------------------------- Check Versions  # -------------------------------------------------------------- Check Versions
   
   sub devalidateversioncache {
       my $src=shift;
       &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
     &Apache::lonnet::clutter($src));
   }
   
 sub checkversions {  sub checkversions {
     my $r=shift;      my $r=shift;
     my $html=&Apache::lonxml::xmlbegin();      my $html=&Apache::lonxml::xmlbegin();
Line 1610  sub checkversions { Line 1785  sub checkversions {
  foreach (keys %hash) {   foreach (keys %hash) {
     if ($_=~/^ids\_(\/res\/.+)$/) {      if ($_=~/^ids\_(\/res\/.+)$/) {
  $newsetversions{$1}='mostrecent';   $newsetversions{$1}='mostrecent';
                   &devalidateversioncache($1);
     }      }
  }   }
     } elsif ($env{'form.setcurrent'}) {      } elsif ($env{'form.setcurrent'}) {
Line 1619  sub checkversions { Line 1795  sub checkversions {
  my $getvers=&Apache::lonnet::getversion($1);   my $getvers=&Apache::lonnet::getversion($1);
  if ($getvers>0) {   if ($getvers>0) {
     $newsetversions{$1}=$getvers;      $newsetversions{$1}=$getvers;
       &devalidateversioncache($1);
  }   }
     }      }
  }   }
Line 1629  sub checkversions { Line 1806  sub checkversions {
  my $src=$1;   my $src=$1;
  if (($env{$_}) && ($env{$_} ne $setversions{$src})) {   if (($env{$_}) && ($env{$_} ne $setversions{$src})) {
     $newsetversions{$src}=$env{$_};      $newsetversions{$src}=$env{$_};
       &devalidateversioncache($src);
  }   }
     }      }
  }   }
Line 1858  sub changewarning { Line 2036  sub changewarning {
  if (defined($env{'form.pagepath'})) {   if (defined($env{'form.pagepath'})) {
     $pathvar='pagepath';      $pathvar='pagepath';
     $path=&Apache::lonnet::escape($env{'form.pagepath'});      $path=&Apache::lonnet::escape($env{'form.pagepath'});
     $path.='&amp;symb='.&Apache::lonnet::escape($env{'form.pagesymb'});      $path.='&amp;pagesymb='.&Apache::lonnet::escape($env{'form.pagesymb'});
  }   }
  $url='/adm/coursedocs?'.$pathvar.'='.$path;   $url='/adm/coursedocs?'.$pathvar.'='.$path;
     }      }
     if (!defined($message)) {      if (!defined($message)) {
  $message='Changes will become active for your current session after [_1], or the next time you log in.';   $message='Changes will become active for your current session after [_1], or the next time you log in.';
     }      }
     $r->print(      $r->print("\n\n".
 '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'.   '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n". 
 '<form name="reinit" method="post" action="/adm/roles" target="loncapaclient">'.  '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
 '<input type="hidden" name="orgurl" value="'.$url.  '<input type="hidden" name="orgurl" value="'.$url.
 '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.  '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.
 &mt($message,' <input type="hidden" name="'.  &mt($message,' <input type="hidden" name="'.
     $env{'request.role'}.'" value="1" /><input type="button" value="'.      $env{'request.role'}.'" value="1" /><input type="button" value="'.
     &mt('re-initializing course').'" onClick="reinit(this.form)" />').      &mt('re-initializing course').'" onClick="reinit(this.form)" />').
 $help{'Caching'}.'</font></h3></form>');  $help{'Caching'}.'</font></h3></form>'."\n\n");
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
Line 2118  function removeres(folderpath,index,oldt Line 2296  function removeres(folderpath,index,oldt
 }  }
   
 function cutres(folderpath,index,oldtitle,container,pagesymb) {  function cutres(folderpath,index,oldtitle,container,pagesymb) {
     if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible,\\neven if it is pasted in again elsewhere!\\nCut "'+oldtitle+'"?')) {      if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) {
  this.document.forms.renameform.cmd.value='cut_'+index;   this.document.forms.renameform.cmd.value='cut_'+index;
  this.document.forms.renameform.markcopy.value=index;   this.document.forms.renameform.markcopy.value=index;
         if (container == 'sequence') {          if (container == 'sequence') {
Line 2153  ENDNEWSCRIPT Line 2331  ENDNEWSCRIPT
             &Apache::loncommon::bodytag('Course Documents','',$events,              &Apache::loncommon::bodytag('Course Documents','',$events,
  '','',$showdoc).   '','',$showdoc).
     &Apache::loncommon::help_open_menu('','','','',273,'RAT'));      &Apache::loncommon::help_open_menu('','','','',273,'RAT'));
   unless ($showdoc) {    my %allfiles = ();
     my %codebase = ();
     my ($upload_result,$upload_output);
     if ($allowed) {
         if (($env{'form.uploaddoc.filename'}) &&                                               ($env{'form.cmd'}=~/^upload_(\w+)/)) {
   # Process file upload - phase one - upload and parse primary file.  
             $upload_result = &process_file_upload(\$upload_output,$coursenum,
    $coursedom,\%allfiles,
    \%codebase,$1);
             if ($upload_result eq 'phasetwo') {
                 $r->print($upload_output);
             }
         } elsif ($env{'form.phasetwo'}) {
             my %newname = ();
             my %origname = ();
             my %attribs = ();
             my $updateflag = 0;
             my $residx = $env{'form.newidx'};
             my $primary_url = &Apache::lonnet::unescape($env{'form.primaryurl'});
   # Process file upload - phase two - gather secondary files.
             for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
                 if ($env{'form.embedded_item_'.$i.'.filename'}) {
                     my $javacodebase;
                     $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
                     $origname{$i} = &Apache::lonnet::unescape($env{'form.embedded_orig_'.$i});
                     if (exists($env{'form.embedded_codebase_'.$i})) {
                         $javacodebase =  &Apache::lonnet::unescape($env{'form.embedded_codebase_'.$i});  
                         $origname{$i} =~ s#^\Q$javacodebase\E/##; 
                     }
                     my @attributes = ();
                     if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
                         @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
                     } else {
                         @attributes = ($env{'form.embedded_attrib_'.$i});
                     }
                     foreach (@attributes) {
                         push(@{$attribs{$i}},&Apache::lonnet::unescape($_));
                     }
                     if ($javacodebase) {
                         $codebase{$i} = $javacodebase;
                         $codebase{$i} =~ s#/$##;
                         $updateflag = 1;
                     }
                 }
                 unless ($newname{$i} eq $origname{$i}) {
                     $updateflag = 1;
                 }
             }
   # Process file upload - phase three - modify primary file
             if ($updateflag) {
                 my ($content,$rtncode);
                 my $updateflag = 0;
                 my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
                 if ($getstatus eq 'ok') {
                     foreach my $item (keys %newname) {
                         if ($newname{$item} ne $origname{$item}) {
                             my $attrib_regexp = '';
                             if (@{$attribs{$item}} > 1) {
                                 $attrib_regexp = join('|',@{$attribs{$item}});
                             } else {
                                 $attrib_regexp = $attribs{$item}[0];
                             }
                             if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
                             } 
                             $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; 
                         }
                         if (exists($codebase{$item})) {
                             $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i;
                         }
                     }
   # Save edited file.
                     my $saveresult;
                     my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                     my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
                     my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
                 } else {
                     &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); 
                 }
             }
         }
     }
   
     unless ($showdoc ||  $upload_result eq 'phasetwo') {
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
        my %lt=&Apache::lonlocal::texthash(         my %lt=&Apache::lonlocal::texthash(
                 'uplm' => 'Upload a new main course document',                  'uplm' => 'Upload a new main course document',
Line 2167  ENDNEWSCRIPT Line 2427  ENDNEWSCRIPT
                 'impo' => 'Import',                  'impo' => 'Import',
                 'selm' => 'Select Map',                  'selm' => 'Select Map',
                 'load' => 'Load Map',                  'load' => 'Load Map',
                   'reco' => 'Recover Deleted Resources',
                 'newf' => 'New Folder',                  'newf' => 'New Folder',
                 'newp' => 'New Composite Page',                  'newp' => 'New Composite Page',
                 'extr' => 'External Resource',                  'extr' => 'External Resource',
Line 2181  ENDNEWSCRIPT Line 2442  ENDNEWSCRIPT
                 'imsf' => 'Import IMS package',                  'imsf' => 'Import IMS package',
                 'file' =>  'File',                  'file' =>  'File',
                 'title' => 'Title',                  'title' => 'Title',
                 'comment' => 'Comment'                   'comment' => 'Comment',
                   'parse' => 'If HTML file, upload embedded images/multimedia files'
   );    );
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
     if ($allowed) {      if ($allowed) {
Line 2248  ENDCOURSEVERIFY Line 2510  ENDCOURSEVERIFY
            #$postexec='self.close();';             #$postexec='self.close();';
        }         }
        $hadchanges=0;         $hadchanges=0;
        &editor($r,$coursenum,$coursedom,$folder,$allowed);         &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output);
        if ($hadchanges) {         if ($hadchanges) {
    &mark_hash_old()     &mark_hash_old()
        }         }
Line 2257  ENDCOURSEVERIFY Line 2519  ENDCOURSEVERIFY
                      '.sequence';                       '.sequence';
        my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.         my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                      '.page';                       '.page';
    my $container='sequence';
    if ($env{'form.pagepath'}) {
       $container='page';
    }
    my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
        $r->print(<<ENDFORM);         $r->print(<<ENDFORM);
 <table cellspacing=4 cellpadding=4><tr>  <table cellspacing=4 cellpadding=4><tr>
 <th bgcolor="#DDDDDD">$lt{'uplm'}</th>  <th bgcolor="#DDDDDD">$lt{'uplm'}</th>
Line 2273  $lt{'title'}:<br /> Line 2539  $lt{'title'}:<br />
 <input type="text" size="50" name="comment">  <input type="text" size="50" name="comment">
 $uploadtag  $uploadtag
 <input type="hidden" name="cmd" value="upload_default">  <input type="hidden" name="cmd" value="upload_default">
   <br />
   <nobr>
   <label>$lt{'parse'}?
   <input type="checkbox" name="parserflag" />
   </label>
   </nobr>
   <br />
   <br />
 <nobr>  <nobr>
 <input type="submit" value="$lt{'upld'}">  <input type="submit" value="$lt{'upld'}">
  $help{'Uploading_From_Harddrive'}   $help{'Uploading_From_Harddrive'}
Line 2298  value="$lt{'selm'}"> <input type="submit Line 2572  value="$lt{'selm'}"> <input type="submit
 $help{'Load_Map'}</nobr>  $help{'Load_Map'}</nobr>
 </p>  </p>
 </form>  </form>
   <hr />
   <form action="/adm/groupsort" method="post" name="recover">
   <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1)" value="$lt{'reco'}" />
   </form>
 ENDFORM  ENDFORM
        unless ($env{'form.pagepath'}) {         unless ($env{'form.pagepath'}) {
    $r->print(<<ENDFORM);     $r->print(<<ENDFORM);
Line 2462  ENDBLOCK Line 2740  ENDBLOCK
 <tr><td bgcolor="#DDDDDD">  <tr><td bgcolor="#DDDDDD">
 <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">  <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
 <input type="file" name="uploaddoc" size="40">  <input type="file" name="uploaddoc" size="40">
 <br />$lt{'comment'}:<br />  <br />
   <br />
   <nobr>
   <label>$lt{'parse'}?
   <input type="checkbox" name="parserflag" />
   </label>
   </nobr>
   <br /><br />
   $lt{'comment'}:<br />
 <textarea cols=50 rows=4 name='comment'>  <textarea cols=50 rows=4 name='comment'>
 </textarea>  </textarea>
 <br />  <br />
Line 2521  ENDSUPFORM Line 2807  ENDSUPFORM
     }      }
     $r->print('</table>');      $r->print('</table>');
   } else {    } else {
         unless ($upload_result eq 'phasetwo') {
 # -------------------------------------------------------- This is showdoc mode  # -------------------------------------------------------- This is showdoc mode
       $r->print("<h1>".&mt('Uploaded Document').' - '.            $r->print("<h1>".&mt('Uploaded Document').' - '.
  &Apache::lonnet::gettitle($r->uri).'</h1><p>'.   &Apache::lonnet::gettitle($r->uri).'</h1><p>'.
 &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".  &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".
          &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');            &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');
         }
   }    }
  }   }
  $r->print('</body></html>');   $r->print('</body></html>');

Removed from v.1.182  
changed lines
  Added in v.1.205


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