# The LearningOnline Network # RSS Feeder # # $Id: lonrss.pm,v 1.2 2005/11/18 13:35:30 www Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # package Apache::lonrss; use strict; use Apache::Constants qw(:common); use Apache::loncommon; use Apache::lonnet; use Apache::lontexconvert; use Apache::lonlocal; use Apache::lonhtmlcommon; my $feedcounter=0; sub filterfeedname { my $filename=shift; $filename=~s/\.rss$//; $filename=~s/\W//g; return $filename; } sub feedname { return 'nohist_'.&filterfeedname(shift).'_rssfeed'; } sub displayfeedname { my ($rawname,$uname,$udom)=@_; my $filterfilename=&filterfeedname($rawname); # do we have a stored name? my %stored=&Apache::lonnet::get('nohist_all_rss_feeds',[$filterfilename],$udom,$uname); if ($stored{$filterfilename}) { return $stored{$filterfilename}; } # no, construct a name my $name=$filterfilename; if ($name=~/^CourseBlog/) { $name=&mt('Course Blog'); if ($env{'course.'.$env{'request.course.id'}.'.description'}) { $name.=' '.$env{'course.'.$env{'request.course.id'}.'.description'}; } } else { $name=~s/\_/ /g; } return $name; } sub renamefeed { my ($rawname,$uname,$udom,$newname)=@_; return &Apache::lonnet::put('nohist_all_rss_feeds', { &filterfeedname($rawname) => $newname }, $udom,$uname); } sub advertisefeeds { my ($uname,$udom)=@_; my $feeds=''; my %feednames=&Apache::lonnet::dump('nohist_all_rss_feeds',$udom,$uname); foreach (sort keys %feednames) { if ($_!~/^error\:/) { my $url='feed://'.$ENV{'HTTP_HOST'}.'/public/'.$udom.'/'.$uname.'/'.$_.'.rss'; $feeds.='
  • '. $feednames{$_}.'
    '.$url.'
  • '; } } if ($feeds) { return '

    '.&mt('Available RSS Feeds and Blogs').'

    '; } else { return ''; } } sub addentry { $feedcounter++; my $id=time.'00000'.$$.'00000'.$feedcounter; return &editentry($id,@_); } sub editentry { my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enclength,$enctype)=@_; my $feedname=&feedname($filename); &Apache::lonnet::put('nohist_all_rss_feeds', { &filterfeedname($filename) => &displayfeedname($filename,$uname,$udom) }, $udom,$uname); return &Apache::lonnet::put($feedname,{ $id.'_title' => $title, $id.'_description' => $description, $id.'_link' => $url, $id.'_enclosureurl' => $encurl, $id.'_enclosurelength' => $enclength, $id.'_enclosuretype' => $enctype, $id.'_status' => $status},$udom,$uname); } sub changestatus { my ($id,$uname,$udom,$filename,$status)=@_; my $feedname=&feedname($filename); if ($status eq 'deleted') { return &Apache::lonnet::del($feedname,[$id.'_title', $id.'_description', $id.'_link', $id.'_enclosureurl', $id.'_enclosurelength', $id.'_enclosuretype', $id.'_status'],$udom,$uname); } else { return &Apache::lonnet::put($feedname,{$id.'_status' => $status},$udom,$uname); } } sub handler { my $r = shift; &Apache::loncommon::content_type($r,'text/xml'); $r->send_http_header; return OK if $r->header_only; my (undef,undef,$udom,$uname,$filename)=split(/\//,$r->uri); my $filterfeedname=&filterfeedname($filename); my $feedname=&feedname($filename); my $displayfeedname=&displayfeedname($filename,$uname,$udom); $r->print("\n". "\nhttp://".$ENV{'HTTP_HOST'}.'/'. "\n".&mt('An RSS Feed provided by the LON-CAPA Learning Content Management System').''); # Is this user for real? my $homeserver=&Apache::lonnet::homeserver($uname,$udom); if ($homeserver eq 'no_host') { $r->print(''.&mt('No feed available').''); } else { # Course or user? my $name=''; if ($uname=~/^\d/) { my %cenv=&Apache::lonnet::dump('environment',$udom,$uname); $name=$cenv{'description'}; } else { $name=&Apache::loncommon::nickname($uname,$udom); } $r->print("\n".&mt('LON-CAPA RSS Feed "[_1]" for [_2]',$displayfeedname,$name).''); # Render private items? my $viewpubliconly=1; if (($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) { $viewpubliconly=0; } # Get feed items my %newsfeed=&Apache::lonnet::dump($feedname,$udom,$uname); foreach (sort keys %newsfeed) { if ($_=~/^(\d+)\_status$/) { my $id=$1; if (($newsfeed{$id.'_status'} ne 'public') && ($viewpubliconly)) { next; } if ($newsfeed{$id.'_status'} eq 'hidden') { next; } $r->print("\n\n".$newsfeed{$id.'_title'}."\n". $newsfeed{$id.'_description'}."\n". $newsfeed{$id.'_link'}."\n"); if ($newsfeed{$id.'_enclosureurl'}) { $r->print("\n"); } $r->print("\n".$id.$filterfeedname.'_'.$udom.'_'.$uname."\n"); } } } $r->print("\n\n"); return OK; } 1; __END__