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

version 1.339, 2012/03/13 05:37:49 version 1.340, 2012/03/15 12:45:21
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 285  sub list_discussion { Line 265  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 311  sub list_discussion { Line 286  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,$canvote,$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,$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 769  END Line 744  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) {
                     if ($canvote eq 'notended') {                      $discussion .= '&nbsp;'.&mt('(Closed for [_1] roles)',
                         $discussion .= '&nbsp;'.&mt('(Posting and voting closed for [_1] roles)',                                                  &Apache::lonnet::plaintext('st',$crstype));
                                                     &Apache::lonnet::plaintext('st',$crstype));  
                     } else {  
                         $discussion .= '&nbsp;'.&mt('(Closed for [_1] roles)',  
                                                     &Apache::lonnet::plaintext('st',$crstype));  
                     }  
                 }                  }
             }              }
  } else {   } else {
Line 968  ENDDISCUSS Line 937  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,$canvote,$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,$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 978  sub build_posting_display { Line 947  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
         %likes=&Apache::lonnet::dump('disclikes',      my %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.
         @theselikes=();      my @theselikes=();
 # Hashes containing likes and unlikes for this user.  
         %userlikes=();  
         %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 1025  sub build_posting_display { Line 988  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 '') {                  push(@theselikes,$likes{$symb.':'.$idx.':likes'});
                         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  # Figure out average likes and standard deviation if there are enough 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
             $oneplus=$ave+$stddev;          my $oneplus=$ave+$stddev;
             $twoplus=$ave+2.*$stddev;          my $twoplus=$ave+2.*$stddev;
             $oneminus=$ave-$stddev;          my $oneminus=$ave-$stddev;
             $twominus=$ave-2.*$stddev;          my $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
 #  # 
  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'});
Line 1123  sub build_posting_display { Line 1071  sub build_posting_display {
                 my %subjects = ();                  my %subjects = ();
                 my %attachtxt = ();                  my %attachtxt = ();
                 my %allattachments = ();                  my %allattachments = ();
                 my ($screenname,$plainname,$showaboutme);                  my ($screenname,$plainname);
                 my $sender = &mt('Anonymous');                  my $sender = &mt('Anonymous');
 # Anonymous users getting number within a discussion  # Anonymous users getting number within a discussion
 # Since idx is in static order, this should give the same sequence every time.   # Since idx is in static order, this should give the same sequence every time. 
Line 1133  sub build_posting_display { Line 1081  sub build_posting_display {
     $$anonhash{$key}=&mt('Anonymous').' '.$anoncnt;      $$anonhash{$key}=&mt('Anonymous').' '.$anoncnt;
  }   }
                 my ($message,$subject,$vgrlink,$ctlink);                  my ($message,$subject,$vgrlink,$ctlink);
                 &get_post_contents(\%contrib,$idx,$seeid,$outputtarget,\%messages,\%subjects,\%allattachments,\%attachtxt,$imsfiles,\$screenname,\$plainname,\$showaboutme,$numoldver);                  &get_post_contents(\%contrib,$idx,$seeid,$outputtarget,\%messages,\%subjects,\%allattachments,\%attachtxt,$imsfiles,\$screenname,\$plainname,$numoldver);
   
   
 # Set up for sorting by subject  # Set up for sorting by subject
Line 1163  sub build_posting_display { Line 1111  sub build_posting_display {
                             }                              }
                         }                          }
         if (!$contrib{$idx.':anonymous'} || $see_anonymous) {          if (!$contrib{$idx.':anonymous'} || $see_anonymous) {
                             if ($showaboutme) {      $sender=&Apache::loncommon::aboutmewrapper(
                                 $sender = &Apache::loncommon::aboutmewrapper(   $plainname,
                                               $plainname,   $contrib{$idx.':sendername'},
                                               $contrib{$idx.':sendername'},   $contrib{$idx.':senderdomain'}).' ('.
                                               $contrib{$idx.':senderdomain'});   $contrib{$idx.':sendername'}.':'.
                             } else {   $contrib{$idx.':senderdomain'}.')';
                                 $sender = $plainname;  
                             }  
                             if ($see_anonymous) {  
                                 $sender .= ' ('.$contrib{$idx.':sendername'}.':'.  
    $contrib{$idx.':senderdomain'}.')';  
                             }  
                             $sender = '<b>'.$sender.'</b>';                              $sender = '<b>'.$sender.'</b>';
     if ($contrib{$idx.':anonymous'}) {      if ($contrib{$idx.':anonymous'}) {
         $sender.=' <font color="red"><b>['.$$anonhash{$key}.']</b></font> '.          $sender.=' <font color="red"><b>['.$$anonhash{$key}.']</b></font> '.
Line 1401  sub build_posting_display { Line 1343  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 ($seeid || $canvote) {                              if ($thislikes>$twoplus) {
 # Figure out size based on likes                                  $likesize="200";
                                 my $thislikes=$likes{$symb.':'.$idx.':likes'};                              } elsif ($thislikes>$oneplus) {
                                 if ($thislikes>$twoplus) {                                  $likesize="150";
                                     $likesize="200";                              }
                                 } elsif ($thislikes>$oneplus) {                              if ($thislikes<$twominus) {
                                     $likesize="150";                                  $likesize="50";
                                 }                              } elsif ($thislikes<$oneminus) {
                                 if ($thislikes<$twominus) {                                  $likesize="75";
                                     $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}) {                              unless ($likes{$symb.':'.$idx.':likers'}=~/\,\Q$thisuser\E\,/) {
                                     $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You 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"));
                                 } 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].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You 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].='&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"));  
                                 }  
                             }                              }
                             if ($seeid || $canvote) {                              unless ($likes{$symb.':'.$idx.':unlikers'}=~/\,\Q$thisuser\E\,/) {
                                 my $thislikes=$likes{$symb.':'.$idx.':likes'};                                  $$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"));
                                 if ($thislikes>0) {                              } else {
                                     $$discussionitems[$idx].='&nbsp;('.&mt("[_1] likes",$thislikes).')';                                  $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsdown_gray.png" alt="'.&mt('You unlike this posting').'" />';
                                 } elsif ($thislikes<0) {                              }
                                     $$discussionitems[$idx].='&nbsp;('.&mt("[_1] unlikes",abs($thislikes)).')';                              my $thislikes=$likes{$symb.':'.$idx.':likes'};
                                 }                              if ($thislikes>0) {
                                   $$discussionitems[$idx].='&nbsp;('.&mt("[_1] likes",$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 1533  sub filter_regexp { Line 1468  sub filter_regexp {
   
   
 sub get_post_contents {  sub get_post_contents {
     my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$showaboutme,$numver) = @_;      my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$numver) = @_;
     my $discussion = '';      my $discussion = '';
     my $start=$numver;      my $start=$numver;
     my $end=$numver + 1;      my $end=$numver + 1;
Line 1551  sub get_post_contents { Line 1486  sub get_post_contents {
                                         $$contrib{$idx.':sendername'},                                          $$contrib{$idx.':sendername'},
                                         $$contrib{$idx.':senderdomain'});                                          $$contrib{$idx.':senderdomain'});
     $$screenname=$$contrib{$idx.':screenname'};      $$screenname=$$contrib{$idx.':screenname'};
     $$showaboutme = &Apache::lonnet::usertools_access($$contrib{$idx.':sendername'},  
                                                       $$contrib{$idx.':senderdomain'},      my $sender=&Apache::loncommon::aboutmewrapper(
                                                       'aboutme');  
     my $sender = $$plainname;  
     if ($$showaboutme) {  
         $sender = &Apache::loncommon::aboutmewrapper(  
                                  $$plainname,                                   $$plainname,
                                  $$contrib{$idx.':sendername'},                                   $$contrib{$idx.':sendername'},
                                  $$contrib{$idx.':senderdomain'});                                   $$contrib{$idx.':senderdomain'}).' ('.
     }                                   $$contrib{$idx.':sendername'}.':'.
     if ($seeid) {                                   $$contrib{$idx.':senderdomain'}.')';
         $sender .= ' ('.$$contrib{$idx.':sendername'}.':'.  
                    $$contrib{$idx.':senderdomain'}.')';  
     }  
     my $attachmenturls = $$contrib{$idx.':attachmenturl'};      my $attachmenturls = $$contrib{$idx.':attachmenturl'};
     my @postversions = ();      my @postversions = ();
     if ($type eq 'allversions' || $type eq 'export') {      if ($type eq 'allversions' || $type eq 'export') {
Line 1680  sub mail_screen { Line 1608  sub mail_screen {
   }    }
   
   my %lt = &Apache::lonlocal::texthash(    my %lt = &Apache::lonlocal::texthash(
             'myqu' => 'My question/comment/feedback:',              'myqu' => 'Question/comment/feedback:',
             'title' => 'Title',              'title' => 'Title',
             'reta' => 'Retained attachments',              'reta' => 'Retained attachments',
             'atta' => 'Attachment',              'atta' => 'Attachment',
            );             );
     if($env{'form.editdisc'} || $env{'form.replydisc'}){
       %lt = &Apache::lonlocal::texthash(
               'myqu' => 'Post Discussion',
       );
     }
   my $restitle = &get_resource_title($caller_symb,$feedurl);    my $restitle = &get_resource_title($caller_symb,$feedurl);
   my $quote='';    my $quote='';
   my $subject = '';    my $subject = '';
Line 1895  END Line 1828  END
   }    }
   $r->print(<<END);    $r->print(<<END);
 $start_page  $start_page
   <h1>$lt{'myqu'}</h1>
 $header  $header
 <form action="/adm/feedback" method="post" name="mailform"  <form action="/adm/feedback" method="post" name="mailform"
 enctype="multipart/form-data">  enctype="multipart/form-data">
Line 1915  END Line 1849  END
   $r->print(<<END);    $r->print(<<END);
 $options  $options
 $quote  $quote
 <p>$lt{'myqu'}  <p>
 $textareaheader  $textareaheader
 </p>  </p>
   <br>
 <p>  <p>
 $latexHelp  $latexHelp
 </p>  </p>
 <p>  <p>
 $lt{'title'}: <input type="text" name="subject" size="30" value="$subject" /></p>  
 <p>  
 <textarea name="comment" id="comment" cols="60" rows="10" $textareaclass>$comment  
 </textarea></p>  
 END  END
   
   $r->print(&Apache::lonhtmlcommon::start_pick_box());
   $r->print(&Apache::lonhtmlcommon::row_title(&mt('Subject')));
   $r->print('<input type="text" name="subject" size="30" value="'."$subject".'" /></p>');
   $r->print(&Apache::lonhtmlcommon::row_closure());
   $r->print(&Apache::lonhtmlcommon::row_title(&mt('Message')));
   $r->print('<textarea name="comment" id="comment" cols="60" rows="10" $textareaclass>'."$comment".
   '</textarea>');
   $r->print(&Apache::lonhtmlcommon::row_closure(1));
   $r->print(&Apache::lonhtmlcommon::end_pick_box());
   
     if ( ($env{'form.editdisc'}) || ($env{'form.replydisc'}) ) {      if ( ($env{'form.editdisc'}) || ($env{'form.replydisc'}) ) {
         if ($env{'form.origpage'}) {          if ($env{'form.origpage'}) {
             foreach my $attach (@currnewattach) {              foreach my $attach (@currnewattach) {
Line 2838  sub screen_header { Line 2780  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 = &get_realsymb($symb);          my $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 3041  sub storefeedbacklikes { Line 2988  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 = &get_realsymb($symb);      my $realsymb;
       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 3396  sub modify_attachments { Line 3348  sub modify_attachments {
   
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                'subj' => 'Subject',                 'subj' => 'Subject',
                'thfo' => 'The following attachments were part of the most recent saved version of this posting.',  
                'chth' => 'Check the checkboxes for any you wish to remove.',                 'chth' => 'Check the checkboxes for any you wish to remove.',
                'thef' => 'The following attachments have been uploaded for inclusion with this posting.',                 'thef' => 'The following attachments have been uploaded for inclusion with this posting.',
                'adda' => 'Add a new attachment to this post.',                 'adda' => 'Add a new attachment to this post',
                'stch' => 'Save Changes',                 'stch' => 'Save Changes',
                  'clic' => 'Add/remove attachments',
              );               );
     my $js = <<END;      my $js = <<END;
 <script type="text/javascript">  <script type="text/javascript">
Line 3414  END Line 3366  END
     # Breadcrumbs      # Breadcrumbs
     my $brcrum = [{'href' => '',      my $brcrum = [{'href' => '',
                    'text' => 'Discussion Post Attachments'}];                     'text' => 'Discussion Post Attachments'}];
     my %parms=();      my %parms=('only_body' => 1);
     if ($env{'form.modal'} ne 'yes') { 'bread_crumbs' => $brcrum }      if ($env{'form.modal'} ne 'yes') { 'bread_crumbs' => $brcrum }
   
     my $start_page =       my $start_page = 
Line 3443  $start_page Line 3395  $start_page
 $toolarge  $toolarge
 <form name="modattachments" method="post" enctype="multipart/form-data" action="/adm/feedback?attach=$symb">  <form name="modattachments" method="post" enctype="multipart/form-data" action="/adm/feedback?attach=$symb">
  <br />   <br />
  <table class="LC_data_table">   <h1>$lt{'clic'}</h1>
   <tr>  
    <td colspan="2">  
     <b>Subject:</b> <b>$subject</b><br /><br />  
 END  END
     if ($idx) {      $r->print(&Apache::lonhtmlcommon::start_pick_box());
         if ($attachmenturls) {      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Subject')));
             my @currold = keys(%currattach);      $r->print('<b>'.$subject.'</b>');
             if (@currold > 0) {      $r->print(&Apache::lonhtmlcommon::row_closure());
                 $r->print($lt{'thfo'}.'<br />'.$lt{'chth'}.'<br />'."\n");        $r->print(&Apache::lonhtmlcommon::row_title($lt{'adda'}));
                 foreach my $id (@currold) {      $r->print('<input type="file" name="addnewattach" /><input type="button" name="upload" value="Upload" onclick="this.form.submit()" />  '.$attachmaxtext);
                     my $attachurl = &HTML::Entities::decode($attachments{$id}{'filename'});   
                     $attachurl =~ m#/([^/]+)$#;      if(($idx)||(ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)){
                     $r->print('<label><input type="checkbox" name="deloldattach" value="'.$id.'" />&nbsp;'.$1.'</label><br />'."\n");          $r->print(&Apache::lonhtmlcommon::row_closure());
           $r->print(&Apache::lonhtmlcommon::row_title(&mt('Attachments')));
           if ($idx) {
               if ($attachmenturls) {
                   my @currold = keys(%currattach);
                   if (@currold > 0) {
                       $r->print($lt{'thfo'}.'<br />'.$lt{'chth'}.'<br />'."\n");  
                       foreach my $id (@currold) {
                           my $attachurl = &HTML::Entities::decode($attachments{$id}{'filename'}); 
                           $attachurl =~ m#/([^/]+)$#;
                           $r->print('<label><input type="checkbox" name="deloldattach" value="'.$id.'" />&nbsp;'.$1.'</label><br />'."\n");
                       }
                       $r->print("<br />");
                 }                  }
                 $r->print("<br />");  
             }              }
         }          }
     }          if ((ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)) {
     if ((ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)) {              $r->print($lt{'chth'}.'<br />'."\n");
         $r->print($lt{'thef'}.'<br />'.$lt{'chth'}.'<br />'."\n");              foreach my $attach (@{$currnewattach}) {
         foreach my $attach (@{$currnewattach}) {                  $attach =~ m#/([^/]+)$#;
             $attach =~ m#/([^/]+)$#;                  $r->print('<label><input type="checkbox" name="delnewattach" value="'.$attach.'" />&nbsp;'.$1.'</label><br />'."\n");
             $r->print('<label><input type="checkbox" name="delnewattach" value="'.$attach.'" />&nbsp;'.$1.'</label><br />'."\n");              }
         }          }
         $r->print("<br />");   
     }      }
       $r->print(&Apache::lonhtmlcommon::row_closure(1));
       $r->print(&Apache::lonhtmlcommon::end_pick_box());
     $r->print(<<END);      $r->print(<<END);
    </td></tr>  
    <tr>  
     <td>  
    $lt{'adda'}</td><td><input type="file" name="addnewattach" /><input type="button" name="upload" value="Upload" onclick="this.form.submit()" />      
    </td>  
   </tr>  
   <tr>  
    <td colspan="2">$attachmaxtext</td>  
   </tr>  
  </table>  
 <input type="hidden" name="subject" value="$env{'form.subject'}" />  <input type="hidden" name="subject" value="$env{'form.subject'}" />
 <input type="hidden" name="comment" value="$env{'form.comment'}" />  <input type="hidden" name="comment" value="$env{'form.comment'}" />
 <input type="hidden" name="timestamp" value="$env{'form.timestamp'}" />  <input type="hidden" name="timestamp" value="$env{'form.timestamp'}" />
Line 3536  sub generate_attachments_button { Line 3487  sub generate_attachments_button {
     my ($idx,$attachnum,$ressymb,$now,$currnewattach,$deloldattach,      my ($idx,$attachnum,$ressymb,$now,$currnewattach,$deloldattach,
         $numoldver,$mode,$blockblog) = @_;          $numoldver,$mode,$blockblog) = @_;
     my $origpage = $ENV{'REQUEST_URI'};      my $origpage = $ENV{'REQUEST_URI'};
       my $att=$attachnum.' '.&mt("attachments");
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                 'clic' => 'Add/remove attachments',                  'clic' => 'Add/remove attachments',
     );       ); 
Line 3860  sub handler { Line 3812  sub handler {
           my %attachmsgs = ();            my %attachmsgs = ();
           my %allattachments = ();            my %allattachments = ();
           my %imsfiles = ();            my %imsfiles = ();
           my ($screenname,$plainname,$showaboutme);            my ($screenname,$plainname);
           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'});
           $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname,\$showaboutme));            $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname));
       }        }
       $r->print(&Apache::loncommon::end_page());        $r->print(&Apache::loncommon::end_page());
       return OK;        return OK;
Line 4058  ENDREDIR Line 4010  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 all who like or unlike this
 # Get current like or unlike status for the $idx for this user.        my $currentlikers=$contrib{$prefix.'likers'};
           my $thisuser=$env{'user.name'}.':'.$env{'user.domain'};        my $currentunlikers=$contrib{$prefix.'unlikers'};
           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  # 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 ($currentlikers=~/\,\Q$thisuser\E\,/) {
               if ($userlikes) {                $alreadyflag=1;
                   $alreadyflag=1;            } else {
               } elsif ($userunlikes) {                if ($currentunlikers=~/\,\Q$thisuser\E\,/) {
                   delete($contrib{$prefix.'unlikers'}{$thisuser});                    $currentunlikers=~s/\,\Q$thisuser\E\,//g;
                   $likes++;  
               } else {                } else {
                   if (ref($contrib{$prefix.'likers'}) eq 'HASH') {                    $currentlikers.=','.$thisuser.',';
                       $contrib{$prefix.'likers'}{$thisuser} = 1;  
                   } else {  
                       $contrib{$prefix.'likers'} = {$thisuser => 1};  
                   }  
                   $likes++;  
               }                }
                 $likes++;
             } 
         } else {
             if ($currentunlikers=~/\,\Q$thisuser\E\,/) {
                 $alreadyflag=1;
           } else {            } else {
               if ($userunlikes) {                if ($currentlikers=~/\,\Q$thisuser\E\,/) {
                   $alreadyflag=1;                    $currentlikers=~s/\,\Q$thisuser\E\,//g;
               } elsif ($userlikes) {  
                   delete($contrib{$prefix.'likers'}{$thisuser});  
                   $likes--;  
               } else {                } else {
                   if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') {                    $currentunlikers.=','.$thisuser.',';
                       $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'   => $currentlikers,
                            $prefix.'unlikers' => $contrib{$prefix.'unlikers'});                         $prefix.'unlikers' => $currentunlikers);
 # 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 {
 # Oops, something went wrong                    &storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'});
                   $result=&mt("Failed to register vote");                    $result=&mt("Registered 'Unlike'");
               }                }
             } else {
   # Oops, something went wrong
                 $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 4605  None Line 4529  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.339  
changed lines
  Added in v.1.340


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