From: dbs Date: Sat, 5 Jul 2008 17:59:06 +0000 (+0000) Subject: Backport RSS feed fixes from trunk (c9950) X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=cf2da2cde92d70c77c7b40fffc9d3ce639ab1214;p=Evergreen.git Backport RSS feed fixes from trunk (c9950) git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_1_2@9967 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- diff --git a/Open-ILS/src/extras/Makefile.install b/Open-ILS/src/extras/Makefile.install index 5c6dbcab61..a5122b42e0 100644 --- a/Open-ILS/src/extras/Makefile.install +++ b/Open-ILS/src/extras/Makefile.install @@ -97,6 +97,7 @@ DEBS = \ libclass-dbi-abstractsearch-perl\ libtemplate-perl\ libtext-aspell-perl\ + libdatetime-format-mail-perl\ libdatetime-timezone-perl\ libdatetime-perl\ libunix-syslog-perl\ diff --git a/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm b/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm index aee47e374e..86d25a33bb 100644 --- a/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm +++ b/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm @@ -408,7 +408,7 @@ sub unapi { $feed->root($root); $feed->creator($host); - $feed->update_ts(gmtime_ISO8601()); + $feed->update_ts(); $feed->link( unapi => $base) if ($flesh_feed); print "Content-type: ". $feed->type ."; charset=utf-8\n\n"; @@ -610,7 +610,9 @@ sub supercat { $feed->root($root); $feed->creator($host); - $feed->update_ts(gmtime_ISO8601()); + + $feed->update_ts(); + $feed->link( unapi => $base) if ($flesh_feed); print "Content-type: ". $feed->type ."; charset=utf-8\n\n"; @@ -679,7 +681,6 @@ sub bookbag_feed { return Apache2::Const::NOT_FOUND unless($bucket); my $bucket_tag = "tag:$host,$year:record_bucket/$id"; - $feed->id($bucket_tag); if ($type eq 'opac') { print "Location: $root/../../en-US/skin/default/xml/rresult.xml?rt=list&" . join('&', map { "rl=" . $_->target_biblio_record_entry } @{ $bucket->items }) . @@ -696,10 +697,11 @@ sub bookbag_feed { $flesh_feed ); $feed->root($root); + $feed->id($bucket_tag); $feed->title("Items in Book Bag [".$bucket->name."]"); $feed->creator($host); - $feed->update_ts(gmtime_ISO8601()); + $feed->update_ts(); $feed->link(alternate => $base . "/rss2-full/$id" => 'application/rss+xml'); $feed->link(atom => $base . "/atom-full/$id" => 'application/atom+xml'); @@ -708,7 +710,7 @@ sub bookbag_feed { $feed->link( OPAC => - '/opac/en-US/skin/default/xml/rresult.xml?rt=list&' . + $host . '/opac/en-US/skin/default/xml/rresult.xml?rt=list&' . join('&', map { 'rl=' . $_->target_biblio_record_entry } @{$bucket->items} ), 'text/html' ); @@ -768,7 +770,7 @@ sub changes_feed { } $feed->creator($host); - $feed->update_ts(gmtime_ISO8601()); + $feed->update_ts(); $feed->link(alternate => $base . "/rss2-full/$rtype/$axis/$limit/$date" => 'application/rss+xml'); $feed->link(atom => $base . "/atom-full/$rtype/$axis/$limit/$date" => 'application/atom+xml'); @@ -777,7 +779,7 @@ sub changes_feed { $feed->link( OPAC => - '/opac/en-US/skin/default/xml/rresult.xml?rt=list&' . + $host . '/opac/en-US/skin/default/xml/rresult.xml?rt=list&' . join('&', map { 'rl=' . $_} @$list ), 'text/html' ); @@ -993,14 +995,14 @@ sub opensearch_feed { my $recs = $search->request( 'open-ils.search.biblio.multiclass.query' => { - org_unit => $org_unit->[0]->id, + org_unit => $org_unit->[0]->id, offset => $offset, limit => $limit, sort => $sort, sort_dir => $sortdir, - ($lang ? ( 'language' => $lang ) : ()), + ($lang ? ( 'language' => $lang ) : ()), } => $terms => 1 - )->gather(1); + )->gather(1); $log->debug("Hits for [$terms]: $recs->{count}"); @@ -1020,10 +1022,10 @@ sub opensearch_feed { $feed->search($terms); $feed->class($class); - $feed->title("Search results for [$terms] at ".$org_unit->[0]->name); + $feed->title("Search results for [$terms] at ".$org_unit->[0]->name); $feed->creator($host); - $feed->update_ts(gmtime_ISO8601()); + $feed->update_ts(); $feed->_create_node( $feed->{item_xpath}, diff --git a/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm b/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm index ba9d3cc848..bce56dd350 100644 --- a/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm +++ b/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat/Feed.pm @@ -6,6 +6,9 @@ use XML::LibXML; use XML::LibXSLT; use OpenSRF::Utils::SettingsClient; use CGI; +use DateTime; +use DateTime::Format::Mail; + sub exists { my $class = shift; @@ -225,6 +228,7 @@ sub creator {}; package OpenILS::WWW::SuperCat::Feed::atom; use base 'OpenILS::WWW::SuperCat::Feed'; +use OpenSRF::Utils qw/:datetime/; sub new { my $class = shift; @@ -244,7 +248,8 @@ sub title { sub update_ts { my $self = shift; - my $text = shift; + # ATOM demands RFC-3339 compliant datetime formats + my $text = shift || gmtime_ISO8601(); $self->_create_node($self->{item_xpath},'http://www.w3.org/2005/Atom','updated', $text); } @@ -317,11 +322,15 @@ sub title { my $self = shift; my $text = shift; $self->_create_node('/rss/channel',undef,'title', $text); + # RSS2 demands a /channel/description element; just dupe title until we give + # users the ability to provide a description for their bookbags + $self->_create_node('/rss/channel',undef,'description', $text); } sub update_ts { my $self = shift; - my $text = shift; + # RSS2 demands RFC-822 compliant datetime formats + my $text = shift || DateTime::Format::Mail->format_datetime(DateTime->now()); $self->_create_node($self->{item_xpath},undef,'lastBuildDate', $text); } @@ -337,17 +346,27 @@ sub link { my $id = shift; my $mime = shift || "application/x-$type+xml"; - $type = 'self' if ($type eq 'rss2'); - - $self->_create_node( - $self->{item_xpath}, - undef, - 'link', - $id, - { rel => $type, - type => $mime, - } - ); + if ($type eq 'rss2' or $type eq 'alternate') { + # Just link to ourself using standard RSS2 link element + $self->_create_node( + $self->{item_xpath}, + undef, + 'link', + $id, + undef + ); + } else { + # Alternate link: use XHTML link element + $self->_create_node( + $self->{item_xpath}, + 'http://www.w3.org/1999/xhtml', + 'xhtml:link', + $id, + { rel => $type, + type => $mime, + } + ); + } } sub id { @@ -372,11 +391,33 @@ sub new { sub update_ts { my $self = shift; + # RSS2 demands RFC-822 compliant datetime formats my $text = shift; + if (!$text) { + # No date passed in, default to now + $text = DateTime::Format::Mail->format_datetime(DateTime->now()); + } elsif ($text =~ m/^\s*(\d{4})\.?\s*$/o) { + # Publication date is just a year, convert accordingly + my $year = DateTime->new(year=>$1); + $text = DateTime::Format::Mail->format_datetime($year); + } $self->_create_node($self->{item_xpath},undef,'pubDate', $text); } +sub id { + my $self = shift; + my $id = shift; + $self->_create_node( + $self->{item_xpath}, + undef, + 'guid', + $id, + { + isPermaLink=>"false" + } + ); +} #---------------------------------------------------------- diff --git a/Open-ILS/xsl/MARC21slim2ATOM.xsl b/Open-ILS/xsl/MARC21slim2ATOM.xsl index e706763b41..dd0c7e1497 100644 --- a/Open-ILS/xsl/MARC21slim2ATOM.xsl +++ b/Open-ILS/xsl/MARC21slim2ATOM.xsl @@ -24,6 +24,7 @@ + @@ -77,17 +78,23 @@ + - - - - - + + + + + + diff --git a/Open-ILS/xsl/MARC21slim2RSS2.xsl b/Open-ILS/xsl/MARC21slim2RSS2.xsl index 8461557f5a..bb8f852a00 100644 --- a/Open-ILS/xsl/MARC21slim2RSS2.xsl +++ b/Open-ILS/xsl/MARC21slim2RSS2.xsl @@ -78,6 +78,7 @@ + @@ -94,11 +95,12 @@ - - - - - + + + + + +