File:  [LON-CAPA] / loncom / interface / lonrss.pm
Revision 1.46: download - view: text, annotated - select for diffs
Thu Feb 26 16:17:29 2009 UTC (15 years, 3 months ago) by schafran
Branches: MAIN
CVS tags: HEAD
Box title is now the main title of the next page and the link text or the former page title will be set to the subtitle in the near future.
Group: consistent wording

    1: # The LearningOnline Network
    2: # RSS Feeder
    3: #
    4: # $Id: lonrss.pm,v 1.46 2009/02/26 16:17:29 schafran Exp $
    5: #
    6: # Copyright Michigan State University Board of Trustees
    7: #
    8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
    9: #
   10: # LON-CAPA is free software; you can redistribute it and/or modify
   11: # it under the terms of the GNU General Public License as published by
   12: # the Free Software Foundation; either version 2 of the License, or
   13: # (at your option) any later version.
   14: #
   15: # LON-CAPA is distributed in the hope that it will be useful,
   16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
   17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   18: # GNU General Public License for more details.
   19: #
   20: # You should have received a copy of the GNU General Public License
   21: # along with LON-CAPA; if not, write to the Free Software
   22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   23: #
   24: # /home/httpd/html/adm/gpl.txt
   25: #
   26: # http://www.lon-capa.org/
   27: #
   28: 
   29: package Apache::lonrss;
   30: 
   31: use strict;
   32: use LONCAPA;
   33: use Apache::Constants qw(:common);
   34: use Apache::loncommon;
   35: use Apache::lonnet;
   36: use Apache::lontexconvert;
   37: use Apache::lonlocal;
   38: use Apache::lonhtmlcommon;
   39: use Apache::inputtags();
   40: 
   41: sub filterfeedname {
   42:     my $filename=shift;
   43:     $filename=~s/(\_rss\.html|\.rss)$//;
   44:     $filename=~s/\W//g;
   45:     $filename=~s/\_rssfeed$//;
   46:     $filename=~s/^nohist\_//;
   47:     return $filename;
   48: }
   49: 
   50: sub feedname {
   51:     return 'nohist_'.&filterfeedname(shift).'_rssfeed';
   52: }
   53: 
   54: sub displayfeedname {
   55:     my ($rawname,$uname,$udom)=@_;
   56:     my $filterfilename=&filterfeedname($rawname);
   57: # do we have a stored name?
   58:     my %stored=&Apache::lonnet::get('nohist_all_rss_feeds',[$filterfilename,'feed_display_option_'.$filterfilename],$udom,$uname);
   59:     if ($stored{$filterfilename}) { return ($stored{$filterfilename},$stored{'feed_display_option_'.$filterfilename}); }
   60: # no, construct a name
   61:     my $name=$filterfilename; 
   62:     if ($name=~/^CourseBlog/) {
   63:         $name=&mt('Course Blog');
   64: 	if ($env{'course.'.$env{'request.course.id'}.'.description'}) {
   65: 	    $name.=' '.$env{'course.'.$env{'request.course.id'}.'.description'};
   66: 	}
   67:     } else {
   68: 	$name=~s/\_/ /g;
   69:     }
   70:     return ($name,$stored{'feed_display_option_'.$filterfilename});
   71: }
   72: 
   73: sub namefeed {
   74:     my ($rawname,$uname,$udom,$newname)=@_;
   75:     return &Apache::lonnet::put('nohist_all_rss_feeds',
   76: 				{ &filterfeedname($rawname) => $newname },
   77: 				$udom,$uname);
   78: }
   79: 
   80: sub changefeeddisplay {
   81:     my ($rawname,$uname,$udom,$newstatus)=@_;
   82:     return &Apache::lonnet::put('nohist_all_rss_feeds',
   83: 				{ 'feed_display_option_'.&filterfeedname($rawname) => $newstatus },
   84: 				$udom,$uname);
   85: }
   86: 
   87: sub advertisefeeds {
   88:     my ($uname,$udom,$edit)=@_;
   89:     my $feeds='';
   90:     my %feednames=&Apache::lonnet::dump('nohist_all_rss_feeds',$udom,$uname);
   91:     my $mode='public';
   92:     if ($edit) {
   93: 	$mode='adm';
   94:     }
   95:     my $server = &Apache::lonnet::absolute_url();
   96:     foreach my $feed (sort(keys(%feednames))) {
   97: 	next if ($feed =~/^\s*$/    ||
   98: 		 $feed =~ /^error:/ ||
   99: 		 $feed =~ /^feed_display_option_/);
  100: 
  101: 	my $feedurl= $server.'/public/'.$udom.'/'.$uname.'/'.$feed.'.rss';
  102: 	my $htmlurl= $server.'/'.$mode.'/'.$udom.'/'.$uname.'/'.$feed.'_rss.html';
  103: 	if ($feednames{'feed_display_option_'.$feed} eq 'hidden') {
  104: 	    if ($edit) {
  105: 		$feeds.='<li><i>'.$feednames{$feed}.'</i><br />'.&mt('Hidden').': <a href="'.$htmlurl.'"><tt>'.$htmlurl.'</tt></a></li>';
  106: 	    }
  107: 	} else {
  108: 	    $feeds.='<li><b>'.$feednames{$feed}.
  109: 		'</b><br />'.($edit?&mt('Edit'):'HTML').': <a href="'.$htmlurl.'"><tt>'.$feednames{$feed}.' HTML</tt></a>'.
  110: 		'<br />'.&mt('Public RSS/podcast (subscribe to)').': <a href="'.$feedurl.'"><tt>'.$feednames{$feed}.' RSS/Podcast</tt></a></li>';
  111: 	}
  112:     }
  113:     if ($feeds) {
  114: 	return '<h4>'.&mt('Available RSS Feeds and Blogs').'</h4><ul>'.$feeds.'</ul>';
  115:     } else {
  116:         return '';
  117:     }
  118: }
  119: 
  120: sub rss_link {
  121:     my ($uname,$udom)=@_;
  122:     my $result;
  123:     my $server = &Apache::lonnet::absolute_url();
  124:     my %feednames=&Apache::lonnet::dump('nohist_all_rss_feeds',$udom,$uname);
  125:     foreach my $feed (sort(keys(%feednames))) {
  126: 	next if ($feed =~/^\s*$/    ||
  127: 		 $feed =~ /^error:/ ||
  128: 		 $feed =~/^feed_display_option_/ );
  129: 	my $url= $server.'/public/'.$udom.'/'.$uname.'/'.$feed.'.rss';
  130: 	my $title = $feed;
  131: 	$title =~ s/_/ /g;
  132: 	$result.=qq|
  133: <link rel="alternate" type="application/rss+xml" title="$title" href="$url" />
  134: |;
  135:     }
  136:     return $result;
  137: }
  138: 
  139: {
  140:     my $feedcounter;
  141:     sub get_new_feed_id {
  142: 	$feedcounter++;
  143: 	return time().'00000'.$$.'00000'.$feedcounter;
  144:     }
  145: }
  146: 
  147: sub addentry {
  148:     my $id=&get_new_feed_id();
  149:     return &editentry($id,@_);
  150: }
  151: 
  152: sub editentry {
  153:     my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enctype)=@_;
  154:     if ($status eq 'deleted') {
  155: 	return &changestatus($id,$uname,$udom,$filename,$status);
  156:     }
  157:     my $feedname=&feedname($filename);
  158:     &Apache::lonnet::put('nohist_all_rss_feeds',
  159: 			 { &filterfeedname($filename) => 
  160: 			       (&displayfeedname($filename,$uname,$udom))[0] },
  161: 			 $udom,$uname);
  162:     return &Apache::lonnet::put($feedname,{
  163: 	$id.'_title' => $title,
  164: 	$id.'_description' => $description,
  165: 	$id.'_link' => $url,
  166: 	$id.'_enclosureurl' => $encurl,
  167: 	$id.'_enclosuretype' => $enctype,
  168: 	$id.'_status' => $status},$udom,$uname);
  169: }
  170: 
  171: sub changestatus {
  172:     my ($id,$uname,$udom,$filename,$status)=@_;
  173:     my $feedname=&feedname($filename);
  174:     if ($status eq 'deleted') {
  175: 	return &Apache::lonnet::del($feedname,[$id.'_title',
  176: 					       $id.'_description',
  177: 					       $id.'_link',
  178: 					       $id.'_enclosureurl',
  179: 					       $id.'_enclosuretype',
  180: 					       $id.'_status'],$udom,$uname);
  181:     } else {
  182: 	return &Apache::lonnet::put($feedname,{$id.'_status' => $status},$udom,$uname);
  183:     }
  184: }
  185: 
  186: sub changed_js {
  187:     return <<ENDSCRIPT;
  188: <script type="text/javascript">
  189:     function changed(tform,id) {
  190:         tform.elements[id+"_modified"].checked=true;
  191:     }
  192: </script>
  193: ENDSCRIPT
  194: }
  195: 
  196: sub determine_enclosure_types {
  197:     my ($url)=@_;
  198:     my ($ending)=($url=~/\.(\w+)$/);
  199:     return &Apache::loncommon::filemimetype($ending);
  200: }
  201: 
  202: sub course_blog_link {
  203:     my ($id,$title,$description,$url,$encurl,$enctype)=@_;
  204:     if ($env{'request.course.id'}) {
  205: 	return &add_blog_entry_link($id,
  206: 				    $env{'course.'.$env{'request.course.id'}.'.num'},
  207: 				    $env{'course.'.$env{'request.course.id'}.'.domain'},
  208: 				    'Course_Announcements',
  209: 				    $title,$description,$url,'public',$encurl,$enctype,
  210: 				    &mt('Add to Course Announcements'));
  211:     } else {
  212: 	return '';
  213:     }
  214: }
  215: 
  216: sub add_blog_entry_link {
  217:     my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enctype,$linktext)=@_;
  218:     return "<a href='/adm/$udom/$uname/".&filterfeedname($filename).'_rss.html?queryid='.
  219: 	&escape($id).
  220: 	'&amp;title='.&escape($title).
  221: 	'&amp;description='.&escape($description).
  222: 	'&amp;url='.&escape($url).
  223: 	'&amp;status='.&escape($status).
  224: 	'&amp;encurl='.&escape($encurl).
  225: 	'&amp;enctype='.&escape($enctype).
  226: 	"'>".$linktext.'</a>';
  227: 
  228: }
  229: 
  230: sub blocking_blogdisplay {
  231:     my ($uname,$udom,$html,$filterfeedname) = @_;
  232:     my $user = &Apache::loncommon::plainname($uname,$udom);
  233:     if ($html) {
  234:         $user = &Apache::loncommon::aboutmewrapper($user,$uname,$udom);
  235:     } else {
  236:         $user = $user.' ('.$uname.':'.$udom.')';
  237:     }
  238:     my %setters;
  239:     my ($blocked,$output,$blockcause);
  240:     my ($startblock,$endblock) =
  241:              &Apache::loncommon::blockcheck(\%setters,'blogs');
  242:     if ($startblock && $endblock) {
  243:         $blockcause = 'user';
  244:     } else { 
  245:         if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
  246:             ($startblock,$endblock) =
  247:                  &Apache::loncommon::blockcheck(\%setters,'blogs',
  248:                                                 $uname,$udom);
  249:             $blockcause = 'blogowner';
  250:         }
  251:     }
  252:     if ($startblock && $endblock) {
  253:         $blocked = 1;
  254:         my $showstart = &Apache::lonlocal::locallocaltime($startblock);
  255:         my $showend = &Apache::lonlocal::locallocaltime($endblock);
  256:         $output = &mt('Blogs belonging to [_1] are unavailable from [_2] to [_3].',$user,$showstart,$showend);
  257:         if ($html) {$output.='<br />';}
  258:         if ($blockcause eq 'user') {
  259:             $output .= &mt('This is because you are a student in one or more courses in which communication is being blocked.');
  260:             if ($html) {
  261:                 $output .= '<br />'.
  262:                        &Apache::loncommon::build_block_table($startblock,
  263:                                                         $endblock,\%setters);
  264:             }
  265:         } else {
  266:             $output .= &mt('This is because the blog owner is a student in one or more courses in which communication is being blocked.');
  267:         }
  268:         if (!$html) {
  269:             my $id = &get_new_feed_id();
  270:             $output = '<title/><item><title/><description>'.$output."</description><link/><guid isPermaLink='false'>".$id.$filterfeedname.'_'.$udom.'_'.$uname.'</guid></item>';
  271:         }
  272:     }
  273:     return ($blocked,$output);
  274: }
  275: 
  276: sub handler {
  277:     my ($r) = @_;
  278: 
  279:     my $edit=0;
  280:     my $html=0;
  281:     my (undef,$mode,$udom,$uname,$filename)=split(/\//,$r->uri);
  282:     if (($mode eq 'adm') && ($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) {
  283: 	$edit=1;
  284: 	$html=1;
  285:     }
  286:     if  (($mode eq 'adm') && (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
  287: 	$edit=1;
  288: 	$html=1;
  289:     }
  290:     if ($filename=~/\.html$/) {
  291: 	$html=1;
  292:     }
  293:     if ($html) {
  294: 	&Apache::loncommon::content_type($r,'text/html');
  295:     } else {
  296: # Workaround Mozilla/Firefox
  297: #	&Apache::loncommon::content_type($r,'application/rss+xml');
  298: 	&Apache::loncommon::content_type($r,'text/xml');
  299:     }
  300:     $r->send_http_header;
  301:     return OK if $r->header_only;
  302: 
  303:     my $filterfeedname=&filterfeedname($filename);
  304:     my $feedname=&feedname($filename);
  305:     my ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
  306:     my ($blocked,$blocktext,$disabled,$disabletext);
  307:     if (!&Apache::lonnet::is_course($udom,$uname)) {
  308:         ($blocked,$blocktext) = &blocking_blogdisplay($uname,$udom,$html,$filterfeedname);
  309:         if (&Apache::lonnet::usertools_access($uname,$udom,'blog')) {
  310:             $disabled = 0;
  311:         } else {
  312:             $disabled = 1;
  313:             if ($html) {
  314:                 $disabletext = '<h2>'.&mt('No user blog available') .'</h2>'.
  315:                                &mt('This is a result of one of the following:').'<ul>'.
  316:                                '<li>'.&mt('The administrator of this domain has disabled blog functionality for this specific user.').'</li>'.
  317:                                '<li>'.&mt('The domain has been configured to disable, by default, blog functionality for all users in the domain.').'</li>'.
  318:                                '</ul>';
  319:             } else {
  320:                 $disabletext = &mt('No user blog available');
  321:             }
  322:         }
  323:     }
  324:     if ($html) {
  325: #	my $title = $displayfeedname?$displayfeedname:"Available RSS Feeds and Blogs";
  326:         my $title = "My Space";
  327: 	my $rss_link = &Apache::lonrss::rss_link($uname,$udom);
  328: 	my $brcrumb = [{href=>$rss_link,text=>"Available RSS Feeds and Blogs"}];
  329: 	$r->print(&Apache::loncommon::start_page($title,$rss_link,
  330: 			 {'bread_crumbs'   => $brcrumb,
  331: 			  'domain'         => $udom,
  332: 			  'force_register' => $env{'form.register'}}).
  333: 		  &changed_js());
  334:     } else { # render RSS
  335:         my $server = &Apache::lonnet::absolute_url();
  336: 	$r->print("<rss version='2.0' xmlns:dc='http://purl.org/dc/elements/1.1'>\n<channel>".
  337: 		  "\n".'<link>'.$server.'/public/'.$udom.'/'.$uname.'/'.
  338: 		  $filterfeedname.'_rss.html</link>'.
  339: 		  "\n<description>".
  340: 		  &mt('An RSS Feed provided by the LON-CAPA Learning Content Management System').
  341: 		  '</description>');
  342:     }
  343: # This will be the entry id for new additions to the blog
  344:     my $newid = &get_new_feed_id();
  345: # Is this user for real?
  346:     my $homeserver=&Apache::lonnet::homeserver($uname,$udom);
  347:     if ($html && !$blocked && !$disabled) {
  348: # Any new feeds or renaming of feeds?
  349: 	if ($edit) {
  350: # Hide a feed?
  351: 	    if ($env{'form.hidethisblog'}) {
  352: 		&changefeeddisplay($feedname,$uname,$udom,'hidden');
  353: 		($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
  354: 	    }
  355: # Advertise a feed?
  356: 	    if ($env{'form.advertisethisblog'}) {
  357: 		&changefeeddisplay($feedname,$uname,$udom,'public');
  358: 		($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
  359: 	    }
  360: # New feed?
  361: 	    if ($env{'form.namenewblog'}=~/\w/) {
  362: 		&namefeed($env{'form.namenewblog'},$uname,$udom,$env{'form.namenewblog'});
  363: 	    }
  364: # Old feed that is being renamed?
  365: 	    if (($displayfeedname) && ($env{'form.newblogname'}=~/\w/)) {
  366: 		if ($env{'form.newblogname'} ne $displayfeedname) {
  367: 		    &namefeed($feedname,$uname,$udom,$env{'form.newblogname'});
  368: 		    ($displayfeedname,$displayoption)=&displayfeedname($filename,$uname,$udom);
  369: 		}
  370: 	    }
  371: 	}
  372: 	$r->print(&advertisefeeds($uname,$udom,$edit));
  373:     } 
  374:     if ($homeserver eq 'no_host') {
  375: 	$r->print(($html?'<h3>':'<title>').&mt('No feed available').($html?'</h3>':'</title>'));
  376:     } elsif ($blocked) {
  377:         $r->print($blocktext);
  378:         $r->print(($html?&Apache::loncommon::end_page():'</channel></rss>'."\n"));
  379:     } elsif ($disabled) {
  380:         $r->print($disabletext);
  381:         $r->print(($html?&Apache::loncommon::end_page():'</channel></rss>'."\n"));
  382:     } else { # is indeed a user
  383: # Course or user?
  384: 	my $name='';
  385: 	if (&Apache::lonnet::is_course($udom,$uname)) {
  386: 	    my %cenv=&Apache::lonnet::dump('environment',$udom,$uname);
  387: 	    $name=$cenv{'description'};
  388: 	} else {
  389: 	    $name=&Apache::loncommon::nickname($uname,$udom);
  390: 	}
  391: # Add a new feed
  392:         if (($html) && ($edit)) {
  393: 	    $r->print('<form method="post" name="makenewfeed">');
  394:             $r->print(&mt('Name').": <input type='text' size='40' name='namenewblog' />");
  395: 	    $r->print('<input type="submit" value="'.&mt('New Feed').'" />');
  396: 	    $r->print('</form>');
  397: 	}
  398:         if ($displayfeedname) { # this is an existing feed
  399: # Anything to store?
  400: 	    if ($edit) {
  401: # check if this was called with a query string
  402: 		&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['queryid']);
  403: 		if ($env{'form.queryid'}) {
  404: # yes, collect the remainder
  405: 		    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
  406: 							    ['title',
  407: 							     'description',
  408: 							     'url',
  409: 							     'status',
  410: 							     'enclosureurl',
  411: 							     'enclosuretype']);
  412: 
  413: #    my ($id,$uname,$udom,$filename,$title,$description,$url,$status,$encurl,$enctype)=@_;
  414: 
  415: 
  416: 		    &editentry($env{'form.queryid'},
  417: 			       $uname,$udom,$filename,
  418: 			       $env{'form.title'},
  419: 			       $env{'form.description'},
  420: 			       $env{'form.url'},
  421: 			       $env{'form.status'},
  422: 			       $env{'form.encurl'},
  423: 			       $env{'form.enctype'}
  424: 			       );
  425: 		}
  426: 
  427: # store away the fields modified in the online form
  428: 		my %newsfeed=&Apache::lonnet::dump($feedname,$udom,$uname);
  429: 		foreach my $entry (sort(keys(%newsfeed)),$env{'form.newid'}.'_status') {
  430: 		    if ($entry=~/^(\d+)\_status$/) {
  431: 			my $id=$1;
  432: 			if ($env{'form.'.$id.'_modified'}) {
  433: 			    &editentry($id,$uname,$udom,$feedname,
  434: 				       $env{'form.'.$id.'_title'},
  435: 				       $env{'form.'.$id.'_description'},
  436: 				       $env{'form.'.$id.'_link'},
  437: 				       $env{'form.'.$id.'_status'},
  438: 				       $env{'form.'.$id.'_enclosureurl'},
  439: 				       $env{'form.'.$id.'_enclosuretype'},
  440: 				       );
  441: 			}
  442: 		    }
  443: 		}
  444: 
  445: # see if we have any uploaded or portfolio files
  446:                 my @uploadeditems=();
  447: 
  448: 		if ($env{'form.HWFILE0_0'}) {
  449: # We have an uploaded file - store it away.
  450: 		    $uploadeditems[0]=&Apache::lonnet::userfileupload('HWFILE0_0',undef,'portfolio/podcasts');
  451: 		}
  452: 		if ($env{'form.HWPORT0_0'}) {
  453: # Selected portfolio files
  454: 		    foreach my $filename (split(/\,/,$env{'form.HWPORT0_0'})) {
  455: 			if ($filename) {
  456: # construct full path and remember
  457: 			    push(@uploadeditems,'/uploaded/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/portfolio'.$filename);
  458: 			}
  459: 		    }
  460: 		}
  461: # the zeroth item should be stored together with the last displayed (newid) field
  462: 		if ($uploadeditems[0]) {
  463: 		    my $id=$env{'form.newid'};
  464: 		    &editentry($id,$uname,$udom,$feedname,
  465: 			       $env{'form.'.$id.'_title'},
  466: 			       $env{'form.'.$id.'_description'},
  467: 			       $env{'form.'.$id.'_link'},
  468: 			       $env{'form.'.$id.'_status'},
  469: 			       $uploadeditems[0],
  470: 			       &Apache::loncommon::filemimetype(($uploadeditems[0]=~/\.(\w+)$/)[0]),
  471: 			       );
  472: 		    &Apache::lonnet::make_public_indefinitely($uploadeditems[0]);
  473: 		}
  474: # if there are more files, they need new entries, since each can only have one enclosure
  475: 		for (my $i=1; $i<=$#uploadeditems; $i++) {
  476: 		    my $id = &get_new_feed_id().$i;
  477: 		    &editentry($id,$uname,$udom,$feedname,
  478: 			       'New Entry',
  479: 			       '',
  480: 			       '',
  481: 			       'public',
  482: 			       $uploadeditems[$i],
  483: 			       &Apache::loncommon::filemimetype(($uploadeditems[$i]=~/\.(\w+)$/)[0]),
  484: 			       );
  485: 		    &Apache::lonnet::make_public_indefinitely($uploadeditems[$i]);
  486: 		}
  487: 	    } #done storing
  488: 
  489: # Render private items?
  490:             my $viewpubliconly=1;
  491: 	    $r->print("\n".
  492: 		      ($html?'<hr /><h3>':'<title>').
  493: 		      &mt('LON-CAPA Feed "[_1]" for [_2]',$displayfeedname,$name).
  494: 		      ($displayoption eq 'hidden'?' ('.&mt('Hidden').')':'').
  495: 		      ($html?'</h3>'.($edit?'<form method="post" name="lonhomework" enctype="multipart/form-data"><br />'.
  496: 				      &mt('Name of this Feed').
  497: 				      ': <input type="text" size="50" name="newblogname" value="'.
  498: 				      $displayfeedname.'" />':'').'<ul>':'</title>'));
  499: 	    if (($env{'user.name'} eq $uname) && ($env{'user.domain'} eq $udom)) {
  500: 		$viewpubliconly=0;
  501:             }
  502: # Get feed items
  503: 	    my %newsfeed=&Apache::lonnet::dump($feedname,$udom,$uname);
  504: 	    foreach my $entry (sort {$b cmp $a} (keys(%newsfeed)),$newid.'_status') {
  505: 		if ($entry=~/^(\d+)\_status$/) { # is an entry
  506: 		    my $id=$1;
  507: 		    if ($edit) {
  508: 			my %lt=&Apache::lonlocal::texthash('public' => 'public',
  509: 							   'private' => 'private',
  510: 							   'hidden' => 'hidden',
  511: 							   'delete' => 'delete',
  512: 							   'store' => 'Select',
  513: 							   'title' => 'Title',
  514: 							   'link' => 'Link',
  515: 							   'description' => 'Description',
  516:                                                            'enc' => 'Podcasted enclosure');
  517:                         my $uploadlink;
  518:                         if ($entry==$newid) {
  519: # Generate upload link only for last (new) entry
  520: 			    $uploadlink=&Apache::inputtags::file_selector(0,0,'*','both');
  521: 			} else {
  522: # Otherwise, display
  523:                             $uploadlink='<tt>'.$newsfeed{$id.'_enclosureurl'}.'</tt>'.
  524: 				"<input type='hidden' name='$id\_enclosureurl' value='$newsfeed{$id.'_enclosureurl'}' />".
  525: 				"<input type='hidden' name='$id\_enclosuretype' value='$newsfeed{$id.'_enclosuretype'}' />";
  526: 			}
  527: 			my %status=();
  528: 			unless ($newsfeed{$id.'_status'}) { $newsfeed{$id.'_status'}='public'; }
  529: 			$status{$newsfeed{$id.'_status'}}='checked="checked"';
  530: 			$r->print(<<ENDEDIT);
  531: <li>
  532: <label><input name='$id\_modified' type='checkbox' value="modified" /> $lt{'store'}</label>
  533: &nbsp;&nbsp;
  534: <label><input name='$id\_status' type="radio" value="public" $status{'public'} onClick="changed(this.form,'$id');" /> $lt{'public'}</label>
  535: &nbsp;&nbsp;
  536: <label><input name='$id\_status' type="radio" value="private" $status{'private'} onClick="changed(this.form,'$id');" /> $lt{'private'}</label>
  537: &nbsp;&nbsp;
  538: <label><input name='$id\_status' type="radio" value="hidden" $status{'hidden'} onClick="changed(this.form,'$id');" /> $lt{'hidden'}</label>
  539: &nbsp;&nbsp;
  540: <label><input name='$id\_status' type="radio" value="deleted" onClick="changed(this.form,'$id');" /> $lt{'delete'}</label>
  541: <br />
  542: $lt{'title'}:
  543: <input name='$id\_title' type='text' size='60' value='$newsfeed{$id.'_title'}' onChange="changed(this.form,'$id');" /><br />
  544: $lt{'description'}:<br />
  545: <textarea name='$id\_description' rows="6" cols="80" onChange="changed(this.form,'$id');">$newsfeed{$id.'_description'}</textarea><br />
  546: $lt{'link'}:
  547: <input name='$id\_link' type='text' size='60' value='$newsfeed{$id.'_link'}' onChange="changed(this.form,'$id');" /><br />
  548: $lt{'enc'} -
  549: $uploadlink
  550: <hr /></li>
  551: ENDEDIT
  552: 		    } else { # not in edit mode, just displaying
  553: 			if (($newsfeed{$id.'_status'} ne 'public') && ($viewpubliconly)) { next; }
  554: 			if ($newsfeed{$id.'_status'} eq 'hidden') { next; }
  555: 			my $link =  $newsfeed{$id.'_link'};
  556: 			if ($link =~ m|^/| ) {
  557: 			    $link = "http://".$ENV{'HTTP_HOST'}.$link;
  558: 			}
  559: 			$r->print("\n".($html?"\n<li><b>":"<item>\n<title>").$newsfeed{$id.'_title'}.
  560: 				  ($html?"</b><br />\n":"</title>\n<description>").
  561: 				  $newsfeed{$id.'_description'}.
  562: 				  ($html?"<br />":"</description>\n").
  563: 				  ($link?($html?"\n<a href='":"<link>").
  564: 				  $link.
  565: 				  ($html?("'>".&mt('Read more')."</a><br />\n"):"</link>\n"):''));
  566: 			my $enclosure=$newsfeed{$id.'_enclosureurl'};
  567: # Enclosure? Get stats
  568: 			if ($enclosure) {
  569: 			    my @stat=&Apache::lonnet::stat_file($enclosure);
  570: 			    if ($stat[7]) {
  571: # Has non-zero length (and exists)
  572: 				my $enclosuretype=$newsfeed{$id.'_enclosuretype'};
  573: 				if ($enclosure =~ m|^/| ) {
  574: 				    $enclosure = "http://".$ENV{'HTTP_HOST'}.$enclosure;
  575: 				}
  576: 				$r->print(($html?"<a href='":"\n<enclosure url='").
  577: 					  $enclosure."' length='".$stat[7].
  578: 					  "' type='".$enclosuretype.($html?"'>".&mt('Enclosure')."</a>":"' />"));
  579: 			    }
  580: 			}
  581: 			if ($html) { # is HTML
  582: 			    $r->print("\n<hr /></li>\n");
  583: 			} else { # is RSS
  584: 			    $r->print("\n<guid isPermaLink='false'>".$id.$filterfeedname.'_'.$udom.'_'.$uname."</guid></item>\n");
  585: 			}
  586: 		    } # end of "in edit mode"
  587: 		} # end of rendering a real entry
  588: 	    } # end of loop through all keys
  589: 	    if ($html) {
  590: 		$r->print('</ul>');
  591: 		if ($edit) {
  592: 		    $r->print('<input type="hidden" name="newid" value="'.$newid.'"/><input type="submit" value="'.&mt('Save Selected').'" />'.
  593: 			      ($displayoption eq 'hidden'?'<input type="submit" name="advertisethisblog" value="'.&mt('Advertise this Feed').'" />':
  594: 			       '<input type="submit" name="hidethisblog" value="'.&mt('Hide this Feed').'" />'));
  595: 		}
  596: 	    }
  597: 	} # was a real display feedname
  598: 	$r->print(($html?'</form>'.&Apache::loncommon::end_page():'</channel></rss>'."\n"));
  599:     } # a real user
  600:     return OK;
  601: } # end handler
  602: 1;
  603: __END__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>