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

version 1.348, 2012/03/17 02:55:15 version 1.351, 2012/03/17 14:49:29
Line 513  imscp_v1p1.xsd http://www.imsglobal.org/ Line 513  imscp_v1p1.xsd http://www.imsglobal.org/
         my $currdepth = 0;          my $currdepth = 0;
         my $firstidx = $alldiscussion{$showposts[0]};          my $firstidx = $alldiscussion{$showposts[0]};
         foreach my $post (@showposts) {          foreach my $post (@showposts) {
             unless (($sortposts eq 'thread') || (($sortposts eq '') && ($env{'environment.threadeddiscussion'})) || ($outputtarget eq 'export')) {              unless (($sortposts eq 'thread') || 
                       (($sortposts eq '') && (!$env{'environment.unthreadeddiscussion'})) || 
                       ($outputtarget eq 'export')) {
                 $alldiscussion{$post} = $post;                  $alldiscussion{$post} = $post;
             }              }
             unless ( ($notshown{$alldiscussion{$post}} eq '1') || ($shown{$alldiscussion{$post}} == 0) ) {              unless ( ($notshown{$alldiscussion{$post}} eq '1') || ($shown{$alldiscussion{$post}} == 0) ) {
Line 1117  sub build_posting_display { Line 1119  sub build_posting_display {
     my $origindex='0.';      my $origindex='0.';
             my $numoldver=0;              my $numoldver=0;
     if ($contrib{$idx.':replyto'}) {      if ($contrib{$idx.':replyto'}) {
                 if ( (($env{'environment.threadeddiscussion'}) && ($sortposts eq '')) || ($sortposts eq 'thread') || ($outputtarget eq 'export')) {                  if ( ((!$env{'environment.unthreadeddiscussion'}) && ($sortposts eq '')) || 
                        ($sortposts eq 'thread') || ($outputtarget eq 'export')) {
 # this is a follow-up message  # this is a follow-up message
     $original[$idx]=$original[$contrib{$idx.':replyto'}];      $original[$idx]=$original[$contrib{$idx.':replyto'}];
     $$depth[$idx]=$$depth[$contrib{$idx.':replyto'}]+1;      $$depth[$idx]=$$depth[$contrib{$idx.':replyto'}]+1;
Line 1330  sub build_posting_display { Line 1333  sub build_posting_display {
                 }                  }
                 if ($outputtarget eq 'export' || $message) {                  if ($outputtarget eq 'export' || $message) {
     my $thisindex=$idx;      my $thisindex=$idx;
     if ( (($env{'environment.threadeddiscussion'}) && ($sortposts eq '')) || ($sortposts eq 'thread') || ($outputtarget eq 'export')) {      if ( ((!$env{'environment.unthreadeddiscussion'}) && ($sortposts eq '')) || 
                            ($sortposts eq 'thread') || ($outputtarget eq 'export')) {
  $thisindex=$origindex.substr('00'.$$replies[$$depth[$idx]],-2,2);   $thisindex=$origindex.substr('00'.$$replies[$$depth[$idx]],-2,2);
     }      }
     $$alldiscussion{$thisindex}=$idx;      $$alldiscussion{$thisindex}=$idx;
Line 1453  sub build_posting_display { Line 1457  sub build_posting_display {
                                     $message.                                      $message.
                                     '</div></blockquote>';                                      '</div></blockquote>';
                             if ($canvote) {                              if ($canvote) {
                                   my $ownpost;
                                   if (($uname eq $env{'user.name'}) &&
                                       ($udom eq $env{'user.domain'})) {
                                       $ownpost = 1;
                                   }   
 # Put in the like and unlike buttons  # Put in the like and unlike buttons
                                 if (($uname eq $env{'user.name'}) && ($udom eq $env{'user.domain'})) {                                  if ($ownpost || (($hiddens{$idx}) && ($seehidden))) { 
                                     my $novote = &mt('No voting for your own posts');                                      my $novote;
                                       if ($ownpost) { 
                                           $novote = &mt('No voting for your own posts.');
                                       } else {
                                           $novote = &mt('No voting for hidden posts.');
                                       }
                                     $$discussionitems[$idx].=                                      $$discussionitems[$idx].=
                                         '<a href="javascript:alert('."'$novote'".');" style="text-decoration: none;">'.                                          '<a href="javascript:alert('."'$novote'".');" style="text-decoration: none;">'.
                                         '<img border="0" src="/res/adm/pages/thumbsup_novote.png" alt="'.$novote.'" />&nbsp;'.                                          '<img border="0" src="/res/adm/pages/thumbsup_novote.png" alt="'.$novote.'" />&nbsp;'.
                                         '<img border="0" src="/res/adm/pages/thumbsdown_novote.png" alt="'.$novote.'" /></a>';                                           '<img border="0" src="/res/adm/pages/thumbsdown_novote.png" alt="'.$novote.'" /></a>'; 
   
                                 } else {                                  } else {
                                     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').'" />';
Line 3204  sub getdiscussionrecords { Line 3219  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 3284  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 4083  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 4093  ENDREDIR Line 4138  ENDREDIR
           if (&discussion_vote_available($status,$realsymb)) {            if (&discussion_vote_available($status,$realsymb)) {
               my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},                my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
                                                    $cdom,$cnum);                                                     $cdom,$cnum);
                 my $ownpost;
               if (($contrib{$idx.':sendername'} eq $env{'user.name'}) &&                 if (($contrib{$idx.':sendername'} eq $env{'user.name'}) && 
                   ($contrib{$idx.':senderdomain'} eq $env{'user.domain'})) {                    ($contrib{$idx.':senderdomain'} eq $env{'user.domain'})) {
                   $result = &mt("Vote not registered. No voting for your own posts.");                    $ownpost = 1;
                 }
                 if ($ownpost || $contrib{$idx.':hidden'} || $contrib{$idx.':deleted'}) {
                     $result = &mt('Vote not registered.').' ';
                 }
                 if ($ownpost) {
                     $result .= &mt('No voting for your own posts.');
                 } elsif ($contrib{$idx.':hidden'}) {
                     $result .= &mt('No voting for hidden posts.');
                 } elsif ($contrib{$idx.':deleted'}) {
                     $result .= &mt('No voting for deleted posts.');
               } else {                } else {
   
 #  #
 # 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,
Line 4126  ENDREDIR Line 4181  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 4202  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 4227  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 4194  ENDREDIR Line 4273  ENDREDIR
       return OK;        return OK;
   } elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) {    } elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) {
       my ($symb,$feedurl)=&get_feedurl_and_clean_symb($env{'form.symb'});        my ($symb,$feedurl)=&get_feedurl_and_clean_symb($env{'form.symb'});
       if ($env{'form.cmd'} eq 'threadedon') {        if ($env{'form.cmd'} eq 'threadedoff') {
     &Apache::lonnet::put('environment',{'unthreadeddiscussion' => 'on'});
     &Apache::lonnet::appenv({'environment.unthreadeddiscussion' => 'on'});
     &Apache::lonnet::del('environment',['threadeddiscussion']);
     &Apache::lonnet::delenv('environment.threadeddiscussion');
         } else {
   &Apache::lonnet::put('environment',{'threadeddiscussion' => 'on'});    &Apache::lonnet::put('environment',{'threadeddiscussion' => 'on'});
   &Apache::lonnet::appenv({'environment.threadeddiscussion' => 'on'});    &Apache::lonnet::appenv({'environment.threadeddiscussion' => 'on'});
       } else {    &Apache::lonnet::del('environment',['unthreadeddiscussion']);
    &Apache::lonnet::del('environment',['threadeddiscussion']);    &Apache::lonnet::delenv('environment.unthreadeddiscussion');
   &Apache::lonnet::delenv('environment.threadeddiscussion');  
       }        }
       &redirect_back($r,$feedurl,&mt('Changed discussion view mode').'<br />',        &redirect_back($r,$feedurl,&mt('Changed discussion view mode').'<br />',
      '0','0','','',$env{'form.previous'},undef,undef,undef,       '0','0','','',$env{'form.previous'},undef,undef,undef,
Line 4225  ENDREDIR Line 4308  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 4397  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 4794  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.351


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