--- loncom/interface/lonfeedback.pm 2012/03/16 02:59:01 1.346 +++ loncom/interface/lonfeedback.pm 2012/03/17 14:49:29 1.351 @@ -1,7 +1,7 @@ # The LearningOnline Network # Feedback # -# $Id: lonfeedback.pm,v 1.346 2012/03/16 02:59:01 raeburn Exp $ +# $Id: lonfeedback.pm,v 1.351 2012/03/17 14:49:29 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -277,14 +277,10 @@ 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); @@ -311,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,$canvote,$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; @@ -467,7 +463,7 @@ imscp_v1p1.xsd http://www.imsglobal.org/ "\n".'
';
@@ -861,7 +892,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 .='';
}
}
}
- if ($seeid) {
+ if ($seehidden) {
if ($hiddens{$idx}) {
unless ($studenthidden) {
$sender.=' '.
@@ -1301,7 +1333,8 @@ sub build_posting_display {
}
if ($outputtarget eq 'export' || $message) {
my $thisindex=$idx;
- if ( (($env{'environment.threadeddiscussion'}) && ($sortposts eq '')) || ($sortposts eq 'thread') || ($outputtarget eq 'export')) {
+ if ( ((!$env{'environment.unthreadeddiscussion'}) && ($sortposts eq '')) ||
+ ($sortposts eq 'thread') || ($outputtarget eq 'export')) {
$thisindex=$origindex.substr('00'.$$replies[$$depth[$idx]],-2,2);
}
$$alldiscussion{$thisindex}=$idx;
@@ -1424,13 +1457,24 @@ sub build_posting_display {
$message.
'';
if ($canvote) {
+ my $ownpost;
+ if (($uname eq $env{'user.name'}) &&
+ ($udom eq $env{'user.domain'})) {
+ $ownpost = 1;
+ }
# Put in the like and unlike buttons
- if (($uname eq $env{'user.name'}) && ($udom eq $env{'user.domain'})) {
- my $novote = &mt('No voting for your own posts');
+ if ($ownpost || (($hiddens{$idx}) && ($seehidden))) {
+ my $novote;
+ if ($ownpost) {
+ $novote = &mt('No voting for your own posts.');
+ } else {
+ $novote = &mt('No voting for hidden posts.');
+ }
$$discussionitems[$idx].=
''.
' '.
'';
+
} else {
if ($userlikes{$idx}) {
$$discussionitems[$idx].='';
@@ -1456,7 +1500,7 @@ sub build_posting_display {
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));
}
@@ -1542,13 +1586,13 @@ sub filter_regexp {
sub get_post_contents {
- my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$showaboutme,$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;
}
@@ -2465,24 +2509,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 = ();
@@ -2498,7 +2529,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'};
@@ -2523,7 +2554,7 @@ sub print_showposters {
}
}
}
- }
+ }
}
my $start_page = &Apache::loncommon::start_page('Discussion options');
@@ -3188,7 +3219,8 @@ sub getdiscussionrecords {
sub getdiscussionstats {
my %record=&getdiscussionrecords(@_);
- return ($record{'subnumber'},$record{'points'},$record{'totallikes'},$record{'totalvotes'});
+ my $totalvotes = $record{'totallikes'} + $record{'totalunlikes'};
+ return ($record{'subnumber'},$record{'points'},$record{'totallikes'},$totalvotes);
}
# Calculate discussion karma
@@ -3252,23 +3284,20 @@ sub storediscussionpoints {
# Store discussion "likes"
sub storediscussionlikes {
- my ($likes,$uname,$udom,$course)=@_;
- unless ($likes) { $likes=0; }
- if ($likes>0) { $likes=1; }
- if ($likes<0) { $likes=-1; }
+ my ($chglikes,$chgunlikes,$uname,$udom,$course,$context)=@_;
unless ($uname) { $uname=$env{'user.name'}; }
unless ($udom) { $udom=$env{'user.domain'}; }
unless ($course) { $course=$env{'request.course.id'}; }
my %record=&getdiscussionrecords($uname,$udom,$course);
my $totallikes=$record{'totallikes'};
- my $totalvotes=$record{'totalvotes'};
- $totallikes+=$likes;
- $totalvotes++;
+ my $totalunlikes=$record{'totalunlikes'};
+ $totallikes += $chglikes;
+ $totalunlikes += $chgunlikes;
my %newrecord=('likes_user' => $env{'user.name'},
'likes_domain' => $env{'user.domain'},
- 'likes' => $likes,
- 'totallikes' => $totallikes,
- 'totalvotes' => $totalvotes);
+ 'totallikes' => $totallikes,
+ 'totalunlikes' => $totalunlikes,
+ 'context' => $context);
my $status=&Apache::lonnet::cstore(\%newrecord,'_discussion',$course,$udom,$uname);
if ($status eq 'ok') {
&updatekarma($uname,$udom,$course);
@@ -3804,6 +3833,9 @@ 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,
@@ -3859,24 +3891,14 @@ 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 $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 = ();
@@ -3885,9 +3907,8 @@ sub handler {
my %imsfiles = ();
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,\$showaboutme));
+ $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;
@@ -4025,37 +4046,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($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'},$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'}) { @@ -4064,16 +4080,46 @@ 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'}); - - &redirect_back($r,$feedurl,&mt('Changed discussion status').' ', - '0','0','','',$env{'form.previous'},undef,undef,undef, + my $result; + if (&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'}, + $cdom,$cnum) eq 'ok') { + my $prefix=$symb.':'.$idx.':'; + my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum, + '^'.$prefix); + my ($totallikes,$totalunlikes); + if (ref($likes{$prefix.'likers'}) eq 'HASH') { + $totallikes = scalar(keys(%{$likes{$prefix.'likers'}})); + } + if (ref($likes{$prefix.'unlikers'}) eq 'HASH') { + $totalunlikes = scalar(keys(%{$likes{$prefix.'unlikers'}})); + } + if ($totallikes || $totalunlikes) { + my ($chglikes,$chgunlikes,$context); + if ($env{'form.hide'}) { + $chglikes = -1 * $totallikes; + $chgunlikes = -1 * $totalunlikes; + $context = 'hide'; + } else { + $chglikes = $totallikes; + $chgunlikes = $totalunlikes; + $context = 'unhide'; + } + &storediscussionlikes($chglikes,$chgunlikes, + $contrib{$idx.':sendername'}, + $contrib{$idx.':senderdomain'}, + $env{'request.course.id'}, + $context); + + } + $result = &mt('Changed discussion status'); + } else { + $result = &mt('Discussion status unchanged'); + } + &redirect_back($r,$feedurl,$result.' ','0','0','','', + $env{'form.previous'},undef,undef,undef, undef,undef,undef,$group); return OK; } elsif (($env{'form.like'}) || ($env{'form.unlike'})) { @@ -4091,23 +4137,30 @@ ENDREDIR } if (&discussion_vote_available($status,$realsymb)) { 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 $ownpost; 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."); + $ownpost = 1; + } + if ($ownpost || $contrib{$idx.':hidden'} || $contrib{$idx.':deleted'}) { + $result = &mt('Vote not registered.').' '; + } + if ($ownpost) { + $result .= &mt('No voting for your own posts.'); + } elsif ($contrib{$idx.':hidden'}) { + $result .= &mt('No voting for hidden posts.'); + } elsif ($contrib{$idx.':deleted'}) { + $result .= &mt('No voting for deleted 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 %likes=&Apache::lonnet::dump('disclikes', - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}, - '^'.$prefix); + 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'}; @@ -4128,11 +4181,13 @@ ENDREDIR # Users cannot like a post twice, or unlike it twice. # They can change their mind, though. my $alreadyflag=0; + my $votetype; if ($env{'form.like'}) { if ($userlikes) { $alreadyflag=1; } elsif ($userunlikes) { delete($likes{$prefix.'unlikers'}{$thisuser}); + $votetype = 'switch'; $likescount++; } else { if (ref($likes{$prefix.'likers'}) eq 'HASH') { @@ -4147,6 +4202,7 @@ ENDREDIR $alreadyflag=1; } elsif ($userlikes) { delete($likes{$prefix.'likers'}{$thisuser}); + $votetype = 'switch'; $likescount--; } else { if (ref($likes{$prefix.'unlikers'}) eq 'HASH') { @@ -4169,16 +4225,34 @@ ENDREDIR $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 + my ($chglike,$chgunlike); if ($env{'form.like'}) { - &storediscussionlikes(1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); + if ($votetype eq 'switch') { + $chglike = 0; + $chgunlike = -1; + } else { + $chglike = 1; + $chgunlike = 0; + } + &storediscussionlikes($chglike,$chgunlike, + $contrib{$idx.':sendername'}, + $contrib{$idx.':senderdomain'}, + $env{'request.course.id'},'like'); $result=&mt("Registered 'Like'"); } else { - &storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); + if ($votetype eq 'switch') { + $chglike = -1; + $chgunlike = 0; + } else { + $chglike = 0; + $chgunlike = 1; + } + &storediscussionlikes($chglike,$chgunlike, + $contrib{$idx.':sendername'}, + $contrib{$idx.':senderdomain'}, + $env{'request.course.id'},'unlike'); $result=&mt("Registered 'Unlike'"); } } else { @@ -4199,12 +4273,16 @@ ENDREDIR return OK; } elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) { my ($symb,$feedurl)=&get_feedurl_and_clean_symb($env{'form.symb'}); - if ($env{'form.cmd'} eq 'threadedon') { + if ($env{'form.cmd'} eq 'threadedoff') { + &Apache::lonnet::put('environment',{'unthreadeddiscussion' => 'on'}); + &Apache::lonnet::appenv({'environment.unthreadeddiscussion' => 'on'}); + &Apache::lonnet::del('environment',['threadeddiscussion']); + &Apache::lonnet::delenv('environment.threadeddiscussion'); + } else { &Apache::lonnet::put('environment',{'threadeddiscussion' => 'on'}); &Apache::lonnet::appenv({'environment.threadeddiscussion' => 'on'}); - } else { - &Apache::lonnet::del('environment',['threadeddiscussion']); - &Apache::lonnet::delenv('environment.threadeddiscussion'); + &Apache::lonnet::del('environment',['unthreadeddiscussion']); + &Apache::lonnet::delenv('environment.unthreadeddiscussion'); } &redirect_back($r,$feedurl,&mt('Changed discussion view mode').' ', '0','0','','',$env{'form.previous'},undef,undef,undef, @@ -4214,20 +4292,51 @@ 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'}); - &redirect_back($r,$feedurl,&mt('Changed discussion status').' ', - '0','0','','',$env{'form.previous'},undef,undef,undef, + + my $result; + if (&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'}, + $cdom,$cnum) eq 'ok') { + $result = &mt('Changed discussion status'); + my $prefix=$symb.':'.$idx.':'; + my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum, + '^'.$prefix); + my ($totallikes,$totalunlikes); + if (ref($likes{$prefix.'likers'}) eq 'HASH') { + $totallikes = scalar(keys(%{$likes{$prefix.'likers'}})); + } + if (ref($likes{$prefix.'unlikers'}) eq 'HASH') { + $totalunlikes = scalar(keys(%{$likes{$prefix.'unlikers'}})); + } + if ($totallikes || $totalunlikes) { + my $chglikes = -1 * $totallikes; + my $chgunlikes = -1 * $totalunlikes; + &storediscussionlikes($chglikes,$chgunlikes, + $contrib{$idx.':sendername'}, + $contrib{$idx.':senderdomain'}, + $env{'request.course.id'}, + 'delete'); + } + } else { + $result = &mt('Discussion status unchanged'); + } + &redirect_back($r,$feedurl,$result.' ','0','0','','', + $env{'form.previous'},undef,undef,undef, undef,undef,undef,$group); return OK; } elsif ($env{'form.preview'}) { @@ -4255,8 +4364,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, @@ -4273,6 +4381,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'); @@ -4285,16 +4394,48 @@ 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 (&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') { - $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries"))); - } else { - $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1)); - } - $r->print(" ".&mt("Return and reload").""); + if (&can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum)) { + my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, + $cdom,$cnum); + $contrib{'deleted'} =~ s/^\.//; + $contrib{'deleted'} =~ s/\.$//; + if ($contrib{'deleted'} ne '') { + if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'}, + $cdom,$cnum) eq 'ok') { + my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum,'^'.$symb.':'); + my @ids = split(/\.\./,$contrib{'deleted'}); + my (%chglikes,%chgunlikes); + foreach my $idx (@ids) { + my $uname = $contrib{$idx.':sendername'}; + my $udom = $contrib{$idx.':senderdomain'}; + my ($totallikes,$totalunlikes); + if (ref($likes{$symb.':'.$idx.':likers'}) eq 'HASH') { + $totallikes = scalar(keys(%{$likes{$symb.':'.$idx.':likers'}})); + } + if (ref($likes{$symb.':'.$idx.':unlikers'}) eq 'HASH') { + $totalunlikes = scalar(keys(%{$likes{$symb.':'.$idx.':unlikers'}})); + } + if ($totallikes || $totalunlikes) { + $chglikes{$uname.':'.$udom} += $totallikes; + $chgunlikes{$uname.':'.$udom} += $totalunlikes; + } + } + foreach my $user (keys(%chglikes)) { + my ($uname,$udom) = split(/:/,$user); + &storediscussionlikes($chglikes{$user},$chgunlikes{$user}, + $uname,$udom,$env{'request.course.id'}, + 'undelete'); + } + $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries"))); + } else { + $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1)); + } + } else { + $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("No entries to undelete"),1)); + } + $r->print(" ".&mt("Return and reload").""); } $r->print(&Apache::loncommon::end_page()); return OK; @@ -4493,6 +4634,7 @@ sub wrap_symb { } return $ressymb; } + sub dewrapper { my ($feedurl)=@_; if ($$feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { @@ -4652,6 +4794,8 @@ None =item list_discussion() +=item can_see_discussion() + =item send_feedback_link() =item send_message_link() |