'.&mt('Internal Filename').' | '.&mt('Title').' | '.&mt('Save as ...').' |
');
@@ -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(''.($title?$title:' ').' | ');
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 ''.
''.
@@ -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;
+ $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]=
@@ -1115,7 +1185,30 @@ sub editor {
unless ($shown) {
$r->print(' | '.&mt('Currently no documents.').' |
');
}
- $r->print('
');
+ $r->print("\n\n");
+ if ($ENV{'form.markedcopy_url'}) {
+ $r->print(<