Diff for /loncom/interface/lonfeedback.pm between versions 1.338 and 1.339

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 .= '&nbsp;'.&mt('(Closed for [_1] roles)',                      if ($canvote eq 'notended') {
                                                 &Apache::lonnet::plaintext('st',$crstype));                          $discussion .= '&nbsp;'.&mt('(Posting and voting closed for [_1] roles)',
                                                       &Apache::lonnet::plaintext('st',$crstype));
                       } else {
                           $discussion .= '&nbsp;'.&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].='&nbsp;&nbsp;'.$ctlink;                                  $$discussionitems[$idx].='&nbsp;&nbsp;'.$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].='&nbsp;'.&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].='&nbsp;'.&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].='&nbsp;'.&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].='&nbsp;'.&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].='&nbsp;('.&mt("[_1] likes",$thislikes).')';                                  if ($thislikes>0) {
                             } elsif ($thislikes<0) {                                      $$discussionitems[$idx].='&nbsp;('.&mt("[_1] likes",$thislikes).')';
                                 $$discussionitems[$idx].='&nbsp;('.&mt("[_1] unlikes",abs($thislikes)).')';                                  } elsif ($thislikes<0) {
                                       $$discussionitems[$idx].='&nbsp;('.&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()

Removed from v.1.338  
changed lines
  Added in v.1.339


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