--- loncom/interface/londocs.pm 2024/12/27 02:32:55 1.714 +++ loncom/interface/londocs.pm 2025/01/07 21:01:37 1.722 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.714 2024/12/27 02:32:55 raeburn Exp $ +# $Id: londocs.pm,v 1.722 2025/01/07 21:01:37 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -579,7 +579,8 @@ $contents{webreferences}.' $title=~s/[\/\s]+/\_/gs; $title=&clean($title); my $formname = 'dumpdoc'; - my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash); + my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash). + '
'."\n"; my %uploadedfiles; &tiehash(); foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) { @@ -643,8 +644,8 @@ sub authorspace_selector { } $preamble .= '
'. '
'.&mt('Folder in Authoring Space').''. - ''."\n". - '
'."\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