[LON-CAPA-cvs] cvs: loncom /interface lonfeedback.pm

raeburn raeburn at source.lon-capa.org
Thu Mar 15 09:27:25 EDT 2012


raeburn		Thu Mar 15 13:27:25 2012 EDT

  Modified files:              
    /loncom/interface	lonfeedback.pm 
  Log:
  - Reinstating changes in 1.336, 1.337, 1.338 & 1.339 which were removed in 1.340.
  
  
-------------- next part --------------
Index: loncom/interface/lonfeedback.pm
diff -u loncom/interface/lonfeedback.pm:1.340 loncom/interface/lonfeedback.pm:1.341
--- loncom/interface/lonfeedback.pm:1.340	Thu Mar 15 12:45:21 2012
+++ loncom/interface/lonfeedback.pm	Thu Mar 15 13:27:25 2012
@@ -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.341 2012/03/15 13:27:25 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -82,6 +82,26 @@
     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(); }
@@ -265,6 +285,11 @@
     } else {
         $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 %shown = ();
     my @posteridentity=();
@@ -286,7 +311,7 @@
     $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,$canvote,$prevread,$sortposts,$encsymb,$readkey,$showunmark,$showonlyunread,$totposters,\@rolefilter,\@sectionpick,\@grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,\%anonhash,$anoncnt,$group);
 
     my $discussion='';
     my $manifestfile;
@@ -744,9 +769,15 @@
             $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 {
@@ -937,7 +968,7 @@
 }
 
 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 @index=();
     my $skip_group_check = 0;
@@ -947,14 +978,20 @@
     my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
 			  $env{'course.'.$env{'request.course.id'}.'.num'});
+    my (%likes,%userlikes,%userunlikes, at theselikes,$oneplus,$twoplus,$oneminus,$twominus);
+    my $thisuser=$env{'user.name'}.':'.$env{'user.domain'};
+    if ($seeid || $canvote) {
 # 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'}.'.num'},
                           '^'.$symb.':');
-    my $thisuser=$env{'user.name'}.':'.$env{'user.domain'};
 # Array with likes to figure out averages, etc.
-    my @theselikes=();
+        @theselikes=();
+# Hashes containing likes and unlikes for this user.
+        %userlikes=();
+        %userunlikes=();
+    }
 # Is the user allowed to see the real name behind anonymous postings?
     my $see_anonymous = 
 	&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
@@ -988,40 +1025,55 @@
                      &filter_regexp($rolefilter,$sectionpick,$statusfilter);
             $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
-        for (my $id=1;$id<=$contrib{'version'};$id++) {
-            my $idx=$id;
-            next if ($contrib{$idx.':deleted'});
-            next if ($contrib{$idx.':hidden'});
-            unless ((($hiddens{$idx}) && (!$seeid)) || ($deletions{$idx}) || (!$contrib{$idx.':message'})) {
-                push(@theselikes,$likes{$symb.':'.$idx.':likes'});
+            for (my $id=1;$id<=$contrib{'version'};$id++) {
+                my $idx=$id;
+                next if ($contrib{$idx.':deleted'});
+                next if ($contrib{$idx.':hidden'});
+                unless ((($hiddens{$idx}) && (!$seeid)) || ($deletions{$idx}) || (!$contrib{$idx.':message'})) {
+                    if ($likes{$symb.':'.$idx.':likes'} ne '') {
+                        push(@theselikes,$likes{$symb.':'.$idx.':likes'});
+                        if (ref($likes{$symb.':'.$idx.':likers'}) eq 'HASH') {
+                            if (exists($likes{$symb.':'.$idx.':likers'}{$thisuser})) {
+                                $userlikes{$idx} = 1;
+                            }
+                        }
+                        if (ref($likes{$symb.':'.$idx.':unlikers'}) eq 'HASH') {
+                            if (exists($likes{$symb.':'.$idx.':unlikers'}{$thisuser})) {
+                                $userunlikes{$idx} = 1;
+                            }
+                        }
+                    }
+                }
             }
-        }
-# Figure out average likes and standard deviation if there are enough discussions to warrant that
-        my $ave=0;
-        my $stddev=10000;
-        if ($#theselikes>1) {
-            my $sum=0;
-            my $num=$#theselikes+1;
-            foreach my $thislike (@theselikes) {
-                $sum+=$thislike;
-            }
-            $ave=$sum/$num;
-            my $sumsq=0;
-            foreach my $thislike (@theselikes) {
-                $sumsq+=($thislike-$ave)*($thislike-$ave);
+# Figure out average likes and standard deviation if there are enough 
+# discussions to warrant that
+            my $ave=0;
+            my $stddev=10000;
+            if ($#theselikes>1) {
+                my $sum=0;
+                my $num=$#theselikes+1;
+                foreach my $thislike (@theselikes) {
+                    $sum+=$thislike;
+                }
+                $ave=$sum/$num;
+                my $sumsq=0;
+                foreach my $thislike (@theselikes) {
+                    $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
 # Get the boundaries for markup
-        my $oneplus=$ave+$stddev;
-        my $twoplus=$ave+2.*$stddev;
-        my $oneminus=$ave-$stddev;
-        my $twominus=$ave-2.*$stddev;
+            $oneplus=$ave+$stddev;
+            $twoplus=$ave+2.*$stddev;
+            $oneminus=$ave-$stddev;
+            $twominus=$ave-2.*$stddev;
+        }
 #
 # This is now the real loop. Go through all entries, pick up what we need
-# 
+#
 	for (my $id=1;$id<=$contrib{'version'};$id++) {
 	    my $idx=$id;
             next if ($contrib{$idx.':deleted'});
@@ -1071,7 +1123,7 @@
                 my %subjects = ();
                 my %attachtxt = ();
                 my %allattachments = ();
-                my ($screenname,$plainname);
+                my ($screenname,$plainname,$showaboutme);
                 my $sender = &mt('Anonymous');
 # Anonymous users getting number within a discussion
 # Since idx is in static order, this should give the same sequence every time. 
@@ -1081,7 +1133,7 @@
 		    $$anonhash{$key}=&mt('Anonymous').' '.$anoncnt;
 		}
                 my ($message,$subject,$vgrlink,$ctlink);
-                &get_post_contents(\%contrib,$idx,$seeid,$outputtarget,\%messages,\%subjects,\%allattachments,\%attachtxt,$imsfiles,\$screenname,\$plainname,$numoldver);
+                &get_post_contents(\%contrib,$idx,$seeid,$outputtarget,\%messages,\%subjects,\%allattachments,\%attachtxt,$imsfiles,\$screenname,\$plainname,\$showaboutme,$numoldver);
 
 
 # Set up for sorting by subject
@@ -1111,12 +1163,18 @@
                             }
                         }
 		        if (!$contrib{$idx.':anonymous'} || $see_anonymous) {
-			    $sender=&Apache::loncommon::aboutmewrapper(
-					 $plainname,
-					 $contrib{$idx.':sendername'},
-					 $contrib{$idx.':senderdomain'}).' ('.
-					 $contrib{$idx.':sendername'}.':'.
-					 $contrib{$idx.':senderdomain'}.')';
+                            if ($showaboutme) {
+                                $sender = &Apache::loncommon::aboutmewrapper(
+                                              $plainname,
+                                              $contrib{$idx.':sendername'},
+                                              $contrib{$idx.':senderdomain'});
+                            } else {
+                                $sender = $plainname;
+                            }
+                            if ($see_anonymous) {
+                                $sender .= ' ('.$contrib{$idx.':sendername'}.':'.
+					   $contrib{$idx.':senderdomain'}.')';
+                            }
                             $sender = '<b>'.$sender.'</b>';
 			    if ($contrib{$idx.':anonymous'}) {
 			        $sender.=' <font color="red"><b>['.$$anonhash{$key}.']</b></font> '.
@@ -1343,40 +1401,47 @@
                             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].= '<br /><blockquote>'.
                                     "<div style='font-size:$likesize%'>".
                                     $message.
                                     '</div></blockquote>';
+                            if ($canvote) {
 # Put in the like and unlike buttons
-                            unless ($likes{$symb.':'.$idx.':likers'}=~/\,\Q$thisuser\E\,/) {
-                                $$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"));
-                            } else {
-                                $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You like this posting').'" />';
-                            }
-                            unless ($likes{$symb.':'.$idx.':unlikers'}=~/\,\Q$thisuser\E\,/) {
-                                $$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"));
-                            } else {
-                                $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsdown_gray.png" alt="'.&mt('You unlike this posting').'" />';
+                                if ($userlikes{$idx}) {
+                                    $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You like this posting').'" />';
+                                } 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"));
+                                }
+                                if ($userunlikes{$idx}) {
+                                    $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsdown_gray.png" alt="'.&mt('You unlike this posting').'" />';
+                                } 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"));
+                                }
                             }
-                            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'}) {
@@ -1468,7 +1533,7 @@
 
 
 sub get_post_contents {
-    my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$numver) = @_;
+    my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$showaboutme,$numver) = @_;
     my $discussion = '';
     my $start=$numver;
     my $end=$numver + 1;
@@ -1486,13 +1551,20 @@
                                         $$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') {
@@ -2780,12 +2852,7 @@
         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 +3055,7 @@
 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 +3465,6 @@
     $r->print(&Apache::lonhtmlcommon::row_closure());
     $r->print(&Apache::lonhtmlcommon::row_title($lt{'adda'}));
     $r->print('<input type="file" name="addnewattach" /><input type="button" name="upload" value="Upload" onclick="this.form.submit()" />  '.$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 +3472,9 @@
             if ($attachmenturls) {
                 my @currold = keys(%currattach);
                 if (@currold > 0) {
-                    $r->print($lt{'thfo'}.'<br />'.$lt{'chth'}.'<br />'."\n");  
+                    $r->print($lt{'thfo'}.'<br />'.$lt{'chth'}.'<br />'."\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('<label><input type="checkbox" name="deloldattach" value="'.$id.'" /> '.$1.'</label><br />'."\n");
                     }
@@ -3421,13 +3482,6 @@
                 }
             }
         }
-        if ((ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)) {
-            $r->print($lt{'chth'}.'<br />'."\n");
-            foreach my $attach (@{$currnewattach}) {
-                $attach =~ m#/([^/]+)$#;
-                $r->print('<label><input type="checkbox" name="delnewattach" value="'.$attach.'" /> '.$1.'</label><br />'."\n");
-            }
-        }
     }
     $r->print(&Apache::lonhtmlcommon::row_closure(1));
     $r->print(&Apache::lonhtmlcommon::end_pick_box());
@@ -3812,11 +3866,11 @@
           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));
+          $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname,\$showaboutme));
       }
       $r->print(&Apache::loncommon::end_page());
       return OK;
@@ -4010,71 +4064,99 @@
       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 $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
 # 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',
+          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'};
+
+# 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($contrib{$prefix.'likers'}) eq 'HASH') {
+              if (exists($contrib{$prefix.'likers'}{$thisuser})) {
+                  $userlikes = 1;
+              }
+          }
+          if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') {
+              if (exists($contrib{$prefix.'unlikers'}{$thisuser})) {
+                  $userunlikes = 1;
+              }
+          }
 # Get the current "likes" count
-      my $likes=$contrib{$prefix.'likes'};
+          my $likes=$contrib{$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;
+# 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 ($userlikes) {
+                  $alreadyflag=1;
+              } elsif ($userunlikes) {
+                  delete($contrib{$prefix.'unlikers'}{$thisuser});
+                  $likes++;
               } else {
-                  $currentlikers.=','.$thisuser.',';
+                  if (ref($contrib{$prefix.'likers'}) eq 'HASH') {
+                      $contrib{$prefix.'likers'}{$thisuser} = 1;
+                  } else {
+                      $contrib{$prefix.'likers'} = {$thisuser => 1};
+                  }
+                  $likes++;
               }
-              $likes++;
-          } 
-      } else {
-          if ($currentunlikers=~/\,\Q$thisuser\E\,/) {
-              $alreadyflag=1;
           } else {
-              if ($currentlikers=~/\,\Q$thisuser\E\,/) {
-                  $currentlikers=~s/\,\Q$thisuser\E\,//g;
+              if ($userunlikes) {
+                  $alreadyflag=1;
+              } elsif ($userlikes) {
+                  delete($contrib{$prefix.'likers'}{$thisuser});
+                  $likes--;
               } else {
-                  $currentunlikers.=','.$thisuser.',';
+                  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
-      unless ($alreadyflag) {
-          my %newhash=($prefix.'likes'    => $likes,
-                       $prefix.'likers'   => $currentlikers,
-                       $prefix.'unlikers' => $currentunlikers);
+          unless ($alreadyflag) {
+              my %newhash=($prefix.'likes'    => $likes,
+                           $prefix.'likers'   => $contrib{$prefix.'likers'},
+                           $prefix.'unlikers' => $contrib{$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,
+                                       $env{'course.'.$env{'request.course.id'}.'.domain'},
+                                       $env{'course.'.$env{'request.course.id'}.'.num'}) 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'");
+                  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 {
-                  &storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'});
-                  $result=&mt("Registered 'Unlike'");
-              }
-          } else {
 # 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 />',
                      '0','0','','',$env{'form.previous'},undef,undef,undef,
@@ -4529,6 +4611,10 @@
 
 =item discussion_visible()
 
+=item discussion_vote_available()
+
+=item get_realsymb()
+
 =item list_discussion()
 
 =item send_feedback_link()


More information about the LON-CAPA-cvs mailing list