--- loncom/publisher/lonpublisher.pm 2003/03/14 15:29:46 1.116 +++ loncom/publisher/lonpublisher.pm 2003/09/16 22:00:25 1.133 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Publication Handler # -# $Id: lonpublisher.pm,v 1.116 2003/03/14 15:29:46 albertel Exp $ +# $Id: lonpublisher.pm,v 1.133 2003/09/16 22:00:25 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -82,6 +82,26 @@ invocation by F: ErrorDocument 500 /adm/errorhandler +=head1 OVERVIEW + +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 +entries on a hierarchical per-directory base: The wizard imports the +metadata (including access privileges and royalty information) from +the most recent published resource in the current directory, and if +that is not available, from the next directory above, etc. The Network +keeps all previous versions of a resource and makes them available by +an explicit version number, which is inserted between the file name +and extension, for example C, while the most recent +version does not carry a version number (C). Servers +subscribing to a changed resource are notified that a new version is +available. + =head1 DESCRIPTION B takes the proper steps to add resources to the LON-CAPA @@ -190,7 +210,7 @@ sub metaeval { } if ($metadatafields{$unikey}) { my $newentry=$parser->get_text('/'.$entry); - unless (($metadatafields{$unikey}=~/$newentry/) || + unless (($metadatafields{$unikey}=~/\Q$newentry\E/) || ($newentry eq '')) { $metadatafields{$unikey}.=', '.$newentry; } @@ -242,7 +262,7 @@ sub metaread { my ($logfile,$fn)=@_; unless (-e $fn) { print($logfile 'No file '.$fn."\n"); - return '
No file: '.$fn.''; + return '
No file: '.$fn.''; } print($logfile 'Processing '.$fn."\n"); my $metastring; @@ -251,7 +271,7 @@ sub metaread { $metastring=join('',<$metafh>); } &metaeval($metastring); - return '
Processed file: '.$fn.''; + return '
Processed file: '.$fn.''; } ######################################### @@ -304,7 +324,9 @@ string which presents the form field (fo ######################################### sub textfield { my ($title,$name,$value)=@_; - return "\n

$title:
". + my $uctitle=uc($title); + return "\n

$uctitle:". + "


". ''; } @@ -316,8 +338,9 @@ sub hiddenfield { sub selectbox { my ($title,$name,$value,$functionref,@idlist)=@_; my $uctitle=uc($title); + $value=(split(/\s*,\s*/,$value))[-1]; my $selout="\n

$uctitle:". - "
".''; foreach (@idlist) { $selout.='

New parameters or stored values: '.$chparms; + $scrout.='

New parameters or stored values: '.$chparms.'

'; } $chparms=''; @@ -984,7 +1012,7 @@ sub publish { } if ($chparms) { $scrout.='

Obsolete parameters or stored values: '. - $chparms; + $chparms.'

'; } # ------------------------------------------------------- Now have all metadata @@ -1042,24 +1070,26 @@ function uncheckAll(field) { field[i].checked = false ; } -

Keywords: $keywords_help - - +

KEYWORDS: + $keywords_help + + +


-END - $keywordout.=''; +END + $keywordout.='
'; my $colcount=0; foreach (sort keys %keywords) { - $keywordout.=''; if ($colcount>10) { $keywordout.="\n"; $colcount=0; @@ -1076,15 +1106,22 @@ END $scrout.=&textfield('Notes','notes',$metadatafields{'notes'}); $scrout.= - '

Abstract:
'; + "\n

ABSTRACT:". + "


". + '

'; $source=~/\.(\w+)$/; $scrout.=&hiddenfield('mime',$1); + my $defaultlanguage=$metadatafields{'language'}; + $defaultlanguage =~ s/\s*notset\s*//g; + $defaultlanguage =~ s/^,\s*//g; + $defaultlanguage =~ s/,\s*$//g; + $scrout.=&selectbox('Language','language', - $metadatafields{'language'}, + $defaultlanguage, \&Apache::loncommon::languagedescription, (&Apache::loncommon::languageids), ); @@ -1102,18 +1139,21 @@ END $metadatafields{'owner'}); # -------------------------------------------------- Correct copyright for rat. + my $defaultoption=$metadatafields{'copyright'}; + unless ($defaultoption) { $defaultoption='default'; } unless ($style eq 'prv') { if ($style eq 'rat') { if ($metadatafields{'copyright'} eq 'public') { delete $metadatafields{'copyright'}; + $defaultoption='default'; } $scrout.=&selectbox('Copyright/Distribution','copyright', - $metadatafields{'copyright'}, + $defaultoption, \&Apache::loncommon::copyrightdescription, (grep !/^public$/,(&Apache::loncommon::copyrightids))); } else { $scrout.=&selectbox('Copyright/Distribution','copyright', - $metadatafields{'copyright'}, + $defaultoption, \&Apache::loncommon::copyrightdescription, (&Apache::loncommon::copyrightids)); } @@ -1140,7 +1180,7 @@ END $ENV{'form.keywords'}=''; foreach (keys %keywords) { if ($metadatafields{'keywords'}) { - if ($metadatafields{'keywords'}=~/$_/) { + if ($metadatafields{'keywords'}=~/\Q$_\E/) { $ENV{'form.keywords'}.=$_.','; } } elsif (&Apache::loncommon::keyword($_)) { @@ -1216,7 +1256,7 @@ sub phasetwo { return 0; } print $logfile - "\n================= Publish ".localtime()." Phase Two ================\n"; + "\n================= Publish ".localtime()." Phase Two ================\n".$ENV{'user.name'}.'@'.$ENV{'user.domain'}."\n"; %metadatafields=(); %metadatakeys=(); @@ -1274,7 +1314,7 @@ sub phasetwo { .''; } } - $r->print('

Wrote Metadata'); + $r->print('

Wrote Metadata

'); print $logfile "\nWrote metadata"; } @@ -1285,14 +1325,14 @@ sub phasetwo { unless ($metadatafields{'copyright'} eq 'priv') { my ($error,$success) = &store_metadata(\%metadatafields); if ($success) { - $r->print('

Synchronized SQL metadata database'); + $r->print('

Synchronized SQL metadata database

'); print $logfile "\nSynchronized SQL metadata database"; } else { $r->print($error); print $logfile "\n".$error; } } else { - $r->print('

Private Publication - did not synchronize database'); + $r->print('

Private Publication - did not synchronize database

'); print $logfile "\nPrivate: Did not synchronize data into ". "SQL metadata database"; } @@ -1315,21 +1355,21 @@ sub phasetwo { unlink($srcd.'/'.$filename); unlink($srcd.'/'.$filename.'.meta'); } else { - if ($filename=~/$srcf\.(\d+)\.$srct$/) { + if ($filename=~/\Q$srcf\E\.(\d+)\.\Q$srct\E$/) { $maxversion=($1>$maxversion)?$1:$maxversion; } } } closedir(DIR); $maxversion++; - $r->print('

Creating old version '.$maxversion); - print $logfile "\nCreating old version ".$maxversion; + $r->print('

Creating old version '.$maxversion.'

'); + print $logfile "\nCreating old version ".$maxversion."\n"; my $copyfile=$srcd.'/'.$srcf.'.'.$maxversion.'.'.$srct; if (copy($target,$copyfile)) { print $logfile "Copied old target to ".$copyfile."\n"; - $r->print('

Copied old target file'); + $r->print('

Copied old target file

'); } else { print $logfile "Unable to write ".$copyfile.':'.$!."\n"; return "Failed to copy old target, $!, FAIL"; @@ -1341,7 +1381,7 @@ sub phasetwo { if (copy($target.'.meta',$copyfile)) { print $logfile "Copied old target metadata to ".$copyfile."\n"; - $r->print('

Copied old metadata') + $r->print('

Copied old metadata

') } else { print $logfile "Unable to write metadata ".$copyfile.':'.$!."\n"; if (-e $target.'.meta') { @@ -1352,7 +1392,7 @@ sub phasetwo { } else { - $r->print('

Initial version'); + $r->print('

Initial version

'); print $logfile "\nInitial version"; } @@ -1367,14 +1407,14 @@ sub phasetwo { $path.="/$parts[$count]"; if ((-e $path)!=1) { print $logfile "\nCreating directory ".$path; - $r->print('

Created directory '.$parts[$count]); + $r->print('

Created directory '.$parts[$count].'

'); mkdir($path,0777); } } if (copy($source,$copyfile)) { print $logfile "\nCopied original source to ".$copyfile."\n"; - $r->print('

Copied source file'); + $r->print('

Copied source file

'); } else { print $logfile "\nUnable to write ".$copyfile.':'.$!."\n"; return "Failed to copy source, $!, FAIL"; @@ -1386,7 +1426,7 @@ sub phasetwo { if (copy($source.'.meta',$copyfile)) { print $logfile "\nCopied original metadata to ".$copyfile."\n"; - $r->print('

Copied metadata'); + $r->print('

Copied metadata

'); } else { print $logfile "\nUnable to write metadata ".$copyfile.':'.$!."\n"; return @@ -1400,7 +1440,7 @@ sub phasetwo { $r->print('

Notifying host '.$subhost.':');$r->rflush; print $logfile "\nNotifying host ".$subhost.':'; my $reply=&Apache::lonnet::critical('update:'.$target,$subhost); - $r->print($reply.'
');$r->rflush; + $r->print($reply.'


');$r->rflush; print $logfile $reply; } @@ -1412,7 +1452,7 @@ sub phasetwo { print $logfile "\nNotifying host for metadata only ".$subhost.':'; my $reply=&Apache::lonnet::critical('update:'.$target.'.meta', $subhost); - $r->print($reply.'
');$r->rflush; + $r->print($reply.'


');$r->rflush; print $logfile $reply; } @@ -1425,13 +1465,13 @@ sub phasetwo { my ($cdom,$cname)=split(/\_/,$_); my $reply=&Apache::lonnet::cput ('versionupdate',{$target => $now},$cdom,$cname); - $r->print($reply.'
');$r->rflush; + $r->print($reply.'


');$r->rflush; print $logfile $reply; } # ------------------------------------------------ Provide link to new resource unless ($batch) { my $thisdistarget=$target; - $thisdistarget=~s/^$docroot//; + $thisdistarget=~s/^\Q$docroot\E//; my $thissrc=$source; $thissrc=~s/^\/home\/(\w+)\/public_html/\/priv\/$1/; @@ -1441,11 +1481,11 @@ sub phasetwo { $r->print( - '
'. + '
'. 'View Published Version'. - '

Back to Source'. + '

Back to Source

'. '

Back to Source Directory'); + '">Back to Source Directory

'); } } @@ -1453,6 +1493,8 @@ sub phasetwo { sub batchpublish { my ($r,$srcfile,$targetfile)=@_; + #publication pollutes %ENV with form.* values + my %oldENV=%ENV; $srcfile=~s/\/+/\//g; $targetfile=~s/\/+/\//g; my $thisdisfn=$srcfile; @@ -1461,7 +1503,7 @@ sub batchpublish { my $docroot=$r->dir_config('lonDocRoot'); my $thisdistarget=$targetfile; - $thisdistarget=~s/^$docroot//; + $thisdistarget=~s/^\Q$docroot\E//; undef %metadatafields; @@ -1488,6 +1530,7 @@ sub batchpublish { &phasetwo($r,$srcfile,$targetfile,$thisembstyle,$thisdistarget,1); $r->print('

'); } + %ENV=%oldENV; return ''; } @@ -1528,7 +1571,7 @@ sub publishdirectory { $ruid,$rgid,$rrdev,$rsize, $ratime,$rmtime,$rctime, $rblksize,$rblocks)=stat($resdir.'/'.$filename); - if ($rmtime<$cmtime) { + if (($rmtime<$cmtime) || ($ENV{'form.forcerepub'})) { # previously published, modified now $publishthis=1; } @@ -1698,25 +1741,33 @@ unless ($ENV{'form.phase'} eq 'two') { $thistarget=~s/\/public\_html//; my $thisdistarget=$thistarget; - $thisdistarget=~s/^$docroot//; + $thisdistarget=~s/^\Q$docroot\E//; my $thisdisfn=$thisfn; - $thisdisfn=~s/^\/home\/$cuname\/public_html\///; + $thisdisfn=~s/^\/home\/\Q$cuname\E\/public_html\///; if ($fn=~/\/$/) { # -------------------------------------------------------- This is a directory &publishdirectory($r,$fn,$thisdisfn); + $r->print('
Done
Return to Directory'); + } else { # ---------------------- Evaluate individual file, and then output information. $thisfn=~/\.(\w+)$/; my $thistype=$1; my $thisembstyle=&Apache::loncommon::fileembstyle($thistype); - $r->print('

Publishing '. - &Apache::loncommon::filedescription($thistype).' '. - ''.$thisdisfn. - '

Target: '.$thisdistarget.'

'); + &Apache::loncommon::filedescription($thistype).' '); + + $r->print(< +$thisdisfn +ENDCAPTION + $r->print( + 'Target: '.$thisdistarget.'
'); if (($cuname ne $ENV{'user.name'}) || ($cudom ne $ENV{'user.domain'})) { $r->print('

Co-Author: '.$cuname.' at '.$cudom. @@ -1724,9 +1775,10 @@ unless ($ENV{'form.phase'} eq 'two') { } if (&Apache::loncommon::fileembstyle($thistype) eq 'ssi') { - $r->print('
Diffs with Current Version

'); + $r->print(< +Diffs with Current Version
+ENDDIFF } # ------------------ Publishing from $thisfn to $thistarget with $thisembstyle. @@ -1751,5 +1803,7 @@ __END__ =back +=back + =cut

'; + $keywordout.=' />'.$_.'