--- loncom/publisher/lonpublisher.pm 2011/10/22 23:09:44 1.271
+++ loncom/publisher/lonpublisher.pm 2023/01/23 02:24:50 1.295.2.1.2.1
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Publication Handler
#
-# $Id: lonpublisher.pm,v 1.271 2011/10/22 23:09:44 www Exp $
+# $Id: lonpublisher.pm,v 1.295.2.1.2.1 2023/01/23 02:24:50 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -66,10 +66,10 @@ invocation by F:
=head1 OVERVIEW
-Authors can only write-access the C~authorname/> space. They can
-copy resources into the resource area through the publication step,
-and move them back through a recover step. Authors do not have direct
-write-access to their resource space.
+Authors can only write-access the C space.
+They can copy resources into the resource area through the
+publication step, and move them back through a recover step.
+Authors do not have direct write-access to their resource space.
During the publication step, several events will be
triggered. Metadata is gathered, where a wizard manages default
@@ -102,8 +102,6 @@ to publication space.
Many of the undocumented subroutines implement various magical
parsing shortcuts.
-=over 4
-
=cut
######################################################################
@@ -121,7 +119,6 @@ use HTML::LCParser;
use HTML::Entities;
use Encode::Encoder;
use Apache::lonxml;
-use Apache::loncacc;
use DBI;
use Apache::lonnet;
use Apache::loncommon();
@@ -150,6 +147,8 @@ my $lock;
=pod
+=over 4
+
=item B
Evaluates a string that contains metadata. This subroutine
@@ -201,12 +200,12 @@ sub metaeval {
if (defined($token->[2]->{'name'})) {
$unikey.="\0".$token->[2]->{'name'};
}
- foreach (@{$token->[3]}) {
- $metadatafields{$unikey.'.'.$_}=$token->[2]->{$_};
+ foreach my $item (@{$token->[3]}) {
+ $metadatafields{$unikey.'.'.$item}=$token->[2]->{$item};
if ($metadatakeys{$unikey}) {
- $metadatakeys{$unikey}.=','.$_;
+ $metadatakeys{$unikey}.=','.$item;
} else {
- $metadatakeys{$unikey}=$_;
+ $metadatakeys{$unikey}=$item;
}
}
my $newentry=$parser->get_text('/'.$entry);
@@ -294,8 +293,8 @@ sub coursedependencies {
my %evaldata=&Apache::lonnet::dump('nohist_resevaldata',$adomain,
$aauthor,$regexp);
my %courses=();
- foreach (keys %evaldata) {
- if ($_=~/^([a-zA-Z0-9]+_[a-zA-Z0-9]+)___.+___course$/) {
+ foreach my $item (keys(%evaldata)) {
+ if ($item=~/^([a-zA-Z0-9]+_[a-zA-Z0-9]+)___.+___course$/) {
$courses{$1}=1;
}
}
@@ -319,8 +318,12 @@ string which presents the form field (fo
=item B
+=item B
+
=item B
+=item B
+
=item B
=back
@@ -368,7 +371,7 @@ sub hiddenfield {
sub checkbox {
my ($name,$text)=@_;
- return "\n ".
+ return "\n ".
&mt($text)." ";
}
@@ -383,12 +386,12 @@ sub selectbox {
}
my $selout="\n".&Apache::lonhtmlcommon::row_title($title)
.'';
- foreach (@idlist) {
- $selout.=''.&{$functionref}($_).' ';
+ $selout.='>'.&{$functionref}($id).'';
}
$selout.=' '.&Apache::lonhtmlcommon::row_closure();
return $selout;
@@ -400,6 +403,58 @@ sub select_level_form {
if (!defined($value)) { $env{'form.'.$name}=0; }
return &Apache::loncommon::select_level_form($value,$name);
}
+
+sub common_access {
+ my ($name,$text,$options)=@_;
+ return unless (ref($options) eq 'ARRAY');
+ my $formname = 'pubdirpref';
+ my $chkname = 'common'.$name;
+ my $chkid = 'LC_'.$chkname;
+ my $divid = $chkid.'div';
+ my $customdivid = 'LC_customfile';
+ my $selname = $chkname.'select';
+ my $selid = $chkid.'select';
+ my $selonchange;
+ if ($name eq 'dist') {
+ $selonchange = ' onchange="showHideCustom(this,'."'$customdivid'".');"';
+ }
+ my %lt = &Apache::lonlocal::texthash(
+ 'default' => 'System wide - can be used for any courses system wide',
+ 'domain' => 'Domain only - use limited to courses in the domai',
+ 'custom' => 'Customized right of use ...',
+ 'public' => 'Public - no authentication or authorization required for use',
+ 'closed' => 'Closed - XML source is closed to everyone',
+ 'open' => 'Open - XML source is open to people who want to use it',
+ 'sel' => 'Select',
+ );
+ my $output = <<"END";
+
+
+
+$text
+
+
+$lt{'sel'}
+END
+ foreach my $val (@{$options}) {
+ $output .= ''.$lt{$val}.' '."\n";
+ }
+ $output .= '
+ ';
+ if ($name eq 'dist') {
+ $output .= <<"END";
+
+END
+ }
+ $output .= '
+
+';
+}
+
#########################################
#########################################
@@ -469,7 +524,7 @@ Currently undocumented
#########################################
#########################################
sub set_allow {
- my ($allow,$logfile,$target,$tag,$oldurl)=@_;
+ my ($allow,$logfile,$target,$tag,$oldurl,$type)=@_;
my $newurl=&urlfixup($oldurl,$target);
my $return_url=$oldurl;
print $logfile 'GUYURL: '.$tag.':'.$oldurl.' - '.$newurl."\n";
@@ -481,6 +536,11 @@ sub set_allow {
($newurl !~ /^mailto:/i) &&
($newurl !~ /^(?:http|https|ftp):/i) &&
($newurl !~ /^\#/)) {
+ if (($type eq 'src') || ($type eq 'href')) {
+ if ($newurl =~ /^([^?]+)\?[^?]*$/) {
+ $newurl = $1;
+ }
+ }
$$allow{&absoluteurl($newurl,$target)}=1;
}
return $return_url;
@@ -722,9 +782,11 @@ sub fix_ids_and_indices {
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,}));
$parms{$key}=&set_allow(\%allow,$logfile,
$target,$tag,
- $parms{$key});
+ $parms{$key},$type);
}
}
}
@@ -781,20 +843,105 @@ sub fix_ids_and_indices {
}
my $newparmstring='';
my $endtag='';
- foreach (keys %parms) {
- if ($_ eq '/') {
+ foreach my $parkey (keys(%parms)) {
+ if ($parkey eq '/') {
$endtag=' /';
} else {
- my $quote=($parms{$_}=~/\"/?"'":'"');
- $newparmstring.=' '.$_.'='.$quote.$parms{$_}.$quote;
+ my $quote=($parms{$parkey}=~/\"/?"'":'"');
+ $newparmstring.=' '.$parkey.'='.$quote.$parms{$parkey}.$quote;
}
}
if (!$endtag) { if ($token->[4]=~m:/>$:) { $endtag=' /'; }; }
$outstring.='<'.$tag.$newparmstring.$endtag.'>';
- if ($lctag eq 'm' || $lctag eq 'script' || $lctag eq 'answer'
- || $lctag eq 'display' || $lctag eq 'tex') {
+ if ($lctag eq 'm' || $lctag eq 'answer' || $lctag eq 'display' ||
+ $lctag eq 'tex') {
$outstring.=&get_all_text_unbalanced('/'.$lctag,\@parser);
- }
+ } elsif ($lctag eq 'script') {
+ if ($parms{'type'} eq 'loncapa/perl') {
+ $outstring.=&get_all_text_unbalanced('/'.$lctag,\@parser);
+ } else {
+ my $script = &get_all_text_unbalanced('/'.$lctag,\@parser);
+ if ($script =~ m{\.set\w+(Src|Swf)\(["']}i) {
+ my @srcs = split(/\.set/i,$script);
+ if (scalar(@srcs) > 1) {
+ foreach my $item (@srcs) {
+ if ($item =~ m{^(FlashPlayerSwf|MediaSrc|XMPSrc|ConfigurationSrc|PosterImageSrc)\((['"])(?:(?!\2).)+\2\)}is) {
+ my $srctype = $1;
+ my $quote = $2;
+ my ($url) = ($item =~ m{^\Q$srctype($quote\E([^$quote]+)\Q$quote)\E});
+ $url = &urlfixup($url);
+ unless ($url=~m{^(?:http|https|ftp)://}) {
+ $allow{&absoluteurl($url,$target)}=1;
+ if ($srctype eq 'ConfigurationSrc') {
+ if ($url =~ m{^(.+/)configuration_express\.xml$}) {
+#
+# Camtasia 8.1: express_show/spritesheet.png needed, and included in zip archive.
+# Not referenced directly in .html or _player.html files,
+# so add this file to %allow (where is name user gave to file/archive).
+#
+ my $spritesheet = $1.'express_show/spritesheet.png';
+ $allow{&absoluteurl($spritesheet,$target)}=1;
+
+#
+# Camtasia 8.4: skins/express_show/spritesheet.min.css needed, and included in zip archive.
+# Not referenced directly in .html or _player.html files,
+# so add this file to %allow (where is name user gave to file/archive).
+#
+ my $spritecss = $1.'express_show/spritesheet.min.css';
+ $allow{&absoluteurl($spritecss,$target)}=1;
+ }
+ } elsif ($srctype eq 'PosterImageSrc') {
+ if ($url =~ m{^(.+)_First_Frame\.png$}) {
+ my $prefix = $1;
+#
+# Camtasia 8.1: _Thumbnails.png needed, and included in zip archive.
+# Not referenced directly in .html or _player.html files,
+# so add this file to %allow (where is name user gave to file/archive).
+#
+ my $thumbnail = $prefix.'_Thumbnails.png';
+ $allow{&absoluteurl($thumbnail,$target)}=1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if ($script =~ m{\.addMediaSrc\((["'])((?!\1).+)\1\);}) {
+ my $src = $2;
+ if ($src) {
+ my $url = &urlfixup($src);
+ unless ($url=~m{^(?:http|https|ftp)://}) {
+ $allow{&absoluteurl($url,$target)}=1;
+ }
+ }
+ }
+ if ($script =~ /\(document,\s*(['"])script\1,\s*\[([^\]]+)\]\);/s) {
+ my $scriptslist = $2;
+ my @srcs = split(/\s*,\s*/,$scriptslist);
+ foreach my $src (@srcs) {
+ if ($src =~ /(["'])(?:(?!\1).)+\.js\1/) {
+ my $quote = $1;
+ my ($url) = ($src =~ m/\Q$quote\E([^$quote]+)\Q$quote\E/);
+ $url = &urlfixup($url);
+ unless ($url=~m{^(?:http|https|ftp)://}) {
+ $allow{&absoluteurl($url,$target)}=1;
+ }
+ }
+ }
+ }
+ if ($script =~ m{loadScript\(\s*(['"])((?:(?!\1).)+\.js)\1,\s*function}is) {
+ my $src = $2;
+ if ($src) {
+ my $url = &urlfixup($src);
+ unless ($url=~m{^(?:http|https|ftp)://}) {
+ $allow{&absoluteurl($url,$target)}=1;
+ }
+ }
+ }
+ $outstring .= $script;
+ }
+ }
} elsif ($token->[0] eq 'E') {
if ($token->[2]) {
unless ($token->[1] eq 'allow') {
@@ -1017,6 +1164,11 @@ sub publish {
$outdep.= ' - '.&mt('Currently not available').
' ';
} else {
+#
+# Store the fact that the dependency has been used by the target file
+# Unfortunately, usage is erroneously named sequsage in lonmeta.pm
+# The translation happens in lonmetadata.pm
+#
my %temphash=(&Apache::lonnet::declutter($target).'___'.
&Apache::lonnet::declutter($thisdep).'___usage'
=> time);
@@ -1101,9 +1253,9 @@ sub publish {
# ------------------- Clear out parameters and stores (there should not be any)
- foreach (keys %metadatafields) {
- if (($_=~/^parameter/) || ($_=~/^stores/)) {
- delete $metadatafields{$_};
+ foreach my $field (keys(%metadatafields)) {
+ if (($field=~/^parameter/) || ($field=~/^stores/)) {
+ delete $metadatafields{$field};
}
}
@@ -1112,23 +1264,21 @@ sub publish {
$scrout.=&metaread($logfile,$source.'.meta');
- foreach (keys %metadatafields) {
- if (($_=~/^parameter/) || ($_=~/^stores/)) {
- $oldparmstores{$_}=1;
- delete $metadatafields{$_};
+ foreach my $field (keys(%metadatafields)) {
+ if (($field=~/^parameter/) || ($field=~/^stores/)) {
+ $oldparmstores{$field}=1;
+ delete $metadatafields{$field};
}
}
# ------------------------------------------------------------- Save some stuff
my %savemeta=();
- foreach ('title') {
- if ($metadatafields{$_}) { $savemeta{$_}=$metadatafields{$_}; }
- }
+ if ($metadatafields{'title'}) { $savemeta{'title'}=$metadatafields{'title'}; }
# ------------------------------------------ See if anything new in file itself
$allmeta=&parseformeta($source,$style);
# ----------------------------------------------------------- Restore the stuff
- foreach (keys %savemeta) {
- $metadatafields{$_}=$savemeta{$_};
+ foreach my $item (keys(%savemeta)) {
+ $metadatafields{$item}=$savemeta{$item};
}
}
@@ -1136,11 +1286,11 @@ sub publish {
# ---------------- Find and document discrepancies in the parameters and stores
my $chparms='';
- foreach (sort keys %metadatafields) {
- if (($_=~/^parameter/) || ($_=~/^stores/)) {
- unless ($_=~/\.\w+$/) {
- unless ($oldparmstores{$_}) {
- my $disp_key = $_;
+ foreach my $field (sort(keys(%metadatafields))) {
+ if (($field=~/^parameter/) || ($field=~/^stores/)) {
+ unless ($field=~/\.\w+$/) {
+ unless ($oldparmstores{$field}) {
+ my $disp_key = $field;
$disp_key =~ tr/\0/_/;
print $logfile ('New: '.$disp_key."\n");
$chparms .= $disp_key.' ';
@@ -1154,11 +1304,11 @@ sub publish {
}
$chparms='';
- foreach (sort keys %oldparmstores) {
- if (($_=~/^parameter/) || ($_=~/^stores/)) {
- unless (($metadatafields{$_.'.name'}) ||
- ($metadatafields{$_.'.package'}) || ($_=~/\.\w+$/)) {
- my $disp_key = $_;
+ foreach my $olditem (sort(keys(%oldparmstores))) {
+ if (($olditem=~/^parameter/) || ($olditem=~/^stores/)) {
+ unless (($metadatafields{$olditem.'.name'}) ||
+ ($metadatafields{$olditem.'.package'}) || ($olditem=~/\.\w+$/)) {
+ my $disp_key = $olditem;
$disp_key =~ tr/\0/_/;
print $logfile ('Obsolete: '.$disp_key."\n");
$chparms.=$disp_key.' ';
@@ -1235,7 +1385,7 @@ sub publish {
&hiddenfield('phase','two').
&hiddenfield('filename',$env{'form.filename'}).
&hiddenfield('allmeta',&escape($allmeta)).
- &hiddenfield('dependencies',join(',',keys %allow));
+ &hiddenfield('dependencies',join(',',keys(%allow)));
unless ($env{'form.makeobsolete'}) {
$intr_scrout.=
&textfield('Title','title',$metadatafields{'title'}).
@@ -1480,6 +1630,8 @@ Returns:
0: fail
1: success
+=back
+
=cut
#'stupid emacs
@@ -1533,7 +1685,33 @@ sub phasetwo {
%metadatakeys=();
&metaeval(&unescape($env{'form.allmeta'}));
-
+
+ if ($batch) {
+ my %commonaccess;
+ map { $commonaccess{$_} = 1; } &Apache::loncommon::get_env_multiple('form.commonaccess');
+ if ($commonaccess{'dist'}) {
+ unless ($style eq 'prv') {
+ if ($env{'form.commondistselect'} eq 'custom') {
+ unless ($source =~ /\.rights$/) {
+ if ($env{'form.commoncustomrights'} =~ m{^/res/.+\.rights$}) {
+ $env{'form.customdistributionfile'} = $env{'form.commoncustomrights'};
+ $env{'form.copyright'} = $env{'form.commondistselect'};
+ }
+ }
+ } elsif ($env{'form.commondistselect'} =~ /^default|domain|public$/) {
+ $env{'form.copyright'} = $env{'form.commondistselect'};
+ }
+ }
+ }
+ unless ($style eq 'prv') {
+ if ($commonaccess{'source'}) {
+ if (($env{'form.commonsourceselect'} eq 'open') || ($env{'form.commonsourceselect'} eq 'closed')) {
+ $env{'form.sourceavail'} = $env{'form.commonsourceselect'};
+ }
+ }
+ }
+ }
+
$metadatafields{'title'}=$env{'form.title'};
$metadatafields{'author'}=$env{'form.author'};
$metadatafields{'subject'}=$env{'form.subject'};
@@ -1594,17 +1772,17 @@ sub phasetwo {
'');
return 0;
}
- foreach (sort keys %metadatafields) {
- unless ($_=~/\./) {
- my $unikey=$_;
+ foreach my $field (sort(keys(%metadatafields))) {
+ unless ($field=~/\./) {
+ my $unikey=$field;
$unikey=~/^([A-Za-z]+)/;
my $tag=$1;
$tag=~tr/A-Z/a-z/;
print $mfh "\n\<$tag";
- foreach (split(/\,/,$metadatakeys{$unikey})) {
- my $value=$metadatafields{$unikey.'.'.$_};
+ foreach my $item (split(/\,/,$metadatakeys{$unikey})) {
+ my $value=$metadatafields{$unikey.'.'.$item};
$value=~s/\"/\'\'/g;
- print $mfh ' '.$_.'="'.$value.'"';
+ print $mfh ' '.$item.'="'.$value.'"';
}
print $mfh '>'.
&HTML::Entities::encode($metadatafields{$unikey},'<>&"')
@@ -1770,21 +1948,17 @@ sub phasetwo {
my $thissrcdir=$thissrc;
$thissrcdir=~s/\/[^\/]+$/\//;
- $r->print(&Apache::loncommon::head_subbox(
- &Apache::lonhtmlcommon::start_funclist().
- &Apache::lonhtmlcommon::add_item_funclist(
+ $r->print(
+ &Apache::lonhtmlcommon::actionbox([
''.
&mt('View Published Version').
- ' ').
- &Apache::lonhtmlcommon::add_item_funclist(
+ '',
''.
&mt('Back to Source').
- ' ').
- &Apache::lonhtmlcommon::add_item_funclist(
+ '',
''.
&mt('Back to Source Directory').
- ' ').
- &Apache::lonhtmlcommon::end_funclist())
+ ''])
);
}
return 1;
@@ -1814,9 +1988,9 @@ sub notify {
# --------------------------------------------------- Notify subscribed courses
my %courses=&coursedependencies($target);
my $now=time;
- foreach (keys %courses) {
- print $logfile "\nNotifying course ".$_.':';
- my ($cdom,$cname)=split(/\_/,$_);
+ foreach my $course (keys(%courses)) {
+ print $logfile "\nNotifying course ".$course.':';
+ my ($cdom,$cname)=split(/\_/,$course);
my $reply=&Apache::lonnet::cput
('versionupdate',{$target => $now},$cdom,$cname);
print $logfile $reply;
@@ -1878,39 +2052,62 @@ sub publishdirectory {
my ($r,$fn,$thisdisfn)=@_;
$fn=~s/\/+/\//g;
$thisdisfn=~s/\/+/\//g;
- my $resdir=
- $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$cudom.'/'.$cuname.'/'.
- $thisdisfn;
- $r->print(&Apache::lonhtmlcommon::start_pick_box()
+ my $thisdisresdir=$thisdisfn;
+ $thisdisresdir=~s/^\/priv\//\/res\//;
+ my $resdir = $r->dir_config('lonDocRoot').$thisdisresdir;
+ $r->print('');
+ ''.&mt('Recurse').' '.
+ &checkbox('pubrec','include subdirectories').
+ ' '.
+ ''.&mt('Force').' '.
+ &checkbox('forcerepub','force republication of previously published files').' '.
+ &checkbox('forceoverride','force directory level metadata over existing').
+ ' '.
+ ''.&mt('Exclude').' '.
+ &checkbox('excludeunpub','exclude currently unpublished files').' '.
+ &checkbox('excludemod','exclude modified files').' '.
+ &checkbox('excludemodmeta','exclude files with modified metadata').
+ ' '.
+ ''.&mt('Actions').' '.
+ &checkbox('obsolete','make file(s) obsolete').' '.
+ &common_access('dist',&mt('apply common copyright/distribution'),
+ ['default','domain','public','custom']).' '.
+ &common_access('source',&mt('apply common source availability'),
+ ['closed','open']).
+ ' '
+ );
$r->print(&Apache::lonhtmlcommon::row_closure(1)
.&Apache::lonhtmlcommon::end_pick_box()
+ .' '
);
$lock=0;
} else {
$r->print(&Apache::lonhtmlcommon::row_closure(1)
.&Apache::lonhtmlcommon::end_pick_box()
);
+ my %commonaccess;
+ map { $commonaccess{$_} = 1; } &Apache::loncommon::get_env_multiple('form.commonaccess');
unless ($lock) { $lock=&Apache::lonnet::set_lock(&mt('Publishing [_1]',$fn)); }
# actually publish things
opendir(DIR,$fn);
@@ -1929,8 +2126,9 @@ sub publishdirectory {
}
} elsif ((&Apache::loncommon::fileembstyle($extension) ne 'hdn') &&
($filename!~/^[\#\.]/) && ($filename!~/\~$/)) {
-# find out publication status and/or exiting metadata
+# find out publication status and/or existing metadata
my $publishthis=0;
+ my $skipthis;
if (-e $resdir.'/'.$filename) {
my ($rdev,$rino,$rmode,$rnlink,
$ruid,$rgid,$rrdev,$rsize,
@@ -1938,22 +2136,72 @@ sub publishdirectory {
$rblksize,$rblocks)=stat($resdir.'/'.$filename);
if (($rmtime<$cmtime) || ($env{'form.forcerepub'})) {
# previously published, modified now
- $publishthis=1;
- }
- my $meta_cmtime = (stat($fn.'/'.$filename.'.meta'))[9];
- my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9];
- if ( $meta_rmtime<$meta_cmtime ) {
- $publishthis=1;
+ if ($env{'form.excludemod'}) {
+ $skipthis='mod';
+ } else {
+ $publishthis=1;
+ }
}
+ unless ($skipthis) {
+ my $meta_cmtime = (stat($fn.'/'.$filename.'.meta'))[9];
+ my $meta_rmtime = (stat($resdir.'/'.$filename.'.meta'))[9];
+ if ( $meta_rmtime<$meta_cmtime ) {
+ if ($env{'form.excludemodmeta'}) {
+ $skipthis='modmeta';
+ $publishthis=0;
+ } else {
+ $publishthis=1;
+ }
+ } else {
+ unless (&Apache::loncommon::fileembstyle($extension) eq 'prv') {
+ if ($commonaccess{'dist'}) {
+ my ($currdist,$currdistfile,$currsourceavail);
+ my $currdist = &Apache::lonnet::metadata($thisdisresdir.'/'.$filename,'copyright');
+ if ($currdist eq 'custom') {
+ $currdistfile = &Apache::lonnet::metadata($thisdisresdir.'/'.$filename,'customdistributionfile');
+ }
+ if ($env{'form.commondistselect'} eq 'custom') {
+ if ($env{'form.commoncustomrights'} =~ m{^/res/.+\.rights$}) {
+ if ($currdist eq 'custom') {
+ unless ($env{'form.commoncustomrights'} eq $currdistfile) {
+ $publishthis=1;
+ }
+ } else {
+ $publishthis=1;
+ }
+ }
+ } elsif ($env{'form.commondistselect'} =~ /^default|domain|public$/) {
+ unless ($currdist eq $env{'form.commondistselect'}) {
+ $publishthis=1;
+ }
+ }
+ }
+ }
+ }
+ }
} else {
# never published
- $publishthis=1;
+ if ($env{'form.excludeunpub'}) {
+ $skipthis='unpub';
+ } else {
+ $publishthis=1;
+ }
}
if ($publishthis) {
&batchpublish($r,$fn.'/'.$filename,$resdir.'/'.$filename);
} else {
- $r->print(' '.&mt('Skipping').' '.$filename.' ');
+ my $reason;
+ if ($skipthis) {
+ $reason = $reasons{$skipthis};
+ } else {
+ $reason = &mt('No changes needed to published resource or metadata');
+ }
+ $r->print(' '.&mt('Skipping').' '.$filename);
+ if ($reason) {
+ $r->print(' ('.$reason.')');
+ }
+ $r->print(' ');
}
$r->rflush();
}
@@ -2014,7 +2262,7 @@ sub defaultmetapublish {
$r->print($reply.'
');$r->rflush;
}
# ------------------------------------------------------------------- Link back
- $r->print("".&mt('Back to Metadata').' ');
+ $r->print("".&mt('Back to Metadata').' ');
$r->print(&Apache::loncommon::end_page());
return OK;
}
@@ -2078,7 +2326,7 @@ sub handler {
# -------------------------------------------------------------- Check filename
my $fn=&unescape($env{'form.filename'});
- ($cuname,$cudom)=&Apache::loncacc::constructaccess($fn);
+ ($cuname,$cudom)=&Apache::lonnet::constructaccess($fn);
# ----------------------------------------------------- Do we have permissions?
unless (($cuname) && ($cudom)) {
$r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
@@ -2143,8 +2391,8 @@ sub handler {
# Breadcrumbs
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb({
- 'text' => 'Construction Space',
- 'href' => &Apache::loncommon::authorspace(),
+ 'text' => 'Authoring Space',
+ 'href' => &Apache::loncommon::authorspace($fn),
});
&Apache::lonhtmlcommon::add_breadcrumb({
'text' => 'Resource Publication',
@@ -2154,10 +2402,56 @@ sub handler {
my $js='';
- $r->print(&Apache::loncommon::start_page('Resource Publication',$js)
+ my $startargs = {};
+ if ($fn=~/\/$/) {
+ unless ($env{'form.phase'} eq 'two') {
+ $startargs->{'add_entries'} = { onload => 'javascript:setDefaultAccess();' };
+ $js .= <<"END";
+
+
+END
+ }
+ }
+ $r->print(&Apache::loncommon::start_page('Resource Publication',$js,$startargs)
.&Apache::lonhtmlcommon::breadcrumbs()
.&Apache::loncommon::head_subbox(
- &Apache::loncommon::CSTR_pageheader()) # FIXME crumbs broken?
+ &Apache::loncommon::CSTR_pageheader($docroot.$fn))
);
my $thisdisfn=&HTML::Entities::encode($fn,'<>&"');
@@ -2167,8 +2461,11 @@ sub handler {
if ($fn=~/\/$/) {
# -------------------------------------------------------- This is a directory
- &publishdirectory($r,$fn,$thisdisfn);
- $r->print(''.&mt('Return to Directory').' ');
+ &publishdirectory($r,$docroot.$fn,$thisdisfn);
+ $r->print(
+ ' '.
+ &Apache::lonhtmlcommon::actionbox([
+ ''.&mt('Return to Directory').' ']));
} else {
# ---------------------- Evaluate individual file, and then output information.
$fn=~/\.(\w+)$/;
@@ -2218,7 +2515,7 @@ ENDCAPTION
$r->print(&Apache::lonhtmlcommon::row_closure()
.&Apache::lonhtmlcommon::row_title(&mt('Diffs')));
$r->print(<
+
ENDDIFF
$r->print(&mt('Diffs with Current Version').' ');
}
@@ -2237,7 +2534,7 @@ ENDDIFF
}
unless ($errorcount) {
my ($outstring,$error)=
- &publish($docroot.$fn,$thistarget,$thisembstyle);
+ &publish($docroot.$fn,$docroot.$thistarget,$thisembstyle);
$r->print($outstring);
} else {
$r->print(''.
@@ -2245,7 +2542,7 @@ ENDDIFF
' ');
}
} else {
- &phasetwo($r,$fn,$thistarget,$thisembstyle,$thisdistarget);
+ &phasetwo($r,$docroot.$fn,$docroot.$thistarget,$thisembstyle,$thisdistarget);
}
}
$r->print(&Apache::loncommon::end_page());
@@ -2260,7 +2557,5 @@ __END__
=back
-=back
-
=cut
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.