--- loncom/interface/lonrss.pm 2005/11/18 19:32:05 1.4
+++ loncom/interface/lonrss.pm 2006/05/11 15:27:49 1.20
@@ -1,7 +1,7 @@
# The LearningOnline Network
# RSS Feeder
#
-# $Id: lonrss.pm,v 1.4 2005/11/18 19:32:05 albertel Exp $
+# $Id: lonrss.pm,v 1.20 2006/05/11 15:27:49 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,10 +36,13 @@ use Apache::lontexconvert;
use Apache::lonlocal;
use Apache::lonhtmlcommon;
+
sub filterfeedname {
my $filename=shift;
- $filename=~s/\.rss$//;
+ $filename=~s/(\_rss\.html|\.rss)$//;
$filename=~s/\W//g;
+ $filename=~s/\_rssfeed$//;
+ $filename=~s/^nohist\_//;
return $filename;
}
@@ -51,8 +54,8 @@ 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}; }
+ my %stored=&Apache::lonnet::get('nohist_all_rss_feeds',[$filterfilename,'feed_display_option_'.$filterfilename],$udom,$uname);
+ if ($stored{$filterfilename}) { return ($stored{$filterfilename},$stored{'feed_display_option_'.$filterfilename}); }
# no, construct a name
my $name=$filterfilename;
if ($name=~/^CourseBlog/) {
@@ -63,25 +66,44 @@ sub displayfeedname {
} else {
$name=~s/\_/ /g;
}
- return $name;
+ return ($name,$stored{'feed_display_option_'.$filterfilename});
}
-sub renamefeed {
+sub namefeed {
my ($rawname,$uname,$udom,$newname)=@_;
return &Apache::lonnet::put('nohist_all_rss_feeds',
{ &filterfeedname($rawname) => $newname },
$udom,$uname);
}
+sub changefeeddisplay {
+ my ($rawname,$uname,$udom,$newstatus)=@_;
+ return &Apache::lonnet::put('nohist_all_rss_feeds',
+ { 'feed_display_option_'.&filterfeedname($rawname) => $newstatus },
+ $udom,$uname);
+}
+
sub advertisefeeds {
- my ($uname,$udom)=@_;
+ my ($uname,$udom,$edit)=@_;
my $feeds='';
my %feednames=&Apache::lonnet::dump('nohist_all_rss_feeds',$udom,$uname);
+ my $mode='public';
+ if ($edit) {
+ $mode='adm';
+ }
foreach my $feed (sort(keys(%feednames))) {
- if ($feed!~/^error\:/) {
- my $url='feed://'.$ENV{'HTTP_HOST'}.'/public/'.$udom.'/'.$uname.'/'.$feed.'.rss';
- $feeds.='
'.
- $feednames{$feed}.' '.$url.' ';
+ if (($feed!~/^error\:/) && ($feed!~/^feed\_display\_option\_/)) {
+ my $feedurl='http://'.$ENV{'HTTP_HOST'}.'/public/'.$udom.'/'.$uname.'/'.$feed.'.rss';
+ my $htmlurl='http://'.$ENV{'HTTP_HOST'}.'/'.$mode.'/'.$udom.'/'.$uname.'/'.$feed.'_rss.html';
+ if ($feednames{'feed_display_option_'.$feed} eq 'hidden') {
+ if ($edit) {
+ $feeds.=''.$feednames{$feed}.' '.&mt('Hidden').': '.$htmlurl.' ';
+ }
+ } else {
+ $feeds.=''.$feednames{$feed}.
+ ' '.($edit?&mt('Edit'):'HTML').': '.$htmlurl.' '.
+ ' RSS: '.$feedurl.' ';
+ }
}
}
if ($feeds) {
@@ -91,17 +113,29 @@ sub advertisefeeds {
}
}
+sub rss_link {
+ my ($url) = @_;
+ return qq| |;
+}
+
{
my $feedcounter;
- sub addentry {
+ sub get_new_feed_id {
$feedcounter++;
- my $id=time.'00000'.$$.'00000'.$feedcounter;
- return &editentry($id,@_);
+ return time().'00000'.$$.'00000'.$feedcounter;
}
}
+sub addentry {
+ my $id=&get_new_feed_id();
+ return &editentry($id,@_);
+}
+
sub editentry {
- my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enclength,$enctype)=@_;
+ my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enctype)=@_;
+ if ($status eq 'deleted') {
+ return &changestatus($id,$uname,$udom,$filename,$status);
+ }
my $feedname=&feedname($filename);
&Apache::lonnet::put('nohist_all_rss_feeds',
{ &filterfeedname($filename) => &displayfeedname($filename,$uname,$udom) },
@@ -111,7 +145,6 @@ sub editentry {
$id.'_description' => $description,
$id.'_link' => $url,
$id.'_enclosureurl' => $encurl,
- $id.'_enclosurelength' => $enclength,
$id.'_enclosuretype' => $enctype,
$id.'_status' => $status},$udom,$uname);
}
@@ -124,7 +157,6 @@ sub changestatus {
$id.'_description',
$id.'_link',
$id.'_enclosureurl',
- $id.'_enclosurelength',
$id.'_enclosuretype',
$id.'_status'],$udom,$uname);
} else {
@@ -132,24 +164,96 @@ sub changestatus {
}
}
+sub changed_js {
+ return <
+ function changed(tform,id) {
+ tform.elements[id+"_modified"].checked=true;
+ }
+
+ENDSCRIPT
+}
+
+sub determine_enclosure_types {
+ my ($url)=@_;
+ my ($ending)=($url=~/\.(\w+)$/);
+ return &Apache::loncommon::filemimetype($ending);
+}
+
sub handler {
- my $r = shift;
- &Apache::loncommon::content_type($r,'application/rss+xml');
+ my ($r) = @_;
+
+ my $edit=0;
+ my $html=0;
+ my (undef,$mode,$udom,$uname,$filename)=split(/\//,$r->uri);
+ if (($mode eq 'adm') && ($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) {
+ $edit=1;
+ $html=1;
+ }
+ if ($filename=~/\.html$/) {
+ $html=1;
+ }
+ if ($html) {
+ &Apache::loncommon::content_type($r,'text/html');
+ } else {
+# Workaround Mozilla/Firefox
+# &Apache::loncommon::content_type($r,'application/rss+xml');
+ &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".
- "\n http://".$ENV{'HTTP_HOST'}.'/'.
- "\n".&mt('An RSS Feed provided by the LON-CAPA Learning Content Management System').' ');
+ my ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
+ if ($html) {
+ $r->print(&Apache::loncommon::start_page(($displayfeedname?$displayfeedname:&mt("Available RSS Feeds and Blogs")),undef,
+ {'domain' => $udom,
+ 'force_register' =>
+ $env{'form.register'}}).
+ &changed_js());
+ } else { # render RSS
+ $r->print("\n".
+ "\n http://".$ENV{'HTTP_HOST'}.'/public/'.$udom.'/'.$uname.'/'.
+ $filterfeedname.'_rss.html'.
+ "\n".
+ &mt('An RSS Feed provided by the LON-CAPA Learning Content Management System').
+ ' ');
+ }
+# Do we have stuff to store?
+ my $newid = &get_new_feed_id();
# Is this user for real?
- my $homeserver=&Apache::lonnet::homeserver($uname,$udom);
+ my $homeserver=&Apache::lonnet::homeserver($uname,$udom);
+ if ($html) {
+# Any new feeds or renaming of feeds?
+ if ($edit) {
+# Hide a feed?
+ if ($env{'form.hidethisblog'}) {
+ &changefeeddisplay($feedname,$uname,$udom,'hidden');
+ ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
+ }
+# Advertise a feed?
+ if ($env{'form.advertisethisblog'}) {
+ &changefeeddisplay($feedname,$uname,$udom,'public');
+ ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
+ }
+# New feed?
+ if ($env{'form.namenewblog'}=~/\w/) {
+ &namefeed($env{'form.namenewblog'},$uname,$udom,$env{'form.namenewblog'});
+ }
+# Old feed that is being renamed?
+ if (($displayfeedname) && ($env{'form.newblogname'}=~/\w/)) {
+ if ($env{'form.newblogname'} ne $displayfeedname) {
+ &namefeed($feedname,$uname,$udom,$env{'form.newblogname'});
+ ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
+ }
+ }
+ }
+ $r->print(&advertisefeeds($uname,$udom,$edit));
+ }
if ($homeserver eq 'no_host') {
- $r->print(''.&mt('No feed available').' ');
- } else {
+ $r->print(($html?'':'').&mt('No feed available').($html?' ':''));
+ } else { # is indeed a user
# Course or user?
my $name='';
if ($uname=~/^\d/) {
@@ -158,33 +262,122 @@ sub handler {
} 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;
+# Add a new feed
+ if (($html) && ($edit)) {
+ $r->print('');
}
+ if ($displayfeedname) { # this is an existing feed
+# Anything to store?
+ if ($edit) {
+ my %newsfeed=&Apache::lonnet::dump($feedname,$udom,$uname);
+ foreach my $entry (sort(keys(%newsfeed)),$env{'form.newid'}.'_status') {
+ if ($entry=~/^(\d+)\_status$/) {
+ my $id=$1;
+ if ($env{'form.'.$id.'_modified'}) {
+ &editentry($id,$uname,$udom,$feedname,
+ $env{'form.'.$id.'_title'},
+ $env{'form.'.$id.'_description'},
+ $env{'form.'.$id.'_url'},
+ $env{'form.'.$id.'_status'});
+ }
+ }
+ }
+ } #done storing
+
+ $r->print("\n".
+ ($html?'':'').
+ &mt('LON-CAPA Feed "[_1]" for [_2]',$displayfeedname,$name).
+ ($displayoption eq 'hidden'?' ('.&mt('Hidden').')':'').
+ ($html?' '.($edit?' \n");
+ } # was a real display feedname
+ $r->print(($html?''.&Apache::loncommon::end_page():' '."\n"));
+ } # a real user
return OK;
-}
-
+} # end handler
1;
__END__
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.