Diff for /loncom/interface/lonmsg.pm between versions 1.92 and 1.102

version 1.92, 2004/03/02 02:51:09 version 1.102, 2004/06/02 20:40:07
Line 74  email program, so they have full access Line 74  email program, so they have full access
 interface, or other features they may wish to use in response to the  interface, or other features they may wish to use in response to the
 student's query.  student's query.
   
   =item * B<Blocking>: LON-CAPA can block display of e-mails that are 
   sent to a student during an online exam. A course coordinator or
   instructor can set an open and close date/time for scheduled online
   exams in a course. If a user uses the LON-CAPA internal messaging 
   system to display e-mails during the scheduled blocking event,  
   display of all e-mail sent during the blocking period will be 
   suppressed, and a message of explanation, including details of the 
   currently active blocking periods will be displayed instead. A user 
   who has a course coordinator or instructor role in a course will be
   unaffected by any blocking periods for the course, unless the user
   also has a student role in the course, AND has selected the student role.
   
 =back  =back
   
 Users can ask LON-CAPA to forward messages to conventional e-mail  Users can ask LON-CAPA to forward messages to conventional e-mail
Line 101  use Apache::lontexconvert(); Line 113  use Apache::lontexconvert();
 use HTML::Entities();  use HTML::Entities();
 use Mail::Send;  use Mail::Send;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::loncommunicate;
   
 # Querystring component with sorting type  # Querystring component with sorting type
 my $sqs;  my $sqs;
Line 109  my $sqs; Line 122  my $sqs;
   
 sub packagemsg {  sub packagemsg {
     my ($subject,$message,$citation,$baseurl,$attachmenturl)=@_;      my ($subject,$message,$citation,$baseurl,$attachmenturl)=@_;
     $message =&HTML::Entities::encode($message);      $message =&HTML::Entities::encode($message,'<>&"');
     $citation=&HTML::Entities::encode($citation);      $citation=&HTML::Entities::encode($citation,'<>&"');
     $subject =&HTML::Entities::encode($subject);      $subject =&HTML::Entities::encode($subject,'<>&"');
     #remove machine specification      #remove machine specification
     $baseurl =~ s|^http://[^/]+/|/|;      $baseurl =~ s|^http://[^/]+/|/|;
     $baseurl =&HTML::Entities::encode($baseurl);      $baseurl =&HTML::Entities::encode($baseurl,'<>&"');
     #remove machine specification      #remove machine specification
     $attachmenturl =~ s|^http://[^/]+/|/|;      $attachmenturl =~ s|^http://[^/]+/|/|;
     $attachmenturl =&HTML::Entities::encode($attachmenturl);      $attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"');
   
     my $now=time;      my $now=time;
     $msgcount++;      $msgcount++;
Line 171  sub unpackagemsg { Line 184  sub unpackagemsg {
        }         }
     }      }
     if ($content{'attachmenturl'}) {      if ($content{'attachmenturl'}) {
        my ($fname,$ft)=($content{'attachmenturl'}=~/\/(\w+)\.(\w+)$/);         my ($fname)=($content{'attachmenturl'}=~m|/([^/]+)$|);
        if ($notoken) {         if ($notoken) {
    $content{'message'}.='<p>'.&mt('Attachment').': <tt>'.$fname.'.'.$ft.'</tt>';     $content{'message'}.='<p>'.&mt('Attachment').': <tt>'.$fname.'</tt>';
        } else {         } else {
    $content{'message'}.='<p>'.&mt('Attachment').': <a href="'.     &Apache::lonnet::allowuploaded('/adm/msg',
        &Apache::lonnet::tokenwrapper($content{'attachmenturl'}).    $content{'attachmenturl'});
        '"><tt>'.$fname.'.'.$ft.'</tt></a>';     $content{'message'}.='<p>'.&mt('Attachment').
          ': <a href="'.$content{'attachmenturl'}.'"><tt>'.
          $fname.'</tt></a>';
        }         }
     }      }
     return %content;      return %content;
Line 204  sub sendemail { Line 219  sub sendemail {
     my $msg = new Mail::Send;      my $msg = new Mail::Send;
     $msg->to($to);      $msg->to($to);
     $msg->subject('[LON-CAPA] '.$subject);      $msg->subject('[LON-CAPA] '.$subject);
     if (my $fh = $msg->open('smtp',Server => 'localhost')) {      if (my $fh = $msg->open()) {
  print $fh $body;   print $fh $body;
  $fh->close;   $fh->close;
     }      }
Line 619  $content{'sendername'}.'@'. Line 634  $content{'sendername'}.'@'.
 }  }
   
 sub sortedmessages {  sub sortedmessages {
       my ($blocked,$startblock,$endblock,$numblocked) = @_;
     my @messages = &Apache::lonnet::getkeys('nohist_email');      my @messages = &Apache::lonnet::getkeys('nohist_email');
     #unpack the varibles and repack into temp for sorting      #unpack the varibles and repack into temp for sorting
     my @temp;      my @temp;
Line 628  sub sortedmessages { Line 644  sub sortedmessages {
     &Apache::lonmsg::unpackmsgid($msgid);      &Apache::lonmsg::unpackmsgid($msgid);
  my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,   my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,
      $msgid);       $msgid);
  push @temp ,\@temp1;          # Check whether message was sent during blocking period.
           if ($sendtime >= $startblock && ($sendtime <= $endblock && $endblock > 0) ) {
               my $escid = &Apache::lonnet::unescape($msgid);
               $$blocked{$escid} = 'ON';
               $$numblocked ++;
           } else { 
               push @temp ,\@temp1;
           }
     }      }
     #default sort      #default sort
     @temp = sort  {$a->[0] <=> $b->[0]} @temp;          @temp = sort  {$a->[0] <=> $b->[0]} @temp;    
Line 669  sub sortedmessages { Line 692  sub sortedmessages {
   
 sub disall {  sub disall {
     my $r=shift;      my $r=shift;
      $r->print(<<ENDDISHEADER);      my %blocked = ();
       my %setters = ();
       my $startblock;
       my $endblock;
       my $numblocked = 0;
       &blockcheck(\%setters,\$startblock,\$endblock);
       $r->print(<<ENDDISHEADER);
 <script>  <script>
     function checkall() {      function checkall() {
  for (i=0; i<document.forms.disall.elements.length; i++) {   for (i=0; i<document.forms.disall.elements.length; i++) {
Line 723  ENDDISHEADER Line 752  ENDDISHEADER
       $r->print('<a href = "?sortedby=revstatus">'.&mt('Status').'</th>');        $r->print('<a href = "?sortedby=revstatus">'.&mt('Status').'</th>');
     }      }
     $r->print('</tr>');      $r->print('</tr>');
     my @temp=sortedmessages();      my @temp=sortedmessages(\%blocked,$startblock,$endblock,\$numblocked);
     foreach (@temp){      foreach (@temp){
  my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID)= @$_;   my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID)= @$_;
  if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {   if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {
Line 750  ENDDISHEADER Line 779  ENDDISHEADER
               '<a href="javascript:uncheckall()">'.&mt('Uncheck All').'</a><p>'.                '<a href="javascript:uncheckall()">'.&mt('Uncheck All').'</a><p>'.
       '<input type="hidden" name="sortedby" value="'.$ENV{'form.sortedby'}.'" />'.        '<input type="hidden" name="sortedby" value="'.$ENV{'form.sortedby'}.'" />'.
               '<input type="submit" name="markeddel" value="'.&mt('Delete Checked').'" />'.                '<input type="submit" name="markeddel" value="'.&mt('Delete Checked').'" />'.
               '</form></body></html>');                '</form>');
       if ($numblocked > 0) {
           my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
           my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
           $r->print('<br /><br />'.
                     $numblocked.' '.&mt('message(s) is/are not viewable because display of LON-CAPA messages sent to you by other students between').' '.$beginblock.' '.&mt('and').' '.$finishblock.' '.&mt('is currently being blocked because of online exams.'));
           &build_block_table($r,$startblock,$endblock,\%setters);
       }
       $r->print('</body></html>');
 }  }
   
 # ============================================================== Compose output  # ============================================================== Compose output
   
 sub compout {  sub compout {
     my ($r,$forwarding,$replying,$broadcast)=@_;      my ($r,$forwarding,$replying,$broadcast,$replycrit)=@_;
   
     if ($broadcast eq 'individual') {      if ($broadcast eq 'individual') {
  &printheader($r,'/adm/email?compose=individual',   &printheader($r,'/adm/email?compose=individual',
Line 776  sub compout { Line 813  sub compout {
           text=>"Display Message"});            text=>"Display Message"});
  &printheader($r,'/adm/email?replyto='.&Apache::lonnet::escape($replying),   &printheader($r,'/adm/email?replyto='.&Apache::lonnet::escape($replying),
      'Replying to a Message');       'Replying to a Message');
       } elsif ($replycrit) {
    $r->print('<h3>'.&mt('Replying to a Critical Message').'</h3>');
    $replying=$replycrit;
     } else {      } else {
  &printheader($r,'/adm/email?compose=upload',   &printheader($r,'/adm/email?compose=upload',
      'Distribute from Uploaded File');       'Distribute from Uploaded File');
Line 907  ENDUPLOAD Line 947  ENDUPLOAD
   
 sub disfacetoface {  sub disfacetoface {
     my ($r,$user,$domain)=@_;      my ($r,$user,$domain)=@_;
       my $target=$ENV{'form.grade_target'};
     unless ($ENV{'request.course.id'}) { return; }      unless ($ENV{'request.course.id'}) { return; }
     unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {      unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
  return;   return;
Line 922  sub disfacetoface { Line 963  sub disfacetoface {
         $content{'message'}=~s/\n/\<br\>/g;          $content{'message'}=~s/\n/\<br\>/g;
         if ($content{'subject'}=~/^Record/) {          if ($content{'subject'}=~/^Record/) {
     $result.='<h3>'.&mt('Record').'</h3>';      $result.='<h3>'.&mt('Record').'</h3>';
           } elsif ($content{'subject'}=~/^Broadcast/) {
               $result .='<h3>'.&mt('Broadcast Message').'</h3>';
         } else {          } else {
             $result.='<h3>'.&mt('Sent Message').'</h3>';              $result.='<h3>'.&mt('Critical Message').'</h3>';
             %content=&unpackagemsg($content{'message'});              %content=&unpackagemsg($content{'message'});
             $content{'message'}=              $content{'message'}=
                 '<b>'.&mt('Subject').': '.$content{'subject'}.'</b><br />'.                  '<b>'.&mt('Subject').': '.$content{'subject'}.'</b><br />'.
Line 940  $content{'sendername'}.'@'. Line 983  $content{'sendername'}.'@'.
      }       }
     # Check to see if there were any messages.      # Check to see if there were any messages.
     if ($result eq '') {      if ($result eq '') {
         $r->print("<p><b>".&mt("No notes, face-to-face discussion records, or critical messages in this course.")."</b></p>");   if ($target ne 'tex') { 
       $r->print("<p><b>".&mt("No notes, face-to-face discussion records, critical messages, or broadcast messages in this course.")."</b></p>");
    } else {
       $r->print('\textbf{'.&mt("No notes, face-to-face discussion records, critical messages or broadcast messages in this course.").'}\\\\');
    }
     } else {      } else {
        $r->print($result);         $r->print($result);
     }      }
Line 955  sub facetoface { Line 1002  sub facetoface {
     }      }
     &printheader($r,      &printheader($r,
  '/adm/email?recordftf=query',   '/adm/email?recordftf=query',
  "User Notes, Face-to-Face, Critical Messages");   "User Notes, Face-to-Face, Critical Messages, Broadcast Messages");
 # from query string  # from query string
   
     if ($ENV{'form.recname'}) { $ENV{'form.recuname'}=$ENV{'form.recname'}; }      if ($ENV{'form.recname'}) { $ENV{'form.recuname'}=$ENV{'form.recname'}; }
Line 970  sub facetoface { Line 1017  sub facetoface {
  ('stdselect','recuname','recdomain');   ('stdselect','recuname','recdomain');
     my %lt=&Apache::lonlocal::texthash('user' => 'Username',      my %lt=&Apache::lonlocal::texthash('user' => 'Username',
        'dom' => 'Domain',         'dom' => 'Domain',
        'head' => 'User Notes, Records of Face-To-Face Discussions, and Critical Messages in Course',         'head' => 'User Notes, Records of Face-To-Face Discussions, Critical Messages, and Broadcast Messages in Course',
        'subm' => 'Retrieve discussion and message records',         'subm' => 'Retrieve discussion and message records',
        'newr' => 'New Record (record is visible to course faculty and staff)',         'newr' => 'New Record (record is visible to course faculty and staff)',
        'post' => 'Post this Record');         'post' => 'Post this Record');
Line 1019  ENDBFORM Line 1066  ENDBFORM
     }      }
 }  }
   
   # ----------------------------------------------------------- Blocking during exams
   
   sub examblock {
       my ($r,$action) = @_;
       unless ($ENV{'request.course.id'}) { return;}
       unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { $r->print('Not allowed'); }
       my %lt=&Apache::lonlocal::texthash(
               'comb' => 'Communication Blocking',
               'cbds' => 'Communication blocking during scheduled exams',
               'desc' => 'You can use communication blocking to prevent students enrolled in this course from displaying LON-CAPA messages sent by other students during an online exam. As blocking of communication could potentially interrupt legitimate communication between students who are also both enrolled in a different LON-CAPA course, please be careful that you select the correct start and end times for your scheduled exam when setting or modifying these parameters.',
                'mecb' => 'Modify existing communication blocking periods',
                'ncbc' => 'No communication blocks currently stored'
       );
   
       my %ltext = &Apache::lonlocal::texthash(
               'dura' => 'Duration',
               'setb' => 'Set by',
               'even' => 'Event',
               'actn' => 'Action',
               'star' => 'Start',
               'endd' => 'End'
       );
   
       &printheader($r,'/adm/email?block=display',$lt{'comb'});
       $r->print('<h3>'.$lt{'cbds'}.'</h3>');
   
       if ($action eq 'store') {
           &blockstore($r);
       }
   
       $r->print($lt{'desc'}.'<br /><br />
                  <form name="blockform" method="post" action="/adm/email?block=store">
                ');
   
       $r->print('<h4>'.$lt{'mecb'}.'</h4>');
       my %records = ();
       my $blockcount = 0;
       my $parmcount = 0;
       &get_blockdates(\%records,\$blockcount);
       if ($blockcount > 0) {
           $parmcount = &display_blocker_status($r,\%records,\%ltext);
       } else {
           $r->print($lt{'ncbc'}.'<br /><br />');
       }
       &display_addblocker_table($r,$parmcount,\%ltext);
       $r->print(<<"END");
   <br />
   <input type="hidden" name="blocktotal" value="$blockcount" />
   <input type ="submit" value="Save Changes" />
   </form>
   </body>
   </html>
   END
       return;
   }
   
   sub blockstore {
       my $r = shift;
       my %lt=&Apache::lonlocal::texthash(
               'tfcm' => 'The following changes were made',
               'cbps' => 'communication blocking period(s)',
               'werm' => 'was/were removed',
               'wemo' => 'was/were modified',
               'wead' => 'was/were added',
               'ncwm' => 'No changes were made.' 
       );
       my %adds = ();
       my %removals = ();
       my %cancels = ();
       my $modtotal = 0;
       my $canceltotal = 0;
       my $addtotal = 0;
       my %blocking = ();
       $r->print('<h3>'.$lt{'head'}.'</h3>');
       foreach (keys %ENV) {
           if ($_ =~ m/^form\.modify_(\w+)$/) {
               $adds{$1} = $1;
               $removals{$1} = $1;
               $modtotal ++;
           } elsif ($_ =~ m/^form\.cancel_(\d+)$/) {
               $cancels{$1} = $1;
               unless ( defined($removals{$1}) ) {
                   $removals{$1} = $1;
                   $canceltotal ++;
               }
           } elsif ($_ =~ m/^form\.add_(\d+)$/) {
               $adds{$1} = $1;
               $addtotal ++;
           }
       }
   
       foreach (keys %removals) {
           my $hashkey = $ENV{'form.key_'.$_};
           &Apache::lonnet::del('comm_block',["$hashkey"],
                            $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
                            $ENV{'course.'.$ENV{'request.course.id'}.'.num'}
                            );
       }
       foreach (keys %adds) {
           unless ( defined($cancels{$_}) ) {
               my ($newstart,$newend) = &get_dates_from_form($_);
               my $newkey = $newstart.'____'.$newend;
               $blocking{$newkey} = $ENV{'user.name'}.'@'.$ENV{'user.domain'}.':'.$ENV{'form.title_'.$_};
           }
       }
       if ($addtotal + $modtotal > 0) {
           &Apache::lonnet::put('comm_block',\%blocking,
                        $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
                        $ENV{'course.'.$ENV{'request.course.id'}.'.num'}
                        );
       }
       my $chgestotal = $canceltotal + $modtotal + $addtotal;
       if ($chgestotal > 0) {
           $r->print($lt{'tfcm'}.'<ul>');
           if ($canceltotal > 0) {
               $r->print('<li>'.$canceltotal.' '.$lt{'cbps'},' '.$lt{'werm'}.'</li>');
           }
           if ($modtotal > 0) {
               $r->print('<li>'.$modtotal.' '.$lt{'cbps'},' '.$lt{'wemo'}.'</li>');
           }
           if ($addtotal > 0) {
               $r->print('<li>'.$addtotal.' '.$lt{'cbps'},' '.$lt{'wead'}.'</li>');
           }
           $r->print('</ul>');
       } else {
           $r->print($lt{'ncwm'});
       }
       $r->print('<br />');
       return;
   }
   
   sub get_dates_from_form {
       my $item = shift;
       my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate_'.$item);
       my $enddate   = &Apache::lonhtmlcommon::get_date_from_form('enddate_'.$item);
       return ($startdate,$enddate);
   }
   
   sub get_blockdates {
       my ($records,$blockcount) = @_;
       $$blockcount = 0;
       %{$records} = &Apache::lonnet::dump('comm_block',
                            $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
                            $ENV{'course.'.$ENV{'request.course.id'}.'.num'}
                            );
       $$blockcount = keys %{$records};
                                                                                                                
       foreach (keys %{$records}) {
           if ($_ eq 'error: 2 tie(GDBM) Failed while attempting dump') {
               $$blockcount = 0;
               last;
           }
       }
   }
   
   sub display_blocker_status {
       my ($r,$records,$ltext) = @_;
       my $parmcount = 0;
       my @bgcols = ("#eeeeee","#dddddd");
       my $function = &Apache::loncommon::get_users_function();
       my $color = &Apache::loncommon::designparm($function.'.tabbg',
                                                       $ENV{'user.domain'});
       my %lt = &Apache::lonlocal::texthash(
           'modi' => 'Modify',
           'canc' => 'Cancel',
       );
       $r->print(<<"END");
   <table border="0" cellpadding="0" cellspacing="0">
    <tr>
     <td width="100%" bgcolor="#000000">
      <table width="100%" border="0" cellpadding="1" cellspacing="0">
       <tr>
        <td width="100%" bgcolor="#000000">
         <table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF">
          <tr bgcolor="$color">
           <td><b>$$ltext{'dura'}</b></td>
           <td><b>$$ltext{'setb'}</b></td>
           <td><b>$$ltext{'even'}</b></td>
           <td><b>$$ltext{'actn'}?</b></td>
          </tr>
   END
       foreach (sort keys %{$records}) {
           my $iter = $parmcount%2;
           my $onchange = 'onFocus="javascript:window.document.forms['.
                          "'blockform'].elements['modify_".$parmcount."'].".
                          'checked=true;"';
           my ($start,$end) = split/____/,$_;
           my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);
           my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);
           my ($setter,$title) = split/:/,$$records{$_};
           my ($setuname,$setudom) = split/@/,$setter;
           my $settername = &Apache::loncommon::plainname($setuname,$setudom);
           $r->print(<<"END");
          <tr bgcolor="$bgcols[$iter]">
           <td>$$ltext{'star'}:&nbsp;$startform<br/>$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>
           <td>$settername</td>
           <td><input type="text" name="title_$parmcount" size="15" value="$title"/><input type="hidden" name="key_$parmcount" value="$_"></td>
           <td>$lt{'modi'}?&nbsp;<input type="checkbox" name="modify_$parmcount"/><br />$lt{'canc'}?&nbsp;&nbsp;<input type="checkbox" name="cancel_$parmcount"/>
          </tr>
   END
           $parmcount ++;
       }
       $r->print(<<"END");
         </table>
        </td>
       </tr>
      </table>
     </td>
    </tr>
   </table>
   <br />
   <br />
   END
       return $parmcount;
   }
   
   sub display_addblocker_table {
       my ($r,$parmcount,$ltext) = @_;
       my $start = time;
       my $end = $start + (60 * 60 * 2); #Default is an exam of 2 hours duration.
       my $onchange = 'onFocus="javascript:window.document.forms['.
                      "'blockform'].elements['add_".$parmcount."'].".
                      'checked=true;"';
       my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);
       my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);
       my $function = &Apache::loncommon::get_users_function();
       my $color = &Apache::loncommon::designparm($function.'.tabbg',
                                                       $ENV{'user.domain'});
       my %lt = &Apache::lonlocal::texthash(
           'addb' => 'Add block',
           'exam' => 'e.g., Exam 1',
           'addn' => 'Add new communication blocking periods'
       );
       $r->print(<<"END");
   <h4>$lt{'addn'}</h4> 
   <table border="0" cellpadding="0" cellspacing="0">
    <tr>
     <td width="100%" bgcolor="#000000">
      <table width="100%" border="0" cellpadding="1" cellspacing="0">
       <tr>
        <td width="100%" bgcolor="#000000">
         <table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF">
          <tr bgcolor="#CCCCFF">
           <td><b>$$ltext{'dura'}</b></td>
           <td><b>$$ltext{'even'} $lt{'exam'}</b></td>
           <td><b>$$ltext{'actn'}?</b></td>
          </tr>
          <tr bgcolor="#eeeeee">
           <td>$$ltext{'star'}:&nbsp;$startform<br />$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>
           <td><input type="text" name="title_$parmcount" size="15" value=""/></td>
           <td>$lt{'addb'}?&nbsp;<input type="checkbox" name="add_$parmcount" value="1"/></td>
          </tr>
         </table>
        </td>
       </tr>
      </table>
     </td>
    </tr>
   </table>
   END
       return;
   }
   
   sub blockcheck {
       my ($setters,$startblock,$endblock) = @_;
       # Retrieve active student roles and active course coordinator/instructor roles
       my @livecses = ();
       my @staffcses = ();
       $$startblock = 0;
       $$endblock = 0;
       foreach (keys %ENV) {
           if ($_ =~ m-^user\.role\.(st|cc|in)\./(.+)$-) {
               my $role = $1;
               my $cse = $2;
               $cse =~ s|/|_|;
               if ($ENV{$_} =~ m/^(\d*)\.(\d*)$/) {
                   unless (($2 > 0 && $2 < time) || ($1 > time)) {
                       if ($role eq 'st') {
                           push @livecses, $cse;
                       } else {
                           unless (grep/^$cse$/,@staffcses) {
                               push @staffcses, $cse;
                           }
                       }
                   }
               }
           } elsif ($_ =~ m-user\.role\.cr/(\w+)/(\w+)/([^/]+)\./(.+)$- ) { 
               my $rolepriv = $ENV{'user.role..rolesdef_'.$3};
           }
       }
       # Retrieve blocking times and identity of blocker for active courses for students.
       if (@livecses > 0) {
           foreach my $cse (@livecses) {
               my ($cdom,$crs) = split/_/,$cse;
               if ( (grep/^$cse$/,@staffcses) && ($ENV{'request.role'} !~ m-^st\./$cdom/$crs$-) ) {
                   next;
               } else {
                   %{$$setters{$cse}} = ();
                   @{$$setters{$cse}{'staff'}} = ();
                   @{$$setters{$cse}{'times'}} = ();
                   my %records = &Apache::lonnet::dump('comm_block',$cdom,$crs);
                   foreach (keys %records) {
                       if ($_ =~ m/^(\d+)____(\d+)$/) {
                           if ($1 <= time && $2 >= time) {
                               my ($staff,$title) = split/:/,$records{$_};
                               push @{$$setters{$cse}{'staff'}}, $staff;
                               push @{$$setters{$cse}{'times'}}, $_;
                               if ( ($$startblock == 0) || ($$startblock > $1) ) {
                                   $$startblock = $1;
                               }
                               if ( ($$endblock == 0) || ($$endblock < $2) ) {
                                   $$endblock = $2;
                               }
                           }
                       }
                   }
               }
           }
       }
   }
   
   sub build_block_table {
       my ($r,$startblock,$endblock,$setters) = @_;
       my $function = &Apache::loncommon::get_users_function();
       my $color = &Apache::loncommon::designparm($function.'.tabbg',
                                                       $ENV{'user.domain'});
       my %lt = &Apache::lonlocal::texthash(
           'cacb' => 'Currently active communication blocks',
           'cour' => 'Course',
           'dura' => 'Duration',
           'blse' => 'Block set by'
       ); 
       $r->print(<<"END");
   <br /<br />$lt{'cacb'}:<br /><br />
   <table border="0" cellpadding="0" cellspacing="0">
    <tr>
     <td width="100%" bgcolor="#000000">
      <table width="100%" border="0" cellpadding="1" cellspacing="0">
       <tr>
        <td width="100%" bgcolor="#000000">
         <table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF">
          <tr bgcolor="$color">
           <td><b>$lt{'cour'}</b></td>
           <td><b>$lt{'dura'}</b></td>
           <td><b>$lt{'blse'}</b></td>
          </tr>
   END
       foreach (keys %{$setters}) {
           my %courseinfo=&Apache::lonnet::coursedescription($_);
           for (my $i=0; $i<@{$$setters{$_}{staff}}; $i++) {
               my ($uname,$udom) = split/\@/,$$setters{$_}{staff}[$i];
               my $fullname = &Apache::loncommon::plainname($uname,$udom);
               my ($openblock,$closeblock) = split/____/,$$setters{$_}{times}[$i];
               $openblock = &Apache::lonlocal::locallocaltime($openblock);
               $closeblock= &Apache::lonlocal::locallocaltime($closeblock);
               $r->print('<tr><td>'.$courseinfo{'description'}.'</td>'.
                         '<td>'.$openblock.' to '.$closeblock.'</td>'.
                         '<td>'.$fullname.' ('.$uname.'@'.$udom.
                         ')</td></tr>');
           }
       }
       $r->print('</table></td></tr></table></td></tr></table>');
   }
   
 # ----------------------------------------------------------- Display a message  # ----------------------------------------------------------- Display a message
   
 sub displaymessage {  sub displaymessage {
     my ($r,$msgid)=@_;      my ($r,$msgid)=@_;
       my %blocked = ();
       my %setters = ();
       my $startblock = 0;
       my $endblock = 0;
       my $numblocked = 0;
   # info to generate "next" and "previous" buttons and check if message is blocked
       &blockcheck(\%setters,\$startblock,\$endblock);
       my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked);
       if ( $blocked{$msgid} eq 'ON' ) {
           &printheader($r,'/adm/email',&mt('Display a Message'));
           $r->print(&mt('You attempted to display a message that is currently blocked because you are enrolled in one or more courses for which there is an ongoing online exam.'));
           &build_block_table($r,$startblock,$endblock,\%setters);
           return;
       }
     &statuschange($msgid,'read');      &statuschange($msgid,'read');
     my %message=&Apache::lonnet::get('nohist_email',[$msgid]);      my %message=&Apache::lonnet::get('nohist_email',[$msgid]);
     my %content=&unpackagemsg($message{$msgid});      my %content=&unpackagemsg($message{$msgid});
 # info to generate "next" and "previous" buttons  
     my @messages=&sortedmessages();  
     my $counter=0;      my $counter=0;
     $r->print('<pre>');      $r->print('<pre>');
     my $escmsgid=&Apache::lonnet::escape($msgid);      my $escmsgid=&Apache::lonnet::escape($msgid);
Line 1121  sub handler { Line 1544  sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
         ['display','replyto','forward','markread','markdel','markunread',          ['display','replyto','forward','markread','markdel','markunread',
          'sendreply','compose','sendmail','critical','recname','recdom',           'sendreply','compose','sendmail','critical','recname','recdom',
          'recordftf','sortedby']);           'recordftf','sortedby','block']);
     $sqs='&sortedby='.$ENV{'form.sortedby'};      $sqs='&sortedby='.$ENV{'form.sortedby'};
 # ------------------------------------------------------ They checked for email  # ------------------------------------------------------ They checked for email
     &Apache::lonnet::put('email_status',{'recnewemail'=>0});      unless ($ENV{'form.block'}) {
           &Apache::lonnet::put('email_status',{'recnewemail'=>0});
       }
   
 # ----------------------------------------------------------------- Breadcrumbs  # ----------------------------------------------------------------- Breadcrumbs
   
Line 1151  sub handler { Line 1576  sub handler {
  my $msgid=$1;   my $msgid=$1;
  $r->print('<b>'.&mt('Confirming Receipt').':</b> '.   $r->print('<b>'.&mt('Confirming Receipt').':</b> '.
   &user_crit_received($msgid).'<br>');    &user_crit_received($msgid).'<br>');
  &comprep($r,$msgid);   &compout($r,'','','',$msgid);
     }      }
  }   }
  &discrit($r);   &discrit($r);
Line 1183  sub handler { Line 1608  sub handler {
  &compout($r,'','',$ENV{'form.compose'});   &compout($r,'','',$ENV{'form.compose'});
     } elsif ($ENV{'form.recordftf'}) {      } elsif ($ENV{'form.recordftf'}) {
  &facetoface($r,$ENV{'form.recordftf'});   &facetoface($r,$ENV{'form.recordftf'});
       } elsif ($ENV{'form.block'}) {
           &examblock($r,$ENV{'form.block'});
     } elsif ($ENV{'form.sendmail'}) {      } elsif ($ENV{'form.sendmail'}) {
  my $sendstatus='';   my $sendstatus='';
  if ($ENV{'form.send'}) {   if ($ENV{'form.send'}) {
Line 1242  sub handler { Line 1669  sub handler {
       &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),        &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
       $msgtxt,        $msgtxt,
       $content{'citation'});        $content{'citation'});
                       if (($ENV{'request.course.id'}) && ($ENV{'form.sendmode'} eq 'group')) {
                           &user_normal_msg_raw(
                           $ENV{'course.'.$ENV{'request.course.id'}.'.num'},
                           $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
                           'Broadcast ['.$recuname.':'.$recdomain.']',
                           $msgtxt);
                       }
  }   }
  $r->print($thismsg.'<br />');   $r->print($thismsg.'<br />');
  $sendstatus.=' '.$thismsg;   $sendstatus.=' '.$thismsg;
     }      }
    } else {
       &printheader($r,'','No messages sent.'); 
  }   }
  if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {   if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {
     $r->print('<br /><font color="green">'.&mt('Completed.').'</font>');      $r->print('<br /><font color="green">'.&mt('Completed.').'</font>');
     if ($ENV{'form.displayedcrit'}) {      if ($ENV{'form.displayedcrit'}) {
  &discrit($r);   &discrit($r);
     } else {      } else {
  &disall($r);   &Apache::loncommunicate::menu($r);
     }      }
  } else {   } else {
     $r->print(      $r->print(

Removed from v.1.92  
changed lines
  Added in v.1.102


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