Diff for /loncom/interface/lonfeedback.pm between versions 1.318 and 1.342

version 1.318, 2012/01/04 18:23:38 version 1.342, 2012/03/15 15:02:59
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 759  END Line 790  END
   
   
 sub discussion_link {  sub discussion_link {
    my ($ressymb,$linktext,$cmd,$item,$flag,$prev,$adds)=@_;     my ($ressymb,$linktext,$cmd,$item,$flag,$prev,$adds,$title)=@_;
    my $link='/adm/feedback?inhibitmenu=yes&modal=yes&'.$cmd.'='.&escape($ressymb).':::'.$item;     my $link='/adm/feedback?inhibitmenu=yes&modal=yes&'.$cmd.'='.&escape($ressymb).':::'.$item;
    if ($flag) { $link .= '&amp;previous='.$prev; }     if ($flag) { $link .= '&amp;previous='.$prev; }
    if ($adds) { $link .= $adds; }     if ($adds) { $link .= $adds; }
    return &Apache::loncommon::modal_link($link,$linktext,600,600);     my $width=600;
      my $height=600;
      if (($cmd eq 'hide') || ($cmd eq 'unhide') || ($cmd eq 'like') || ($cmd eq 'unlike')) {
          $width=300;
          $height=200;
      }
      return &Apache::loncommon::modal_link($link,$linktext,$width,$height,undef,undef,$title);
 }  }
   
   
Line 781  sub send_feedback_link { Line 818  sub send_feedback_link {
 sub send_message_link {  sub send_message_link {
     my ($ressymb) = @_;      my ($ressymb) = @_;
     my $output = '<span class="LC_message_link">'.      my $output = '<span class="LC_message_link">'.
                  '  <a href="/adm/feedback?sendmessageonly=1&amp;symb='.                   &discussion_link($ressymb,
                  &escape($ressymb).'"><img alt="" class="LC_noBorder" src="'.                      '<img alt="" class="LC_noBorder" src="'.
                  &Apache::loncommon::lonhttpdurl('/res/adm/pages/feedback.png').                      &Apache::loncommon::lonhttpdurl('/res/adm/pages/feedback.png').
                  '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Send Feedback').'</span></a></span>';                      '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Send Feedback').'</span>',
                       'sendmessageonly').
                    '</span>';
     return $output;      return $output;
 }  }
   
Line 821  sub action_links_bar { Line 860  sub action_links_bar {
         $discussion .= '&amp;previous='.$prevread;          $discussion .= '&amp;previous='.$prevread;
     }      }
     $discussion .= &group_args($group);      $discussion .= &group_args($group);
     $discussion .= '">'.&mt('Export').'</a></td>';      $discussion .= '">'.&mt('Export').'</a>';
       if (&Apache::lonnet::allowed('rin',$env{'request.course.id'})) {
           $discussion .= '&nbsp;&nbsp;';
           $discussion .='<a href="/adm/feedback?undeleteall='.$escsymb;
           if ($newpostsflag) {
               $discussion .= '&amp;previous='.$prevread;
           }
           $discussion .= &group_args($group);
           $discussion .= '">'.&mt('Undelete all deleted entries').'</a>';
       }
       $discussion.='</td>';
     if ($newpostsflag) {      if ($newpostsflag) {
         if (!$markondisp) {          if (!$markondisp) {
             $discussion .='<td class="LC_disc_action_right"><a href="/adm/preferences?action=changediscussions';              $discussion .='<td class="LC_disc_action_right"><a href="/adm/preferences?action=changediscussions';
Line 870  sub postingform_display { Line 919  sub postingform_display {
 <input type="submit" name="anondiscuss" value="$lt{'poan'}" /> <input type="hidden" name="symb" value="$ressymb" />  <input type="submit" name="anondiscuss" value="$lt{'poan'}" /> <input type="hidden" name="symb" value="$ressymb" />
 <input type="hidden" name="sendit" value="true" />  <input type="hidden" name="sendit" value="true" />
 <input type="hidden" name="timestamp" value="$now" />  <input type="hidden" name="timestamp" value="$now" />
 <br /><a name="newpost"></a>  <a name="newpost"></a>
 <font size="1">$lt{'note'}</font><br />  <font size="1">$lt{'note'}</font><br />
 <b>$lt{'title'}:</b>&nbsp;<input type="text" name="subject" value="$subject" size="30" /><br /><br />  <b>$lt{'title'}:</b>&nbsp;<input type="text" name="subject" value="$subject" size="30" /><br />
 <textarea name="comment" cols="80" rows="14" id="comment" $textareaclass>$comment</textarea>  <textarea name="comment" cols="80" rows="14" id="comment" $textareaclass>$comment</textarea>
 ENDDISCUSS  ENDDISCUSS
     if ($env{'form.origpage'}) {      if ($env{'form.origpage'}) {
Line 919  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;
     my $symb=&Apache::lonenc::check_decrypt($ressymb);      my $symb=&Apache::lonenc::check_decrypt($ressymb);
     my $escsymb=&escape($ressymb);      my $escsymb=&escape($ressymb);
   # These are the discussion contributions
     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
           %likes=&Apache::lonnet::dump('disclikes',
                             $env{'course.'.$env{'request.course.id'}.'.domain'},
                             $env{'course.'.$env{'request.course.id'}.'.num'},
                             '^'.$symb.':');
   # Array with likes to figure out averages, etc.
           @theselikes=();
   # Hashes containing likes and unlikes for this user.
           %userlikes=();
           %userunlikes=();
       }
   # Is the user allowed to see the real name behind anonymous postings?
     my $see_anonymous =       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'}:''));
   
     if ((@{$grouppick} == 0) || (grep(/^all$/,@{$grouppick}))) {      if ((@{$grouppick} == 0) || (grep(/^all$/,@{$grouppick}))) {
         $skip_group_check = 1;          $skip_group_check = 1;
     }      }
   # Deletions and hiddens are just lists. Split them up into a hash for quicker lookup
     my (%deletions,%hiddens);      my (%deletions,%hiddens);
     if ($contrib{'deleted'}) {      if ($contrib{'deleted'}) {
        my $deleted = $contrib{'deleted'};         my $deleted = $contrib{'deleted'};
Line 948  sub build_posting_display { Line 1013  sub build_posting_display {
        $hidden =~ s/\.$//;         $hidden =~ s/\.$//;
        %hiddens = map { $_ => 1 } (split(/\.\./,$hidden));         %hiddens = map { $_ => 1 } (split(/\.\./,$hidden));
     }      }
   # Versions if store/restore are used to actually store the messages. 
     if ($contrib{'version'}) {      if ($contrib{'version'}) {
         my $oldest = $contrib{'1:timestamp'};          my $oldest = $contrib{'1:timestamp'};
         if ($prevread eq '0') {          if ($prevread eq '0') {
Line 958  sub build_posting_display { Line 1024  sub build_posting_display {
             ($skiptest,$roleregexp,$secregexp,$statusregexp) =               ($skiptest,$roleregexp,$secregexp,$statusregexp) = 
                      &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
               for (my $id=1;$id<=$contrib{'version'};$id++) {
                   my $idx=$id;
                   next if ($contrib{$idx.':deleted'});
                   next if ($contrib{$idx.':hidden'});
                   unless ((($hiddens{$idx}) && (!$seeid)) || ($deletions{$idx}) || (!$contrib{$idx.':message'})) {
                       if ($likes{$symb.':'.$idx.':likes'} ne '') {
                           push(@theselikes,$likes{$symb.':'.$idx.':likes'});
                           if (ref($likes{$symb.':'.$idx.':likers'}) eq 'HASH') {
                               if (exists($likes{$symb.':'.$idx.':likers'}{$thisuser})) {
                                   $userlikes{$idx} = 1;
                               }
                           }
                           if (ref($likes{$symb.':'.$idx.':unlikers'}) eq 'HASH') {
                               if (exists($likes{$symb.':'.$idx.':unlikers'}{$thisuser})) {
                                   $userunlikes{$idx} = 1;
                               }
                           }
                       }
                   }
               }
   # Figure out average likes and standard deviation if there are enough 
   # discussions to warrant that
               my $ave=0;
               my $stddev=10000;
               if ($#theselikes>1) {
                   my $sum=0;
                   my $num=$#theselikes+1;
                   foreach my $thislike (@theselikes) {
                       $sum+=$thislike;
                   }
                   $ave=$sum/$num;
                   my $sumsq=0;
                   foreach my $thislike (@theselikes) {
                       $sumsq+=($thislike-$ave)*($thislike-$ave);
                   }
                   $stddev=sqrt($sumsq/$num);
               }
   # Now we know the average likes $ave and the standard deviation $stddev
   # Get the boundaries for markup
               $oneplus=$ave+$stddev;
               $twoplus=$ave+2.*$stddev;
               $oneminus=$ave-$stddev;
               $twominus=$ave-2.*$stddev;
           }
   #
   # This is now the real loop. Go through all entries, pick up what we need
   #
  for (my $id=1;$id<=$contrib{'version'};$id++) {   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'});
   # If we get here, we are actually going to display the message - we don't know where and we don't know if we display
   # previous edits, but it counts as one entry
             my $posttime = $contrib{$idx.':timestamp'};              my $posttime = $contrib{$idx.':timestamp'};
             if ($prevread <= $posttime) {              if ($prevread <= $posttime) {
                 $$newpostsflag = 1;                  $$newpostsflag = 1;
Line 1006  sub build_posting_display { Line 1123  sub build_posting_display {
                 my %subjects = ();                  my %subjects = ();
                 my %attachtxt = ();                  my %attachtxt = ();
                 my %allattachments = ();                  my %allattachments = ();
                 my ($screenname,$plainname);                  my ($screenname,$plainname,$showaboutme);
                 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 1016  sub build_posting_display { Line 1133  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,$numoldver);                  &get_post_contents(\%contrib,$idx,$seeid,$outputtarget,\%messages,\%subjects,\%allattachments,\%attachtxt,$imsfiles,\$screenname,\$plainname,\$showaboutme,$numoldver);
   
   
 # Set up for sorting by subject  # Set up for sorting by subject
Line 1046  sub build_posting_display { Line 1163  sub build_posting_display {
                             }                              }
                         }                          }
         if (!$contrib{$idx.':anonymous'} || $see_anonymous) {          if (!$contrib{$idx.':anonymous'} || $see_anonymous) {
     $sender=&Apache::loncommon::aboutmewrapper(                              if ($showaboutme) {
  $plainname,                                  $sender = &Apache::loncommon::aboutmewrapper(
  $contrib{$idx.':sendername'},                                                $plainname,
  $contrib{$idx.':senderdomain'}).' ('.                                                $contrib{$idx.':sendername'},
  $contrib{$idx.':sendername'}.':'.                                                $contrib{$idx.':senderdomain'});
  $contrib{$idx.':senderdomain'}.')';                              } else {
                                   $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 1090  sub build_posting_display { Line 1213  sub build_posting_display {
                                 @{$$namesort{$lastname}{$firstname}} = ("$idx");                                  @{$$namesort{$lastname}{$firstname}} = ("$idx");
                             }                              }
                             if ($outputtarget ne 'tex') {                              if ($outputtarget ne 'tex') {
   # Add karma stars
                                   my $karma=&userkarma($contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'});
                                   for (my $i=1;$i<=$karma;$i++) {
                                       $sender.='<img border="0" src="/res/adm/pages/star.gif" alt="'.&mt('Contributor Kudos').'" />';
                                   }
   # Can people edit this?
                                 if (&editing_allowed($escsymb.':::'.$idx,$group)) {                                  if (&editing_allowed($escsymb.':::'.$idx,$group)) {
                                     if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {                                      if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {
                                         $sender.=' '.                                          $sender.=' '.
Line 1272  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;
                             }                              }
                               my $thislikes=$likes{$symb.':'.$idx.':likes'};
                               my $likesize="100";
                               if ($seeid || $canvote) {
   # Figure out size based on likes
                                   my $thislikes=$likes{$symb.':'.$idx.':likes'};
                                   if ($thislikes>$twoplus) {
                                       $likesize="200";
                                   } elsif ($thislikes>$oneplus) {
                                       $likesize="150";
                                   }
                                   if ($thislikes<$twominus) {
                                       $likesize="50";
                                   } elsif ($thislikes<$oneminus) {
                                       $likesize="75";
                                   }
                               }
   # Actually glue in the message itself
                             $$discussionitems[$idx].= '<br /><blockquote>'.                              $$discussionitems[$idx].= '<br /><blockquote>'.
                                     $message.'</blockquote>';                                      "<div style='font-size:$likesize%'>".
                                       $message.
                                       '</div></blockquote>';
                               if ($canvote) {
   # Put in the like and unlike buttons
                                   if ($userlikes{$idx}) {
                                       $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You like this posting').'" />';
                                   } 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"));
                                   }
                                   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) {
                                   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 ($contrib{$idx.':history'}) {                              if ($contrib{$idx.':history'}) {
                                 my @postversions = ();                                  my @postversions = ();
                                 $$discussionitems[$idx] .= &mt('This post has been edited by the author.');                                  $$discussionitems[$idx] .= '&nbsp;&nbsp;'.&mt('This post has been edited by the author.');
                                 if ($seeid) {                                  if ($seeid) {
                                     $$discussionitems[$idx] .= '&nbsp;&nbsp;'.                                      $$discussionitems[$idx] .= '&nbsp;&nbsp;'.
                                          &discussion_link($symb,&mt('Display all versions'),'allversions',$idx,$$newpostsflag,$prevread,&group_args($group));                                           &discussion_link($symb,&mt('Display all versions'),'allversions',$idx,$$newpostsflag,$prevread,&group_args($group));
Line 1292  sub build_posting_display { Line 1462  sub build_posting_display {
                                     $$discussionitems[$idx] .= '<b>'.$version.'.</b> - '.&Apache::lonlocal::locallocaltime($postversions[$i]).'  ';                                      $$discussionitems[$idx] .= '<b>'.$version.'.</b> - '.&Apache::lonlocal::locallocaltime($postversions[$i]).'  ';
                                 }                                  }
                             }                              }
   # end of unless ($$notshown ...)
                         }                          }
   # end of if ($message) ...
                     }                      }
   # end of the else-branch of target being export
                 }                  }
   # end of unless hidden or deleted
             }              }
   # end of the loop over all discussion entries
  }   }
   # end of "if there actually are any discussions
     }      }
   # end of subroutine "build_posting_display" 
 }  }
   
 sub filter_regexp {  sub filter_regexp {
Line 1356  sub filter_regexp { Line 1533  sub filter_regexp {
   
   
 sub get_post_contents {  sub get_post_contents {
     my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$numver) = @_;      my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$showaboutme,$numver) = @_;
     my $discussion = '';      my $discussion = '';
     my $start=$numver;      my $start=$numver;
     my $end=$numver + 1;      my $end=$numver + 1;
Line 1374  sub get_post_contents { Line 1551  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'},
     my $sender=&Apache::loncommon::aboutmewrapper(                                                        $$contrib{$idx.':senderdomain'},
                                                         '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'}.':'.      }
                                  $$contrib{$idx.':senderdomain'}.')';      if ($seeid) {
           $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 1496  sub mail_screen { Line 1680  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 1711  END Line 1900  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 1731  END Line 1921  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 2583  sub no_redirect_back { Line 2781  sub no_redirect_back {
       'add_entries' => \%onload,);        'add_entries' => \%onload,);
   
   if ($feedurl !~ m{^/adm/feedback}) {     if ($feedurl !~ m{^/adm/feedback}) { 
       $body_options{'rediect'} = [2,$feedurl];        $body_options{'redirect'} = [2,$feedurl];
   }    }
   my $start_page=    my $start_page=
       &Apache::loncommon::start_page('Feedback not sent',undef,        &Apache::loncommon::start_page('Feedback not sent',undef,
Line 2625  sub screen_header { Line 2823  sub screen_header {
     unless (($env{'form.replydisc'}) || ($env{'form.editdisc'})) {      unless (($env{'form.replydisc'}) || ($env{'form.editdisc'})) {
  if (($feedurl=~/^\/res\//) && ($feedurl!~/^\/res\/adm/) && ($env{'user.adv'})) {   if (($feedurl=~/^\/res\//) && ($feedurl!~/^\/res\/adm/) && ($env{'user.adv'})) {
     $msgoptions=       $msgoptions= 
  '<p><label><input type="radio" name="discuss" value="author" /> '.   '<label><input type="radio" name="discuss" value="author" /> '.
  &mt('Feedback to resource author').'</label></p>';   &mt('Feedback to resource author').'</label><br />';
  }   }
         my %optionhash=();          my %optionhash=();
         foreach my $type ('question','comment','policy') {          foreach my $type ('question','comment','policy') {
Line 2634  sub screen_header { Line 2832  sub screen_header {
  }   }
  if (&feedback_available(1)) {   if (&feedback_available(1)) {
     $msgoptions.=      $msgoptions.=
  '<p><label><input type="radio" name="discuss" value="question" /> '.   '<label><input type="radio" name="discuss" value="question" /> '.
  ($optionhash{'question'}?$optionhash{'question'}:&mt('Question about resource content')).'</label></p>';   ($optionhash{'question'}?$optionhash{'question'}:&mt('Question about resource content')).'</label><br />';
  }   }
  if (&feedback_available(0,1)) {   if (&feedback_available(0,1)) {
     $msgoptions.=      $msgoptions.=
  '<p><label><input type="radio" name="discuss" value="course" /> '.   '<label><input type="radio" name="discuss" value="course" /> '.
  ($optionhash{'comment'}?$optionhash{'comment'}:$crscontent).   ($optionhash{'comment'}?$optionhash{'comment'}:$crscontent).
  '</label></p>';   '</label><br />';
  }   }
  if (&feedback_available(0,0,1)) {   if (&feedback_available(0,0,1)) {
     $msgoptions.=      $msgoptions.=
  '<p><label><input type="radio" name="discuss" value="policy" /> '.   '<label><input type="radio" name="discuss" value="policy" /> '.
  ($optionhash{'policy'}?$optionhash{'policy'}:$crspolicy).   ($optionhash{'policy'}?$optionhash{'policy'}:$crspolicy).
  '</label></p>';   '</label><br />';
  }   }
     }      }
     if (($env{'request.course.id'}) && (!$env{'form.sendmessageonly'})) {      if (($env{'request.course.id'}) && (!$env{'form.sendmessageonly'})) {
         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 2787  sub send_msg { Line 2980  sub send_msg {
  }   }
     }      }
   
 # Records of number of postings, etc, are kept under the "symb" called "_feedback"  # Records of number of feedback messages are kept under the "symb" called "_feedback"
 # There are two entries within the framework of a course:  # There are two entries within the framework of a course:
 # - the URLs for which feedback was provided  # - the URLs for which feedback was provided
 # - the total number of contributions  # - the total number of contributions
     my %record=&Apache::lonnet::restore('_feedback');      if ($sendsomething) {
     my ($temp)=keys(%record);          my %record=&getfeedbackrecords();
     unless ($temp=~/^error\:/) {          my ($temp)=keys(%record);
  my %newrecord=();          unless ($temp=~/^error\:/) {
  $newrecord{'resource'}=$feedurl;      my %newrecord=();
  $newrecord{'subnumber'}=$record{'subnumber'}+1;      $newrecord{'resource'}=$feedurl;
  unless (&Apache::lonnet::cstore(\%newrecord,'_feedback') eq 'ok') {      $newrecord{'subnumber'}=$record{'subnumber'}+1;
     $status.='<br />'.&mt('Not registered').'<br />';      unless (&Apache::lonnet::cstore(\%newrecord,'_feedback') eq 'ok') {
  }          $status.='<br />'.&mt('Not registered').'<br />';
       }
           }
     }      }
       
     return ($status,$sendsomething);      return ($status,$sendsomething);
 }  }
   
 # Routine to get the complete discussion records  # Routine to get the complete feedback records
   
 sub getdiscrecords {  sub getfeedbackrecords {
     my ($uname,$udom,$course)=@_;      my ($uname,$udom,$course)=@_;
     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=&Apache::lonnet::restore('_feedback',$course,$udom,$uname);      my %record=&Apache::lonnet::restore('_feedback',$course,$udom,$uname);
    return %record;      return %record;
 }  }
   
   # Routine to get feedback statistics
   
   sub getfeedbackstats {
       my %record=&getfeedbackrecords(@_);
       return ($record{'subnumber'},$record{'points'},$record{'totallikes'});
   }
   
   # Store feedback credit
   
   sub storefeedbackpoints {
       my ($points,$uname,$udom,$course)=@_;
       unless ($points) { $points=0; }
       unless ($uname) { $uname=$env{'user.name'}; }
       unless ($udom)  { $udom=$env{'user.domain'}; }
       unless ($course) { $course=$env{'request.course.id'}; }
       my %record=('grader_user'   => $env{'user.name'},
                   'grader_domain' => $env{'user.domain'},
                   'points' => $points);
       return &Apache::lonnet::cstore(\%record,'_feedback',$course,$udom,$uname);
   }
   
   # Store feedback "likes"
   
   sub storefeedbacklikes {
       my ($likes,$uname,$udom,$course)=@_;
       unless ($likes) { $likes=0; }
       if ($likes>0) { $likes=1; }
       if ($likes<0) { $likes=-1; }
       unless ($uname) { $uname=$env{'user.name'}; }
       unless ($udom)  { $udom=$env{'user.domain'}; }
       unless ($course) { $course=$env{'request.course.id'}; }
       my %record=&getfeedbackrecords($uname,$udom,$course);
       my $totallikes=$record{'totallikes'};
       $totallikes+=$likes;
       my %newrecord=('likes_user'   => $env{'user.name'},
                      'likes_domain' => $env{'user.domain'},
                      'likes' => $likes,
                      'totallikes' => $totallikes);
       return &Apache::lonnet::cstore(\%newrecord,'_feedback',$course,$udom,$uname);
   }
   
   
 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 2914  sub adddiscuss { Line 3145  sub adddiscuss {
                      $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 %record=&Apache::lonnet::restore('_discussion');      my %record=&getdiscussionrecords();
     my ($temp)=keys(%record);      my ($temp)=keys(%record);
     unless ($temp=~/^error\:/) {      unless ($temp=~/^error\:/) {
        my %newrecord=();         my %newrecord=();
Line 2922  sub adddiscuss { Line 3153  sub adddiscuss {
        $newrecord{'subnumber'}=$record{'subnumber'}+1;         $newrecord{'subnumber'}=$record{'subnumber'}+1;
        $status.='<br />'.&mt('Registering').': '.         $status.='<br />'.&mt('Registering').': '.
                &Apache::lonnet::cstore(\%newrecord,'_discussion');                 &Apache::lonnet::cstore(\%newrecord,'_discussion');
          &updatekarma();
     }      }
     } else {      } else {
  $status.='Failed.';   $status.='Failed.';
Line 2929  sub adddiscuss { Line 3161  sub adddiscuss {
     return $status.'<br />';         return $status.'<br />';   
 }  }
   
   
   # Routine to get the complete discussion records
   
   sub getdiscussionrecords {
       my ($uname,$udom,$course)=@_;
       unless ($uname) { $uname=$env{'user.name'}; }
       unless ($udom)  { $udom=$env{'user.domain'}; }
       unless ($course) { $course=$env{'request.course.id'}; }
       my %record=&Apache::lonnet::restore('_discussion',$course,$udom,$uname);
       return %record;
   }
   
   # Routine to get discussion statistics
   
   sub getdiscussionstats {
       my %record=&getdiscussionrecords(@_);
       return ($record{'subnumber'},$record{'points'},$record{'totallikes'},$record{'totalvotes'});
   }
   
   # Calculate discussion karma
   
   sub calcdiscussionkarma {    
       my ($subs,$pts,$likes,$votes)=&getdiscussionstats(@_);
       my $karma=0;
       if ($votes>0) {
           $karma=int(.1+5.*(1.-exp(-$subs/10.))*$likes/$votes);
           if ($karma<0) { $karma=0; }
           if ($karma>5) { $karma=5; }
       }
       return $karma;
   }
   
   # Update karma
   
   sub updatekarma {
       my ($uname,$udom,$course)=@_;
       unless ($uname) { $uname=$env{'user.name'}; }
       unless ($udom)  { $udom=$env{'user.domain'}; }
       unless ($course) { $course=$env{'request.course.id'}; }
       my $karma=&calcdiscussionkarma($uname,$udom,$course);
       &Apache::lonnet::cstore({ 'karma' => $karma },'_discussion',$course,$udom,$uname);
       &Apache::lonnet::do_cache_new('karma',$uname.':'.$udom.':'.$course,$karma,3600);
       return $karma;
   }
   
   # Retrieve karma
   
   sub userkarma {
       my ($uname,$udom,$course)=@_;
       unless ($uname) { $uname=$env{'user.name'}; }
       unless ($udom)  { $udom=$env{'user.domain'}; }
       unless ($course) { $course=$env{'request.course.id'}; }
       my $hashkey=$uname.':'.$udom.':'.$course;
       my ($karma,$cached)=&Apache::lonnet::is_cached_new('karma',$hashkey);
       if ($cached) {
           return $karma;
       }
       my %userdisc=&getdiscussionrecords($uname,$udom,$course);
       $karma=$userdisc{'karma'};
       &Apache::lonnet::do_cache_new('karma',$hashkey,$karma,3600);
       return $karma;
   }
   
   # Store discussion credit
   
   sub storediscussionpoints {
       my ($points,$uname,$udom,$course)=@_;
       unless ($points) { $points=0; }
       unless ($uname) { $uname=$env{'user.name'}; }
       unless ($udom)  { $udom=$env{'user.domain'}; }
       unless ($course) { $course=$env{'request.course.id'}; }
       my %record=('grader_user'   => $env{'user.name'},
                   'grader_domain' => $env{'user.domain'},
                   'points' => $points);
       return &Apache::lonnet::cstore(\%record,'_discussion',$course,$udom,$uname);
   }
   
   # Store discussion "likes"
   
   sub storediscussionlikes {
       my ($likes,$uname,$udom,$course)=@_;
       unless ($likes) { $likes=0; }
       if ($likes>0) { $likes=1; }
       if ($likes<0) { $likes=-1; }
       unless ($uname) { $uname=$env{'user.name'}; }
       unless ($udom)  { $udom=$env{'user.domain'}; }
       unless ($course) { $course=$env{'request.course.id'}; }
       my %record=&getdiscussionrecords($uname,$udom,$course);
       my $totallikes=$record{'totallikes'};
       my $totalvotes=$record{'totalvotes'};
       $totallikes+=$likes;
       $totalvotes++;
       my %newrecord=('likes_user'   => $env{'user.name'},
                      'likes_domain' => $env{'user.domain'},
                      'likes' => $likes,
                      'totallikes' => $totallikes,
                      'totalvotes' => $totalvotes);
       my $status=&Apache::lonnet::cstore(\%newrecord,'_discussion',$course,$udom,$uname);
       if ($status eq 'ok') {
           &updatekarma($uname,$udom,$course);
       }
       return $status;
   }
   
 sub get_discussion_info {  sub get_discussion_info {
     my ($idx,%contrib) = @_;      my ($idx,%contrib) = @_;
     my $changelast = 0;      my $changelast = 0;
Line 3074  sub modify_attachments { Line 3410  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 3092  END Line 3428  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 3121  $start_page Line 3457  $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'});       if(($idx)||(ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)){
                     $attachurl =~ m#/([^/]+)$#;          $r->print(&Apache::lonhtmlcommon::row_closure());
                     $r->print('<label><input type="checkbox" name="deloldattach" value="'.$id.'" />&nbsp;'.$1.'</label><br />'."\n");          $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 3216  sub generate_attachments_button { Line 3550  sub generate_attachments_button {
     my $origpage = $ENV{'REQUEST_URI'};      my $origpage = $ENV{'REQUEST_URI'};
     my $att=$attachnum.' '.&mt("attachments");      my $att=$attachnum.' '.&mt("attachments");
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                 'clic' => 'Click to add/remove attachments',                  'clic' => 'Add/remove attachments',
     );       ); 
     my $response = (<<END);      my $response = (<<END);
 <br />  <br />
 <form name="attachment" action="/adm/feedback?attach=$ressymb" method="post">  <form name="attachment" action="/adm/feedback?attach=$ressymb" method="post">
 $lt{'clic'}:&nbsp;<input type="button" value="$att"  <input type="button" value="$lt{'clic'}"
 onclick="if (typeof(document.mailform.onsubmit)=='function') {document.mailform.onsubmit();};this.form.comment.value=escape(document.mailform.comment.value);this.form.subject.value=escape(document.mailform.subject.value);  onclick="if (typeof(document.mailform.onsubmit)=='function') {document.mailform.onsubmit();};this.form.comment.value=escape(document.mailform.comment.value);this.form.subject.value=escape(document.mailform.subject.value);
 END  END
     if (!$blockblog) {      if (!$blockblog) {
Line 3457  sub handler { Line 3791  sub handler {
 # --------------------------- Get query string for limited number of parameters  # --------------------------- Get query string for limited number of parameters
   
   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
          ['modal','hide','unhide','deldisc','postdata','preview','replydisc','editdisc','cmd','symb','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navtime','navmaps','navurl','sortposts','applysort','rolefilter','statusfilter','sectionpick','groupick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export','sendmessageonly','group','ref']);           ['like','unlike','modal','hide','unhide','deldisc','undeleteall','postdata','preview','replydisc','editdisc','cmd','symb','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navtime','navmaps','navurl','sortposts','applysort','rolefilter','statusfilter','sectionpick','groupick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export','sendmessageonly','group','ref']);
   my $group = $env{'form.group'};    my $group = $env{'form.group'};
   my %attachmax = (    my %attachmax = (
                     text => &mt('(128 KB max size)'),                      text => &mt('(128 KB max size)'),
Line 3539  sub handler { Line 3873  sub handler {
           my %attachmsgs = ();            my %attachmsgs = ();
           my %allattachments = ();            my %allattachments = ();
           my %imsfiles = ();            my %imsfiles = ();
           my ($screenname,$plainname);            my ($screenname,$plainname,$showaboutme);
           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));            $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname,\$showaboutme));
       }        }
       $r->print(&Apache::loncommon::end_page());        $r->print(&Apache::loncommon::end_page());
       return OK;        return OK;
Line 3732  ENDREDIR Line 4066  ENDREDIR
      '0','0','','',$env{'form.previous'},undef,undef,undef,       '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'})) {
   # ----------------------------------------------------------------- Like/unlike
         my $entry=$env{'form.like'}?$env{'form.like'}:$env{'form.unlike'};
         my ($symb,$idx)=split(/\:\:\:/,$entry);
         ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb);
         my $status='OPEN';
         if ($Apache::lonhomework::parsing_a_problem ||
             $Apache::lonhomework::parsing_a_task) {
             $status=$Apache::inputtags::status[-1];
         }
         my $result;
         my $realsymb = &get_realsymb($symb);
         if (&discussion_vote_available($status,$realsymb)) {
   #
   # Likes and unlikes are in db-file "disclikes" of the course
   # The prefix is the $symb to identify the resource discussion,
   # and the $idx to identify the entry
   #
             my $prefix=$symb.':'.$idx.':';
             my %contrib=&Apache::lonnet::dump('disclikes',
                                           $env{'course.'.$env{'request.course.id'}.'.domain'},
                                           $env{'course.'.$env{'request.course.id'}.'.num'},
                                           '^'.$prefix);
   
   # Get current like or unlike status for the $idx for this user.
             my $thisuser=$env{'user.name'}.':'.$env{'user.domain'};
             my ($userlikes,$userunlikes);
             if (ref($contrib{$prefix.'likers'}) eq 'HASH') {
                 if (exists($contrib{$prefix.'likers'}{$thisuser})) {
                     $userlikes = 1;
                 }
             }
             if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') {
                 if (exists($contrib{$prefix.'unlikers'}{$thisuser})) {
                     $userunlikes = 1;
                 }
             }
   # Get the current "likes" count
             my $likes=$contrib{$prefix.'likes'};
   # Find out if they already voted
   # Users cannot like a post twice, or unlike it twice.
   # They can change their mind, though.
             my $alreadyflag=0;
             my $thisuser=$env{'user.name'}.':'.$env{'user.domain'};
             if ($env{'form.like'}) {
                 if ($userlikes) {
                     $alreadyflag=1;
                 } elsif ($userunlikes) {
                     delete($contrib{$prefix.'unlikers'}{$thisuser});
                     $likes++;
                 } else {
                     if (ref($contrib{$prefix.'likers'}) eq 'HASH') {
                         $contrib{$prefix.'likers'}{$thisuser} = 1;
                     } else {
                         $contrib{$prefix.'likers'} = {$thisuser => 1};
                     }
                     $likes++;
                 }
             } else {
                 if ($userunlikes) {
                     $alreadyflag=1;
                 } elsif ($userlikes) {
                     delete($contrib{$prefix.'likers'}{$thisuser});
                     $likes--;
                 } else {
                     if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') {
                         $contrib{$prefix.'unlikers'}{$thisuser} = 1;
                     } else {
                         $contrib{$prefix.'unlikers'} = {$thisuser => 1};
                     }
                     $likes--;
                 }
             }
   # $alreadyflag would be 1 if they tried to double-like or double-unlike
             unless ($alreadyflag) {
                 my %newhash=($prefix.'likes'    => $likes,
                              $prefix.'likers'   => $contrib{$prefix.'likers'},
                              $prefix.'unlikers' => $contrib{$prefix.'unlikers'});
   # Store data in db-file "disclikes"
                 if (&Apache::lonnet::put('disclikes',
                                          \%newhash,
                                          $env{'course.'.$env{'request.course.id'}.'.domain'},
                                          $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
   # Also store with the person who posted the liked/unliked entry
                     if ($env{'form.like'}) {
                         &storediscussionlikes(1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'});
                         $result=&mt("Registered 'Like'");
                     } else {
                         &storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'});
                         $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 />',
                        '0','0','','',$env{'form.previous'},undef,undef,undef,
                        undef,undef,undef,$group);
         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 'threadedon') {
Line 3815  ENDREDIR Line 4252  ENDREDIR
   &Apache::loncommon::end_page();    &Apache::loncommon::end_page();
       $r->print($start_page.$discussion.$end_page);        $r->print($start_page.$discussion.$end_page);
       return OK;        return OK;
   
     } elsif ($env{'form.undeleteall'}) {
         &Apache::loncommon::content_type($r,'text/html');
         $r->send_http_header;
         my ($symb,$feedurl) = &get_feedurl_and_clean_symb($env{'form.undeleteall'});
         $r->print(&Apache::loncommon::start_page('Undelete all deleted discussion entries'));
         if (&Apache::lonnet::allowed('rin',$env{'request.course.id'})) {
              if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'},
                        $env{'course.'.$env{'request.course.id'}.'.domain'},
                        $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
                  $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries")));
              } else {
                  $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1));
              }
              $r->print("<br /><a href='$feedurl'>".&mt("Return and reload")."</a>");
         }
         $r->print(&Apache::loncommon::end_page());
         return OK;
   } else {    } else {
 # ------------------------------------------------------------- Normal feedback  # ------------------------------------------------------------- Normal feedback
       my $feedurl=$env{'form.postdata'};        my $feedurl=$env{'form.postdata'};
Line 3830  ENDREDIR Line 4285  ENDREDIR
   $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];    $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];
       } elsif ($env{'form.origpage'}) {        } elsif ($env{'form.origpage'}) {
   $symb="";     $symb=""; 
         } elsif ($env{'form.sendmessageonly'}) {
             $symb=(split(/\:\:\:/,$env{'form.sendmessageonly'}))[0];
       } else {        } else {
   $symb=&Apache::lonnet::symbread($feedurl);    $symb=&Apache::lonnet::symbread($feedurl);
       }        }
Line 4161  None Line 4618  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.318  
changed lines
  Added in v.1.342


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