--- loncom/publisher/lonpublisher.pm 2004/05/21 19:27:02 1.167
+++ loncom/publisher/lonpublisher.pm 2005/01/05 20:11:19 1.181
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Publication Handler
#
-# $Id: lonpublisher.pm,v 1.167 2004/05/21 19:27:02 albertel Exp $
+# $Id: lonpublisher.pm,v 1.181 2005/01/05 20:11:19 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -199,7 +199,8 @@ sub metaeval {
}
}
my $newentry=$parser->get_text('/'.$entry);
- if ($entry eq 'customdistributionfile') {
+ if (($entry eq 'customdistributionfile') ||
+ ($entry eq 'sourcerights')) {
$newentry=~s/^\s*//;
if ($newentry !~m|^/res|) { $newentry=$prefix.$newentry; }
}
@@ -328,6 +329,21 @@ sub textfield {
'';
}
+sub text_with_browse_field {
+ my ($title,$name,$value,$restriction)=@_;
+ $value=~s/^\s+//gs;
+ $value=~s/\s+$//gs;
+ $value=~s/\s+/ /gs;
+ $title=&mt($title);
+ $ENV{'form.'.$name}=$value;
+ return "\n
$title:".
+ "
".
+ ''.
+ 'Select '.
+ 'Search';
+
+}
+
sub hiddenfield {
my ($name,$value)=@_;
$ENV{'form.'.$name}=$value;
@@ -471,7 +487,8 @@ sub get_subscribed_hosts {
while ($filename=readdir(DIR)) {
if ($filename=~/\Q$srcf\E\.(\w+)$/) {
my $subhost=$1;
- if (($subhost ne 'meta' && $subhost ne 'subscription') &&
+ if (($subhost ne 'meta' && $subhost ne 'subscription' &&
+ $subhost ne 'tmp') &&
($subhost ne $Apache::lonnet::perlvar{'lonHostID'})) {
push(@subscribed,$subhost);
}
@@ -582,11 +599,11 @@ sub get_all_text_unbalanced {
} elsif ($token->[0] eq 'E') {
$result.=$token->[2];
}
- if ($result =~ /(.*)\Q$tag\E(.*)/s) {
+ if ($result =~ /\Q$tag\E/s) {
+ ($result,my $redo)=$result =~ /(.*)\Q$tag\E(.*)/is;
#&Apache::lonnet::logthis('Got a winner with leftovers ::'.$2);
#&Apache::lonnet::logthis('Result is :'.$1);
- $result=$1;
- my $redo=$tag.$2;
+ $redo=$tag.$redo;
push (@$pars,HTML::LCParser->new(\$redo));
$$pars[-1]->xml_mode('1');
last;
@@ -801,49 +818,21 @@ sub store_metadata {
&Apache::lonnet::logthis($error);
return ($error,undef);
}
+ my $dbh = &Apache::lonmysql::get_dbh();
if (($metadata{'obsolete'}) || ($metadata{'copyright'} eq 'priv') ||
($metadata{'copyright'} eq 'custom')) {
-# remove this entry
- $status=&Apache::lonmysql::remove_from_table
- ('metadata','url',$metadata{'url'});
+ # remove this entry
+ $status=&LONCAPA::lonmetadata::delete_metadata($dbh,undef,
+ $metadata{'url'});
} else {
-# store new data
-# adjust some values to metadatadatabase (e.g., "usage" is a reserved word)
- $metadata{'creationdate'}=
- &Apache::lonmysql::sqltime($metadata{'creationdate'});
- $metadata{'lastrevisiondate'}=
- &Apache::lonmysql::sqltime($metadata{'lastrevisiondate'});
- $metadata{'sequsage'}=$metadata{'usage'};
- $metadata{'sequsage_list'}=$metadata{'usage_list'};
- my %newmetadata=();
-# see if we have old entries
- my @oldmeta=&Apache::lonmysql::get_rows('metadata',
- "url LIKE BINARY '".
- $metadata{'url'}."'");
- if ($#oldmeta==0) {
-# yes, there is one old entry, transfer to newmetadata
- %newmetadata=&LONCAPA::lonmetadata::metadata_col_to_hash(@{$oldmeta[0]});
-# remove old entry
- $status=&Apache::lonmysql::remove_from_table
- ('metadata','url',$metadata{'url'});
- } elsif ($#oldmeta>0) {
-# more than one entry fit - how did that happen?
- $error='Error occured retrieving old values in '.
- 'metadata table in LON-CAPA database: '.$#oldmeta.
- ' matches';
- &Apache::lonnet::logthis($error);
- return ($error,undef);
- }
-# store new data on top of it
- foreach (keys %metadata) {
- $newmetadata{$_}=$metadata{$_};
- }
- $status = &Apache::lonmysql::store_row('metadata',\%newmetadata);
+ $status = &LONCAPA::lonmetadata::update_metadata($dbh,undef,
+ \%metadata);
}
- if (! defined($status)) {
+ if (defined($status) && $status ne '') {
$error='Error occured storing new values in '.
'metadata table in LON-CAPA database';
&Apache::lonnet::logthis($error);
+ &Apache::lonnet::logthis($status);
return ($error,undef);
}
return (undef,$status);
@@ -956,7 +945,7 @@ sub publish {
}
}
}
- $outstring=~s/\n*(\<\/[^\>]+\>)\s*$/$allowstr\n$1\n/s;
+ $outstring=~s/\n*(\<\/[^\>]+\>[^<]*)$/$allowstr\n$1\n/s;
# ------------------------------------------------------------- Write modified.
@@ -1102,8 +1091,13 @@ sub publish {
}
- foreach (split(/\W+/,$metadatafields{'keywords'})) {
- $keywords{$_}=1;
+ foreach my $addkey (split(/[\"\'\,\;]/,$metadatafields{'keywords'})) {
+ $addkey=~s/\s+/ /g;
+ $addkey=~s/^\s//;
+ $addkey=~s/\s$//;
+ if ($addkey=~/\w/) {
+ $keywords{$addkey}=1;
+ }
}
# --------------------------------------------------- Now we also have keywords
# =============================================================================
@@ -1153,7 +1147,7 @@ END
my $colcount=0;
foreach (sort keys %keywords) {
- $keywordout.=' | ';
+ $keywordout.=' />'.$_.'';
if ($colcount>10) {
$keywordout.="\n";
$colcount=0;
@@ -1228,11 +1222,20 @@ END
$intr_scrout.=&textfield('Publisher/Owner','owner',
$metadatafields{'owner'});
-# -------------------------------------------------- Correct copyright for rat.
+# ---------------------------------------------- Retrofix for unused copyright
+ if ($metadatafields{'copyright'} eq 'free') {
+ $metadatafields{'copyright'}='default';
+ $metadatafields{'sourceavail'}='open';
+ }
+# ------------------------------------------------ Dial in reasonable defaults
my $defaultoption=$metadatafields{'copyright'};
unless ($defaultoption) { $defaultoption='default'; }
+ my $defaultsourceoption=$metadatafields{'sourceavail'};
+ unless ($defaultsourceoption) { $defaultsourceoption='closed'; }
unless ($style eq 'prv') {
+# -------------------------------------------------- Correct copyright for rat.
if ($style eq 'rat') {
+# -------------------------------------- Retrofix for non-applicable copyright
if ($metadatafields{'copyright'} eq 'public') {
delete $metadatafields{'copyright'};
$defaultoption='default';
@@ -1241,33 +1244,35 @@ END
$defaultoption,
\&Apache::loncommon::copyrightdescription,
(grep !/^public$/,(&Apache::loncommon::copyrightids)));
- } else {
- $intr_scrout.=&selectbox('Copyright/Distribution','copyright',
- $defaultoption,
- \&Apache::loncommon::copyrightdescription,
- (&Apache::loncommon::copyrightids));
- }
-
- my $copyright_help =
- Apache::loncommon::help_open_topic('Publishing_Copyright');
- $intr_scrout =~ s/DISTRIBUTION:/'DISTRIBUTION: ' . $copyright_help/ge;
- $intr_scrout.=&textfield('Custom Distribution File','customdistributionfile',
- $metadatafields{'customdistributionfile'}).
- $copyright_help;
- my $uctitle=&mt('Obsolete');
- $intr_scrout.=
- "\n$uctitle:".
- '
'.
- &textfield('Suggested Replacement for Obsolete File',
- 'obsoletereplacement',
- $metadatafields{'obsoletereplacement'});
} else {
- $intr_scrout.=&hiddenfield('copyright','private');
+ $intr_scrout.=&selectbox('Copyright/Distribution','copyright',
+ $defaultoption,
+ \&Apache::loncommon::copyrightdescription,
+ (&Apache::loncommon::copyrightids));
+ }
+ my $copyright_help =
+ Apache::loncommon::help_open_topic('Publishing_Copyright');
+ $intr_scrout =~ s/DISTRIBUTION:/'DISTRIBUTION: ' . $copyright_help/ge;
+ $intr_scrout.=&text_with_browse_field('Custom Distribution File','customdistributionfile',$metadatafields{'customdistributionfile'},'rights').$copyright_help;
+ $intr_scrout.=&selectbox('Source Distribution','sourceavail',
+ $defaultsourceoption,
+ \&Apache::loncommon::source_copyrightdescription,
+ (&Apache::loncommon::source_copyrightids));
+ $intr_scrout.=&text_with_browse_field('Source Custom Distribution File','sourcerights',$metadatafields{'sourcerights'},'rights');
+ my $uctitle=&mt('Obsolete');
+ $intr_scrout.=
+ "\n$uctitle:".
+ '
'.
+ &text_with_browse_field('Suggested Replacement for Obsolete File',
+ 'obsoletereplacement',
+ $metadatafields{'obsoletereplacement'});
+ } else {
+ $intr_scrout.=&hiddenfield('copyright','private');
+ }
if (!$batch) {
$scrout.=$intr_scrout.'';
@@ -1357,6 +1362,7 @@ sub phasetwo {
$metadatafields{'highestgradelevel'}=$ENV{'form.highestgradelevel'};
$metadatafields{'customdistributionfile'}=
$ENV{'form.customdistributionfile'};
+ $metadatafields{'sourceavail'}=$ENV{'form.sourceavail'};
$metadatafields{'obsolete'}=$ENV{'form.obsolete'};
$metadatafields{'obsoletereplacement'}=
$ENV{'form.obsoletereplacement'};
@@ -1373,8 +1379,11 @@ sub phasetwo {
$allkeywords .= ','.$ENV{'form.keywords'};
}
}
- $allkeywords=~s/\W+/\,/;
- $allkeywords=~s/^\,//;
+ $allkeywords=~s/[\"\']//g;
+ $allkeywords=~s/\s*[\;\,]\s*/\,/g;
+ $allkeywords=~s/\s+/ /g;
+ $allkeywords=~s/^[ \,]//;
+ $allkeywords=~s/[ \,]$//;
$metadatafields{'keywords'}=$allkeywords;
# check if custom distribution file is specified
@@ -1532,42 +1541,12 @@ sub phasetwo {
"".&mt('Failed to write metadata copy').", $!, ".&mt('FAIL')."";
}
$r->rflush;
-# --------------------------------------------------- Send update notifications
- my @subscribed=&get_subscribed_hosts($target);
- foreach my $subhost (@subscribed) {
- $r->print(''.&mt('Notifying host').' '.$subhost.':');$r->rflush;
- print $logfile "\nNotifying host ".$subhost.':';
- my $reply=&Apache::lonnet::critical('update:'.$target,$subhost);
- $r->print($reply.'
');$r->rflush;
- print $logfile $reply;
- }
-
-# ---------------------------------------- Send update notifications, meta only
+# ------------------------------------------------------------- Trigger updates
+ $ENV{'internal.publication.target'}=$target;
+ $ENV{'internal.publication.source'}=$source;
+ $r->register_cleanup(\¬ify);
- my @subscribedmeta=&get_subscribed_hosts("$target.meta");
- foreach my $subhost (@subscribedmeta) {
- $r->print(''.
-&mt('Notifying host for metadata only').' '.$subhost.':');$r->rflush;
- print $logfile "\nNotifying host for metadata only ".$subhost.':';
- my $reply=&Apache::lonnet::critical('update:'.$target.'.meta',
- $subhost);
- $r->print($reply.'
');$r->rflush;
- print $logfile $reply;
- }
-
-# --------------------------------------------------- Notify subscribed courses
- my %courses=&coursedependencies($target);
- my $now=time;
- foreach (keys %courses) {
- $r->print(''.&mt('Notifying course').' '.$_.':');$r->rflush;
- print $logfile "\nNotifying host ".$_.':';
- my ($cdom,$cname)=split(/\_/,$_);
- my $reply=&Apache::lonnet::cput
- ('versionupdate',{$target => $now},$cdom,$cname);
- $r->print($reply.'
');$r->rflush;
- print $logfile $reply;
- }
# ------------------------------------------------ Provide link to new resource
unless ($batch) {
my $thisdistarget=$target;
@@ -1589,9 +1568,45 @@ sub phasetwo {
'">'.
&mt('Back to Source Directory').'');
}
+ $logfile->close();
return ''.&mt('Done').'
';
}
+# =============================================================== Notifications
+sub notify {
+# --------------------------------------------------- Send update notifications
+ my $target=$ENV{'internal.publication.target'};
+ my $source=$ENV{'internal.publication.source'};
+ my $logfile=Apache::File->new('>>'.$source.'.log');
+ print $logfile "\nCleanup phase: Notifications\n";
+ my @subscribed=&get_subscribed_hosts($target);
+ foreach my $subhost (@subscribed) {
+ print $logfile "\nNotifying host ".$subhost.':';
+ my $reply=&Apache::lonnet::critical('update:'.$target,$subhost);
+ print $logfile $reply;
+ }
+# ---------------------------------------- Send update notifications, meta only
+ my @subscribedmeta=&get_subscribed_hosts("$target.meta");
+ foreach my $subhost (@subscribedmeta) {
+ print $logfile "\nNotifying host for metadata only ".$subhost.':';
+ my $reply=&Apache::lonnet::critical('update:'.$target.'.meta',
+ $subhost);
+ print $logfile $reply;
+ }
+# --------------------------------------------------- Notify subscribed courses
+ my %courses=&coursedependencies($target);
+ my $now=time;
+ foreach (keys %courses) {
+ print $logfile "\nNotifying course ".$_.':';
+ my ($cdom,$cname)=split(/\_/,$_);
+ my $reply=&Apache::lonnet::cput
+ ('versionupdate',{$target => $now},$cdom,$cname);
+ print $logfile $reply;
+ }
+ print $logfile "\n============ Done ============\n";
+ $logfile->close();
+}
+
#########################################
sub batchpublish {
@@ -1894,8 +1909,11 @@ sub handler {
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
-
- $r->print('LON-CAPA Publishing');
+
+ my $js=&Apache::loncommon::browser_and_searcher_javascript();
+ $r->print('LON-CAPA Publishing
+ ');
$r->print(&Apache::loncommon::bodytag('Resource Publication'));