Diff for /loncom/interface/lonfeedback.pm between versions 1.225 and 1.236

version 1.225, 2006/11/30 08:51:20 version 1.236, 2006/12/11 18:50:40
Line 44  use HTML::LCParser(); Line 44  use HTML::LCParser();
 use Apache::lonspeller();  use Apache::lonspeller();
 use Apache::longroup;  use Apache::longroup;
 use Cwd;  use Cwd;
 use lib '/home/httpd/lib/perl/';  
 use LONCAPA;  use LONCAPA;
   
 sub discussion_open {  sub discussion_open {
Line 75  sub discussion_visible { Line 74  sub discussion_visible {
   
 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) { return ''; }
       $ressymb=&wrap_symb($ressymb);
     my $outputtarget=$env{'form.grade_target'};      my $outputtarget=$env{'form.grade_target'};
     if (defined($env{'form.export'})) {      if (defined($env{'form.export'})) {
  if($env{'form.export'}) {   if($env{'form.export'}) {
Line 86  sub list_discussion { Line 88  sub list_discussion {
             $outputtarget = 'export';              $outputtarget = 'export';
         }          }
     }      }
     if (not &discussion_visible($status)) { return ''; }      if (not &discussion_visible($status)) {
           if ($mode ne 'board') {
               &Apache::lonenc::check_encrypt(\$ressymb); 
               return &send_message_link($ressymb);
           }
       }
     if ($group ne '' && $mode eq 'board') {      if ($group ne '' && $mode eq 'board') {
         if (&check_group_priv($group,'vgb') ne 'ok') {          if (&check_group_priv($group,'vgb') ne 'ok') {
             return '';              return '';
         }          }
     }      }
   
     my ($blocked,$blocktext) = &blocking_posts('boards',1);      my ($blocked,$blocktext) = 
           &Apache::loncommon::blocking_status('boards');
     if ($blocked) {      if ($blocked) {
         return $blocktext;          &Apache::lonenc::check_encrypt(\$ressymb);
           if ($mode ne 'board') {
               $blocktext.='<br />'.&send_message_link($ressymb);
           }
           return $blocktext; 
     }      }
   
     my @bgcols = ("#cccccc","#eeeeee");      my @bgcols = ("#cccccc","#eeeeee");
Line 108  sub list_discussion { Line 120  sub list_discussion {
  $crs.='_'.$env{'request.course.sec'};   $crs.='_'.$env{'request.course.sec'};
     }      }
     $crs=~s/\_/\//g;      $crs=~s/\_/\//g;
     unless ($ressymb) { $ressymb=&Apache::lonnet::symbread(); }  
     unless ($ressymb) { return ''; }  
     $ressymb=&wrap_symb($ressymb);  
     my $encsymb=&Apache::lonenc::check_encrypt($ressymb);      my $encsymb=&Apache::lonenc::check_encrypt($ressymb);
     my $viewgrades=(&Apache::lonnet::allowed('vgr',$crs)      my $viewgrades=(&Apache::lonnet::allowed('vgr',$crs)
   && ($ressymb=~/\.(problem|exam|quiz|assess|survey|form|task)$/));    && ($ressymb=~/\.(problem|exam|quiz|assess|survey|form|task)$/));
Line 723  END Line 732  END
             }              }
  }   }
     } else {      } else {
  $discussion.='<table bgcolor="#BBBBBB"><tr><td>';          $discussion.='<table class="LC_feedback_link"><tr><td>';
         if (&discussion_open($status) &&          if (&discussion_open($status) &&
             &Apache::lonnet::allowed('pch',              &Apache::lonnet::allowed('pch',
            $env{'request.course.id'}.             $env{'request.course.id'}.
         ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {          ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
     if ($outputtarget ne 'tex') {      if ($outputtarget ne 'tex') {
  $discussion.='<a href="/adm/feedback?replydisc='.   $discussion.= &send_feedback_link($ressymb,$target).
     &escape($ressymb).':::" '.$target.'>'.                                '<br />';
     '<img alt="" src="'.&Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').'" border="0" />'.  
     &mt('Post Discussion').'</a><br />';  
             }              }
  }   }
  $discussion.='<a href="/adm/feedback?sendmessageonly=1&amp;symb='.          if ($outputtarget ne 'tex') {
     &escape($ressymb).      $discussion.= &send_message_link($ressymb);
     '"><img alt="" src="'.&Apache::loncommon::lonhttpdurl('/adm/lonMisc/feedback.gif').'" border="0" />'.          }
     &mt('Send Message').'</a></td></tr></table>';          $discussion.='</td></tr></table>';
     }      }
     return $discussion;      return $discussion;
 }  }
   
   sub send_feedback_link {
       my ($ressymb,$target) = @_;
       my $output = '<span class="LC_feedback_link">'.
                    ' <a href="/adm/feedback?replydisc='.
                    &escape($ressymb).':::" '.$target.'>'.
                    '<img alt="" src="'.
                    &Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').
                    '" border="0" />'.&mt('Post Discussion').'</a></span>';
       return $output;
   }
   
   sub send_message_link {
       my ($ressymb) = @_;
       my $output = '<span class="LC_feedback_link">'.
                    '  <a href="/adm/feedback?sendmessageonly=1&amp;symb='.
                    &escape($ressymb).'"><img alt="" src="'.
                    &Apache::loncommon::lonhttpdurl('/adm/lonMisc/feedback.gif').
                    '" border="0" />'.&mt('Send Message').'</a></span>';
       return $output;
   }
   
 sub action_links_bar {  sub action_links_bar {
     my ($colspan,$ressymb,$visible,$newpostsflag,$group,$prevread,$markondisp) = @_;      my ($colspan,$ressymb,$visible,$newpostsflag,$group,$prevread,$markondisp) = @_;
     my $discussion = '<tr><td bgcolor="#DDDDBB" colspan="'.$colspan.'">'.      my $discussion = '<tr><td bgcolor="#DDDDBB" colspan="'.$colspan.'">'.
Line 796  sub action_links_bar { Line 824  sub action_links_bar {
     return $discussion;      return $discussion;
 }  }
   
 sub blocking_posts {  
     my ($type,$showstatus) = @_;  
     my %setters;  
     my ($blocked,$output);  
     my ($startblock,$endblock) =  
           &Apache::loncommon::blockcheck(\%setters,$type);  
     if ($startblock && $endblock) {  
         $blocked = 1;  
         if ($showstatus) {  
             my $showstart = &Apache::lonlocal::locallocaltime($startblock);  
             my $showend = &Apache::lonlocal::locallocaltime($endblock);  
             $output = &mt('Discussion postings will not be viewable for resources in this course between [_1] and [_2] because communication is being blocked.',$showstart, $showend).'<br />'.  
                     &Apache::loncommon::build_block_table($startblock,$endblock,  
                                                          \%setters);  
         }  
     }  
     return ($blocked,$output);  
 }  
   
 sub postingform_display {  sub postingform_display {
     my ($mode,$ressymb,$now,$subject,$comment,$outputtarget,$attachnum,      my ($mode,$ressymb,$now,$subject,$comment,$outputtarget,$attachnum,
         $currnewattach,$currdelold,$group) = @_;          $currnewattach,$currdelold,$group) = @_;
Line 851  ENDDISCUSS Line 860  ENDDISCUSS
     if ($group ne '') {      if ($group ne '') {
         $postingform .='<input type="hidden" name="group" value="'.$group.'" />';          $postingform .='<input type="hidden" name="group" value="'.$group.'" />';
     }      }
     my ($blockblog) = &blocking_posts('blogs');      my $blockblog = &Apache::loncommon::blocking_status('blogs');
     if (!$blockblog) {      if (!$blockblog) {
         $postingform .= &add_blog_checkbox();          $postingform .= &add_blog_checkbox();
     }      }
Line 1729  END Line 1738  END
     if ($env{'form.editdisc'} || $env{'form.replydisc'}) {      if ($env{'form.editdisc'} || $env{'form.replydisc'}) {
         my $now = time;          my $now = time;
         my $ressymb = $symb;          my $ressymb = $symb;
           &Apache::lonenc::check_encrypt(\$ressymb);
         my $postidx = '';          my $postidx = '';
         if ($env{'form.editdisc'}) {          if ($env{'form.editdisc'}) {
             $postidx = $idx;              $postidx = $idx;
Line 1736  END Line 1746  END
         if (@currnewattach > 0) {          if (@currnewattach > 0) {
             $attachnum += @currnewattach;              $attachnum += @currnewattach;
         }          }
         my ($blockblog) = &blocking_posts('blogs');          my $blockblog = &Apache::loncommon::blocking_status('blogs');
         $r->print(&generate_attachments_button($postidx,$attachnum,$ressymb,$now,\@currnewattach,\@currdelold,$numoldver,'',$blockblog));          $r->print(&generate_attachments_button($postidx,$attachnum,$ressymb,$now,\@currnewattach,\@currdelold,$numoldver,'',$blockblog));
         if ($attachnum > 0) {          if ($attachnum > 0) {
             if (@currnewattach > 0) {              if (@currnewattach > 0) {
Line 2472  sub redirect_back { Line 2482  sub redirect_back {
           $feedurl .= '?group='.$group.$refarg;            $feedurl .= '?group='.$group.$refarg;
       }        }
   }     } 
   $feedurl=&Apache::lonenc::check_encrypt($feedurl);    &Apache::lonenc::check_encrypt(\$feedurl);
   my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');    my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
   my %onload;    my %onload;
   if ($env{'environment.remote'} ne 'off') {    if ($env{'environment.remote'} ne 'off') {
Line 2529  sub no_redirect_back { Line 2539  sub no_redirect_back {
               
   my $end_page = &Apache::loncommon::end_page();    my $end_page = &Apache::loncommon::end_page();
   
   $feedurl=&Apache::lonenc::check_encrypt($feedurl);    &Apache::lonenc::check_encrypt(\$feedurl);
   my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');    my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
   $r->print (<<ENDNOREDIRTWO);    $r->print (<<ENDNOREDIRTWO);
 $start_page  $start_page
Line 2573  sub screen_header { Line 2583  sub screen_header {
     &Apache::lonnet::allowed('pch',      &Apache::lonnet::allowed('pch',
      $env{'request.course.id'}.       $env{'request.course.id'}.
      ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {       ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
             my ($blocked) = &blocking_posts('boards');      $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.
             if (!$blocked) {   &mt('Contribution to course discussion of resource');
         $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.  
     &mt('Contribution to course discussion of resource');  
         $discussoptions.='</label><br /><label><input type="radio" name="discuss" value="anon" /> '.          $discussoptions.='</label><br /><label><input type="radio" name="discuss" value="anon" /> '.
     &mt('Anonymous contribution to course discussion of resource').   &mt('Anonymous contribution to course discussion of resource').
     ' <i>('.&mt('name only visible to course faculty').')</i></label> '.   ' <i>('.&mt('name only visible to course faculty').')</i></label> '.
     '<a href="/adm/preferences?action=changescreenname">'.&mt('Change Screenname').'</a>';   '<a href="/adm/preferences?action=changescreenname">'.&mt('Change Screenname').'</a>';
             }  
         }          }
         my ($blockblog) = &blocking_posts('blogs');          my $blockblog = &Apache::loncommon::blocking_status('blogs');
         if (!$blockblog) {          if (!$blockblog) {
             $discussoptions.= &add_blog_checkbox();              $discussoptions.= &add_blog_checkbox();
         }          }
Line 2660  sub secapply { Line 2667  sub secapply {
     my $defaultflag=shift;      my $defaultflag=shift;
     $rec=~s/\s+//g;      $rec=~s/\s+//g;
     $rec=~s/\@/\:/g;      $rec=~s/\@/\:/g;
     my ($adr,$sections)=($rec=~/^([^\(]+)\(([^\)]+)\)/);      my ($adr,$sections_or_groups)=($rec=~/^([^\(]+)\(([^\)]+)\)/);
     if ($sections) {      if ($sections_or_groups) {
  foreach my $sec (split(/\;/,$sections)) {   foreach my $item (split(/\;/,$sections_or_groups)) {
             if (($sec eq $env{'request.course.sec'}) ||              if (($item eq $env{'request.course.sec'}) ||
                 ($defaultflag && ($sec eq '*'))) {                  ($defaultflag && ($item eq '*'))) {
                 return $adr;                   return $adr; 
             }              } elsif ($env{'request.course.groups'}) {
                   my @usersgroups = split(/:/,$env{'request.course.groups'});
                   if (grep(/^\Q$item\E$/,@usersgroups)) {
                       return $adr;
                   }
               } 
         }          }
     } else {      } else {
        return $rec;         return $rec;
Line 2711  sub decide_receiver { Line 2723  sub decide_receiver {
   my %to=();    my %to=();
   if ($env{'form.discuss'} eq 'author' ||$author) {    if ($env{'form.discuss'} eq 'author' ||$author) {
     $typestyle.='Submitting as Author Feedback<br />';      $typestyle.='Submitting as Author Feedback<br />';
     $feedurl=~/^\/res\/(\w+)\/(\w+)\//;      $feedurl=~ m{^/res/($LONCAPA::domain_re)/($LONCAPA::username_re)/};
     $to{$2.':'.$1}=1;      $to{$2.':'.$1}=1;
   }    }
   if ($env{'form.discuss'} eq 'question' ||$question) {    if ($env{'form.discuss'} eq 'question' ||$question) {
Line 2817  sub adddiscuss { Line 2829  sub adddiscuss {
  $contrib{'anonymous'}='true';   $contrib{'anonymous'}='true';
     }      }
     if (($symb) && ($email)) {      if (($symb) && ($email)) {
           my $now = time;
         if ($env{'form.editdisc'}) {          if ($env{'form.editdisc'}) {
             $contrib{'ip'}=$ENV{'REMOTE_ADDR'};              $contrib{'ip'}=$ENV{'REMOTE_ADDR'};
             $contrib{'host'}=$Apache::lonnet::perlvar{'lonHostID'};              $contrib{'host'}=$Apache::lonnet::perlvar{'lonHostID'};
             $contrib{'timestamp'} = time;              $contrib{'timestamp'} = $now;
             $contrib{'history'} = '';              $contrib{'history'} = '';
             my $numoldver = 0;              my $numoldver = 0;
             my ($oldsymb,$oldidx)=split(/\:\:\:/,$env{'form.editdisc'});              my ($oldsymb,$oldidx)=split(/\:\:\:/,$env{'form.editdisc'});
Line 2871  sub adddiscuss { Line 2884  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 %storenewentry=($symb => time);          my %storenewentry=($symb => $now);
         $status.='<br />'.&mt('Updating discussion time').': '.          $status.='<br />'.&mt('Updating discussion time').': '.
         &Apache::lonnet::put('discussiontimes',\%storenewentry,          &Apache::lonnet::put('discussiontimes',\%storenewentry,
                      $env{'course.'.$env{'request.course.id'}.'.domain'},                       $env{'course.'.$env{'request.course.id'}.'.domain'},
Line 2892  sub adddiscuss { Line 2905  sub adddiscuss {
     return $status.'<br />';         return $status.'<br />';   
 }  }
   
   sub get_discussion_info {
       my ($idx,%contrib) = @_;
       my $changelast = 0;
       my $count = 0;
       my $hiddenflag = 0;
       my $deletedflag = 0;
       my ($hidden,$deleted,%info,$newlastdisc);
       my $version = $contrib{'version'};
       if ($version) {
           for (my $id=$version; $id>0; $id--) {
               my $vkeys=$contrib{$id.':keys'};
               my @keys=split(/:/,$vkeys);
               if (grep(/^hidden$/,@keys)) {
                   if (!$hiddenflag) {
                       $hidden = $contrib{$id.':hidden'};
                       $hiddenflag = 1;
                   }
               } elsif (grep(/^deleted$/,@keys)) {
                   if (!$deletedflag) {
                       $deleted = $contrib{$id.':deleted'};
                       $deletedflag = 1;
                   }
               } else {
                   if (($hidden !~/\.$id\./) && ($deleted !~/\.$id\./)) {
                       $count++;
                       $info{$count}{'id'} = $id;
                       $info{$count}{'timestamp'}=$contrib{$id.':timestamp'}; 
                   }
               }
           }
           if ($info{'1'}{'id'} == $idx) {
               $changelast = 1;
               if ($count > 1) { 
                   $newlastdisc =  $info{'2'}{'timestamp'};
               } else {
                   $newlastdisc = 0;
               }
           }
       }
       return ($changelast,$newlastdisc);
   }
   
 # ----------------------------------------------------------- Preview function  # ----------------------------------------------------------- Preview function
   
 sub show_preview {  sub show_preview {
Line 3560  ENDREDIR Line 3615  ENDREDIR
       if ( ($env{'form.hide'}) && (!$seeid) ) {        if ( ($env{'form.hide'}) && (!$seeid) ) {
   $newhash{'studenthidden'} = $currentstudenthidden;    $newhash{'studenthidden'} = $currentstudenthidden;
       }        }
         if ($env{'form.hide'}) {
             my $changelast = 0;
             my $newlast;
             ($changelast,$newlast) = &get_discussion_info($idx,%contrib);
             if ($changelast) {
                 &Apache::lonnet::put('discussiontimes',{$symb => $newlast},
                        $env{'course.'.$env{'request.course.id'}.'.domain'},
                        $env{'course.'.$env{'request.course.id'}.'.num'});
             }
         }
       &Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},        &Apache::lonnet::store(\%newhash,$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'});
Line 3589  ENDREDIR Line 3653  ENDREDIR
       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 ($changelast,$newlast) = &get_discussion_info($idx,%contrib);
         if ($changelast) {
             &Apache::lonnet::put('discussiontimes',{$symb => $newlast},
                      $env{'course.'.$env{'request.course.id'}.'.domain'},                   $env{'course.'.$env{'request.course.id'}.'.num'});
         }
       my %newhash=('deleted' => $contrib{'deleted'}.".$idx.");        my %newhash=('deleted' => $contrib{'deleted'}.".$idx.");
       &Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},        &Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},
    $env{'course.'.$env{'request.course.id'}.'.domain'},     $env{'course.'.$env{'request.course.id'}.'.domain'},
Line 3699  ENDREDIR Line 3768  ENDREDIR
   &Apache::loncommon::content_type($r,'text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
 # Unable to give feedback  # Unable to give feedback
             &Apache::lonenc::check_encrypt(\$feedurl);
   &no_redirect_back($r,$feedurl);    &no_redirect_back($r,$feedurl);
   return OK;    return OK;
       }        }
 # --------------------------------------------------- Print login screen header  # --------------------------------------------------- Print login screen header
       unless ($env{'form.sendit'}) {        unless ($env{'form.sendit'}) {
             &Apache::lonenc::check_encrypt(\$feedurl);
   &Apache::loncommon::content_type($r,'text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
             if (($env{'form.replydisc'}) || ($env{'form.editdisc'})) {
                 my ($blocked,$blocktext) = 
                        &Apache::loncommon::blocking_status('boards');
                 if ($blocked) {
                     $r->print(&blocked_reply_or_edit($blocktext));
                     return OK;
                 }
             }
   my $options=&screen_header($feedurl,$symb);    my $options=&screen_header($feedurl,$symb);
   if ($options) {    if ($options) {
       &mail_screen($r,$feedurl,$options);        &mail_screen($r,$feedurl,$options);
Line 3797  ENDREDIR Line 3876  ENDREDIR
       &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$blog,$status,$env{'form.previous'},undef,undef,undef,undef,undef,undef,$group);        &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$blog,$status,$env{'form.previous'},undef,undef,undef,undef,undef,undef,$group);
   }    }
   return OK;    return OK;
   }
   
   sub blocked_reply_or_edit {
       my ($blocktext) = @_;
       return 
         &Apache::loncommon::start_page('Resource Feedback and Discussion').
         $blocktext.'<br /><br /><a href="javascript:history.go(-1)">'.
         &mt('Back to previous page').
         &Apache::loncommon::end_page();
 }   } 
   
 sub wrap_symb {  sub wrap_symb {

Removed from v.1.225  
changed lines
  Added in v.1.236


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