--- 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". - "\nhttp://".$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". + "\nhttp://".$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?'</h3>':'')); + } 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('
    '); + $r->print(&mt('Name for New Blog').": "); + $r->print(''); + $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?'</h3>'.($edit?'<form method="post"><br />'. + &mt('Name of blog/journal'). + ': <input type="text" size="50" name="newblogname" value="'. + $displayfeedname.'" />':'').'<ul>':'')); +# 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 my $entry (sort(keys(%newsfeed))) { - if ($entry=~/^(\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"."http://".$ENV{'HTTP_HOST'}. - $newsfeed{$id.'_link'}."\n"); - if ($newsfeed{$id.'_enclosureurl'}) { - $r->print("\n"); + my %newsfeed=&Apache::lonnet::dump($feedname,$udom,$uname); + foreach my $entry (sort(keys(%newsfeed)),$newid.'_status') { + if ($entry=~/^(\d+)\_status$/) { # is an entry + my $id=$1; + if ($edit) { + my %lt=&Apache::lonlocal::texthash('public' => 'public', + 'private' => 'private', + 'hidden' => 'hidden', + 'delete' => 'delete', + 'store' => 'Store changes', + 'title' => 'Title', + 'link' => 'Link', + 'description' => 'Description'); + my %status=(); + unless ($newsfeed{$id.'_status'}) { $newsfeed{$id.'_status'}='public'; } + $status{$newsfeed{$id.'_status'}}='checked="checked"'; + $r->print(< + +   + +   + +   + +   + +
    +$lt{'title'}: +
    +$lt{'description'}:
    +
    +$lt{'link'}: + +
    +ENDEDIT + } else { # not in edit mode, just displaying + if (($newsfeed{$id.'_status'} ne 'public') && ($viewpubliconly)) { next; } + if ($newsfeed{$id.'_status'} eq 'hidden') { next; } + $r->print("\n".($html?"\n
  • ":"\n").$newsfeed{$id.'_title'}. + ($html?"</b><br />\n":"\n"). + $newsfeed{$id.'_description'}. + ($html?"
    \n".&mt('Read more')."
    \n"):"\n")); +# Enclosure? Get stats + if ($newsfeed{$id.'_enclosureurl'}) { + my @stat=&Apache::lonnet::stat_file($newsfeed{$id.'_enclosureurl'}); + if ($stat[7]) { +# Has non-zero length (and exists) + my $enclosuretype=$newsfeed{$id.'_enclosetype'}; + $r->print(($html?"".&mt('Enclosure')."":"' />")); + } + } + if ($html) { # is HTML + $r->print("\n
  • \n"); + } else { # is RSS + $r->print("\n".$id.$filterfeedname.'_'.$udom.'_'.$uname."
    \n"); + } + } # end of "in edit mode" + } # end of rendering a real entry + } # end of loop through all keys + if ($html) { + $r->print(''); + if ($edit) { + $r->print(''. + ($displayoption eq 'hidden'?'': + '')); } - $r->print("\n".$id.$filterfeedname.'_'.$udom.'_'.$uname."\n"); } - } - } - $r->print("\n\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.