--- loncom/interface/londocs.pm 2004/09/18 17:03:25 1.144 +++ loncom/interface/londocs.pm 2004/12/15 15:21:43 1.157 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.144 2004/09/18 17:03:25 albertel Exp $ +# $Id: londocs.pm,v 1.157 2004/12/15 15:21:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -283,7 +283,6 @@ sub exportcourse { $outcome = '
As you did not select any content items or discussions for export, an IMS package has not been created. Please go back to select either content items or discussions for export'; } else { my $now = time; - my $count = 0; my %symbs; my $manifestok = 0; my $imsresources; @@ -291,7 +290,7 @@ sub exportcourse { my $copyresult; my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport); 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); #Create zip file in prtspool @@ -504,8 +503,8 @@ sub build_package { my $lastcontainer = 0; my %parent = (); my @dependencies = (); - my $cnum = $ENV{'request.'.$ENV{'request.course.id'}.'.num'}; - my $cdom = $ENV{'request.'.$ENV{'request.course.id'}.'.domain'}; + my $cnum = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + my $cdom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; while ($curRes = $it->next()) { if (ref($curRes)) { $count ++; @@ -534,57 +533,64 @@ sub build_package { $count = 0; my $imsresources; my $pkgdepth; - if ($curRes == $it->BEGIN_MAP()) { - $prevdepth = $depth; - $depth++; - } - 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 ' '."\n"; - } + my $included = 0; + while ($curRes = $it->next()) { + if ($curRes == $it->BEGIN_MAP()) { + $prevdepth = $depth; + $depth++; + } + if ($curRes == $it->END_MAP()) { $prevdepth = $depth; + $depth--; + } - my $itementry = + 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".' '."\n"; + } + $included = 1; + $prevdepth = $depth; + + my $itementry = ''. ''.$curRes->title().''; - print $ims_manifest "\n".$itementry; + print $ims_manifest "\n".$itementry; - unless ($curRes->is_sequence()) { - my $content_file; - my @hrefs = (); - &process_content($count,$curRes,$cdom,$cnum,$symb,$content_file,\@hrefs,$copyresult,$tempexport); - if ($content_file) { - $imsresources .= "\n". + unless ($curRes->is_sequence()) { + my $content_file; + my @hrefs = (); + &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport); + if ($content_file) { + $imsresources .= "\n". ' '."\n". ' '."\n"; - foreach (@hrefs) { - $imsresources .= + foreach (@hrefs) { + $imsresources .= ' '."\n"; + } + $imsresources .= ' '."\n"; } - $imsresources .= ' '."\n"; } + $pkgdepth = $depth; + } else { + $included = 0; } - $pkgdepth = $depth; } } - while ($pkgdepth > -1) { + while ($pkgdepth > 0) { print $ims_manifest " \n"; $pkgdepth --; } @@ -602,7 +608,7 @@ sub build_package { sub get_dependencies { my ($exportitems,$parent,$depth,$dependencies) = @_; 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}; if ($depth > 2) { &get_dependencies($exportitems,$parent,$depth-1,$dependencies); @@ -616,29 +622,33 @@ sub process_content { my $content_type; my $message; # find where user is author or co-author - my %roleshash = &Appache::lonnet::get_my_roles(); - if ($curRes->is_page()) { - $content_type = 'page'; + my %roleshash = &Apache::lonnet::get_my_roles(); + if ($curRes->is_sequence()) { + $content_type = 'sequence'; + } elsif ($curRes->is_page()) { + $content_type = 'page'; # need to handle individual items in pages. } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) { $content_type = 'syllabus'; - } elsif ($symb =~ m-\.sequence____\d+____ext-) { + } elsif ($symb =~ m-\.sequence___\d+___ext-) { $content_type = 'external'; } elsif ($symb =~ m-adm/navmaps$-) { $content_type = 'navmap'; } elsif ($symb =~ m-adm/$cdom/$cnum/\d+/smppg$-) { $content_type = 'simplepage'; - } elsif ($symb =~ m-$-) { + } elsif ($symb =~ m-/lib/templates/simpleproblem\.problem$-) { $content_type = 'simpleproblem'; } elsif ($symb =~ m-adm/$cdom/$cnum/\d+/bulletinboard$-) { $content_type = 'bulletinboard'; } elsif ($symb =~ m-adm/$cdom/$cnum/\d+/aboutme$-) { $content_type = 'aboutme'; } elsif ($symb =~ m-uploaded/$cdom/$cnum-) { - &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'uploaded'); - } elsif ($symb =~ m-\.sequence____\d+____([^/])/([^/])-) { - my $coauth = $2.':'.$1.':ca'; + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded'); + } 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 $coauth = $3.':'.$2.':ca'; 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; } elsif (defined($roleshash{$coauth})) { if ($roleshash{$coauth} =~ /(\d+):(\d+)/) { @@ -650,45 +660,53 @@ sub process_content { } } if ($canedit) { - &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'resource'); + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource'); } else { - &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'noedit'); + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit'); } } - $$copyresult .= $message."\n"; + if ($message) { + $$copyresult .= $message."\n"; + } } 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 $feedurl = &Apache::lonnet::clutter($url); my $content; my $filename; my $repstatus; - if ($url =~ m-[^/]/(.+)$-) { + my $content_name; + if ($url =~ m-/([^/]+)$-) { $filename = $1; if (!-e $tempexport.'/resources') { mkdir($tempexport.'/resources',0700); } - if (!-e $tempexport.'/resources') { + if (!-e $tempexport.'/resources/'.$count) { mkdir($tempexport.'/resources/'.$count,0700); } - my $destination = $$tempexport.'/resources/'.$count.'/'.$filename; + my $destination = $tempexport.'/resources/'.$count.'/'.$filename; my $copiedfile; if ($copiedfile = Apache::File->new('>'.$destination)) { my $content; - if ($caller eq 'uploaded' || $caller eq 'resource') { + if ($caller eq 'resource') { $content = &Apache::lonnet::getfile($url); if ($content eq -1) { $$message = 'Could not copy file '.$filename; } else { + &extract_media($content,$count,$tempexport,$href,'resource'); $repstatus = 'ok'; } - } elsif ($caller eq 'noedit') { + } elsif ($caller eq 'noedit' || $caller eq 'uploaded') { my $rtncode; - $repstatus = &getuploaded('GET',$url,$cdom,$cnum,$content,$rtncode); - unless ($repstatus eq 'ok') { + $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode); + if ($repstatus eq 'ok') { + if ($url =~ /\.html?$/i) { + &extract_media(\$content,$count,$tempexport,$href,'uploaded'); + } + } else { $$message = 'Could not render '.$url.' server message - '.$rtncode; } } @@ -700,9 +718,21 @@ sub replicate_content { $$message = 'Could not open destination file for '.$filename."\n"; } } else { - $$message = 'Could not determine name of file for '; + $$message = 'Could not determine name of file for '.$url."\n"; + } + if ($repstatus eq 'ok') { + $content_name = $count.'/'.$filename; } - return $repstatus; + 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; } # Imports the given (name, url) resources into the course @@ -989,15 +1019,17 @@ sub editor { # ---------------------------------------------------------------- End commands # ---------------------------------------------------------------- Print screen my $idx=0; + my $shown=0; $r->print(''); foreach (@Apache::lonratedt::order) { my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]); unless ($name) { $name=(split(/\//,$url))[-1]; } - unless ($name) { next; } + unless ($name) { $idx++; next; } $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum)); $idx++; + $shown++; } - unless ($idx) { + unless ($shown) { $r->print(''); } $r->print('
'.&mt('Currently no documents.').'
'); @@ -1032,10 +1064,11 @@ sub entryline { $folderpath=&Apache::lonnet::escape($ENV{'form.folderpath'}); # $htmlfoldername=&HTML::Entities::encode($ENV{'form.foldername'},'<>&"'); } - my $pagepath; + my ($pagepath,$pagesymb); if ($ENV{'form.pagepath'}) { $container = 'page'; $pagepath=&Apache::lonnet::escape($ENV{'form.pagepath'}); + $pagesymb=&Apache::lonnet::escape($ENV{'form.pagesymb'}); } if ($allowed) { my $incindex=$index+1; @@ -1062,20 +1095,21 @@ sub entryline { $line.=(< +
- + $lt{
- + $lt{
$selectbox - + $lt{'rm'} - + $lt{'rn'} END } else { @@ -1147,10 +1181,16 @@ END } elsif ($url!~/\.(sequence|page)$/) { $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); - } + } } my $parameterset=' '; if ($isfolder) { @@ -1159,9 +1199,12 @@ END if ($folderpath) { $folderpath.='&' }; $folderpath.=$folderarg.'&'.$foldername; $url.='folderpath='.&Apache::lonnet::escape($folderpath); - $parameterset=&mt('Randomly Pick: '). + $parameterset=''; + } if ($ispage) { my $pagename=&Apache::lonnet::escape($pagetitle); @@ -1169,7 +1212,17 @@ END my $folderpath=$ENV{'form.folderpath'}; if ($folderpath) { $pagepath = $folderpath.'&' }; $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.=''. @@ -1185,9 +1238,9 @@ END ((&Apache::lonratedt::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':''); $line.=(< - $lt{'hd'} - + + + $parameterset @@ -1600,11 +1653,18 @@ sub is_hash_old { sub changewarning { my ($r,$postexec)=@_; 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.='&symb='.&Apache::lonnet::escape($ENV{'form.pagesymb'}); + } $r->print( ''. '
'. -'

'. &mt('Changes will become active for your current session after'). ' '; - $uploadtag = ''; + $containertag = ''. + ''; + $uploadtag = ''. + ''; } if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { $showdoc='/'.$1; } 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_/); # does this user have privileges to post, etc? @@ -1814,7 +1879,7 @@ function finishpick() { '";this.document.forms.'+form+'.submit();'); } -function changename(folderpath,index,oldtitle,container) { +function changename(folderpath,index,oldtitle,container,pagesymb) { var title=prompt('New Title',oldtitle); if (title) { this.document.forms.renameform.title.value=title; @@ -1824,12 +1889,13 @@ function changename(folderpath,index,old } if (container == 'page') { this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; } this.document.forms.renameform.submit(); } } -function removeres(folderpath,index,oldtitle,container) { +function removeres(folderpath,index,oldtitle,container,pagesymb) { if (confirm('Remove "'+oldtitle+'"?')) { this.document.forms.renameform.cmd.value='del_'+index; if (container == 'sequence') { @@ -1837,6 +1903,7 @@ function removeres(folderpath,index,oldt } if (container == 'page') { this.document.forms.renameform.pagepath.value=folderpath; + this.document.forms.renameform.pagesymb.value=pagesymb; } this.document.forms.renameform.submit(); }