--- loncom/interface/lonfeedback.pm 2012/03/15 12:45:21 1.340 +++ loncom/interface/lonfeedback.pm 2012/03/16 18:32:47 1.347 @@ -1,7 +1,7 @@ # The LearningOnline Network # Feedback # -# $Id: lonfeedback.pm,v 1.340 2012/03/15 12:45:21 goltermann Exp $ +# $Id: lonfeedback.pm,v 1.347 2012/03/16 18:32:47 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -82,6 +82,26 @@ sub discussion_visible { return 1; } +sub discussion_vote_available { + my ($status,$symb)=@_; + my $canvote=&Apache::lonnet::EXT('resource.0.discussvote',$symb); + if ((lc($canvote) eq 'yes') || + ((lc($canvote) eq 'notended') && (&discussion_open($status,$symb)))) { + return 1; + } +} + +sub get_realsymb { + my ($symb) = @_; + my $realsymb = $symb; + if ($symb=~/^bulletin___/) { + my $filename=(&Apache::lonnet::decode_symb($symb))[2]; + $filename=~s{^adm/wrapper/}{}; + $realsymb=&Apache::lonnet::symbread($filename); + } + return $realsymb; +} + sub list_discussion { my ($mode,$status,$ressymb,$imsextras,$group)=@_; unless ($ressymb) { $ressymb=&Apache::lonnet::symbread(); } @@ -257,14 +277,15 @@ sub list_discussion { $visit ++; my $seeid; - if (($group ne '') && ($mode eq 'board') && - ($ressymb =~ m|^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$|)) { - if (&check_group_priv($group,'dgp') eq 'ok') { - $seeid = 1; - } - } else { - $seeid=&Apache::lonnet::allowed('rin',$crs); + if (&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) { + $seeid = 1; } + my $seehidden = &can_see_hidden($mode,$ressymb,undef,$group,$cdom,$cnum,$crs); + +# Is voting on discussions available + my $realsymb = &get_realsymb($ressymb); + my $canvote = &discussion_vote_available($status,$realsymb); + my @discussionitems=(); my %shown = (); my @posteridentity=(); @@ -286,7 +307,7 @@ sub list_discussion { $discinfo{$visitkey} = $visit; &Apache::lonnet::put('nohist_'.$cid.'_discuss',\%discinfo,$env{'user.domain'},$env{'user.name'}); - &build_posting_display(\%usernamesort,\%subjectsort,\%namesort,\%notshown,\%newitem,\%dischash,\%shown,\%alldiscussion,\%imsitems,\%imsfiles,\%roleinfo,\@discussionitems,\@replies,\@depth,\@posters,\$maxdepth,\$visible,\$newpostsflag,\$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$encsymb,$readkey,$showunmark,$showonlyunread,$totposters,\@rolefilter,\@sectionpick,\@grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,\%anonhash,$anoncnt,$group); + &build_posting_display(\%usernamesort,\%subjectsort,\%namesort,\%notshown,\%newitem,\%dischash,\%shown,\%alldiscussion,\%imsitems,\%imsfiles,\%roleinfo,\@discussionitems,\@replies,\@depth,\@posters,\$maxdepth,\$visible,\$newpostsflag,\$current,$status,$viewgrades,$seeid,$seehidden,$canvote,$prevread,$sortposts,$encsymb,$readkey,$showunmark,$showonlyunread,$totposters,\@rolefilter,\@sectionpick,\@grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,\%anonhash,$anoncnt,$group); my $discussion=''; my $manifestfile; @@ -442,7 +463,7 @@ imscp_v1p1.xsd http://www.imsglobal.org/ "\n".''; $discussion .= &action_links_bar($colspan,$ressymb,$visible, $newpostsflag,$group, - $prevread,$markondisp); + $prevread,$markondisp,$seehidden); my $escsymb=&escape($ressymb); my $numhidden = keys(%notshown); if ($numhidden > 0) { @@ -646,7 +667,7 @@ END END $discussion .= &action_links_bar($colspan,$ressymb,$visible, $newpostsflag,$group, - $prevread,$markondisp); + $prevread,$markondisp,$seehidden); $discussion .= "
\n"; } if ($outputtarget eq 'export') { @@ -744,9 +765,15 @@ END $discussion.= &send_feedback_link($ressymb); if ($env{'request.role.adv'}) { my $close = &Apache::lonnet::EXT('resource.0.discussend',$ressymb); + my $canvote = &Apache::lonnet::EXT('resource.0.discussvote',$ressymb); if (defined($close) && $close ne '' && $close < time) { - $discussion .= ' '.&mt('(Closed for [_1] roles)', - &Apache::lonnet::plaintext('st',$crstype)); + if ($canvote eq 'notended') { + $discussion .= ' '.&mt('(Posting and voting closed for [_1] roles)', + &Apache::lonnet::plaintext('st',$crstype)); + } else { + $discussion .= ' '.&mt('(Closed for [_1] roles)', + &Apache::lonnet::plaintext('st',$crstype)); + } } } } else { @@ -757,6 +784,38 @@ END return $discussion; } +sub can_see_hidden { + my ($mode,$ressymb,$feedurl,$group,$cdom,$cnum,$crs) = @_; + my $seehidden; + if ($env{'request.course.id'}) { + unless ($cdom ne '' && $cnum ne '') { + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + } + if ($crs eq '') { + $crs = '/'.$env{'request.course.id'}; + if ($env{'request.course.sec'}) { + $crs.='_'.$env{'request.course.sec'}; + } + $crs=~s{_}{/}g; + } + if ($mode eq '') { + $mode='board'; + if ($feedurl =~ /$LONCAPA::assess_re/) { + $mode='problem'; + } + } + if (($group ne '') && ($mode eq 'board') && + ($ressymb =~ m{^bulletin___\d+\Q___adm/wrapper/adm/$cdom/$cnum/\E\d+/bulletinboard$})) { + if (&check_group_priv($group,'dgp') eq 'ok') { + $seehidden = 1; + } + } else { + $seehidden=&Apache::lonnet::allowed('rin',$crs); + } + } + return $seehidden; +} sub discussion_link { my ($ressymb,$linktext,$cmd,$item,$flag,$prev,$adds,$title)=@_; @@ -797,7 +856,8 @@ sub send_message_link { } sub action_links_bar { - my ($colspan,$ressymb,$visible,$newpostsflag,$group,$prevread,$markondisp) = @_; + my ($colspan,$ressymb,$visible,$newpostsflag,$group,$prevread,$markondisp, + $seehidden) = @_; my $discussion = ''. ''. '
'; @@ -830,7 +890,7 @@ sub action_links_bar { } $discussion .= &group_args($group); $discussion .= '">'.&mt('Export').''; - if (&Apache::lonnet::allowed('rin',$env{'request.course.id'})) { + if ($seehidden) { $discussion .= '  '; $discussion .='['.$$anonhash{$key}.'] '. @@ -1165,14 +1252,14 @@ sub build_posting_display { if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) { $sender.=' '. &discussion_link($symb,&mt('Edit'),'editdisc',$idx,$$newpostsflag,$prevread,&group_args($group)); - unless ($seeid) { + unless ($seehidden) { my $grpargs = &group_args($group); $sender.=" '; } } } - if ($seeid) { + if ($seehidden) { if ($hiddens{$idx}) { unless ($studenthidden) { $sender.=' '. @@ -1275,14 +1362,15 @@ sub build_posting_display { } else { if ($message) { my $spansize = 2; + my ($uname,$udom); if ($showonlyunread && $prevread > $posttime) { $$notshown{$idx} = 1; } elsif ($showunmark && $$dischash{$readkey}=~/\.$idx\./) { $$notshown{$idx} = 1; } else { # apply filters - my $uname = $contrib{$idx.':sendername'}; - my $udom = $contrib{$idx.':senderdomain'}; + $uname = $contrib{$idx.':sendername'}; + $udom = $contrib{$idx.':senderdomain'}; my $poster = $uname.':'.$udom; if ($env{'form.totposters'} ne '') { if ($totposters == 0) { @@ -1343,46 +1431,61 @@ sub build_posting_display { if ($$dischash{$toggkey}) { $$discussionitems[$idx].='  '.$ctlink; } -# Figure out size based on likes my $thislikes=$likes{$symb.':'.$idx.':likes'}; my $likesize="100"; - if ($thislikes>$twoplus) { - $likesize="200"; - } elsif ($thislikes>$oneplus) { - $likesize="150"; - } - if ($thislikes<$twominus) { - $likesize="50"; - } elsif ($thislikes<$oneminus) { - $likesize="75"; + if ($seeid || $canvote) { +# Figure out size based on likes + my $thislikes=$likes{$symb.':'.$idx.':likes'}; + if ($thislikes>$twoplus) { + $likesize="200"; + } elsif ($thislikes>$oneplus) { + $likesize="150"; + } + if ($thislikes<$twominus) { + $likesize="50"; + } elsif ($thislikes<$oneminus) { + $likesize="75"; + } } # Actually glue in the message itself $$discussionitems[$idx].= '
'. "
". $message. '
'; + if ($canvote) { # Put in the like and unlike buttons - unless ($likes{$symb.':'.$idx.':likers'}=~/\,\Q$thisuser\E\,/) { - $$discussionitems[$idx].=' '.&discussion_link($symb,''.&mt('Like').'','like',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Like this posting")); - } else { - $$discussionitems[$idx].=''.&mt('You like this posting').''; - } - unless ($likes{$symb.':'.$idx.':unlikers'}=~/\,\Q$thisuser\E\,/) { - $$discussionitems[$idx].=' '.&discussion_link($symb,''.&mt('Unlike').'',,'unlike',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Unlike this posting")); - } else { - $$discussionitems[$idx].=''.&mt('You unlike this posting').''; + if (($uname eq $env{'user.name'}) && ($udom eq $env{'user.domain'})) { + my $novote = &mt('No voting for your own posts'); + $$discussionitems[$idx].= + '
'. + ''.$novote.' '. + ''.$novote.''; + } else { + if ($userlikes{$idx}) { + $$discussionitems[$idx].=''.&mt('You like this posting').''; + } else { + $$discussionitems[$idx].=' '.&discussion_link($symb,''.&mt('Like').'','like',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Like this posting")); + } + if ($userunlikes{$idx}) { + $$discussionitems[$idx].=''.&mt('You unlike this posting').''; + } else { + $$discussionitems[$idx].=' '.&discussion_link($symb,''.&mt('Unlike').'','unlike',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Unlike this posting")); + } + } } - my $thislikes=$likes{$symb.':'.$idx.':likes'}; - if ($thislikes>0) { - $$discussionitems[$idx].=' ('.&mt("[_1] likes",$thislikes).')'; - } elsif ($thislikes<0) { - $$discussionitems[$idx].=' ('.&mt("[_1] unlikes",abs($thislikes)).')'; + if ($seeid || $canvote) { + my $thislikes=$likes{$symb.':'.$idx.':likes'}; + if ($thislikes>0) { + $$discussionitems[$idx].=' ('.&mt("[_1] likes",$thislikes).')'; + } elsif ($thislikes<0) { + $$discussionitems[$idx].=' ('.&mt("[_1] unlikes",abs($thislikes)).')'; + } } # If there is any history to this post, inform the reader if ($contrib{$idx.':history'}) { my @postversions = (); $$discussionitems[$idx] .= '  '.&mt('This post has been edited by the author.'); - if ($seeid) { + if ($seehidden) { $$discussionitems[$idx] .= '  '. &discussion_link($symb,&mt('Display all versions'),'allversions',$idx,$$newpostsflag,$prevread,&group_args($group)); } @@ -1468,13 +1571,13 @@ sub filter_regexp { sub get_post_contents { - my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$numver) = @_; + my ($contrib,$idx,$seeid,$seehidden,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$showaboutme,$numver) = @_; my $discussion = ''; my $start=$numver; my $end=$numver + 1; %{$$imsfiles{$idx}}=(); if ($type eq 'allversions') { - unless($seeid) { + unless($seehidden) { $discussion=&mt('You do not have privileges to view all versions of posts.').' '.&mt('Please select a different role.'); return $discussion; } @@ -1486,13 +1589,20 @@ sub get_post_contents { $$contrib{$idx.':sendername'}, $$contrib{$idx.':senderdomain'}); $$screenname=$$contrib{$idx.':screenname'}; - - my $sender=&Apache::loncommon::aboutmewrapper( + $$showaboutme = &Apache::lonnet::usertools_access($$contrib{$idx.':sendername'}, + $$contrib{$idx.':senderdomain'}, + 'aboutme'); + my $sender = $$plainname; + if ($$showaboutme) { + $sender = &Apache::loncommon::aboutmewrapper( $$plainname, $$contrib{$idx.':sendername'}, - $$contrib{$idx.':senderdomain'}).' ('. - $$contrib{$idx.':sendername'}.':'. - $$contrib{$idx.':senderdomain'}.')'; + $$contrib{$idx.':senderdomain'}); + } + if ($seeid) { + $sender .= ' ('.$$contrib{$idx.':sendername'}.':'. + $$contrib{$idx.':senderdomain'}.')'; + } my $attachmenturls = $$contrib{$idx.':attachmenturl'}; my @postversions = (); if ($type eq 'allversions' || $type eq 'export') { @@ -1859,15 +1969,17 @@ $latexHelp

END -$r->print(&Apache::lonhtmlcommon::start_pick_box()); -$r->print(&Apache::lonhtmlcommon::row_title(&mt('Subject'))); -$r->print('

'); -$r->print(&Apache::lonhtmlcommon::row_closure()); -$r->print(&Apache::lonhtmlcommon::row_title(&mt('Message'))); -$r->print(''); -$r->print(&Apache::lonhtmlcommon::row_closure(1)); -$r->print(&Apache::lonhtmlcommon::end_pick_box()); + $r->print(&Apache::lonhtmlcommon::start_pick_box()); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Subject'))); + $r->print('

'); + $r->print(&Apache::lonhtmlcommon::row_closure()); + $r->print(&Apache::lonhtmlcommon::row_title(&mt('Message'))); + $r->print(''); + $r->print(&Apache::lonhtmlcommon::row_closure(1)); + $r->print(&Apache::lonhtmlcommon::end_pick_box()); if ( ($env{'form.editdisc'}) || ($env{'form.replydisc'}) ) { if ($env{'form.origpage'}) { @@ -2382,24 +2494,11 @@ sub print_showposters { $r->send_http_header; &Apache::lonenc::check_encrypt(\$symb); - my $crs='/'.$env{'request.course.id'}; - if ($env{'request.course.sec'}) { - $crs.='_'.$env{'request.course.sec'}; - } - $crs=~s/\_/\//g; - my $seeid; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $group = $env{'form.group'}; my $ressymb = &wrap_symb($symb); - if (($group ne '') && - ($ressymb =~ m|^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$|)) { - if (&check_group_priv($group,'dgp') eq 'ok') { - $seeid = 1; - } - } else { - $seeid=&Apache::lonnet::allowed('rin',$crs); - } + my $seehidden = &can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum); my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, $cdom,$cnum); my %namesort = (); @@ -2415,7 +2514,7 @@ sub print_showposters { for (my $idx=1;$idx<=$contrib{'version'};$idx++) { my $hidden=($contrib{'hidden'}=~/\.$idx\./); my $deleted=($contrib{'deleted'}=~/\.$idx\./); - unless ((($hidden) && (!$seeid)) || ($deleted)) { + unless ((($hidden) && (!$seehidden)) || ($deleted)) { if ((!$contrib{$idx.':anonymous'}) || (&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')))) { my %names = &Apache::lonnet::get('environment',['firstname','lastname'],$contrib{$idx.':senderdomain'},$contrib{$idx.':sendername'}); my $lastname = $names{'lastname'}; @@ -2440,7 +2539,7 @@ sub print_showposters { } } } - } + } } my $start_page = &Apache::loncommon::start_page('Discussion options'); @@ -2780,12 +2879,7 @@ sub screen_header { my ($blocked,$blocktext) = &Apache::loncommon::blocking_status('boards'); my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $realsymb = $symb; - if ($symb=~/^bulletin___/) { - my $filename=(&Apache::lonnet::decode_symb($symb))[2]; - $filename=~s|^adm/wrapper/||; - $realsymb=&Apache::lonnet::symbread($filename); - } + my $realsymb = &get_realsymb($symb); if (!$blocked && &discussion_open(undef,$realsymb) && (&Apache::lonnet::allowed('pch', $env{'request.course.id'}. @@ -2988,12 +3082,7 @@ sub storefeedbacklikes { sub adddiscuss { my ($symb,$email,$anon,$attachmenturl,$subject,$group)=@_; my $status=''; - my $realsymb; - if ($symb=~/^bulletin___/) { - my $filename=(&Apache::lonnet::decode_symb($symb))[2]; - $filename=~s|^adm/wrapper/||; - $realsymb=&Apache::lonnet::symbread($filename); - } + my $realsymb = &get_realsymb($symb); my ($cnum,$cdom); if ($env{'request.course.id'}) { $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -3403,7 +3492,6 @@ END $r->print(&Apache::lonhtmlcommon::row_closure()); $r->print(&Apache::lonhtmlcommon::row_title($lt{'adda'})); $r->print(' '.$attachmaxtext); - if(($idx)||(ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)){ $r->print(&Apache::lonhtmlcommon::row_closure()); $r->print(&Apache::lonhtmlcommon::row_title(&mt('Attachments'))); @@ -3411,9 +3499,9 @@ END if ($attachmenturls) { my @currold = keys(%currattach); if (@currold > 0) { - $r->print($lt{'thfo'}.'
'.$lt{'chth'}.'
'."\n"); + $r->print($lt{'thfo'}.'
'.$lt{'chth'}.'
'."\n"); foreach my $id (@currold) { - my $attachurl = &HTML::Entities::decode($attachments{$id}{'filename'}); + my $attachurl = &HTML::Entities::decode($attachments{$id}{'filename'}); $attachurl =~ m#/([^/]+)$#; $r->print('
'."\n"); } @@ -3732,12 +3820,15 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['like','unlike','modal','hide','unhide','deldisc','undeleteall','postdata','preview','replydisc','editdisc','cmd','symb','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navtime','navmaps','navurl','sortposts','applysort','rolefilter','statusfilter','sectionpick','groupick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export','sendmessageonly','group','ref']); my $group = $env{'form.group'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my %attachmax = ( text => &mt('(128 KB max size)'), num => 131072, ); if ($env{'form.editdisc'}) { - if (!(&editing_allowed($env{'form.editdisc'},$env{'form.group'}))) { + if (!(&editing_allowed($env{'form.editdisc'},$group))) { my $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0]; my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb); my $feedurl=&Apache::lonnet::clutter($url); @@ -3787,36 +3878,24 @@ sub handler { $r->print(&Apache::loncommon::start_page('Discussion Post Versions',undef,\%parms)); - my $crs='/'.$env{'request.course.id'}; - if ($env{'request.course.sec'}) { - $crs.='_'.$env{'request.course.sec'}; - } - $crs=~s|_|/|g; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my ($symb,$idx)=split(/\:\:\:/,$env{'form.allversions'}); - ($symb)=&get_feedurl_and_clean_symb($symb); + ($symb, my $feedurl)=&get_feedurl_and_clean_symb($symb); my $ressymb = &wrap_symb($symb); - my $group = $env{'form.group'}; my $seeid; - if (($group ne '') && (($ressymb =~ m|^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$|))) { - if (&check_group_priv($group,'dgp') eq 'ok') { - $seeid = 1; - } - } else { - $seeid = &Apache::lonnet::allowed('rin',$crs); + if (&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) { + $seeid = 1; } + my $seehidden = &can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum); if ($idx > 0) { my %messages = (); my %subjects = (); my %attachmsgs = (); my %allattachments = (); my %imsfiles = (); - my ($screenname,$plainname); + my ($screenname,$plainname,$showaboutme); my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); - $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname)); + $cdom,$cnum); + $r->print(&get_post_contents(\%contrib,$idx,$seeid,$seehidden,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname,\$showaboutme)); } $r->print(&Apache::loncommon::end_page()); return OK; @@ -3954,37 +4033,32 @@ ENDREDIR my $entry=$env{'form.hide'}?$env{'form.hide'}:$env{'form.unhide'}; my ($symb,$idx)=split(/\:\:\:/,$entry); ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb); + my $ressymb = &wrap($symb); - my $crs='/'.$env{'request.course.id'}; - if ($env{'request.course.sec'}) { - $crs.='_'.$env{'request.course.sec'}; - } - $crs=~s/\_/\//g; - my $seeid=&Apache::lonnet::allowed('rin',$crs); - - if ($env{'form.hide'} && !$seeid && !(&editing_allowed($env{'form.hide'},$env{'form.group'}))) { - &redirect_back($r,$feedurl,&mt('Deletion not permitted').'
', '0','0','','',$env{'form.previous'},'','','','', - undef,undef,$group,); + my $seehidden = &can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum); + unless (($seehidden) || (&editing_allowed($env{'form.hide'},$group))) { + &redirect_back($r,$feedurl,&mt('Hiding not permitted').'
', + '0','0','','',$env{'form.previous'},'','','','', + undef,undef,$group,); return OK; } my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); + $cdom,$cnum); my $currenthidden=$contrib{'hidden'}; my $currentstudenthidden=$contrib{'studenthidden'}; if ($env{'form.hide'}) { $currenthidden.='.'.$idx.'.'; - unless ($seeid) { + unless ($seehidden) { $currentstudenthidden.='.'.$idx.'.'; } } else { $currenthidden=~s/\.$idx\.//g; } my %newhash=('hidden' => $currenthidden); - if ( ($env{'form.hide'}) && (!$seeid) ) { + if ( ($env{'form.hide'}) && (!$seehidden) ) { $newhash{'studenthidden'} = $currentstudenthidden; } if ($env{'form.hide'}) { @@ -3993,13 +4067,11 @@ ENDREDIR ($changelast,$newlast) = &get_discussion_info($idx,%contrib); if ($changelast) { &Apache::lonnet::put('discussiontimes',{$symb => $newlast}, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); + $cdom,$cnum); } } &Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); + $cdom,$cnum); &redirect_back($r,$feedurl,&mt('Changed discussion status').'
', '0','0','','',$env{'form.previous'},undef,undef,undef, @@ -4010,71 +4082,111 @@ ENDREDIR my $entry=$env{'form.like'}?$env{'form.like'}:$env{'form.unlike'}; my ($symb,$idx)=split(/\:\:\:/,$entry); ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb); + my $result; + if ($idx > 0) { + my $realsymb = &get_realsymb($symb); + my $status='OPEN'; + if ($Apache::lonhomework::parsing_a_problem || + $Apache::lonhomework::parsing_a_task) { + $status=$Apache::inputtags::status[-1]; + } + if (&discussion_vote_available($status,$realsymb)) { + my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, + $cdom,$cnum); + if (($contrib{$idx.':sendername'} eq $env{'user.name'}) && + ($contrib{$idx.':senderdomain'} eq $env{'user.domain'})) { + $result = &mt("Vote not registered. No voting for your own posts."); + } else { + # # Likes and unlikes are in db-file "disclikes" of the course # The prefix is the $symb to identify the resource discussion, # and the $idx to identify the entry # - my $prefix=$symb.':'.$idx.':'; - my %contrib=&Apache::lonnet::dump('disclikes', - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}, - '^'.$prefix); -# Get all who like or unlike this - my $currentlikers=$contrib{$prefix.'likers'}; - my $currentunlikers=$contrib{$prefix.'unlikers'}; + my $prefix=$symb.':'.$idx.':'; + my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum, + '^'.$prefix); + +# Get current like or unlike status for the $idx for this user. + my $thisuser=$env{'user.name'}.':'.$env{'user.domain'}; + my ($userlikes,$userunlikes); + if (ref($likes{$prefix.'likers'}) eq 'HASH') { + if (exists($likes{$prefix.'likers'}{$thisuser})) { + $userlikes = 1; + } + } + if (ref($likes{$prefix.'unlikers'}) eq 'HASH') { + if (exists($likes{$prefix.'unlikers'}{$thisuser})) { + $userunlikes = 1; + } + } # Get the current "likes" count - my $likes=$contrib{$prefix.'likes'}; + my $likescount=$likes{$prefix.'likes'}; # Find out if they already voted -# Users cannot like a post twice, or unlike it twice. They can change their mind, though - my $alreadyflag=0; - my $thisuser=$env{'user.name'}.':'.$env{'user.domain'}; - if ($env{'form.like'}) { - if ($currentlikers=~/\,\Q$thisuser\E\,/) { - $alreadyflag=1; - } else { - if ($currentunlikers=~/\,\Q$thisuser\E\,/) { - $currentunlikers=~s/\,\Q$thisuser\E\,//g; - } else { - $currentlikers.=','.$thisuser.','; - } - $likes++; - } - } else { - if ($currentunlikers=~/\,\Q$thisuser\E\,/) { - $alreadyflag=1; - } else { - if ($currentlikers=~/\,\Q$thisuser\E\,/) { - $currentlikers=~s/\,\Q$thisuser\E\,//g; - } else { - $currentunlikers.=','.$thisuser.','; - } - $likes--; - } - } - my $result; +# Users cannot like a post twice, or unlike it twice. +# They can change their mind, though. + my $alreadyflag=0; + if ($env{'form.like'}) { + if ($userlikes) { + $alreadyflag=1; + } elsif ($userunlikes) { + delete($likes{$prefix.'unlikers'}{$thisuser}); + $likescount++; + } else { + if (ref($likes{$prefix.'likers'}) eq 'HASH') { + $likes{$prefix.'likers'}{$thisuser} = 1; + } else { + $likes{$prefix.'likers'} = {$thisuser => 1}; + } + $likescount++; + } + } else { + if ($userunlikes) { + $alreadyflag=1; + } elsif ($userlikes) { + delete($likes{$prefix.'likers'}{$thisuser}); + $likescount--; + } else { + if (ref($likes{$prefix.'unlikers'}) eq 'HASH') { + $likes{$prefix.'unlikers'}{$thisuser} = 1; + } else { + $likes{$prefix.'unlikers'} = {$thisuser => 1}; + } + $likescount--; + } + } # $alreadyflag would be 1 if they tried to double-like or double-unlike - unless ($alreadyflag) { - my %newhash=($prefix.'likes' => $likes, - $prefix.'likers' => $currentlikers, - $prefix.'unlikers' => $currentunlikers); + if ($alreadyflag) { + if ($env{'form.like'}) { + $result= &mt("'Like' already registered"); + } else { + $result= &mt("'Unlike' already registered"); + } + } else { + my %newhash=($prefix.'likes' => $likescount, + $prefix.'likers' => $likes{$prefix.'likers'}, + $prefix.'unlikers' => $likes{$prefix.'unlikers'}); # Store data in db-file "disclikes" - if (&Apache::lonnet::put('disclikes', - \%newhash, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') { + if (&Apache::lonnet::put('disclikes',\%newhash,$cdom,$cnum) eq 'ok') { # Also store with the person who posted the liked/unliked entry - if ($env{'form.like'}) { - &storediscussionlikes(1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); - $result=&mt("Registered 'Like'"); - } else { - &storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); - $result=&mt("Registered 'Unlike'"); + if ($env{'form.like'}) { + &storediscussionlikes(1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); + $result=&mt("Registered 'Like'"); + } else { + &storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); + $result=&mt("Registered 'Unlike'"); + } + } else { +# Oops, something went wrong + $result=&mt("Failed to register vote"); + } + } } } else { -# Oops, something went wrong - $result=&mt("Failed to register vote"); + $result=&mt('Voting unavailable for this discussion'); } + } else { + $result=&mt('Invalid post number'); } &redirect_back($r,$feedurl,$result.'
', '0','0','','',$env{'form.previous'},undef,undef,undef, @@ -4097,18 +4209,24 @@ ENDREDIR # --------------------------------------------------------------- Hide for good my ($symb,$idx)=split(/\:\:\:/,$env{'form.deldisc'}); ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb); + my $ressymb=&wrap_symb($symb); + + unless (&can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum)) { + &redirect_back($r,$feedurl,&mt('Deletion not permitted').'
', + '0','0','','',$env{'form.previous'},'','','','', + undef,undef,$group); + return OK; + } my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); + $cdom,$cnum); my ($changelast,$newlast) = &get_discussion_info($idx,%contrib); if ($changelast) { &Apache::lonnet::put('discussiontimes',{$symb => $newlast}, - $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); + $cdom,$cnum); } my %newhash=('deleted' => $contrib{'deleted'}.".$idx."); &Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); + $cdom,$cnum); &redirect_back($r,$feedurl,&mt('Changed discussion status').'
', '0','0','','',$env{'form.previous'},undef,undef,undef, undef,undef,undef,$group); @@ -4138,8 +4256,7 @@ ENDREDIR my $idx = $env{'form.idx'}; if ($idx) { my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); + $cdom,$cnum); $attachmenturls = $contrib{$idx.':attachmenturl'}; } &modify_attachments($r,\@currnewattach,\@currdelold,$symb,$idx, @@ -4156,6 +4273,7 @@ ENDREDIR $mode='problem'; $status=$Apache::inputtags::status[-1]; } + my $discussion = &list_discussion($mode,$status,$symb); my $start_page = &Apache::loncommon::start_page('Resource Feedback and Discussion'); @@ -4168,11 +4286,11 @@ ENDREDIR &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; my ($symb,$feedurl) = &get_feedurl_and_clean_symb($env{'form.undeleteall'}); + my $ressymb=&wrap_symb($symb); $r->print(&Apache::loncommon::start_page('Undelete all deleted discussion entries')); - if (&Apache::lonnet::allowed('rin',$env{'request.course.id'})) { + if (&can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum)) { if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'}, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') { + $cdom,$cnum) eq 'ok') { $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries"))); } else { $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1)); @@ -4376,6 +4494,7 @@ sub wrap_symb { } return $ressymb; } + sub dewrapper { my ($feedurl)=@_; if ($$feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { @@ -4529,6 +4648,10 @@ None =item discussion_visible() +=item discussion_vote_available() + +=item get_realsymb() + =item list_discussion() =item send_feedback_link() 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.