version 1.338, 2012/03/09 15:02:31
|
version 1.339, 2012/03/13 05:37:49
|
Line 82 sub discussion_visible {
|
Line 82 sub discussion_visible {
|
return 1; |
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 { |
sub list_discussion { |
my ($mode,$status,$ressymb,$imsextras,$group)=@_; |
my ($mode,$status,$ressymb,$imsextras,$group)=@_; |
unless ($ressymb) { $ressymb=&Apache::lonnet::symbread(); } |
unless ($ressymb) { $ressymb=&Apache::lonnet::symbread(); } |
Line 265 sub list_discussion {
|
Line 285 sub list_discussion {
|
} else { |
} else { |
$seeid=&Apache::lonnet::allowed('rin',$crs); |
$seeid=&Apache::lonnet::allowed('rin',$crs); |
} |
} |
|
|
|
# Is voting on discussions available |
|
my $realsymb = &get_realsymb($ressymb); |
|
my $canvote = &discussion_vote_available($status,$realsymb); |
|
|
my @discussionitems=(); |
my @discussionitems=(); |
my %shown = (); |
my %shown = (); |
my @posteridentity=(); |
my @posteridentity=(); |
Line 286 sub list_discussion {
|
Line 311 sub list_discussion {
|
$discinfo{$visitkey} = $visit; |
$discinfo{$visitkey} = $visit; |
|
|
&Apache::lonnet::put('nohist_'.$cid.'_discuss',\%discinfo,$env{'user.domain'},$env{'user.name'}); |
&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,$canvote,$prevread,$sortposts,$encsymb,$readkey,$showunmark,$showonlyunread,$totposters,\@rolefilter,\@sectionpick,\@grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,\%anonhash,$anoncnt,$group); |
|
|
my $discussion=''; |
my $discussion=''; |
my $manifestfile; |
my $manifestfile; |
Line 744 END
|
Line 769 END
|
$discussion.= &send_feedback_link($ressymb); |
$discussion.= &send_feedback_link($ressymb); |
if ($env{'request.role.adv'}) { |
if ($env{'request.role.adv'}) { |
my $close = &Apache::lonnet::EXT('resource.0.discussend',$ressymb); |
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) { |
if (defined($close) && $close ne '' && $close < time) { |
$discussion .= ' '.&mt('(Closed for [_1] roles)', |
if ($canvote eq 'notended') { |
&Apache::lonnet::plaintext('st',$crstype)); |
$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 { |
} else { |
Line 937 ENDDISCUSS
|
Line 968 ENDDISCUSS
|
} |
} |
|
|
sub build_posting_display { |
sub build_posting_display { |
my ($usernamesort,$subjectsort,$namesort,$notshown,$newitem,$dischash,$shown,$alldiscussion,$imsitems,$imsfiles,$roleinfo,$discussionitems,$replies,$depth,$posters,$maxdepth,$visible,$newpostsflag,$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$ressymb,$readkey,$showunmark,$showonlyunread,$totposters,$rolefilter,$sectionpick,$grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,$anonhash,$anoncnt,$group) = @_; |
my ($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,$ressymb,$readkey,$showunmark,$showonlyunread,$totposters,$rolefilter,$sectionpick,$grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,$anonhash,$anoncnt,$group) = @_; |
my @original=(); |
my @original=(); |
my @index=(); |
my @index=(); |
my $skip_group_check = 0; |
my $skip_group_check = 0; |
Line 947 sub build_posting_display {
|
Line 978 sub build_posting_display {
|
my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, |
my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'}, |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}); |
$env{'course.'.$env{'request.course.id'}.'.num'}); |
|
my (%likes,%userlikes,%userunlikes,@theselikes,$oneplus,$twoplus,$oneminus,$twominus); |
|
my $thisuser=$env{'user.name'}.':'.$env{'user.domain'}; |
|
if ($seeid || $canvote) { |
# And these are the likes/unlikes |
# And these are the likes/unlikes |
my %likes=&Apache::lonnet::dump('disclikes', |
%likes=&Apache::lonnet::dump('disclikes', |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}, |
'^'.$symb.':'); |
'^'.$symb.':'); |
my $thisuser=$env{'user.name'}.':'.$env{'user.domain'}; |
|
# Array with likes to figure out averages, etc. |
# Array with likes to figure out averages, etc. |
my @theselikes=(); |
@theselikes=(); |
# Hashes containing likes and unlikes for this user. |
# Hashes containing likes and unlikes for this user. |
my %userlikes=(); |
%userlikes=(); |
my %userunlikes=(); |
%userunlikes=(); |
|
} |
# Is the user allowed to see the real name behind anonymous postings? |
# Is the user allowed to see the real name behind anonymous postings? |
my $see_anonymous = |
my $see_anonymous = |
&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); |
&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); |
Line 991 sub build_posting_display {
|
Line 1025 sub build_posting_display {
|
&filter_regexp($rolefilter,$sectionpick,$statusfilter); |
&filter_regexp($rolefilter,$sectionpick,$statusfilter); |
$rolematch = $roleregexp.':'.$secregexp.':'.$statusregexp; |
$rolematch = $roleregexp.':'.$secregexp.':'.$statusregexp; |
} |
} |
|
if ($seeid || $canvote) { |
# We need to go through this twice, first to get the likes/dislikes, then to actually build the display |
# We need to go through this twice, first to get the likes/dislikes, then to actually build the display |
for (my $id=1;$id<=$contrib{'version'};$id++) { |
for (my $id=1;$id<=$contrib{'version'};$id++) { |
my $idx=$id; |
my $idx=$id; |
next if ($contrib{$idx.':deleted'}); |
next if ($contrib{$idx.':deleted'}); |
next if ($contrib{$idx.':hidden'}); |
next if ($contrib{$idx.':hidden'}); |
unless ((($hiddens{$idx}) && (!$seeid)) || ($deletions{$idx}) || (!$contrib{$idx.':message'})) { |
unless ((($hiddens{$idx}) && (!$seeid)) || ($deletions{$idx}) || (!$contrib{$idx.':message'})) { |
if ($likes{$symb.':'.$idx.':likes'} ne '') { |
if ($likes{$symb.':'.$idx.':likes'} ne '') { |
push(@theselikes,$likes{$symb.':'.$idx.':likes'}); |
push(@theselikes,$likes{$symb.':'.$idx.':likes'}); |
if (ref($likes{$symb.':'.$idx.':likers'}) eq 'HASH') { |
if (ref($likes{$symb.':'.$idx.':likers'}) eq 'HASH') { |
if (exists($likes{$symb.':'.$idx.':likers'}{$thisuser})) { |
if (exists($likes{$symb.':'.$idx.':likers'}{$thisuser})) { |
$userlikes{$idx} = 1; |
$userlikes{$idx} = 1; |
|
} |
} |
} |
} |
if (ref($likes{$symb.':'.$idx.':unlikers'}) eq 'HASH') { |
if (ref($likes{$symb.':'.$idx.':unlikers'}) eq 'HASH') { |
if (exists($likes{$symb.':'.$idx.':unlikers'}{$thisuser})) { |
if (exists($likes{$symb.':'.$idx.':unlikers'}{$thisuser})) { |
$userunlikes{$idx} = 1; |
$userunlikes{$idx} = 1; |
} |
} |
} |
} |
} |
} |
} |
} |
} |
} |
|
# Figure out average likes and standard deviation if there are enough |
# Figure out average likes and standard deviation if there are enough |
# discussions to warrant that |
# discussions to warrant that |
my $ave=0; |
my $ave=0; |
my $stddev=10000; |
my $stddev=10000; |
if ($#theselikes>1) { |
if ($#theselikes>1) { |
my $sum=0; |
my $sum=0; |
my $num=$#theselikes+1; |
my $num=$#theselikes+1; |
foreach my $thislike (@theselikes) { |
foreach my $thislike (@theselikes) { |
$sum+=$thislike; |
$sum+=$thislike; |
} |
} |
$ave=$sum/$num; |
$ave=$sum/$num; |
my $sumsq=0; |
my $sumsq=0; |
foreach my $thislike (@theselikes) { |
foreach my $thislike (@theselikes) { |
$sumsq+=($thislike-$ave)*($thislike-$ave); |
$sumsq+=($thislike-$ave)*($thislike-$ave); |
|
} |
|
$stddev=sqrt($sumsq/$num); |
} |
} |
$stddev=sqrt($sumsq/$num); |
|
} |
|
# Now we know the average likes $ave and the standard deviation $stddev |
# Now we know the average likes $ave and the standard deviation $stddev |
# Get the boundaries for markup |
# Get the boundaries for markup |
my $oneplus=$ave+$stddev; |
$oneplus=$ave+$stddev; |
my $twoplus=$ave+2.*$stddev; |
$twoplus=$ave+2.*$stddev; |
my $oneminus=$ave-$stddev; |
$oneminus=$ave-$stddev; |
my $twominus=$ave-2.*$stddev; |
$twominus=$ave-2.*$stddev; |
|
} |
# |
# |
# This is now the real loop. Go through all entries, pick up what we need |
# This is now the real loop. Go through all entries, pick up what we need |
# |
# |
Line 1365 sub build_posting_display {
|
Line 1401 sub build_posting_display {
|
if ($$dischash{$toggkey}) { |
if ($$dischash{$toggkey}) { |
$$discussionitems[$idx].=' '.$ctlink; |
$$discussionitems[$idx].=' '.$ctlink; |
} |
} |
# Figure out size based on likes |
|
my $thislikes=$likes{$symb.':'.$idx.':likes'}; |
my $thislikes=$likes{$symb.':'.$idx.':likes'}; |
my $likesize="100"; |
my $likesize="100"; |
if ($thislikes>$twoplus) { |
if ($seeid || $canvote) { |
$likesize="200"; |
# Figure out size based on likes |
} elsif ($thislikes>$oneplus) { |
my $thislikes=$likes{$symb.':'.$idx.':likes'}; |
$likesize="150"; |
if ($thislikes>$twoplus) { |
} |
$likesize="200"; |
if ($thislikes<$twominus) { |
} elsif ($thislikes>$oneplus) { |
$likesize="50"; |
$likesize="150"; |
} elsif ($thislikes<$oneminus) { |
} |
$likesize="75"; |
if ($thislikes<$twominus) { |
|
$likesize="50"; |
|
} elsif ($thislikes<$oneminus) { |
|
$likesize="75"; |
|
} |
} |
} |
# Actually glue in the message itself |
# Actually glue in the message itself |
$$discussionitems[$idx].= '<br /><blockquote>'. |
$$discussionitems[$idx].= '<br /><blockquote>'. |
"<div style='font-size:$likesize%'>". |
"<div style='font-size:$likesize%'>". |
$message. |
$message. |
'</div></blockquote>'; |
'</div></blockquote>'; |
|
if ($canvote) { |
# Put in the like and unlike buttons |
# Put in the like and unlike buttons |
if ($userlikes{$idx}) { |
if ($userlikes{$idx}) { |
$$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You like this posting').'" />'; |
$$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You like this posting').'" />'; |
} else { |
} else { |
$$discussionitems[$idx].=' '.&discussion_link($symb,'<img border="0" src="/res/adm/pages/thumbsup.png" alt="'.&mt('Like').'" />','like',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Like this posting")); |
$$discussionitems[$idx].=' '.&discussion_link($symb,'<img border="0" src="/res/adm/pages/thumbsup.png" alt="'.&mt('Like').'" />','like',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Like this posting")); |
} |
} |
if ($userunlikes{$idx}) { |
if ($userunlikes{$idx}) { |
$$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsdown_gray.png" alt="'.&mt('You unlike this posting').'" />'; |
$$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsdown_gray.png" alt="'.&mt('You unlike this posting').'" />'; |
} else { |
} else { |
$$discussionitems[$idx].=' '.&discussion_link($symb,'<img border="0" src="/res/adm/pages/thumbsdown.png" alt="'.&mt('Unlike').'" />','unlike',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Unlike this posting")); |
$$discussionitems[$idx].=' '.&discussion_link($symb,'<img border="0" src="/res/adm/pages/thumbsdown.png" alt="'.&mt('Unlike').'" />','unlike',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Unlike this posting")); |
|
} |
} |
} |
my $thislikes=$likes{$symb.':'.$idx.':likes'}; |
if ($seeid || $canvote) { |
if ($thislikes>0) { |
my $thislikes=$likes{$symb.':'.$idx.':likes'}; |
$$discussionitems[$idx].=' ('.&mt("[_1] likes",$thislikes).')'; |
if ($thislikes>0) { |
} elsif ($thislikes<0) { |
$$discussionitems[$idx].=' ('.&mt("[_1] likes",$thislikes).')'; |
$$discussionitems[$idx].=' ('.&mt("[_1] unlikes",abs($thislikes)).')'; |
} elsif ($thislikes<0) { |
|
$$discussionitems[$idx].=' ('.&mt("[_1] unlikes",abs($thislikes)).')'; |
|
} |
} |
} |
# If there is any history to this post, inform the reader |
# If there is any history to this post, inform the reader |
if ($contrib{$idx.':history'}) { |
if ($contrib{$idx.':history'}) { |
Line 2795 sub screen_header {
|
Line 2838 sub screen_header {
|
my ($blocked,$blocktext) = &Apache::loncommon::blocking_status('boards'); |
my ($blocked,$blocktext) = &Apache::loncommon::blocking_status('boards'); |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $realsymb = $symb; |
my $realsymb = &get_realsymb($symb); |
if ($symb=~/^bulletin___/) { |
|
my $filename=(&Apache::lonnet::decode_symb($symb))[2]; |
|
$filename=~s|^adm/wrapper/||; |
|
$realsymb=&Apache::lonnet::symbread($filename); |
|
} |
|
if (!$blocked && &discussion_open(undef,$realsymb) && |
if (!$blocked && &discussion_open(undef,$realsymb) && |
(&Apache::lonnet::allowed('pch', |
(&Apache::lonnet::allowed('pch', |
$env{'request.course.id'}. |
$env{'request.course.id'}. |
Line 3003 sub storefeedbacklikes {
|
Line 3041 sub storefeedbacklikes {
|
sub adddiscuss { |
sub adddiscuss { |
my ($symb,$email,$anon,$attachmenturl,$subject,$group)=@_; |
my ($symb,$email,$anon,$attachmenturl,$subject,$group)=@_; |
my $status=''; |
my $status=''; |
my $realsymb; |
my $realsymb = &get_realsymb($symb); |
if ($symb=~/^bulletin___/) { |
|
my $filename=(&Apache::lonnet::decode_symb($symb))[2]; |
|
$filename=~s|^adm/wrapper/||; |
|
$realsymb=&Apache::lonnet::symbread($filename); |
|
} |
|
my ($cnum,$cdom); |
my ($cnum,$cdom); |
if ($env{'request.course.id'}) { |
if ($env{'request.course.id'}) { |
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
Line 4025 ENDREDIR
|
Line 4058 ENDREDIR
|
my $entry=$env{'form.like'}?$env{'form.like'}:$env{'form.unlike'}; |
my $entry=$env{'form.like'}?$env{'form.like'}:$env{'form.unlike'}; |
my ($symb,$idx)=split(/\:\:\:/,$entry); |
my ($symb,$idx)=split(/\:\:\:/,$entry); |
($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb); |
($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb); |
|
my $status='OPEN'; |
|
if ($Apache::lonhomework::parsing_a_problem || |
|
$Apache::lonhomework::parsing_a_task) { |
|
$status=$Apache::inputtags::status[-1]; |
|
} |
|
my $result; |
|
my $realsymb = &get_realsymb($symb); |
|
if (&discussion_vote_available($status,$realsymb)) { |
# |
# |
# Likes and unlikes are in db-file "disclikes" of the course |
# Likes and unlikes are in db-file "disclikes" of the course |
# The prefix is the $symb to identify the resource discussion, |
# The prefix is the $symb to identify the resource discussion, |
# and the $idx to identify the entry |
# and the $idx to identify the entry |
# |
# |
my $prefix=$symb.':'.$idx.':'; |
my $prefix=$symb.':'.$idx.':'; |
my %contrib=&Apache::lonnet::dump('disclikes', |
my %contrib=&Apache::lonnet::dump('disclikes', |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}, |
'^'.$prefix); |
'^'.$prefix); |
|
|
# Get current like or unlike status for the $idx for this user. |
# Get current like or unlike status for the $idx for this user. |
my $thisuser=$env{'user.name'}.':'.$env{'user.domain'}; |
my $thisuser=$env{'user.name'}.':'.$env{'user.domain'}; |
my ($userlikes,$userunlikes); |
my ($userlikes,$userunlikes); |
if (ref($contrib{$prefix.'likers'}) eq 'HASH') { |
if (ref($contrib{$prefix.'likers'}) eq 'HASH') { |
if (exists($contrib{$prefix.'likers'}{$thisuser})) { |
if (exists($contrib{$prefix.'likers'}{$thisuser})) { |
$userlikes = 1; |
$userlikes = 1; |
|
} |
} |
} |
} |
if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') { |
if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') { |
if (exists($contrib{$prefix.'unlikers'}{$thisuser})) { |
if (exists($contrib{$prefix.'unlikers'}{$thisuser})) { |
$userunlikes = 1; |
$userunlikes = 1; |
} |
} |
} |
} |
|
# Get the current "likes" count |
# Get the current "likes" count |
my $likes=$contrib{$prefix.'likes'}; |
my $likes=$contrib{$prefix.'likes'}; |
# Find out if they already voted |
# Find out if they already voted |
# Users cannot like a post twice, or unlike it twice. |
# Users cannot like a post twice, or unlike it twice. |
# They can change their mind, though. |
# They can change their mind, though. |
my $alreadyflag=0; |
my $alreadyflag=0; |
my $thisuser=$env{'user.name'}.':'.$env{'user.domain'}; |
my $thisuser=$env{'user.name'}.':'.$env{'user.domain'}; |
if ($env{'form.like'}) { |
if ($env{'form.like'}) { |
if ($userlikes) { |
if ($userlikes) { |
$alreadyflag=1; |
$alreadyflag=1; |
} elsif ($userunlikes) { |
} elsif ($userunlikes) { |
delete($contrib{$prefix.'unlikers'}{$thisuser}); |
delete($contrib{$prefix.'unlikers'}{$thisuser}); |
$likes++; |
$likes++; |
} else { |
|
if (ref($contrib{$prefix.'likers'}) eq 'HASH') { |
|
$contrib{$prefix.'likers'}{$thisuser} = 1; |
|
} else { |
} else { |
$contrib{$prefix.'likers'} = {$thisuser => 1}; |
if (ref($contrib{$prefix.'likers'}) eq 'HASH') { |
|
$contrib{$prefix.'likers'}{$thisuser} = 1; |
|
} else { |
|
$contrib{$prefix.'likers'} = {$thisuser => 1}; |
|
} |
|
$likes++; |
} |
} |
$likes++; |
|
} |
|
} else { |
|
if ($userunlikes) { |
|
$alreadyflag=1; |
|
} elsif ($userlikes) { |
|
delete($contrib{$prefix.'likers'}{$thisuser}); |
|
$likes--; |
|
} else { |
} else { |
if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') { |
if ($userunlikes) { |
$contrib{$prefix.'unlikers'}{$thisuser} = 1; |
$alreadyflag=1; |
|
} elsif ($userlikes) { |
|
delete($contrib{$prefix.'likers'}{$thisuser}); |
|
$likes--; |
} else { |
} else { |
$contrib{$prefix.'unlikers'} = {$thisuser => 1}; |
if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') { |
|
$contrib{$prefix.'unlikers'}{$thisuser} = 1; |
|
} else { |
|
$contrib{$prefix.'unlikers'} = {$thisuser => 1}; |
|
} |
|
$likes--; |
} |
} |
$likes--; |
|
} |
} |
} |
|
my $result; |
|
# $alreadyflag would be 1 if they tried to double-like or double-unlike |
# $alreadyflag would be 1 if they tried to double-like or double-unlike |
unless ($alreadyflag) { |
unless ($alreadyflag) { |
my %newhash=($prefix.'likes' => $likes, |
my %newhash=($prefix.'likes' => $likes, |
$prefix.'likers' => $contrib{$prefix.'likers'}, |
$prefix.'likers' => $contrib{$prefix.'likers'}, |
$prefix.'unlikers' => $contrib{$prefix.'unlikers'}); |
$prefix.'unlikers' => $contrib{$prefix.'unlikers'}); |
# Store data in db-file "disclikes" |
# Store data in db-file "disclikes" |
if (&Apache::lonnet::put('disclikes', |
if (&Apache::lonnet::put('disclikes', |
\%newhash, |
\%newhash, |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') { |
$env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') { |
# Also store with the person who posted the liked/unliked entry |
# Also store with the person who posted the liked/unliked entry |
if ($env{'form.like'}) { |
if ($env{'form.like'}) { |
&storediscussionlikes(1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); |
&storediscussionlikes(1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); |
$result=&mt("Registered 'Like'"); |
$result=&mt("Registered 'Like'"); |
|
} else { |
|
&storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); |
|
$result=&mt("Registered 'Unlike'"); |
|
} |
} else { |
} else { |
&storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'}); |
|
$result=&mt("Registered 'Unlike'"); |
|
} |
|
} else { |
|
# Oops, something went wrong |
# Oops, something went wrong |
$result=&mt("Failed to register vote"); |
$result=&mt("Failed to register vote"); |
|
} |
} |
} |
|
} else { |
|
$result=&mt('Voting unavailable for this discussion'); |
} |
} |
&redirect_back($r,$feedurl,$result.'<br />', |
&redirect_back($r,$feedurl,$result.'<br />', |
'0','0','','',$env{'form.previous'},undef,undef,undef, |
'0','0','','',$env{'form.previous'},undef,undef,undef, |
Line 4562 None
|
Line 4605 None
|
|
|
=item discussion_visible() |
=item discussion_visible() |
|
|
|
=item discussion_vote_available() |
|
|
|
=item get_realsymb() |
|
|
=item list_discussion() |
=item list_discussion() |
|
|
=item send_feedback_link() |
=item send_feedback_link() |