--- loncom/publisher/lonpublisher.pm 2003/09/25 22:30:06 1.138
+++ loncom/publisher/lonpublisher.pm 2003/11/08 11:20:22 1.145
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Publication Handler
#
-# $Id: lonpublisher.pm,v 1.138 2003/09/25 22:30:06 www Exp $
+# $Id: lonpublisher.pm,v 1.145 2003/11/08 11:20:22 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -143,6 +143,7 @@ use Apache::lonnet();
use Apache::loncommon();
use Apache::lonmysql;
use Apache::lonlocal;
+use Apache::loncfile;
use vars qw(%metadatafields %metadatakeys);
my %addid;
@@ -180,46 +181,49 @@ nothing
#########################################
#########################################
+#
+# Modifies global %metadatafields %metadatakeys
+#
+
sub metaeval {
- my $metastring=shift;
+ my ($metastring,$prefix)=@_;
- my $parser=HTML::LCParser->new(\$metastring);
- my $token;
- while ($token=$parser->get_token) {
- if ($token->[0] eq 'S') {
- my $entry=$token->[1];
- my $unikey=$entry;
- if (defined($token->[2]->{'package'})) {
- $unikey.='_package_'.$token->[2]->{'package'};
- }
- if (defined($token->[2]->{'part'})) {
- $unikey.='_'.$token->[2]->{'part'};
- }
- if (defined($token->[2]->{'id'})) {
- $unikey.='_'.$token->[2]->{'id'};
- }
- if (defined($token->[2]->{'name'})) {
- $unikey.='_'.$token->[2]->{'name'};
- }
- foreach (@{$token->[3]}) {
- $metadatafields{$unikey.'.'.$_}=$token->[2]->{$_};
- if ($metadatakeys{$unikey}) {
- $metadatakeys{$unikey}.=','.$_;
- } else {
- $metadatakeys{$unikey}=$_;
- }
- }
- if ($metadatafields{$unikey}) {
- my $newentry=$parser->get_text('/'.$entry);
- unless (($metadatafields{$unikey}=~/\Q$newentry\E/) ||
- ($newentry eq '')) {
- $metadatafields{$unikey}.=', '.$newentry;
- }
- } else {
- $metadatafields{$unikey}=$parser->get_text('/'.$entry);
- }
- }
- }
+ my $parser=HTML::LCParser->new(\$metastring);
+ my $token;
+ while ($token=$parser->get_token) {
+ if ($token->[0] eq 'S') {
+ my $entry=$token->[1];
+ my $unikey=$entry;
+ if (defined($token->[2]->{'package'})) {
+ $unikey.='_package_'.$token->[2]->{'package'};
+ }
+ if (defined($token->[2]->{'part'})) {
+ $unikey.='_'.$token->[2]->{'part'};
+ }
+ if (defined($token->[2]->{'id'})) {
+ $unikey.='_'.$token->[2]->{'id'};
+ }
+ if (defined($token->[2]->{'name'})) {
+ $unikey.='_'.$token->[2]->{'name'};
+ }
+ foreach (@{$token->[3]}) {
+ $metadatafields{$unikey.'.'.$_}=$token->[2]->{$_};
+ if ($metadatakeys{$unikey}) {
+ $metadatakeys{$unikey}.=','.$_;
+ } else {
+ $metadatakeys{$unikey}=$_;
+ }
+ }
+ my $newentry=$parser->get_text('/'.$entry);
+ if ($entry eq 'customdistributionfile') {
+ $newentry=~s/^\s*//;
+ if ($newentry !~m|^/res|) { $newentry=$prefix.$newentry; }
+ }
+ unless ($metadatafields{$unikey}=~/\w/) {
+ $metadatafields{$unikey}=$newentry;
+ }
+ }
+ }
}
#########################################
@@ -260,19 +264,21 @@ XHTML text that indicates successful rea
#########################################
#########################################
sub metaread {
- my ($logfile,$fn)=@_;
+ my ($logfile,$fn,$prefix)=@_;
unless (-e $fn) {
print($logfile 'No file '.$fn."\n");
- return '
No file: '.$fn.'';
+ return '
No file: '.
+ &Apache::loncfile::display($fn).'';
}
print($logfile 'Processing '.$fn."\n");
my $metastring;
{
- my $metafh=Apache::File->new($fn);
- $metastring=join('',<$metafh>);
+ my $metafh=Apache::File->new($fn);
+ $metastring=join('',<$metafh>);
}
- &metaeval($metastring);
- return '
Processed file: '.$fn.'';
+ &metaeval($metastring,$prefix);
+ return '
Processed file: '.
+ &Apache::loncfile::display($fn).'';
}
#########################################
@@ -325,6 +331,9 @@ string which presents the form field (fo
#########################################
sub textfield {
my ($title,$name,$value)=@_;
+ $value=~s/^\s+//gs;
+ $value=~s/\s+$//gs;
+ $value=~s/\s+/ /gs;
$title=&mt($title);
my $uctitle=uc($title);
return "\n
$uctitle:".
@@ -808,6 +817,26 @@ sub store_metadata {
return (undef,$status);
}
+
+# ============================================== Parse file itself for metadata
+#
+# parses a file with target meta, sets global %metadatafields %metadatakeys
+
+sub parseformeta {
+ my ($source,$style)=@_;
+ my $allmeta='';
+ if (($style eq 'ssi') || ($style eq 'prv')) {
+ my $dir=$source;
+ $dir=~s-/[^/]*$--;
+ my $file=$source;
+ $file=(split('/',$file))[-1];
+ $source=&Apache::lonnet::hreflocation($dir,$file);
+ $allmeta=&Apache::lonnet::ssi_body($source,('grade_target' => 'meta'));
+ &metaeval($allmeta);
+ }
+ return $allmeta;
+}
+
#########################################
#########################################
@@ -920,7 +949,8 @@ sub publish {
# -------------------------------------------- Initial step done, now metadata.
# --------------------------------------- Storage for metadata keys and fields.
-
+# these are globals
+#
%metadatafields=();
%metadatakeys=();
@@ -945,6 +975,10 @@ sub publish {
$ENV{'user.domain'};
$metadatafields{'authorspace'}=$cuname.'@'.$cudom;
+# ----------------------------------------------------------- Parse file itself
+# read %metadatafields from file itself
+
+ $allmeta=&parseformeta($source,$style);
# ------------------------------------------------ Check out directory hierachy
my $thisdisfn=$source;
@@ -955,9 +989,11 @@ sub publish {
my $currentpath='/home/'.$cuname.'/';
+ my $prefix='../'x($#urlparts);
foreach (@urlparts) {
$currentpath.=$_.'/';
- $scrout.=&metaread($logfile,$currentpath.'default.meta');
+ $scrout.=&metaread($logfile,$currentpath.'default.meta',$prefix);
+ $prefix=~s|^\.\./||;
}
# ------------------- Clear out parameters and stores (there should not be any)
@@ -979,20 +1015,12 @@ sub publish {
delete $metadatafields{$_};
}
}
-
- }
+# ------------------------------------------ See if anything new in file itself
+
+ $allmeta=&parseformeta($source,$style);
+ }
-# -------------------------------------------------- Parse content for metadata
- if (($style eq 'ssi') || ($style eq 'prv')) {
- my $dir=$source;
- $dir=~s-/[^/]*$--;
- my $file=$source;
- $file=(split('/',$file))[-1];
- $source=&Apache::lonnet::hreflocation($dir,$file);
- $allmeta=&Apache::lonnet::ssi_body($source,('grade_target' => 'meta'));
-
- &metaeval($allmeta);
- }
+
# ---------------- Find and document discrepancies in the parameters and stores
my $chparms='';
@@ -1023,7 +1051,9 @@ sub publish {
}
if ($chparms) {
$scrout.=''.&mt('Obsolete parameters or stored values').': '.
- $chparms.'
';
+ $chparms.'
'.&mt('Warning!').
+ '
'.
+ &mt('If this resource is in active use, student performance data from the previous version may become inaccessible.').'
';
}
# ------------------------------------------------------- Now have all metadata
@@ -1542,15 +1572,13 @@ sub batchpublish {
$thisdistarget=~s/^\Q$docroot\E//;
- undef %metadatafields;
- undef %metadatakeys;
- %metadatafields=();
- %metadatakeys=();
- $srcfile=~/\.(\w+)$/;
- my $thistype=$1;
+ %metadatafields=();
+ %metadatakeys=();
+ $srcfile=~/\.(\w+)$/;
+ my $thistype=$1;
- my $thisembstyle=&Apache::loncommon::fileembstyle($thistype);
+ my $thisembstyle=&Apache::loncommon::fileembstyle($thistype);
$r->print(''.&mt('Publishing').' '.$thisdisfn.'
');
@@ -1577,53 +1605,53 @@ sub publishdirectory {
$fn=~s/\/+/\//g;
$thisdisfn=~s/\/+/\//g;
my $resdir=
- $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$cudom.'/'.$cuname.'/'.
- $thisdisfn;
- $r->print('Directory '.$thisdisfn.'
'.
- 'Target: '.$resdir.'
');
-
- my $dirptr=16384; # Mask indicating a directory in stat.cmode.
-
- opendir(DIR,$fn);
- my @files=sort(readdir(DIR));
- foreach my $filename (@files) {
- my ($cdev,$cino,$cmode,$cnlink,
+ $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$cudom.'/'.$cuname.'/'.
+ $thisdisfn;
+ $r->print('Directory '.$thisdisfn.'
'.
+ 'Target: '.$resdir.'
');
+
+ my $dirptr=16384; # Mask indicating a directory in stat.cmode.
+
+ opendir(DIR,$fn);
+ my @files=sort(readdir(DIR));
+ foreach my $filename (@files) {
+ my ($cdev,$cino,$cmode,$cnlink,
$cuid,$cgid,$crdev,$csize,
$catime,$cmtime,$cctime,
$cblksize,$cblocks)=stat($fn.'/'.$filename);
- my $extension='';
- if ($filename=~/\.(\w+)$/) { $extension=$1; }
- if ($cmode&$dirptr) {
- if (($filename!~/^\./) && ($ENV{'form.pubrec'})) {
- &publishdirectory($r,$fn.'/'.$filename,$thisdisfn.'/'.$filename);
- }
- } elsif ((&Apache::loncommon::fileembstyle($extension) ne 'hdn') &&
- ($filename!~/^[\#\.]/) && ($filename!~/\~$/)) {
+ my $extension='';
+ if ($filename=~/\.(\w+)$/) { $extension=$1; }
+ if ($cmode&$dirptr) {
+ if (($filename!~/^\./) && ($ENV{'form.pubrec'})) {
+ &publishdirectory($r,$fn.'/'.$filename,$thisdisfn.'/'.$filename);
+ }
+ } elsif ((&Apache::loncommon::fileembstyle($extension) ne 'hdn') &&
+ ($filename!~/^[\#\.]/) && ($filename!~/\~$/)) {
# find out publication status and/or exiting metadata
- my $publishthis=0;
- if (-e $resdir.'/'.$filename) {
+ my $publishthis=0;
+ if (-e $resdir.'/'.$filename) {
my ($rdev,$rino,$rmode,$rnlink,
- $ruid,$rgid,$rrdev,$rsize,
- $ratime,$rmtime,$rctime,
- $rblksize,$rblocks)=stat($resdir.'/'.$filename);
+ $ruid,$rgid,$rrdev,$rsize,
+ $ratime,$rmtime,$rctime,
+ $rblksize,$rblocks)=stat($resdir.'/'.$filename);
if (($rmtime<$cmtime) || ($ENV{'form.forcerepub'})) {
# previously published, modified now
$publishthis=1;
}
- } else {
+ } else {
# never published
- $publishthis=1;
- }
- if ($publishthis) {
+ $publishthis=1;
+ }
+ if ($publishthis) {
&batchpublish($r,$fn.'/'.$filename,$resdir.'/'.$filename);
- } else {
- $r->print('
Skipping '.$filename.'
');
- }
- $r->rflush();
- }
- }
- closedir(DIR);
+ } else {
+ $r->print('
Skipping '.$filename.'
');
+ }
+ $r->rflush();
+ }
+ }
+ closedir(DIR);
}
#########################################
@@ -1666,13 +1694,13 @@ Publishing from $thisfn to $thistarget w
#########################################
#########################################
sub handler {
- my $r=shift;
+ my $r=shift;
- if ($r->header_only) {
- &Apache::loncommon::content_type($r,'text/html');
- $r->send_http_header;
- return OK;
- }
+ if ($r->header_only) {
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+ return OK;
+ }
# Get query string for limited number of parameters
@@ -1681,156 +1709,156 @@ sub handler {
# -------------------------------------------------------------- Check filename
- my $fn=&Apache::lonnet::unescape($ENV{'form.filename'});
+ my $fn=&Apache::lonnet::unescape($ENV{'form.filename'});
- unless ($fn) {
- $r->log_reason($cuname.' at '.$cudom.
- ' trying to publish empty filename', $r->filename);
- return HTTP_NOT_FOUND;
- }
-
- ($cuname,$cudom)=
- &Apache::loncacc::constructaccess($fn,$r->dir_config('lonDefDomain'));
- unless (($cuname) && ($cudom)) {
- $r->log_reason($cuname.' at '.$cudom.
- ' trying to publish file '.$ENV{'form.filename'}.
- ' ('.$fn.') - not authorized',
- $r->filename);
- return HTTP_NOT_ACCEPTABLE;
- }
-
- unless (&Apache::lonnet::homeserver($cuname,$cudom)
- eq $r->dir_config('lonHostID')) {
- $r->log_reason($cuname.' at '.$cudom.
- ' trying to publish file '.$ENV{'form.filename'}.
- ' ('.$fn.') - not homeserver ('.
- &Apache::lonnet::homeserver($cuname,$cudom).')',
- $r->filename);
- return HTTP_NOT_ACCEPTABLE;
- }
-
- $fn=~s/^http\:\/\/[^\/]+//;
- $fn=~s/^\/\~(\w+)/\/home\/$1\/public_html/;
-
- my $targetdir='';
- $docroot=$r->dir_config('lonDocRoot');
- if ($1 ne $cuname) {
- $r->log_reason($cuname.' at '.$cudom.
- ' trying to publish unowned file '.$ENV{'form.filename'}.
- ' ('.$fn.')',
- $r->filename);
- return HTTP_NOT_ACCEPTABLE;
- } else {
- $targetdir=$docroot.'/res/'.$cudom;
- }
+ unless ($fn) {
+ $r->log_reason($cuname.' at '.$cudom.
+ ' trying to publish empty filename', $r->filename);
+ return HTTP_NOT_FOUND;
+ }
+
+ ($cuname,$cudom)=
+ &Apache::loncacc::constructaccess($fn,$r->dir_config('lonDefDomain'));
+ unless (($cuname) && ($cudom)) {
+ $r->log_reason($cuname.' at '.$cudom.
+ ' trying to publish file '.$ENV{'form.filename'}.
+ ' ('.$fn.') - not authorized',
+ $r->filename);
+ return HTTP_NOT_ACCEPTABLE;
+ }
+
+ unless (&Apache::lonnet::homeserver($cuname,$cudom)
+ eq $r->dir_config('lonHostID')) {
+ $r->log_reason($cuname.' at '.$cudom.
+ ' trying to publish file '.$ENV{'form.filename'}.
+ ' ('.$fn.') - not homeserver ('.
+ &Apache::lonnet::homeserver($cuname,$cudom).')',
+ $r->filename);
+ return HTTP_NOT_ACCEPTABLE;
+ }
+
+ $fn=~s/^http\:\/\/[^\/]+//;
+ $fn=~s/^\/\~(\w+)/\/home\/$1\/public_html/;
+
+ my $targetdir='';
+ $docroot=$r->dir_config('lonDocRoot');
+ if ($1 ne $cuname) {
+ $r->log_reason($cuname.' at '.$cudom.
+ ' trying to publish unowned file '.
+ $ENV{'form.filename'}.' ('.$fn.')',
+ $r->filename);
+ return HTTP_NOT_ACCEPTABLE;
+ } else {
+ $targetdir=$docroot.'/res/'.$cudom;
+ }
- unless (-e $fn) {
- $r->log_reason($cuname.' at '.$cudom.
- ' trying to publish non-existing file '.$ENV{'form.filename'}.
- ' ('.$fn.')',
- $r->filename);
- return HTTP_NOT_FOUND;
- }
+ unless (-e $fn) {
+ $r->log_reason($cuname.' at '.$cudom.
+ ' trying to publish non-existing file '.
+ $ENV{'form.filename'}.' ('.$fn.')',
+ $r->filename);
+ return HTTP_NOT_FOUND;
+ }
-unless ($ENV{'form.phase'} eq 'two') {
+ unless ($ENV{'form.phase'} eq 'two') {
# -------------------------------- File is there and owned, init lookup tables.
- %addid=();
+ %addid=();
+
+ {
+ my $fh=Apache::File->new($r->dir_config('lonTabDir').'/addid.tab');
+ while (<$fh>=~/(\w+)\s+(\w+)/) {
+ $addid{$1}=$2;
+ }
+ }
- {
- my $fh=Apache::File->new($r->dir_config('lonTabDir').'/addid.tab');
- while (<$fh>=~/(\w+)\s+(\w+)/) {
- $addid{$1}=$2;
- }
- }
-
- %nokey=();
-
- {
- my $fh=Apache::File->new($r->dir_config('lonIncludes').'/un_keyword.tab');
- while (<$fh>) {
- my $word=$_;
- chomp($word);
- $nokey{$word}=1;
- }
- }
+ %nokey=();
-}
+ {
+ my $fh=Apache::File->new($r->dir_config('lonIncludes').'/un_keyword.tab');
+ while (<$fh>) {
+ my $word=$_;
+ chomp($word);
+ $nokey{$word}=1;
+ }
+ }
+
+ }
# ---------------------------------------------------------- Start page output.
- &Apache::loncommon::content_type($r,'text/html');
- $r->send_http_header;
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
- $r->print('LON-CAPA Publishing');
- $r->print(&Apache::loncommon::bodytag('Resource Publication'));
+ $r->print('LON-CAPA Publishing');
+ $r->print(&Apache::loncommon::bodytag('Resource Publication'));
- my $thisfn=$fn;
+ my $thisfn=$fn;
- my $thistarget=$thisfn;
+ my $thistarget=$thisfn;
- $thistarget=~s/^\/home/$targetdir/;
- $thistarget=~s/\/public\_html//;
+ $thistarget=~s/^\/home/$targetdir/;
+ $thistarget=~s/\/public\_html//;
- my $thisdistarget=$thistarget;
- $thisdistarget=~s/^\Q$docroot\E//;
+ my $thisdistarget=$thistarget;
+ $thisdistarget=~s/^\Q$docroot\E//;
- my $thisdisfn=$thisfn;
- $thisdisfn=~s/^\/home\/\Q$cuname\E\/public_html\///;
+ my $thisdisfn=$thisfn;
+ $thisdisfn=~s/^\/home\/\Q$cuname\E\/public_html\///;
- if ($fn=~/\/$/) {
+ if ($fn=~/\/$/) {
# -------------------------------------------------------- This is a directory
- &publishdirectory($r,$fn,$thisdisfn);
- $r->print('
'.&mt('Done').'
'.&mt('Return to Directory').'');
+ &publishdirectory($r,$fn,$thisdisfn);
+ $r->print('
'.&mt('Done').'
'.&mt('Return to Directory').'');
- } else {
+ } else {
# ---------------------- Evaluate individual file, and then output information.
- $thisfn=~/\.(\w+)$/;
- my $thistype=$1;
- my $thisembstyle=&Apache::loncommon::fileembstyle($thistype);
- $r->print(''.&mt('Publishing').' '.
- &Apache::loncommon::filedescription($thistype).' ');
+ $thisfn=~/\.(\w+)$/;
+ my $thistype=$1;
+ my $thisembstyle=&Apache::loncommon::fileembstyle($thistype);
+ $r->print(''.&mt('Publishing').' '.
+ &Apache::loncommon::filedescription($thistype).' ');
- $r->print(<print(<
$thisdisfn
ENDCAPTION
- $r->print(
- '
'.&mt('Target').': '.$thisdistarget.'
');
+ $r->print('
'.&mt('Target').': '.
+ $thisdistarget.'
');
- if (($cuname ne $ENV{'user.name'}) || ($cudom ne $ENV{'user.domain'})) {
- $r->print(''.&mt('Co-Author').': '.$cuname.&mt(' at ').$cudom.
- '
');
- }
+ if (($cuname ne $ENV{'user.name'})||($cudom ne $ENV{'user.domain'})) {
+ $r->print(''.&mt('Co-Author').': '.
+ $cuname.&mt(' at ').$cudom.'
');
+ }
- if (&Apache::loncommon::fileembstyle($thistype) eq 'ssi') {
- $r->print(<print(<
ENDDIFF
- $r->print(&mt('Diffs with Current Version').'
');
- }
+ $r->print(&mt('Diffs with Current Version').'
');
+ }
# ------------------ Publishing from $thisfn to $thistarget with $thisembstyle.
- unless ($ENV{'form.phase'} eq 'two') {
- my ($outstring,$error)=&publish($thisfn,$thistarget,$thisembstyle);
- $r->print('
'.$outstring);
- } else {
- $r->print('
');
- &phasetwo($r,$thisfn,$thistarget,$thisembstyle,$thisdistarget);
- }
- }
- $r->print('');
+ unless ($ENV{'form.phase'} eq 'two') {
+ my ($outstring,$error)=&publish($thisfn,$thistarget,$thisembstyle);
+ $r->print('
'.$outstring);
+ } else {
+ $r->print('
');
+ &phasetwo($r,$thisfn,$thistarget,$thisembstyle,$thisdistarget);
+ }
+ }
+ $r->print('