--- loncom/interface/lonmsg.pm 2005/01/01 18:36:13 1.128 +++ loncom/interface/lonmsg.pm 2005/03/01 03:28:14 1.139 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging # -# $Id: lonmsg.pm,v 1.128 2005/01/01 18:36:13 www Exp $ +# $Id: lonmsg.pm,v 1.139 2005/03/01 03:28:14 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -90,7 +90,7 @@ also has a student role in the course, A Users can ask LON-CAPA to forward messages to conventional e-mail addresses on their B<PREF> screen, but generally, LON-CAPA messages -are much more useful then traditional email can be made to be, even +are much more useful than traditional email can be made to be, even with HTML support. Right now, this document will cover just how to send a message, since @@ -239,9 +239,15 @@ sub sendemail { # ==================================================== Send notification emails sub sendnotification { - my ($to,$touname,$toudom,$subj,$crit)=@_; + my ($to,$touname,$toudom,$subj,$crit,$text)=@_; my $sender=$ENV{'environment.firstname'}.' '.$ENV{'environment.lastname'}; + unless ($sender=~/\w/) { + $sender=$ENV{'user.name'}.'@'.$ENV{'user.domain'}; + } my $critical=($crit?' critical':''); + $text=~s/\<\;/\</gs; + $text=~s/\>\;/\>/gs; + $text=~s/\<\/*[^\>]+\>//gs; my $url='http://'. $Apache::lonnet::hostname{&Apache::lonnet::homeserver($touname,$toudom)}. '/adm/email?username='.$touname.'&domain='.$toudom; @@ -250,11 +256,15 @@ You received a$critical message from $se $subj +=== Excerpt ============================================================ +$text +======================================================================== + Use $url -to access this message. +to access the full message. ENDMSG &sendemail($to,'New'.$critical.' message from '.$sender,$body); } @@ -346,11 +356,12 @@ sub all_url_author_res_msg { # ================================================== Critical message to a user sub user_crit_msg_raw { - my ($user,$domain,$subject,$message,$sendback)=@_; + my ($user,$domain,$subject,$message,$sendback,$toperm)=@_; # Check if allowed missing my $status=''; my $msgid='undefined'; unless (($message)&&($user)&&($domain)) { $status='empty'; }; + my $text=$message; my $homeserver=&Apache::lonnet::homeserver($user,$domain); if ($homeserver ne 'no_host') { ($msgid,$message)=&packagemsg($subject,$message); @@ -370,10 +381,16 @@ sub user_crit_msg_raw { $status='no_host'; } # Notifications - my %userenv = &Apache::lonnet::get('environment',['critnotification'], + my %userenv = &Apache::lonnet::get('environment',['critnotification', + 'permanentemail'], $domain,$user); if ($userenv{'critnotification'}) { - &sendnotification($userenv{'critnotification'},$user,$domain,$subject,1); + &sendnotification($userenv{'critnotification'},$user,$domain,$subject,1, + $text); + } + if ($toperm && $userenv{'permanentemail'}) { + &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,1, + $text); } # Log this &Apache::lonnet::logthis( @@ -397,7 +414,7 @@ sub user_crit_msg_raw { =cut sub user_crit_msg { - my ($user,$domain,$subject,$message,$sendback)=@_; + my ($user,$domain,$subject,$message,$sendback,$toperm)=@_; my $status=''; my %userenv = &Apache::lonnet::get('environment',['msgforward'], $domain,$user); @@ -407,10 +424,10 @@ sub user_crit_msg { my ($forwuser,$forwdomain)=split(/\:/,$_); $status.= &user_crit_msg_raw($forwuser,$forwdomain,$subject,$message, - $sendback).' '; + $sendback,$toperm).' '; } } else { - $status=&user_crit_msg_raw($user,$domain,$subject,$message,$sendback); + $status=&user_crit_msg_raw($user,$domain,$subject,$message,$sendback,$toperm); } return $status; } @@ -444,10 +461,12 @@ sub user_crit_received { # ======================================================== Normal communication sub user_normal_msg_raw { - my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl)=@_; + my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, + $toperm)=@_; # Check if allowed missing my $status=''; my $msgid='undefined'; + my $text=$message; unless (($message)&&($user)&&($domain)) { $status='empty'; }; my $homeserver=&Apache::lonnet::homeserver($user,$domain); if ($homeserver ne 'no_host') { @@ -471,10 +490,16 @@ sub user_normal_msg_raw { $status='no_host'; } # Notifications - my %userenv = &Apache::lonnet::get('environment',['notification'], + my %userenv = &Apache::lonnet::get('environment',['notification', + 'permanentemail'], $domain,$user); if ($userenv{'notification'}) { - &sendnotification($userenv{'notification'},$user,$domain,$subject,0); + &sendnotification($userenv{'notification'},$user,$domain,$subject,0, + $text); + } + if ($toperm && $userenv{'permanentemail'}) { + &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0, + $text); } &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'}, $ENV{'user.home'}, @@ -493,7 +518,8 @@ sub user_normal_msg_raw { =cut sub user_normal_msg { - my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl)=@_; + my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, + $toperm)=@_; my $status=''; my %userenv = &Apache::lonnet::get('environment',['msgforward'], $domain,$user); @@ -503,11 +529,11 @@ sub user_normal_msg { my ($forwuser,$forwdomain)=split(/\:/,$_); $status.= &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message, - $citation,$baseurl,$attachmenturl).' '; + $citation,$baseurl,$attachmenturl,$toperm).' '; } } else { $status=&user_normal_msg_raw($user,$domain,$subject,$message, - $citation,$baseurl,$attachmenturl); + $citation,$baseurl,$attachmenturl,$toperm); } return $status; } @@ -613,9 +639,9 @@ sub discourse { my $r=shift; my $classlist = &Apache::loncoursedata::get_classlist(); my $now=time; - my %lt=&Apache::lonlocal::texthash('cfa' => 'Check for All', - 'cfs' => 'Check for Section/Group', - 'cfn' => 'Check for None'); + my %lt=&Apache::lonlocal::texthash('cfa' => 'Check All', + 'cfs' => 'Check Section/Group', + 'cfn' => 'Uncheck All'); $r->print(<<ENDDISHEADER); <input type="hidden" name="sendmode" value="group" /> <script> @@ -649,7 +675,7 @@ sub discourse { </script> <input type="button" onClick="checkall()" value="$lt{'cfa'}" /> <input type="button" onClick="checksec()" value="$lt{'cfs'}" /> -<input type="text" size="5" name=chksec /> +<input type="text" size="5" name="chksec" /> <input type="button" onClick="uncheckall()" value="$lt{'cfn'}" /> <p> ENDDISHEADER @@ -667,7 +693,15 @@ ENDDISHEADER } } $r->print('</table><table>'); - while (my ($student,$info) = each(%$classlist)) { + my $sort = sub { + my $aname=lc($classlist->{$a}[&Apache::loncoursedata::CL_FULLNAME()]); + if (!$aname) { $aname=$a; } + my $bname=lc($classlist->{$b}[&Apache::loncoursedata::CL_FULLNAME()]); + if (!$bname) { $bname=$b; } + return $aname cmp $bname; + }; + foreach my $student (sort $sort (keys(%{$classlist}))) { + my $info=$classlist->{$student}; my ($sname,$sdom,$status,$fullname,$section) = (@{$info}[&Apache::loncoursedata::CL_SNAME(), &Apache::loncoursedata::CL_SDOM(), @@ -675,11 +709,11 @@ ENDDISHEADER &Apache::loncoursedata::CL_FULLNAME(), &Apache::loncoursedata::CL_SECTION()]); next if ($status ne 'Active'); - my $key = 'send_to_&&&'.$section.'&&&'.$student; + my $key = 'send_to_&&&'.$section.'&&&_'.$student; if (! defined($fullname) || $fullname eq '') { $fullname = $sname; } $r->print('<tr><td><label>'. - qq{<input type="checkbox" name="$key">}.(' 'x2). - $fullname.'</td><td>'.$sname.'@'.$sdom.'</td><td>'.$section. + qq{<input type="checkbox" name="$key" />}.(' 'x2). + $fullname.'</label></td><td>'.$sname.'@'.$sdom.'</td><td>'.$section. '</td></tr>'); } $r->print('</table>'); @@ -690,8 +724,8 @@ ENDDISHEADER sub discrit { my $r=shift; my $header = '<h1><font color=red>'.&mt('Critical Messages').'</font></h1>'. - '<form action=/adm/email method=post>'. - '<input type=hidden name=confirm value=true>'; + '<form action="/adm/email" method="POST">'. + '<input type="hidden" name="confirm" value="true" />'; my %what=&Apache::lonnet::dump('critical'); my $result = ''; foreach (sort keys %what) { @@ -703,14 +737,14 @@ sub discrit { $content{'sendername'}.'@'. $content{'senderdomain'}.') '.$content{'time'}. '<br />'.&mt('Subject').': '.$content{'subject'}. - '<br /><blockquote>'. + '<br /><pre>'. &Apache::lontexconvert::msgtexconverted($content{'message'}). - '</blockquote><small>'. + '</pre><small>'. &mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox'). '</small><br />'. - '<input type=submit name="rec_'.$_.'" value="'.&mt('Confirm Receipt').'">'. - '<input type=submit name="reprec_'.$_.'" '. - 'value="'.&mt('Confirm Receipt and Reply').'">'; + '<input type="submit" name="rec_'.$_.'" value="'.&mt('Confirm Receipt').'" />'. + '<input type="submit" name="reprec_'.$_.'" '. + 'value="'.&mt('Confirm Receipt and Reply').'" />'; } # Check to see if there were any messages. if ($result eq '') { @@ -836,14 +870,14 @@ TABLEHEAD foreach my $msg (@newmsgs) { $r->print(<<"ENDLINK"); <tr bgcolor="#FFBB77"> -<td><a href="/adm/email?display=$msg->{'msgid'}">$lt{'op'}</a></td> +<td><a href="/adm/email?dismode=new&display=$msg->{'msgid'}">$lt{'op'}</a></td> ENDLINK foreach ('sendtime','from','fromdom','shortsub') { $r->print("<td>$msg->{$_}</td>"); } $r->print("</td></tr>"); } - $r->print('</table></body></html>'); + $r->print('</table>'.&Apache::loncommon::endbodytag().'</html>'); } elsif ($numblocked == 0) { $r->print("<h3>".&mt('You have no unread messages')."</h3>"); } @@ -953,9 +987,9 @@ ENDDISHEADER } $r->print('</th><th>'); if ($ENV{'form.sortedby'} eq "revstatus") { - $r->print('<a href = "?sortedby=status'.$fsqs.'">'.&mt('Status').'</th>'); + $r->print('<a href = "?sortedby=status'.$fsqs.'">'.&mt('Status').'</a></th>'); } else { - $r->print('<a href = "?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</th>'); + $r->print('<a href = "?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</a></th>'); } $r->print("</tr>\n"); for (my $n=$firstdis;$n<=$lastdis;$n++) { @@ -970,10 +1004,10 @@ ENDDISHEADER } else { $r->print('<tr bgcolor="#99BBBB">'); } - $r->print('<td></a><input type=checkbox name="delmark_'.$origID.'" /></td><td><a href="/adm/email?display='.$origID.$sqs. + $r->print('<td><input type="checkbox" name="delmark_'.$origID.'" /></td><td><a href="/adm/email?display='.$origID.$sqs. '">'.&mt('Open').'</a></td><td>'. ($folder ne 'trash'?'<a href="/adm/email?markdel='.$origID.$sqs. - '">'.&mt('Delete'):' ').'</td>'. + '">'.&mt('Delete'):' ').'</a></td>'. '<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'. $fromname.'</td><td>'.$fromdomain.'</td><td>'. &Apache::lonnet::unescape($shortsubj).'</td><td>'. @@ -1056,10 +1090,12 @@ sub compout { if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message"); $dispcrit= - '<input type="checkbox" name="critmsg" /> '.&mt('Send as critical message').' ' . $crithelp . - '<br>'. - '<input type="checkbox" name="sendbck" /> '.&mt('Send as critical message').' ' . - &mt('and return receipt') . $crithelp . '<p>'; + '<p><label><input type="checkbox" name="critmsg" /> '.&mt('Send as critical message').'</label> ' . $crithelp . + '</p><p>'. + '<label><input type="checkbox" name="sendbck" /> '.&mt('Send as critical message').' ' . + &mt('and return receipt') . '</label>' . $crithelp . + '</p><p><label><input type="checkbox" name="permanent" /> '. +&mt('Send copy to permanent email address (if known)').'</label></p>'; } my %message; my %content; @@ -1093,8 +1129,8 @@ sub compout { if ($content{'baseurl'}) { $disbase='<input type="hidden" name="baseurl" value="'.&Apache::lonnet::escape($content{'baseurl'}).'" />'; if ($ENV{'user.adv'}) { - $disbase.='<input type="checkbox" name="storebasecomment" />'.&mt('Store message for re-use'). - ' <a href="/adm/email?showcommentbaseurl='. + $disbase.='<label><input type="checkbox" name="storebasecomment" />'.&mt('Store message for re-use'). + '</label> <a href="/adm/email?showcommentbaseurl='. &Apache::lonnet::escape($content{'baseurl'}).'" target="comments">'. &mt('Show re-usable messages').'</a><br />'; } @@ -1122,7 +1158,7 @@ sub compout { my $selectlink=&Apache::loncommon::selectstudent_link ('compemail','recuname','recdomain'); $r->print(<<"ENDREC"); -<tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$ENV{'form.recname'}"></td><td rowspan="2">$selectlink</td></tr> +<tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$ENV{'form.recname'}" /></td><td rowspan="2">$selectlink</td></tr> <tr><td>$lt{'do'}:</td> <td>$domform</td></tr> ENDREC @@ -1238,9 +1274,9 @@ sub disfacetoface { &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('. $content{'sendername'}.'@'. $content{'senderdomain'}.') '.$content{'time'}. - '<br /><blockquote>'. + '<br /><pre>'. &Apache::lontexconvert::msgtexconverted($content{'message'}). - '</blockquote>'; + '</pre>'; } # Check to see if there were any messages. if ($result eq '') { @@ -1372,12 +1408,13 @@ sub examblock { $r->print($lt{'ncbc'}.'<br /><br />'); } &display_addblocker_table($r,$parmcount,\%ltext); + my $endbody=&Apache::loncommon::endbodytag(); $r->print(<<"END"); <br /> <input type="hidden" name="blocktotal" value="$blockcount" /> <input type ="submit" value="Save Changes" /> </form> -</body> +$endbody </html> END return; @@ -1523,8 +1560,8 @@ END <tr bgcolor="$bgcols[$iter]"> <td>$$ltext{'star'}: $startform<br/>$$ltext{'endd'}: $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'}? <input type="checkbox" name="modify_$parmcount"/><br />$lt{'canc'}? <input type="checkbox" name="cancel_$parmcount"/> + <td><input type="text" name="title_$parmcount" size="15" value="$title" /><input type="hidden" name="key_$parmcount" value="$_" /></td> + <td><label>$lt{'modi'}? <input type="checkbox" name="modify_$parmcount" /></label><br /><label>$lt{'canc'}? <input type="checkbox" name="cancel_$parmcount" /></label> </tr> END $parmcount ++; @@ -1576,8 +1613,8 @@ sub display_addblocker_table { </tr> <tr bgcolor="#eeeeee"> <td>$$ltext{'star'}: $startform<br />$$ltext{'endd'}: $endform</td> - <td><input type="text" name="title_$parmcount" size="15" value=""/></td> - <td>$lt{'addb'}? <input type="checkbox" name="add_$parmcount" value="1"/></td> + <td><input type="text" name="title_$parmcount" size="15" value="" /></td> + <td><label>$lt{'addb'}? <input type="checkbox" name="add_$parmcount" value="1" /></label></td> </tr> </table> </td> @@ -1739,6 +1776,7 @@ sub displaymessage { '<td><a href="/adm/email?markdel='.&Apache::lonnet::escape($msgid).$sqs. '"><b>Delete</b></a></td>'. '<td><a href="/adm/email?'.$sqs. + ($ENV{'form.dismode'} eq 'new'?'&folder=new':''). '"><b>'.&mt('Back to Folder Display').'</b></a></td>'); if ($counter > 0){ $r->print('<td><a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs. @@ -1810,7 +1848,9 @@ sub displayresource { sub header { my ($r,$title,$baseurl)=@_; - $r->print('<html><head><title>Communication and Messages</title>'); + $r->print(&Apache::lonxml::xmlbegin(). + '<head>'.&Apache::lonxml::fontsettings(). + '<title>Communication and Messages</title>'); if ($baseurl) { $r->print("<base href=\"http://$ENV{'SERVER_NAME'}/$baseurl\" />"); } @@ -1850,7 +1890,8 @@ sub storedcommentlisting { my ($r)=@_; my %msgs=&Apache::lonnet::dump('nohist_stored_comments',undef,undef, '^'.&Apache::lonnet::escape(&Apache::lonnet::escape($ENV{'form.showcommentbaseurl'}))); - $r->print('<html><body>'); + $r->print(&Apache::lonxml::xmlbegin().'<head>'. + &Apache::lonxml::fontsettings().'</head><body>'); if ((keys %msgs)[0]=~/^error\:/) { $r->print(&mt('No stored comments yet.')); } else { @@ -1933,13 +1974,13 @@ sub sendoffmail { $thismsg=&user_crit_msg($recuname,$recdomain, &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}), $msgtxt, - $ENV{'form.sendbck'}); + $ENV{'form.sendbck'},$ENV{'form.permanent'}); } else { $r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': '); $thismsg=&user_normal_msg($recuname,$recdomain, &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}), $msgtxt, - $content{'citation'}); + $content{'citation'},undef,undef,$ENV{'form.permanent'}); if (($ENV{'request.course.id'}) && ($ENV{'form.sendmode'} eq 'group')) { &user_normal_msg_raw( $ENV{'course.'.$ENV{'request.course.id'}.'.num'}, @@ -1986,7 +2027,7 @@ sub handler { ['display','replyto','forward','markread','markdel','markunread', 'sendreply','compose','sendmail','critical','recname','recdom', 'recordftf','sortedby','block','folder','startdis','interdis', - 'showcommentbaseurl']); + 'showcommentbaseurl','dismode']); $sqs='&sortedby='.$ENV{'form.sortedby'}; # ------------------------------------------------------ They checked for email @@ -2121,7 +2162,7 @@ sub handler { &Apache::loncommunicate::menu($r); &disall($r,$folder); } - $r->print('</body></html>'); + $r->print(&Apache::loncommon::endbodytag().'</html>'); return OK; } # ================================================= Main program, reset counter