'."\n";
my %uploadedfiles;
&tiehash();
foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
@@ -643,8 +644,8 @@ sub authorspace_selector {
}
$preamble .= '
'.
'
'."\n";
+ ''."\n".
+ ''."\n";
return $preamble;
}
@@ -694,9 +695,70 @@ sub recurse_html {
sub copycrsauthored {
my ($r,$coursenum,$coursedom,$coursehome,$readonly) = @_;
- my ($starthash,$js);
+ my ($starthash,$js,$title,$formname);
+ my %origcrsdata=&Apache::lonnet::coursedescription($env{'request.course.id'});
+ $title=$origcrsdata{'description'};
+ $title=~s/[\/\s]+/\_/gs;
+ $title=&clean($title);
+ my ($home,$other,%outhash)=&authorhosts();
unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
- $js = <<"ENDJS";
+ my %js_lt;
+ $formname = 'copycrsauthored';
+ if ($home) {
+ %js_lt =
+ &Apache::lonlocal::texthash(
+ yomu => 'You must select an Authoring Space',
+ whco => 'When Copyright set to "custom", URL of a published rights file is needed.',
+ );
+ &js_escape(\%js_lt);
+ }
+ if ($home > 1) {
+ $js = <<"ENDJS";
+
+
+ENDJS
+ } elsif ($home) {
+ $js = <<"ENDJS";
+
+
+ENDJS
+ }
+ $js .= <<"ENDJS";
ENDJS
+
+ $js .= "\n".&Apache::lonhtmlcommon::scripttag(&Apache::loncommon::browser_and_searcher_javascript())."\n";
$starthash = {
- add_entries => {'onload' => "hide_searching();"},
+ add_entries => {'onload' => "hide_searching(); init_copycrs_form();"},
};
}
$r->print(&Apache::loncommon::start_page('Copy from Course Authoring to User Authoring',$js,$starthash)."\n".
&Apache::lonhtmlcommon::breadcrumbs('Copy from Course Authoring Space')."\n");
$r->print(&startContentScreen('tools'));
- my ($home,$other,%outhash)=&authorhosts();
unless ($home) {
$r->print('
'.&mt('No author or co-author roles on this server.').'
');
$r->print(&endContentScreen());
return '';
}
+ my $docroot = $r->dir_config('lonDocRoot');
my $is_course_home;
my @ids=&Apache::lonnet::current_machine_ids();
if (($coursehome ne '') && (grep(/^\Q$coursehome\E$/,@ids))) {
$is_course_home = 1;
}
- my %origcrsdata=&Apache::lonnet::coursedescription($env{'request.course.id'});
my $exclude = &Apache::lonnet::priv_exclude();
my $srcurl = "/priv/$coursedom/$coursenum";
- my $srctop = $r->dir_config('lonDocRoot').$srcurl;
+ my $srctop = $docroot.$srcurl;
+ my $resurl = "/res/$coursedom/$coursenum";
+ my $res_exclude = &Apache::lonnet::res_exclude();
if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
$r->print('
'.&mt('Copying Files and/or Sub-directories').'
');
if ($readonly) {
@@ -748,7 +824,8 @@ ENDJS
}
my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});
my $desturl = "/priv/$cd/$ca";
- my $desttop = $r->dir_config('lonDocRoot').$desturl;
+ my $destresurl = "/res/$cd/$ca";
+ my $desttop = $docroot.$desturl;
my $subdir = &clean($env{'form.authorfolder'});
$subdir = &cleandir($subdir);
if ($subdir eq '') {
@@ -806,10 +883,8 @@ ENDJS
}
if (keys(%tocopy)) {
my (%resdirs,%resfiles);
- my $resurl = "/res/$coursedom/$coursenum";
- my $res_exclude = &Apache::lonnet::res_exclude();
&Apache::lonnet::recursedirs($is_course_home,1,undef,$res_exclude,0,0,$resurl,'',\%resdirs,\%resfiles);
- my ($notopdir,%newdir,%newfile,%checkdeps);
+ my ($notopdir,%newdir,%newfile,%checkdeps,%newresfile);
$r->print('
'.&mt('Copy to: [_1]',
''.$desturl.'/'.$subdir.'').
'
'."\n");
@@ -851,6 +926,39 @@ ENDJS
}
if (-e $desttop.'/'.$subdir) {
my $num = 0;
+ my ($copyright,$customdistfile);
+ if ($env{'form.copyright'} eq 'default' || $env{'form.copyright'} eq 'domain' || $env{'form.copyright'} eq 'public') {
+ $copyright = $env{'form.copyright'};
+ } elsif ($env{'form.copyright'} eq 'custom') {
+ if ($env{'form.customrights'} =~ m{^/res/$match_domain/$match_username/.+\.rights$}) {
+ my ($rightsdom,$rightsuname) = ($1,$2);
+ my $rightshome = &Apache::lonnet::homeserver($rightsdom,$rightsuname);
+ if (($rightshome eq 'no_host') || ($rightshome eq '')) {
+ $copyright = 'default';
+ } elsif (grep(/^\Q$rightshome\E$/,@ids)) {
+ if (-e $docroot.$env{'form.customrights'}) {
+ $copyright = 'custom';
+ $customdistfile = $env{'form.customrights'};
+ } else {
+ $copyright = 'default';
+ }
+ } else {
+ my $rightsfile = &Apache::lonnet::filelocation('',$env{'form.customrights'});
+ unless (&Apache::lonnet::getfile($rightsfile) eq '-1') {
+ $customdistfile = $env{'form.customrights'};
+ }
+ }
+ }
+ }
+ my $sourceavail;
+ if ($env{'form.sourceavail'} =~ /^(open|closed)$/) {
+ $sourceavail = $env{'form.sourceavail'};
+ }
+ my $respublish;
+ if ($env{'form.respublish'}) {
+ $respublish = 1;
+ }
+ my $nokeyref = &Apache::lonpublisher::getnokey($r->dir_config('lonIncludes'));
foreach my $file (keys(%files_to_copy)) {
my ($fail,$dup,$dir_is_file,$src,$dest,$path,$fname);
if ($file =~ m{/}) {
@@ -887,213 +995,165 @@ ENDJS
''.$desturl.'/'.$subdir.'/'.$file.'').
''."\n");
} elsif (($src ne '') && ($dest ne '')) {
- if ($is_course_home) {
- if (&File::Copy::copy($src,$dest)) {
- $newfile{$file} = 1;
- }
- } else {
- if (&Apache::lonnet::repcopy_crsprivfile($srcurl.'/'.$file,$dest) eq 'ok') {
- $newfile{$file} = 1;
+ my $ressrc = $docroot.$resurl.'/'.$file;
+ my $ressrcmeta = $ressrc.'.meta';
+ my ($ext) = ($file =~ /\.(\w+)$/);
+ my $embstyle=&Apache::loncommon::fileembstyle($ext);
+ my ($getres,$getresmeta);
+ if ($respublish) {
+ if ($path eq '') {
+ if ((ref($resfiles{'/'}) eq 'HASH') &&
+ (exists($resfiles{'/'}{$fname}))) {
+ $getres = 1;
+ $getresmeta = 1;
+ }
+ } elsif ((ref($resfiles{$path}) eq 'HASH') &&
+ (exists($resfiles{$path}{$fname}))) {
+ $getres = 1;
+ $getresmeta = 1;
}
}
- if ($newfile{$file}) {
- my $gotmeta;
- if ($is_course_home) {
- if ((-e $src.'.meta') && (!-e $dest.'.meta')) {
- if (&File::Copy::copy($src.'.meta',$dest.'.meta')) {
- $gotmeta = 1;
+ if ($is_course_home) {
+ my ($needpriv,$needprivmeta);
+ if ($respublish) {
+ if ($getres) {
+ if (&Apache::londiff::are_different_files($src,$ressrc)) {
+ $needpriv = 1;
+ if (&File::Copy::copy($ressrc,$dest)) {
+ if ($embstyle eq 'ssi') {
+ &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd);
+ }
+ }
+ } else {
+ if (&File::Copy::copy($src,$dest)) {
+ $newfile{$file} = $desturl.'/'.$subdir.'/'.$file;
+ if ($embstyle eq 'ssi') {
+ &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd,$subdir);
+ }
+ }
}
+ } else {
+ $needpriv = 1;
}
- } else {
- if (&Apache::lonnet::repcopy_crsprivfile($srcurl.'/'.$file.'.meta',$dest.'.meta') eq 'ok') {
- $gotmeta = 1;
- }
- }
- if ($gotmeta) {
- if (open(my $fh,'<',$dest.'.meta')) {
- my ($output,$now);
- $now = time;
- while (my $line=<$fh>) {
- chomp($line);
- if ($line eq "$coursenum:$coursedom") {
- $output .= "$ca:$cd\n";
- } elsif ($line eq 'custom') {
- $output .= "default\n";
- } elsif ($line =~ m{^\d+$}) {
- $output .= "$now\n";
- } elsif ($line eq "/res/$coursedom/$coursenum/default.rights") {
- $output .= "\n";
- } elsif ($line eq "$coursedom") {
- $output .= "$cd\n";
- } elsif ($line =~ m{^\d+$}) {
- $output .= "$now\n";
- } elsif ($line =~ m{^$match_username:$match_domain$}) {
- $output .= "$env{'user.name'}:$env{'user.domain'}\n";
- } elsif ($line eq "$coursenum:$coursedom") {
- $output .= "$ca:$cd\n";
- } elsif ($line =~ m{^(.+)$}) {
- my @deps = split(/\s*,\s*/,$1);
- my @newdeps;
- my $changed = 0;
- foreach my $dep (@deps) {
- if ($dep =~ m{^/res/$coursedom/$coursenum/(.+)$}) {
- my $rest = $1;
- push(@newdeps,"/res/$cd/$ca/$rest");
- $checkdeps{$rest} = 1;
- $changed ++;
- } else {
- push(@newdeps,$dep);
- }
- }
- if ($changed) {
- $output .= ''.join(',',@newdeps).''."\n";
+ if ($getresmeta) {
+ if ((-e $src.'.meta') && (!-e $dest.'.meta')) {
+ if (&Apache::londiff::are_different_files($src.'.meta',$ressrc.'.meta')) {
+ if (&File::Copy::copy($ressrc.'.meta',$dest.'.meta')) {
+ &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
+ $customdistfile,$sourceavail,\%checkdeps);
}
+ $needprivmeta = 1;
} else {
- $output .= "$line\n";
+ if (&File::Copy::copy($src.'.meta',$dest.'.meta')) {
+ &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
+ $customdistfile,$sourceavail,\%checkdeps);
+ }
}
}
- close($fh);
- if (open(my $fh,'>',$dest.'.meta')) {
- print $fh $output;
- close($fh);
+ }
+ if ($getres) {
+ my $destresfile = $docroot.$destresurl.'/'.$subdir.'/'.$file;
+ if (-e $dest) {
+ my $output = &Apache::lonpublisher::batchpublish($r,$dest,$destresfile,$nokeyref,1);
+ if (-e $destresfile) {
+ $newresfile{$file} = $destresurl.'/'.$subdir.'/'.$file;
+ }
}
}
+ } else {
+ $needpriv = 1;
+ if ((-e $src.'.meta') && (!-e $dest.'.meta')) {
+ $needprivmeta = 1;
+ }
}
- my ($ext) = ($file =~ /\.(\w+)$/);
- my $embstyle=&Apache::loncommon::fileembstyle($ext);
- if ($embstyle eq 'ssi') {
- my $outstring='';
- my $changes = 0;
- my @parser;
- $parser[0]=HTML::LCParser->new($dest);
- $parser[-1]->xml_mode(1);
- my $token;
- while (@parser) {
- while ($token=$parser[-1]->get_token) {
- if ($token->[0] eq 'S') {
- my $tag=$token->[1];
- my $lctag=lc($tag);
- my %parms=%{$token->[2]};
- foreach my $type ('src','href','background','bgimg') {
- foreach my $key (keys(%parms)) {
- if ($key =~ /^$type$/i) {
- next if (($lctag eq 'img') && ($type eq 'src') &&
- ($parms{$key} =~ m{^data\:image/gif;base64,}));
- if ($parms{$key} =~ m{^\Q/res/$coursedom/$coursenum/\E}si) {
- $parms{$key} =~ s{^\Q/res/$coursedom/$coursenum/\E}{/res/$cd/$ca/$subdir/}si;
- $changes ++;
- }
- }
- }
- }
- # probably a image type