--- loncom/interface/londocs.pm 2004/12/23 14:00:58 1.158 +++ loncom/interface/londocs.pm 2005/03/16 21:35:17 1.172 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.158 2004/12/23 14:00:58 raeburn Exp $ +# $Id: londocs.pm,v 1.172 2005/03/16 21:35:17 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -132,11 +132,17 @@ sub dumpbutton { } } +sub clean { + my ($title)=@_; + $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs; + return $title; +} # -------------------------------------------------------- Actually dump course sub dumpcourse { my $r=shift; - $r->print('Dump DOCS'. + my $html=&Apache::lonxml::xmlbegin(); + $r->print($html.'Dump DOCS'. &Apache::loncommon::bodytag('Dump Course DOCS to Construction Space'). '
'); my ($home,$other,%outhash)=&authorhosts(); @@ -149,7 +155,7 @@ sub dumpcourse { my ($ca,$cd)=split(/\@/,$ENV{'form.authorspace'}); $r->print('

'.&mt('Copying Files').'

'); my $title=$ENV{'form.authorfolder'}; - $title=~s/[^\w\/]+/\_/g; + $title=&clean($title); my %replacehash=(); foreach (keys %ENV) { if ($_=~/^form\.namefor\_(.+)/) { @@ -160,7 +166,7 @@ sub dumpcourse { $crs=~s/\_/\//g; foreach (keys %replacehash) { my $newfilename=$title.'/'.$replacehash{$_}; - $newfilename=~s/[^\w\/\.\/]+/\_/g; + $newfilename=&clean($newfilename); my @dirs=split(/\//,$newfilename); my $path='/home/'.$ca.'/public_html'; my $makepath=$path; @@ -214,7 +220,7 @@ sub dumpcourse { } my $title=$origcrsdata{'description'}; $title=~s/\s+/\_/gs; - $title=~s/\W//gs; + $title=&clean($title); $r->print('

'.&mt('Folder in Construction Space').'


'); &tiehash(); $r->print('

'.&mt('Filenames in Construction Space').'

'); @@ -223,12 +229,13 @@ sub dumpcourse { my ($ext)=($_=~/\.(\w+)$/); my $title=$hash{'title_'.$hash{ 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}}; + $title=~s/:/:/g; $r->print(''); unless ($title) { $title=$_; } $title=~s/\.(\w+)$//; - $title=~s/[^\w\/]+/\_/gs; + $title=&clean($title); $title.='.'.$ext; $r->print("\n\n"); } @@ -242,6 +249,7 @@ sub dumpcourse { # ------------------------------------------------------ Generate "export" button sub exportbutton { + return ''; return ''); } - $r->print('
'.&mt('Internal Filename').''.&mt('Title').''.&mt('Save as ...').'
'.($title?$title:' ').'
'. ''. @@ -318,8 +326,8 @@ sub exportcourse { $outcome = '
Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.
'; } } - - $r->print('Export Course'. + my $html=&Apache::lonxml::xmlbegin(); + $r->print($html.'Export Course'. &Apache::loncommon::bodytag('Export course to IMS content package')); $r->print($outcome); $r->print(''); @@ -460,7 +468,8 @@ function containerCheck(item) { |; - $r->print('Export Course'.$scripttag.''. + my $html=&Apache::lonxml::xmlbegin(); + $r->print($html.'Export Course'.$scripttag.''. &Apache::loncommon::bodytag('Export course to IMS content package' )); @@ -486,6 +495,9 @@ sub create_ims_store { if (!-e $$tempexport) { mkdir($$tempexport,0700); } + if (!-e "$$tempexport/resources") { + mkdir("$$tempexport/resources",0700); + } # open manifest file my $manifest = '/imsmanifest.xml'; my $manifestfilename = $$tempexport.$manifest; @@ -609,7 +621,7 @@ sub build_package { } my %extras = ( caller => 'imsexport', - tempexport => $tempexport, + tempexport => $tempexport.'/resources', count => $count ); my $discresult = &Apache::lonfeedback::list_discussion($mode,undef,$ressymb,\%extras); @@ -655,7 +667,6 @@ sub process_content { my $content_type; my $message; # find where user is author or co-author - my %roleshash = &Apache::lonnet::get_my_roles(); my @uploads = (); if ($curRes->is_sequence()) { $content_type = 'sequence'; @@ -702,34 +713,25 @@ sub process_content { if ($contents) { $$content_file = &store_template($contents,$tempexport,$count,$content_type); } - } elsif ($symb =~ m-uploaded/$cdom/$cnum-) { - $$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'; + } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/]+)/([^/]+)-) { my $canedit = 0; if ($2 eq $ENV{'user.domain'} && $3 eq $ENV{'user.name'}) { $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) { $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource'); } else { $$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,'uploaded'); + &replicate_content($cdom,$cnum,$tempexport,$item,$count,\$uploadmsg,$href,'templateupload'); if ($uploadmsg) { $$copyresult .= $uploadmsg."\n"; } @@ -742,9 +744,13 @@ sub process_content { sub replicate_content { 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 ($map,$ind,$url); + if ($caller eq 'templateupload') { + $url = $symb; + $url =~ s#//#/#g; + } else { + ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); + } my $content; my $filename; my $repstatus; @@ -762,14 +768,14 @@ sub replicate_content { if ($copiedfile = Apache::File->new('>'.$destination)) { my $content; if ($caller eq 'resource') { - $content = &Apache::lonnet::getfile($url); + $content = &Apache::lonnet::getfile('/home/httpd/html/res/'.$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' || $caller eq 'uploaded') { + } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') { my $rtncode; $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode); if ($repstatus eq 'ok') { @@ -779,6 +785,10 @@ sub replicate_content { } else { $$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') { print $copiedfile $content; @@ -788,7 +798,7 @@ sub replicate_content { $$message = 'Could not open destination file for '.$filename."\n"; } } else { - $$message = 'Could not determine name of file for '.$url."\n"; + $$message = 'Could not determine name of file for '.$symb."\n"; } if ($repstatus eq 'ok') { $content_name = $count.'/'.$filename; @@ -808,13 +818,25 @@ sub extract_media { sub store_template { my ($contents,$tempexport,$count,$content_type) = @_; if ($contents) { - my $destination = $tempexport.'/resources/'.$count.'/'.$content_type.'.xml'; - my $storetemplate; - if ($storetemplate = Apache::File->new('>'.$destination)) { - print $storetemplate $contents; - close($storetemplate); + 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 $count.'/'.$content_type.'.xml'; } } @@ -873,6 +895,14 @@ sub breadcrumbs { @folders=split('&',$ENV{'form.folderpath'}); } my $folderpath; + my $cpinfo=''; + if ($ENV{'form.markedcopy_url'}) { + &Apache::lonnet::logthis('Found '.$ENV{'form.markedcopy_url'}); + $cpinfo='&markedcopy_url='. + &Apache::lonnet::escape($ENV{'form.markedcopy_url'}). + '&markedcopy_title='. + &Apache::lonnet::escape($ENV{'form.markedcopy_title'}); + } while (@folders) { my $folder=shift(@folders); my $foldername=shift(@folders); @@ -881,7 +911,7 @@ sub breadcrumbs { my $url='/adm/coursedocs?folderpath='. &Apache::lonnet::escape($folderpath); &Apache::lonhtmlcommon::add_breadcrumb( - {'href'=>$url, + {'href'=>$url.$cpinfo, 'title'=>&Apache::lonnet::unescape($foldername), 'text'=>''. &Apache::lonnet::unescape($foldername).'' @@ -895,8 +925,6 @@ sub breadcrumbs { sub editor { my ($r,$coursenum,$coursedom,$folder,$allowed)=@_; - - $r->print(&breadcrumbs($folder)); my $errtext=''; my $fatal=0; my $container='sequence'; @@ -909,6 +937,13 @@ sub editor { $Apache::lonratedt::order[0]=1; $Apache::lonratedt::resources[1]=''; } + if (defined($ENV{'form.markcopy'})) { +# Mark for copying + my ($title,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$ENV{'form.markcopy'}]]); + $ENV{'form.markedcopy_title'}=$title; + $ENV{'form.markedcopy_url'}=$url; + } + $r->print(&breadcrumbs($folder)); if ($fatal) { $r->print('

'.$errtext.'

'); } else { @@ -979,14 +1014,50 @@ sub editor { } } + if ($ENV{'form.pastemarked'}) { +# paste resource to end of list + my $url=$ENV{'form.markedcopy_url'}; + my $title=$ENV{'form.markedcopy_title'}; +# Maps need to be copied first + if (($url=~/\.(page|sequence)$/) || ($url=~/^\/uploaded\//)) { + $title=&mt('Copy of').' '.$title; + my $newid=$$.time; + $url=~/^(.+)\.(\w+)$/; + my $newurl=$1.$newid.'.'.$2; + my $storefn=$newurl; + $storefn=~s/^\/\w+\/\w+\/\w+\///; + &Apache::loncreatecourse::writefile + ($ENV{'request.course.id'},$storefn, + &Apache::lonnet::getfile($url)); + $url=$newurl; + } + $title=~s/\/\>\;/g; + $title=~s/\:/\:/g; + my $ext='false'; + if ($url=~/^http\:\/\//) { $ext='true'; } + $url=~s/\:/\:/g; +# Now insert the URL at the bottom + my $newidx=1+$#Apache::lonratedt::resources; + $Apache::lonratedt::resources[$newidx]= + $title.':'.$url.':'.$ext.':normal:res'; + $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx; +# Store the result + ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); + if ($fatal) { + $r->print('

'.$errtext.'

'); + return; + } + } # upload a file, if present if (($ENV{'form.uploaddoc.filename'}) && ($ENV{'form.cmd'}=~/^upload_(\w+)/)) { if ( ($folder=~/^$1/) || ($1 eq 'default') ) { # 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 $url=&Apache::lonnet::userfileupload('uploaddoc',1,'docs'); + my $newidx=$#Apache::lonratedt::resources+1; + my $url=&Apache::lonnet::userfileupload('uploaddoc',1,'docs/'.$newidx); my $ext='false'; if ($url=~/^http\:\/\//) { $ext='true'; } $url=~s/\:/\:/g; @@ -998,7 +1069,6 @@ sub editor { $comment=time.'___&&&___'.$ENV{'user.name'}.'___&&&___'. $ENV{'user.domain'}.'___&&&___'.$comment; } - my $newidx=$#Apache::lonratedt::resources+1; $Apache::lonratedt::resources[$newidx]= $comment.':'.$url.':'.$ext.':normal:res'; $Apache::lonratedt::order[$#Apache::lonratedt::order+1]= @@ -1023,6 +1093,13 @@ sub editor { $Apache::lonratedt::order[$i+1]; } $#Apache::lonratedt::order--; + } elsif ($cmd eq 'cut') { + my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]); + for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) { + $Apache::lonratedt::order[$i]= + $Apache::lonratedt::order[$i+1]; + } + $#Apache::lonratedt::order--; } elsif ($cmd eq 'up') { if (($idx) && (defined($Apache::lonratedt::order[$idx-1]))) { my $i=$Apache::lonratedt::order[$idx-1]; @@ -1115,7 +1192,30 @@ sub editor { unless ($shown) { $r->print('
'.&mt('Currently no documents.').'
'); + $r->print("\n\n"); + if ($ENV{'form.markedcopy_url'}) { + $r->print(< + + +ENDPASTE + $r->print( + ' '.&Apache::loncommon::filedescription( + (split(/\./,$ENV{'form.markedcopy_url'}))[-1]).': '. + $ENV{'form.markedcopy_title'}); + if ($container eq 'page') { + $r->print(< + +PAGEINFO + } else { + $r->print(< +FOLDERINFO + } + $r->print('

'); + } } } @@ -1153,10 +1253,24 @@ sub entryline { $pagepath=&Apache::lonnet::escape($ENV{'form.pagepath'}); $pagesymb=&Apache::lonnet::escape($ENV{'form.pagesymb'}); } + my $cpinfo=''; + if ($ENV{'form.markedcopy_url'}) { + $cpinfo='&markedcopy_url='. + &Apache::lonnet::escape($ENV{'form.markedcopy_url'}). + '&markedcopy_title='. + &Apache::lonnet::escape($ENV{'form.markedcopy_title'}); + } if ($allowed) { my $incindex=$index+1; my $selectbox=''; - if ($folder!~/^supplemental/) { + if (($folder!~/^supplemental/) && + ($#Apache::lonratedt::order>0) && + ((split(/\:/, + $Apache::lonratedt::resources[$Apache::lonratedt::order[0]]))[1] + ne '') && + ((split(/\:/, + $Apache::lonratedt::resources[$Apache::lonratedt::order[1]]))[1] + ne '')) { $selectbox= ''. ' + +
- + $lt{
- + $lt{
$selectbox $lt{'rm'} + +$lt{'ct'} -$lt{'rn'} +$lt{'rn'} + +$lt{'cp'} END } else { $line.=(< + +
- + $lt{
- + $lt{
$selectbox $lt{'rm'} + +$lt{'ct'} -$lt{'rn'} +$lt{'rn'} + +$lt{'cp'} END } } @@ -1281,12 +1409,13 @@ END my $folderpath=$ENV{'form.folderpath'}; if ($folderpath) { $folderpath.='&' }; $folderpath.=$folderarg.'&'.$foldername; - $url.='folderpath='.&Apache::lonnet::escape($folderpath); + $url.='folderpath='.&Apache::lonnet::escape($folderpath).$cpinfo; $parameterset=''; + '" />'. +''.&mt('Store').''; } if ($ispage) { @@ -1305,7 +1434,7 @@ END $path.$pagearg.'.page'); } $url.='pagepath='.&Apache::lonnet::escape($pagepath). - '&pagesymb='.&Apache::lonnet::escape($symb); + '&pagesymb='.&Apache::lonnet::escape($symb).$cpinfo; } $line.=''. @@ -1313,21 +1442,17 @@ END if (($allowed) && ($folder!~/^supplemental/)) { my %lt=&Apache::lonlocal::texthash( 'hd' => 'Hidden', - 'ec' => 'URL hidden', - 'sp' => 'Store Parameters'); + 'ec' => 'URL hidden'); my $enctext= ((&Apache::lonratedt::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':''); my $hidtext= ((&Apache::lonratedt::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':''); $line.=(< - + - + $parameterset - - - ENDPARMS } $line.=""; @@ -1376,7 +1501,7 @@ sub checkonthis { if ($url=~/^\/res\//) { my $result=&Apache::lonnet::repcopy( &Apache::lonnet::filelocation('',$url)); - if ($result==OK) { + if ($result eq 'ok') { $r->print(''.&mt('ok').''); $r->rflush(); &Apache::lonnet::countacc($url); @@ -1388,23 +1513,19 @@ sub checkonthis { $r->print(' '); } $r->print('- '.&mt('Rendering').': '); - my $oldpath=$ENV{'request.filename'}; - $ENV{'request.filename'}=&Apache::lonnet::filelocation('',$url); - &Apache::lonxml::xmlparse($r,'web', - &Apache::lonnet::getfile( - &Apache::lonnet::filelocation('',$url))); - undef($Apache::lonhomework::parsing_a_problem); - $ENV{'request.filename'}=$oldpath; - if (($Apache::lonxml::errorcount) || - ($Apache::lonxml::warningcount)) { - if ($Apache::lonxml::errorcount) { + my ($errorcount,$warningcount)=split(/:/, + &Apache::lonnet::ssi_body($url, + ('return_only_error_and_warning_counts' => 1))); + if (($errorcount) || + ($warningcount)) { + if ($errorcount) { $r->print(''. - $Apache::lonxml::errorcount.' '. + $errorcount.' '. &mt('error(s)').' '); } - if ($Apache::lonxml::warningcount) { + if ($warningcount) { $r->print(''. - $Apache::lonxml::warningcount.' '. + $warningcount.' '. &mt('warning(s)').''); } } else { @@ -1419,9 +1540,9 @@ sub checkonthis { &checkonthis($r,$_,$level+1); } } - } elsif ($result==HTTP_SERVICE_UNAVAILABLE) { + } elsif ($result eq 'unavailable') { $r->print(''.&mt('connection down').''); - } elsif ($result==HTTP_NOT_FOUND) { + } elsif ($result eq 'not_found') { unless ($url=~/\$/) { $r->print(''.&mt('not found').''); } else { @@ -1442,8 +1563,8 @@ sub verifycontent { my $r=shift; my $loaderror=&Apache::lonnet::overloaderror($r); if ($loaderror) { return $loaderror; } - - $r->print('Verify Content'. + my $html=&Apache::lonxml::xmlbegin(); + $r->print($html.'Verify Content'. &Apache::loncommon::bodytag('Verify Course Documents')); $hashtied=0; undef %alreadyseen; @@ -1471,7 +1592,8 @@ sub verifycontent { sub checkversions { my $r=shift; - $r->print('Check Versions'. + my $html=&Apache::lonxml::xmlbegin(); + $r->print($html.'Check Versions'. &Apache::loncommon::bodytag('Check Course Document Versions')); my $header=''; my $startsel=''; @@ -1806,7 +1928,7 @@ sub handler { my $containertag; my $uploadtag; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['folderpath','pagepath','pagesymb']); + ['folderpath','pagepath','pagesymb','markedcopy_url','markedcopy_title']); if ($ENV{'form.folderpath'}) { my (@folderpath)=split('&',$ENV{'form.folderpath'}); $ENV{'form.foldername'}=&Apache::lonnet::unescape(pop(@folderpath)); @@ -1862,8 +1984,9 @@ sub handler { my $now=time; # print screen + my $html=&Apache::lonxml::xmlbegin(); $r->print(< +$html The LearningOnline Network with CAPA ENDNEWSCRIPT @@ -2006,7 +2160,9 @@ ENDNEWSCRIPT my %lt=&Apache::lonlocal::texthash( 'uplm' => 'Upload a new main course document', 'upls' => 'Upload a new supplemental course document', - 'impp' => 'Import a published document', + 'impp' => 'Import a document', + 'pubd' => 'Published documents', + 'copm' => 'All documents out of a published map', 'spec' => 'Special documents', 'upld' => 'Upload Document', 'srch' => 'Search', @@ -2055,6 +2211,7 @@ ENDNEWSCRIPT
+ $containertag
@@ -2126,6 +2283,7 @@ $uploadtag +$lt{'pubd'}
$uploadtag @@ -2134,6 +2292,7 @@ $help{'Importing_LON-CAPA_Resource'}


+$lt{'copm'}
ENDFORM unless ($ENV{'form.pagepath'}) { + $r->print(< + +$uploadtag + + + $help{'Adding_External_Resource'} + +
+
+ + + +
+ENDFORM + } + $r->print(''); + unless ($ENV{'form.pagepath'}) { $r->print(< @@ -2164,14 +2340,6 @@ onClick="javascript:makenewpage(this.for value="$lt{'newp'}" />$help{'Adding_Pages'} -
-$uploadtag - - - $help{'Adding_External_Resource'} - -
$uploadtag $help{'Score_Upload_Form'} -
ENDBLOCK - } else { - $r->print(< -
- - - -
-ENDFORM + $r->print(''); } $r->print(''."\n". '');