Diff for /loncom/interface/lonfeedback.pm between versions 1.348 and 1.349

version 1.348, 2012/03/17 02:55:15 version 1.349, 2012/03/17 04:02:28
Line 3204  sub getdiscussionrecords { Line 3204  sub getdiscussionrecords {
   
 sub getdiscussionstats {  sub getdiscussionstats {
     my %record=&getdiscussionrecords(@_);      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  # Calculate discussion karma
Line 3268  sub storediscussionpoints { Line 3269  sub storediscussionpoints {
 # Store discussion "likes"  # Store discussion "likes"
   
 sub storediscussionlikes {  sub storediscussionlikes {
     my ($likes,$uname,$udom,$course)=@_;      my ($chglikes,$chgunlikes,$uname,$udom,$course,$context)=@_;
     unless ($likes) { $likes=0; }  
     if ($likes>0) { $likes=1; }  
     if ($likes<0) { $likes=-1; }  
     unless ($uname) { $uname=$env{'user.name'}; }      unless ($uname) { $uname=$env{'user.name'}; }
     unless ($udom)  { $udom=$env{'user.domain'}; }      unless ($udom)  { $udom=$env{'user.domain'}; }
     unless ($course) { $course=$env{'request.course.id'}; }      unless ($course) { $course=$env{'request.course.id'}; }
     my %record=&getdiscussionrecords($uname,$udom,$course);      my %record=&getdiscussionrecords($uname,$udom,$course);
     my $totallikes=$record{'totallikes'};      my $totallikes=$record{'totallikes'};
     my $totalvotes=$record{'totalvotes'};      my $totalunlikes=$record{'totalunlikes'};
     $totallikes+=$likes;      $totallikes += $chglikes;
     $totalvotes++;      $totalunlikes += $chgunlikes;
     my %newrecord=('likes_user'   => $env{'user.name'},      my %newrecord=('likes_user'   => $env{'user.name'},
                    'likes_domain' => $env{'user.domain'},                     'likes_domain' => $env{'user.domain'},
                    'likes' => $likes,                     'totallikes'   => $totallikes,
                    'totallikes' => $totallikes,                     'totalunlikes' => $totalunlikes,
                    'totalvotes' => $totalvotes);                     'context'      => $context);
     my $status=&Apache::lonnet::cstore(\%newrecord,'_discussion',$course,$udom,$uname);      my $status=&Apache::lonnet::cstore(\%newrecord,'_discussion',$course,$udom,$uname);
     if ($status eq 'ok') {      if ($status eq 'ok') {
         &updatekarma($uname,$udom,$course);          &updatekarma($uname,$udom,$course);
Line 4070  ENDREDIR Line 4068  ENDREDIR
                                    $cdom,$cnum);                                     $cdom,$cnum);
           }            }
       }        }
       &Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},        my $result;
                             $cdom,$cnum);        if (&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},
                                    $cdom,$cnum) eq 'ok') {
       &redirect_back($r,$feedurl,&mt('Changed discussion status').'<br />',            my $prefix=$symb.':'.$idx.':';
      '0','0','','',$env{'form.previous'},undef,undef,undef,            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.'<br />','0','0','','',
        $env{'form.previous'},undef,undef,undef,
                      undef,undef,undef,$group);                       undef,undef,undef,$group);
       return OK;        return OK;
   } elsif (($env{'form.like'}) || ($env{'form.unlike'})) {    } elsif (($env{'form.like'}) || ($env{'form.unlike'})) {
Line 4126  ENDREDIR Line 4156  ENDREDIR
 # 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 $votetype;
                   if ($env{'form.like'}) {                    if ($env{'form.like'}) {
                       if ($userlikes) {                        if ($userlikes) {
                           $alreadyflag=1;                            $alreadyflag=1;
                       } elsif ($userunlikes) {                        } elsif ($userunlikes) {
                           delete($likes{$prefix.'unlikers'}{$thisuser});                            delete($likes{$prefix.'unlikers'}{$thisuser});
                             $votetype = 'switch';
                           $likescount++;                            $likescount++;
                       } else {                        } else {
                           if (ref($likes{$prefix.'likers'}) eq 'HASH') {                            if (ref($likes{$prefix.'likers'}) eq 'HASH') {
Line 4145  ENDREDIR Line 4177  ENDREDIR
                           $alreadyflag=1;                            $alreadyflag=1;
                       } elsif ($userlikes) {                        } elsif ($userlikes) {
                           delete($likes{$prefix.'likers'}{$thisuser});                            delete($likes{$prefix.'likers'}{$thisuser});
                             $votetype = 'switch';
                           $likescount--;                            $likescount--;
                       } else {                        } else {
                           if (ref($likes{$prefix.'unlikers'}) eq 'HASH') {                            if (ref($likes{$prefix.'unlikers'}) eq 'HASH') {
Line 4169  ENDREDIR Line 4202  ENDREDIR
 # Store data in db-file "disclikes"  # Store data in db-file "disclikes"
                       if (&Apache::lonnet::put('disclikes',\%newhash,$cdom,$cnum) eq 'ok') {                        if (&Apache::lonnet::put('disclikes',\%newhash,$cdom,$cnum) eq 'ok') {
 # Also store with the person who posted the liked/unliked entry  # Also store with the person who posted the liked/unliked entry
                             my ($chglike,$chgunlike);
                           if ($env{'form.like'}) {                            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'");                                $result=&mt("Registered 'Like'");
                           } else {                            } 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'");                               $result=&mt("Registered 'Unlike'");
                           }                            }
                       } else {                        } else {
Line 4225  ENDREDIR Line 4279  ENDREDIR
                                $cdom,$cnum);                                 $cdom,$cnum);
       }        }
       my %newhash=('deleted' => $contrib{'deleted'}.".$idx.");        my %newhash=('deleted' => $contrib{'deleted'}.".$idx.");
       &Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},  
                              $cdom,$cnum);        my $result;
       &redirect_back($r,$feedurl,&mt('Changed discussion status').'<br />',        if (&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},
      '0','0','','',$env{'form.previous'},undef,undef,undef,                               $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.'<br />','0','0','','',
        $env{'form.previous'},undef,undef,undef,
                      undef,undef,undef,$group);                       undef,undef,undef,$group);
       return OK;        return OK;
   } elsif ($env{'form.preview'}) {    } elsif ($env{'form.preview'}) {
Line 4289  ENDREDIR Line 4368  ENDREDIR
       my $ressymb=&wrap_symb($symb);        my $ressymb=&wrap_symb($symb);
       $r->print(&Apache::loncommon::start_page('Undelete all deleted discussion entries'));        $r->print(&Apache::loncommon::start_page('Undelete all deleted discussion entries'));
       if (&can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum)) {        if (&can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum)) {
            if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'},            my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
                                       $cdom,$cnum) eq 'ok') {                                                  $cdom,$cnum);
                $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries")));            $contrib{'deleted'} =~ s/^\.//;
            } else {            $contrib{'deleted'} =~ s/\.$//;
                $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1));            if ($contrib{'deleted'} ne '') {
            }                if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'},
            $r->print("<br /><a href='$feedurl'>".&mt("Return and reload")."</a>");                                            $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("<br /><a href='$feedurl'>".&mt("Return and reload")."</a>");
       }        }
       $r->print(&Apache::loncommon::end_page());        $r->print(&Apache::loncommon::end_page());
       return OK;        return OK;
Line 4654  None Line 4765  None
   
 =item list_discussion()  =item list_discussion()
   
   =item can_see_discussion()
   
 =item send_feedback_link()  =item send_feedback_link()
   
 =item send_message_link()  =item send_message_link()

Removed from v.1.348  
changed lines
  Added in v.1.349


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