Diff for /loncom/interface/londocs.pm between versions 1.143 and 1.162

version 1.143, 2004/09/14 21:27:36 version 1.162, 2004/12/23 20:50:35
Line 30  package Apache::londocs; Line 30  package Apache::londocs;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
   use Apache::imsexport;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonratedt;  use Apache::lonratedt;
Line 241  sub dumpcourse { Line 242  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').'" />'.
Line 283  sub exportcourse { Line 285  sub exportcourse {
             $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created.  Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';              $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created.  Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';
         } else {          } else {
             my $now = time;              my $now = time;
             my $count = 0;  
             my %symbs;              my %symbs;
             my $manifestok = 0;              my $manifestok = 0;
             my $imsresources;              my $imsresources;
Line 291  sub exportcourse { Line 292  sub exportcourse {
             my $copyresult;              my $copyresult;
             my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);              my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);
             if ($manifestok) {              if ($manifestok) {
                 &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,\$tempexport,\$copyresult,$ims_manifest);                  &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest);
                 close($ims_manifest);                  close($ims_manifest);
   
 #Create zip file in prtspool  #Create zip file in prtspool
Line 320  sub exportcourse { Line 321  sub exportcourse {
         }          }
   
         $r->print('<html><head><title>Export Course</title></head>'.          $r->print('<html><head><title>Export Course</title></head>'.
             &Apache::loncommon::bodytag('Export course to IMS or SCORM content package'));              &Apache::loncommon::bodytag('Export course to IMS content package'));
         $r->print($outcome);          $r->print($outcome);
         $r->print('</body></html>');          $r->print('</body></html>');
     } else {      } else {
Line 369  sub exportcourse { Line 370  sub exportcourse {
             }              }
             if (ref($curRes)) {              if (ref($curRes)) {
                 my $symb = $curRes->symb();                  my $symb = $curRes->symb();
                   my $ressymb = $symb;
                   if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                       unless ($ressymb =~ m|adm/wrapper/adm|) {
                           $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                       }
                   }
                 my $color = $count%2;                  my $color = $count%2;
                 $display .='<tr bgcolor='.$bgcolors[$color].'><td>'."\n".                  $display .='<tr bgcolor='.$bgcolors[$color].'><td>'."\n".
                     '<input type="checkbox" name="archive" value="'.$count.'" ';                      '<input type="checkbox" name="archive" value="'.$count.'" ';
Line 390  sub exportcourse { Line 397  sub exportcourse {
                 my $currelem = $count+$boards+$startcount;                  my $currelem = $count+$boards+$startcount;
                 $children{$parent{$depth}} .= $currelem.':';                  $children{$parent{$depth}} .= $currelem.':';
                 $display .= '&nbsp;'.$curRes->title().'</td>';                  $display .= '&nbsp;'.$curRes->title().'</td>';
                 if ($discussiontime{$symb} > 0) {                  if ($discussiontime{$ressymb} > 0) {
                     $boards ++;                      $boards ++;
                     $currelem = $count+$boards+$startcount;                      $currelem = $count+$boards+$startcount;
                     $display .= '<td>&nbsp;</td><td align="right"><input type="checkbox" name="discussion" value="'.$count.'" />&nbsp;</td>'."\n";                      $display .= '<td>&nbsp;</td><td align="right"><input type="checkbox" name="discussion" value="'.$count.'" />&nbsp;</td>'."\n";
Line 403  sub exportcourse { Line 410  sub exportcourse {
 <script>  <script>
   
 function checkAll(field) {  function checkAll(field) {
     for (i = 0; i < field.length; i++)      if (field.length > 0) {
         field[i].checked = true ;          for (i = 0; i < field.length; i++) {
               field[i].checked = true ;
           }
       } else {
           field.checked = true
       }
 }  }
                                                                                   
 function uncheckAll(field) {  function uncheckAll(field) {
     for (i = 0; i < field.length; i++)      if (field.length > 0) {
         field[i].checked = false ;          for (i = 0; i < field.length; i++) {
               field[i].checked = false ;
           }
       } else {
           field.checked = false ;
       }
 }  }
   
 function propagateCheck(item) {  function propagateCheck(item) {
Line 445  function containerCheck(item) { Line 462  function containerCheck(item) {
 </script>  </script>
         |;          |;
         $r->print('<html><head><title>Export Course</title>'.$scripttag.'</head>'.          $r->print('<html><head><title>Export Course</title>'.$scripttag.'</head>'.
             &Apache::loncommon::bodytag('Export course to IMS or SCORM content package'              &Apache::loncommon::bodytag('Export course to IMS content package'
 ));  ));
   
         $r->print($display.'</table>'.          $r->print($display.'</table>'.
Line 470  sub create_ims_store { Line 487  sub create_ims_store {
     if (!-e $$tempexport) {      if (!-e $$tempexport) {
         mkdir($$tempexport,0700);          mkdir($$tempexport,0700);
     }      }
       if (!-e "$$tempexport/resources") {
           mkdir("$$tempexport/resources",0700);
       }
 # open manifest file  # open manifest file
     my $manifest = '/imsmanifest.xml';      my $manifest = '/imsmanifest.xml';
     my $manifestfilename = $$tempexport.$manifest;      my $manifestfilename = $$tempexport.$manifest;
Line 483  sub create_ims_store { Line 503  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".
 '  <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{'request.'.$ENV{'request.course.id'}.'.description'}.'</title>'
Line 504  sub build_package { Line 524  sub build_package {
     my $lastcontainer = 0;      my $lastcontainer = 0;
     my %parent = ();      my %parent = ();
     my @dependencies = ();      my @dependencies = ();
     my $cnum = $ENV{'request.'.$ENV{'request.course.id'}.'.num'};      my $cnum = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
     my $cdom = $ENV{'request.'.$ENV{'request.course.id'}.'.domain'};      my $cdom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
     while ($curRes = $it->next()) {      while ($curRes = $it->next()) {
         if (ref($curRes)) {          if (ref($curRes)) {
             $count ++;              $count ++;
Line 534  sub build_package { Line 554  sub build_package {
     $count = 0;      $count = 0;
     my $imsresources;      my $imsresources;
     my $pkgdepth;      my $pkgdepth;
     if ($curRes == $it->BEGIN_MAP()) {      my $included = 0;
         $prevdepth = $depth;      while ($curRes = $it->next()) {
         $depth++;          if ($curRes == $it->BEGIN_MAP()) {
     }  
     if ($curRes == $it->END_MAP()) {  
         $prevdepth = $depth;  
         $depth--;  
     }  
   
     if (ref($curRes)) {  
         if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {  
             my $symb = $curRes->symb();  
             my $isvisible = 'true';  
             my $resourceref;  
             if ($curRes->randomout()) {  
                 $isvisible = 'false';  
             }  
             unless ($curRes->is_sequence()) {  
                 $resourceref = 'identifierref="RES-'.$ENV{'request.course.id'}.'-'.$count.'"';  
             }  
             if (($depth <= $prevdepth) && ($count > 1)) {  
                 print $ims_manifest '  </item>'."\n";  
             }  
             $prevdepth = $depth;              $prevdepth = $depth;
               $depth++;
           }
           if ($curRes == $it->END_MAP()) {
               $prevdepth = $depth;
               $depth--;
           }
   
           if (ref($curRes)) {
               $count ++;
               if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {
                   my $symb = $curRes->symb();
                   my $isvisible = 'true';
                   my $resourceref;
                   if ($curRes->randomout()) {
                       $isvisible = 'false';
                   }
                   unless ($curRes->is_sequence()) {
                       $resourceref = 'identifierref="RES-'.$ENV{'request.course.id'}.'-'.$count.'"';
                   }
                   if (($depth <= $prevdepth) && ($count > 1) && ($included)) {
                       print $ims_manifest "\n".'  </item>'."\n";
                   }
                   $included = 1;
                   $prevdepth = $depth;
   
             my $itementry =                  my $itementry =
               '<item identifier="ITEM-'.$ENV{'request.course.id'}.'-'.$count.                '<item identifier="ITEM-'.$ENV{'request.course.id'}.'-'.$count.
               '" isvisible="'.$isvisible.'" '.$resourceref.'>'.                '" isvisible="'.$isvisible.'" '.$resourceref.'>'.
               '<title>'.$curRes->title().'</title>';                '<title>'.$curRes->title().'</title>';
             print $ims_manifest "\n".$itementry;                  print $ims_manifest "\n".$itementry;
   
             unless ($curRes->is_sequence()) {                  unless ($curRes->is_sequence()) {
                 my $content_file;                      my $content_file;
                 my @hrefs = ();                      my @hrefs = ();
                 &process_content($count,$curRes,$cdom,$cnum,$symb,$content_file,\@hrefs,$copyresult,$tempexport);                      &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport);
                 if ($content_file) {                      if ($content_file) {
                     $imsresources .= "\n".                          $imsresources .= "\n".
                      '   <resource identifier="RES-'.$ENV{'request.course.id'}.'-'.$count.                       '   <resource identifier="RES-'.$ENV{'request.course.id'}.'-'.$count.
                      '" type="webcontent" href="'.$content_file.'">'."\n".                       '" type="webcontent" href="'.$content_file.'">'."\n".
                      '       <file href="'.$content_file.'" />'."\n";                       '       <file href="'.$content_file.'" />'."\n";
                     foreach (@hrefs) {                          foreach (@hrefs) {
                         $imsresources .=                              $imsresources .=
                      '        <file href="'.$_.'" />'."\n";                       '        <file href="'.$_.'" />'."\n";
                           }
                           if (grep/^$count$/,@$discussions) {
                               my $ressymb = $symb;
                               my $mode;
                               if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                                   unless ($ressymb =~ m|adm/wrapper/adm|) {
                                       $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                                   }
                                   $mode = 'board';
                               }
                               my %extras = (
                                             caller => 'imsexport',
                                             tempexport => $tempexport.'/resources',
                                             count => $count
                                            );
                               my $discresult = &Apache::lonfeedback::list_discussion($mode,undef,$ressymb,\%extras);
                           }
                           $imsresources .= '    </resource>'."\n";
                     }                      }
                     $imsresources .= '    </resource>'."\n";  
                 }                  }
                   $pkgdepth = $depth;
               } else {
                   $included = 0;
             }              }
             $pkgdepth = $depth;  
         }          }
     }      }
     while ($pkgdepth > -1) {      while ($pkgdepth > 0) {
         print $ims_manifest "    </item>\n";          print $ims_manifest "    </item>\n";
         $pkgdepth --;          $pkgdepth --;
     }      }
Line 602  sub build_package { Line 645  sub build_package {
 sub get_dependencies {  sub get_dependencies {
     my ($exportitems,$parent,$depth,$dependencies) = @_;      my ($exportitems,$parent,$depth,$dependencies) = @_;
     if ($depth > 1) {      if ($depth > 1) {
         unless (grep/^$$parent{$depth}$/,@$exportitems || grep/^$$parent{$depth}$/,@$dependencies) {          if ((!grep/^$$parent{$depth}$/,@$exportitems) && (!grep/^$$parent{$depth}$/,@$dependencies)) {
             push @$dependencies, $$parent{$depth};              push @$dependencies, $$parent{$depth};
             if ($depth > 2) {              if ($depth > 2) {
                 &get_dependencies($exportitems,$parent,$depth-1,$dependencies);                  &get_dependencies($exportitems,$parent,$depth-1,$dependencies);
Line 616  sub process_content { Line 659  sub process_content {
     my $content_type;      my $content_type;
     my $message;      my $message;
 # find where user is author or co-author  # find where user is author or co-author
     my %roleshash = &Appache::lonnet::get_my_roles();      my @uploads = ();
     if ($curRes->is_page()) {      if ($curRes->is_sequence()) {
         $content_type = 'page';          $content_type = 'sequence';
       } elsif ($curRes->is_page()) {
           $content_type = 'page'; # need to handle individual items in pages.
     } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) {      } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) {
         $content_type = 'syllabus';          $content_type = 'syllabus';
     } elsif ($symb =~ m-\.sequence____\d+____ext-) {          my $contents = &Apache::imsexport::templatedpage($content_type);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-\.sequence___\d+___ext-) {
         $content_type = 'external';          $content_type = 'external';
           my $title = $curRes->title;
           my $contents =  &Apache::imsexport::external($symb,$title);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
     } elsif ($symb =~ m-adm/navmaps$-) {      } elsif ($symb =~ m-adm/navmaps$-) {
         $content_type =  'navmap';          $content_type =  'navmap';
     } elsif ($symb =~ m-adm/$cdom/$cnum/\d+/smppg$-) {      } elsif ($symb =~ m-adm/[^/]+/[^/]+/(\d+)/smppg$-) {
         $content_type = 'simplepage';          $content_type = 'simplepage';
     } elsif ($symb =~ m-$-) {          my $contents = &Apache::imsexport::templatedpage($content_type,$1,$count,\@uploads);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-lib/templates/simpleproblem\.problem$-) {
         $content_type = 'simpleproblem';          $content_type = 'simpleproblem';
     } elsif ($symb =~ m-adm/$cdom/$cnum/\d+/bulletinboard$-) {          my $contents =  &Apache::imsexport::simpleproblem($symb);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-lib/templates/examupload\.problem-m) {
           $content_type = 'examupload';
       } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {
         $content_type = 'bulletinboard';          $content_type = 'bulletinboard';
     } elsif ($symb =~ m-adm/$cdom/$cnum/\d+/aboutme$-) {          my $contents =  &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
           if ($contents) {
               $$content_file = &store_template($contents,$tempexport,$count,$content_type);
           }
       } elsif ($symb =~ m-adm/([^/]+)/([^/]+)/aboutme$-) {
         $content_type = 'aboutme';          $content_type = 'aboutme';
     } elsif ($symb =~ m-uploaded/$cdom/$cnum-) {          my $contents =  &Apache::imsexport::templatedpage($content_type,undef,$count,\@uploads,$1,$2);
         &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'uploaded');          if ($contents) {
     } elsif ($symb =~ m-\.sequence____\d+____([^/])/([^/])-) {              $$content_file = &store_template($contents,$tempexport,$count,$content_type);
         my $coauth = $2.':'.$1.':ca';          }
       } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) {
           $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
       } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/]+)/([^/]+)-) {
         my $canedit = 0;          my $canedit = 0;
         if ($1 eq $ENV{'user.domain'} && $2 eq $ENV{'user.name'})  {          if ($2 eq $ENV{'user.domain'} && $3 eq $ENV{'user.name'})  {
             $canedit= 1;              $canedit= 1;
         } elsif (defined($roleshash{$coauth})) {  
             if ($roleshash{$coauth} =~ /(\d+):(\d+)/) {  
                 if (($1 < time || $1 == 0) && ($2 == 0 || $2 >= time)) {  
                     $canedit = 1;  
                 }  
             } elsif ($roleshash{$coauth} eq ':') {  
                 $canedit = 1;  
             }  
         }          }
         if ($canedit) {          if ($canedit) {
             &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'resource');              $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');
         } else {          } else {
             &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'noedit');              $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit');
         }          }
       } elsif ($symb =~ m-uploaded/$cdom/$cnum-) {
           $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
       }
       if (@uploads > 0) {
           foreach my $item (@uploads) {
               my $uploadmsg = '';
               &replicate_content($cdom,$cnum,$tempexport,$item,$count,\$uploadmsg,$href,'templateupload');
               if ($uploadmsg) {
                   $$copyresult .= $uploadmsg."\n";
               }
           }
       }
       if ($message) {
           $$copyresult .= $message."\n";
     }      }
     $$copyresult .= $message."\n";  
 }  }
   
 sub replicate_content {  sub replicate_content {
     my ($cdom,$cnum,$tempexport,$symb,$count,$message,$caller) = @_;      my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_;
     my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);      my ($map,$ind,$url);
     my $feedurl = &Apache::lonnet::clutter($url);      if ($caller eq 'templateupload') {
           $url = $symb;
           $url =~ s#//#/#g;
       } else { 
           ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
       }
     my $content;      my $content;
     my $filename;      my $filename;
     my $repstatus;      my $repstatus;
     if ($url =~ m-[^/]/(.+)$-) {      my $content_name;
       if ($url =~ m-/([^/]+)$-) {
         $filename = $1;          $filename = $1;
         if (!-e $tempexport.'/resources') {          if (!-e $tempexport.'/resources') {
             mkdir($tempexport.'/resources',0700);              mkdir($tempexport.'/resources',0700);
         }          }
         if (!-e $tempexport.'/resources') {          if (!-e $tempexport.'/resources/'.$count) {
             mkdir($tempexport.'/resources/'.$count,0700);              mkdir($tempexport.'/resources/'.$count,0700);
         }          }
         my $destination = $$tempexport.'/resources/'.$count.'/'.$filename;          my $destination = $tempexport.'/resources/'.$count.'/'.$filename;
         my $copiedfile;          my $copiedfile;
         if ($copiedfile = Apache::File->new('>'.$destination)) {          if ($copiedfile = Apache::File->new('>'.$destination)) {
             my $content;              my $content;
             if ($caller eq 'uploaded' || $caller eq 'resource') {              if ($caller eq 'resource') {
                 $content = &Apache::lonnet::getfile($url);                  $content = &Apache::lonnet::getfile('/home/httpd/html/res/'.$url);
                 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');
                     $repstatus = 'ok';                      $repstatus = 'ok';
                 }                  }
             } elsif ($caller eq 'noedit') {              } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') {
                 my $rtncode;                  my $rtncode;
                 $repstatus = &getuploaded('GET',$url,$cdom,$cnum,$content,$rtncode);                  $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);
                 unless ($repstatus eq 'ok') {                  if ($repstatus eq 'ok') {
                       if ($url =~ /\.html?$/i) {
                           &extract_media(\$content,$count,$tempexport,$href,'uploaded');
                       }
                   } else {
                     $$message = 'Could not render '.$url.' server message - '.$rtncode;                      $$message = 'Could not render '.$url.' server message - '.$rtncode;
                 }                  }
               } 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. 
                   $repstatus = 'ok';
                   $content = 'Not the owner of this resource'; 
             }              }
             if ($repstatus eq 'ok') {              if ($repstatus eq 'ok') {
                 print $copiedfile $content;                  print $copiedfile $content;
Line 700  sub replicate_content { Line 790  sub replicate_content {
             $$message = 'Could not open destination file for '.$filename."\n";              $$message = 'Could not open destination file for '.$filename."\n";
         }          }
     } else {      } else {
         $$message = 'Could not determine name of file for ';          $$message = 'Could not determine name of file for '.$symb."\n";
       }
       if ($repstatus eq 'ok') {
           $content_name = $count.'/'.$filename;
       }
       return $content_name;
   }
   
   sub extract_media {
       my ($content,$count,$tempexport,$href,$caller) = @_;
   # @$href will contain path to any embedded resources in the content.
   # For LON-CAPA problems this would be images. applets etc. 
   # For uploaded HTML files this would be images etc.
   # paths will be in the form $count/res/$file, and urls in the $content will be rewritten with the new paths. 
       return;
   }
   
   sub store_template {
       my ($contents,$tempexport,$count,$content_type) = @_;
       if ($contents) {
           if ($tempexport) {
               if (!-e $tempexport.'/resources') {
                   mkdir($tempexport.'/resources',0700);
               }
               if (!-e $tempexport.'/resources/'.$count) {
                   mkdir($tempexport.'/resources/'.$count,0700);
               }
               my $destination = $tempexport.'/resources/'.$count.'/'.$content_type.'.xml';
               my $storetemplate;
               if ($storetemplate = Apache::File->new('>'.$destination)) {
                   print $storetemplate $contents;
                   close($storetemplate);
               }
               if ($content_type eq 'external') {
                   return $count.'/'.$content_type.'.html';
               } else {
                   return $count.'/'.$content_type.'.xml';
               }
           }
     }      }
     return $repstatus;  
 }  }
   
 # Imports the given (name, url) resources into the course  # Imports the given (name, url) resources into the course
Line 934  sub editor { Line 1061  sub editor {
                     $comment=~s/\</\&lt\;/g;                      $comment=~s/\</\&lt\;/g;
                     $comment=~s/\>/\&gt\;/g;                      $comment=~s/\>/\&gt\;/g;
                     $comment=~s/\:/\&colon;/g;                      $comment=~s/\:/\&colon;/g;
                     $Apache::lonratedt::resources[      if ($comment=~/\S/) {
    $Apache::lonratedt::resources[
        $Apache::lonratedt::order[$idx]]=         $Apache::lonratedt::order[$idx]]=
                              $comment.':'.join(':',@rrest);              $comment.':'.join(':',@rrest);
                           }
                 }                  }
 # Store the changed version  # Store the changed version
  ($errtext,$fatal)=&storemap($coursenum,$coursedom,   ($errtext,$fatal)=&storemap($coursenum,$coursedom,
Line 988  sub editor { Line 1116  sub editor {
 # ---------------------------------------------------------------- End commands  # ---------------------------------------------------------------- End commands
 # ---------------------------------------------------------------- Print screen  # ---------------------------------------------------------------- Print screen
         my $idx=0;          my $idx=0;
    my $shown=0;
         $r->print('<table>');          $r->print('<table>');
         foreach (@Apache::lonratedt::order) {          foreach (@Apache::lonratedt::order) {
            my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]);             my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]);
            unless ($name) {  $name=(split(/\//,$url))[-1]; }             unless ($name) {  $name=(split(/\//,$url))[-1]; }
            unless ($name) { next; }             unless ($name) { $idx++; next; }
            $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));             $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));
            $idx++;             $idx++;
      $shown++;
         }          }
  unless ($idx) {   unless ($shown) {
     $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');      $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
  }   }
         $r->print('</table>');          $r->print('</table>');
Line 1031  sub entryline { Line 1161  sub entryline {
  $folderpath=&Apache::lonnet::escape($ENV{'form.folderpath'});   $folderpath=&Apache::lonnet::escape($ENV{'form.folderpath'});
  # $htmlfoldername=&HTML::Entities::encode($ENV{'form.foldername'},'<>&"');   # $htmlfoldername=&HTML::Entities::encode($ENV{'form.foldername'},'<>&"');
     }      }
     my $pagepath;      my ($pagepath,$pagesymb);
     if ($ENV{'form.pagepath'}) {      if ($ENV{'form.pagepath'}) {
         $container = 'page';          $container = 'page';
         $pagepath=&Apache::lonnet::escape($ENV{'form.pagepath'});          $pagepath=&Apache::lonnet::escape($ENV{'form.pagepath'});
           $pagesymb=&Apache::lonnet::escape($ENV{'form.pagesymb'});
     }      }
     if ($allowed) {      if ($allowed) {
  my $incindex=$index+1;   my $incindex=$index+1;
Line 1061  sub entryline { Line 1192  sub entryline {
             $line.=(<<END);              $line.=(<<END);
 <form name="entry_$index" action="/adm/coursedocs" method="post">  <form name="entry_$index" action="/adm/coursedocs" method="post">
 <input type="hidden" name="pagepath" value="$ENV{'form.pagepath'}" />  <input type="hidden" name="pagepath" value="$ENV{'form.pagepath'}" />
   <input type="hidden" name="pagesymb" value="$ENV{'form.pagesymb'}" />
 <input type="hidden" name="setparms" value="$orderidx" />  <input type="hidden" name="setparms" value="$orderidx" />
 <td><table border='0' cellspacing='2' cellpadding='0'>  <td><table border='0' cellspacing='2' cellpadding='0'>
 <tr><td bgcolor="#DDDDDD">  <tr><td bgcolor="#DDDDDD">
 <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath'>  <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath&pagesymb=$pagesymb'>
 <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>  <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
 <tr><td bgcolor="#DDDDDD">  <tr><td bgcolor="#DDDDDD">
 <a href='/adm/coursedocs?cmd=down_$index&pagepath=$pagepath'>  <a href='/adm/coursedocs?cmd=down_$index&pagepath=$pagepath&pagesymb=$pagesymb'>
 <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>  <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
 </table></td>  </table></td>
 <td>$selectbox  <td>$selectbox
 </td><td bgcolor="#DDDDDD">  </td><td bgcolor="#DDDDDD">
 <a href='javascript:removeres("$pagepath","$index","$renametitle","page");'>  <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#990000">$lt{'rm'}</font></a>  <font size="-2" color="#990000">$lt{'rm'}</font></a>
 <a href='javascript:changename("$pagepath","$index","$renametitle","page");'>  <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#009900">$lt{'rn'}</font></a></td>  <font size="-2" color="#009900">$lt{'rn'}</font></a></td>
 END  END
         } else {          } else {
Line 1146  END Line 1278  END
     } elsif ($url!~/\.(sequence|page)$/) {      } elsif ($url!~/\.(sequence|page)$/) {
  $url='/adm/coursedocs/showdoc'.$url;   $url='/adm/coursedocs/showdoc'.$url;
     }      }
    } elsif ($url=~m|^/ext/|) { 
       $url='/adm/wrapper'.$url;
  }   }
         unless ($container eq 'page') {   $url.=(($url=~/\?/)?'&':'?').'symb='.&Apache::lonnet::escape($symb);
    if ($container eq 'page') {
       my $symb=$ENV{'form.pagesymb'};
           
       $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
     $url.=(($url=~/\?/)?'&':'?').'symb='.&Apache::lonnet::escape($symb);      $url.=(($url=~/\?/)?'&':'?').'symb='.&Apache::lonnet::escape($symb);
         }   }
     }      }
     my $parameterset='&nbsp;';      my $parameterset='&nbsp;';
     if ($isfolder) {      if ($isfolder) {
Line 1158  END Line 1296  END
  if ($folderpath) { $folderpath.='&' };   if ($folderpath) { $folderpath.='&' };
  $folderpath.=$folderarg.'&'.$foldername;   $folderpath.=$folderarg.'&'.$foldername;
  $url.='folderpath='.&Apache::lonnet::escape($folderpath);   $url.='folderpath='.&Apache::lonnet::escape($folderpath);
  $parameterset=&mt('Randomly Pick: ').   $parameterset='<label>'.&mt('Randomly Pick: ').
     '<input type="text" size="4" name="randpick_'.$orderidx.'" value="'.      '<input type="text" size="4" name="randpick_'.$orderidx.'" value="'.
     (&Apache::lonratedt::getparameter($orderidx,'parameter_randompick'))[0].'" />';      (&Apache::lonratedt::getparameter($orderidx,
                                                 'parameter_randompick'))[0].
                                                 '" />'.'</label>';
          
     }      }
     if ($ispage) {      if ($ispage) {
         my $pagename=&Apache::lonnet::escape($pagetitle);          my $pagename=&Apache::lonnet::escape($pagetitle);
Line 1168  END Line 1309  END
         my $folderpath=$ENV{'form.folderpath'};          my $folderpath=$ENV{'form.folderpath'};
         if ($folderpath) { $pagepath = $folderpath.'&' };          if ($folderpath) { $pagepath = $folderpath.'&' };
         $pagepath.=$pagearg.'&'.$pagename;          $pagepath.=$pagearg.'&'.$pagename;
         $url.='pagepath='.&Apache::lonnet::escape($pagepath);   my $symb=$ENV{'form.pagesymb'};
    if (!$symb) {
       my $path='uploaded/'.
    $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.'/'.
    $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.'/';
       $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
          $residx,
          $path.$pagearg.'.page');
    }
    $url.='pagepath='.&Apache::lonnet::escape($pagepath).
       '&pagesymb='.&Apache::lonnet::escape($symb);
     }      }
     $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.      $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.
  '" border="0"></a></td>'.   '" border="0"></a></td>'.
Line 1184  END Line 1335  END
     ((&Apache::lonratedt::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');      ((&Apache::lonratedt::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
  $line.=(<<ENDPARMS);   $line.=(<<ENDPARMS);
 <td bgcolor="#BBBBFF"><font size='-2'>  <td bgcolor="#BBBBFF"><font size='-2'>
 <input type="checkbox" name="hidprs_$orderidx" $hidtext/> $lt{'hd'}</td>  <nobr><label><input type="checkbox" name="hidprs_$orderidx" $hidtext/> $lt{'hd'}</label></nobr></td>
 <!--<td bgcolor="#BBBBFF"><font size='-2'>  <td bgcolor="#BBBBFF"><font size='-2'>
 <input type="checkbox" name="encprs_$orderidx" $enctext/> $lt{'ec'}</td>-->  <nobr><label><input type="checkbox" name="encprs_$orderidx" $enctext/> $lt{'ec'}</label></nobr></td>
 <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>  <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
 <td bgcolor="#BBBBFF"><font size='-2'>  <td bgcolor="#BBBBFF"><font size='-2'>
 <input type="submit" value="$lt{'sp'}" />  <input type="submit" value="$lt{'sp'}" />
Line 1599  sub is_hash_old { Line 1750  sub is_hash_old {
 sub changewarning {  sub changewarning {
     my ($r,$postexec)=@_;      my ($r,$postexec)=@_;
     if (!&is_hash_old()) { return; }      if (!&is_hash_old()) { return; }
       my $pathvar='folderpath';
       my $path=&Apache::lonnet::escape($ENV{'form.folderpath'});
       if (defined($ENV{'form.pagepath'})) {
    $pathvar='pagepath';
    $path=&Apache::lonnet::escape($ENV{'form.pagepath'});
    $path.='&amp;symb='.&Apache::lonnet::escape($ENV{'form.pagesymb'});
       }
     $r->print(      $r->print(
 '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'.   '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'. 
 '<form method="post" action="/adm/roles" target="loncapaclient">'.  '<form method="post" action="/adm/roles" target="loncapaclient">'.
 '<input type="hidden" name="orgurl" value="/adm/coursedocs?folderpath='.  '<input type="hidden" name="orgurl" value="/adm/coursedocs?'.
 &Apache::lonnet::escape($ENV{'form.folderpath'}).  $pathvar.'='.$path.
 '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.  '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.
 &mt('Changes will become active for your current session after').  &mt('Changes will become active for your current session after').
 ' <input type="hidden" name="'.  ' <input type="hidden" name="'.
Line 1653  sub handler { Line 1811  sub handler {
 # is this a standard course?  # is this a standard course?
   
     my $standard=($ENV{'request.course.uri'}=~/^\/uploaded\//);      my $standard=($ENV{'request.course.uri'}=~/^\/uploaded\//);
     my $forcestandard;      my $forcestandard = 0;
     my $forcesupplement;      my $forcesupplement;
     my $script='';      my $script='';
     my $allowed;      my $allowed;
Line 1662  sub handler { Line 1820  sub handler {
     my $containertag;      my $containertag;
     my $uploadtag;      my $uploadtag;
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
     ['folderpath','pagepath']);      ['folderpath','pagepath','pagesymb']);
     if ($ENV{'form.folderpath'}) {      if ($ENV{'form.folderpath'}) {
  my (@folderpath)=split('&',$ENV{'form.folderpath'});   my (@folderpath)=split('&',$ENV{'form.folderpath'});
  $ENV{'form.foldername'}=&Apache::lonnet::unescape(pop(@folderpath));   $ENV{'form.foldername'}=&Apache::lonnet::unescape(pop(@folderpath));
Line 1672  sub handler { Line 1830  sub handler {
         my (@pagepath)=split('&',$ENV{'form.pagepath'});          my (@pagepath)=split('&',$ENV{'form.pagepath'});
         $ENV{'form.pagename'}=&Apache::lonnet::unescape(pop(@pagepath));          $ENV{'form.pagename'}=&Apache::lonnet::unescape(pop(@pagepath));
         $ENV{'form.folder'}=pop(@pagepath);          $ENV{'form.folder'}=pop(@pagepath);
         $containertag = '<input type="hidden" name="pagepath" value="" />';          $containertag = '<input type="hidden" name="pagepath" value="" />'.
         $uploadtag = '<input type="hidden" name="pagepath" value="'.$ENV{'form.pagepath'}.'" />';      '<input type="hidden" name="pagesymb" value="" />';
           $uploadtag = '<input type="hidden" name="pagepath" value="'.$ENV{'form.pagepath'}.'" />'.
       '<input type="hidden" name="pagesymb" value="'.$ENV{'form.pagesymb'}.'" />';
     }      }
     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {      if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
        $showdoc='/'.$1;         $showdoc='/'.$1;
     }      }
     unless ($showdoc) { # got called from remote      unless ($showdoc) { # got called from remote
        $forcestandard=($ENV{'form.folder'}=~/^default_/);         if (($ENV{'form.folder'}=~/^default_/) || 
             ($ENV{'form.folder'} =~ m#^\d+/(pages|sequences)/#)) {
              $forcestandard = 1;
          } 
        $forcesupplement=($ENV{'form.folder'}=~/^supplemental_/);         $forcesupplement=($ENV{'form.folder'}=~/^supplemental_/);
   
 # does this user have privileges to post, etc?  # does this user have privileges to post, etc?
Line 1813  function finishpick() { Line 1976  function finishpick() {
     '";this.document.forms.'+form+'.submit();');      '";this.document.forms.'+form+'.submit();');
 }  }
   
 function changename(folderpath,index,oldtitle,container) {  function changename(folderpath,index,oldtitle,container,pagesymb) {
     var title=prompt('New Title',oldtitle);      var title=prompt('New Title',oldtitle);
     if (title) {      if (title) {
  this.document.forms.renameform.title.value=title;   this.document.forms.renameform.title.value=title;
Line 1823  function changename(folderpath,index,old Line 1986  function changename(folderpath,index,old
         }          }
         if (container == 'page') {          if (container == 'page') {
             this.document.forms.renameform.pagepath.value=folderpath;              this.document.forms.renameform.pagepath.value=folderpath;
               this.document.forms.renameform.pagesymb.value=pagesymb;
         }          }
         this.document.forms.renameform.submit();          this.document.forms.renameform.submit();
     }      }
 }  }
   
 function removeres(folderpath,index,oldtitle,container) {  function removeres(folderpath,index,oldtitle,container,pagesymb) {
     if (confirm('Remove "'+oldtitle+'"?')) {      if (confirm('Remove "'+oldtitle+'"?')) {
  this.document.forms.renameform.cmd.value='del_'+index;   this.document.forms.renameform.cmd.value='del_'+index;
         if (container == 'sequence') {          if (container == 'sequence') {
Line 1836  function removeres(folderpath,index,oldt Line 2000  function removeres(folderpath,index,oldt
         }          }
         if (container == 'page') {          if (container == 'page') {
             this.document.forms.renameform.pagepath.value=folderpath;              this.document.forms.renameform.pagepath.value=folderpath;
               this.document.forms.renameform.pagesymb.value=pagesymb;
         }          }
         this.document.forms.renameform.submit();          this.document.forms.renameform.submit();
     }      }

Removed from v.1.143  
changed lines
  Added in v.1.162


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