--- loncom/interface/lonmsg.pm 2005/11/17 21:33:40 1.154
+++ loncom/interface/lonmsg.pm 2005/11/23 22:32:11 1.156
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging
#
-# $Id: lonmsg.pm,v 1.154 2005/11/17 21:33:40 www Exp $
+# $Id: lonmsg.pm,v 1.156 2005/11/23 22:32:11 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -126,7 +126,7 @@ my $interdis;
sub packagemsg {
my ($subject,$message,$citation,$baseurl,$attachmenturl,
- $recuser,$recdomain)=@_;
+ $recuser,$recdomain,$msgid)=@_;
$message =&HTML::Entities::encode($message,'<>&"');
$citation=&HTML::Entities::encode($citation,'<>&"');
$subject =&HTML::Entities::encode($subject,'<>&"');
@@ -141,10 +141,12 @@ sub packagemsg {
$msgcount++;
my $partsubj=$subject;
$partsubj=&Apache::lonnet::escape($partsubj);
- my $msgid=&Apache::lonnet::escape(
+ unless(defined($msgid)) {
+ $msgid=&Apache::lonnet::escape(
$now.':'.$partsubj.':'.$env{'user.name'}.':'.
$env{'user.domain'}.':'.$msgcount.':'.
$env{'request.course.id'}.':'.$$);
+ }
my $result=''.$env{'user.name'}.''.
''.$env{'user.domain'}.''.
''.$subject.''.
@@ -161,10 +163,17 @@ sub packagemsg {
''.$env{'request.course.sec'}.''.
''.$env{'request.role'}.''.
''.$env{'request.filename'}.''.
- ''.$msgid.''.
- ''.$recuser.''.
- ''.$recdomain.''.
- ''.$message.'';
+ ''.$msgid.'';
+ if (ref($recuser) eq 'ARRAY') {
+ for (my $i=0; $i<@{$recuser}; $i++) {
+ $result .= ''.$$recuser[$i].''.
+ ''.$$recdomain[$i].'';
+ }
+ } else {
+ $result .= ''.$recuser.''.
+ ''.$recdomain.'';
+ }
+ $result .= ''.$message.'';
if (defined($citation)) {
$result.=''.$citation.'';
}
@@ -188,7 +197,11 @@ sub unpackagemsg {
if ($token->[0] eq 'S') {
my $entry=$token->[1];
my $value=$parser->get_text('/'.$entry);
- $content{$entry}=$value;
+ if (($entry eq 'recuser') || ($entry eq 'recdomain')) {
+ push(@{$content{$entry}},$value);
+ } else {
+ $content{$entry}=$value;
+ }
}
}
if ($content{'attachmenturl'}) {
@@ -474,7 +487,7 @@ sub user_crit_received {
sub user_normal_msg_raw {
my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
- $toperm)=@_;
+ $toperm,$newid)=@_;
# Check if allowed missing
my $status='';
my $msgid='undefined';
@@ -492,15 +505,16 @@ sub user_normal_msg_raw {
# Save new message received time
&Apache::lonnet::put
('email_status',{'recnewemail'=>time},$domain,$user);
-# Into sent-mail folder
- $status.=' '.&Apache::lonnet::critical(
- 'put:'.$env{'user.domain'}.':'.$env{'user.name'}.
- ':nohist_email_sent:'.
- &Apache::lonnet::escape($msgid).'='.
- &Apache::lonnet::escape($message),$env{'user.home'});
+# Into sent-mail folder unless a broadcast message
+ unless (($env{'request.course.id'}) && ($env{'form.sendmode'} eq 'group')) {
+ $status .= &store_sent_mail($msgid,$message);
+ }
} else {
$status='no_host';
}
+ if (defined($newid)) {
+ $$newid = $msgid;
+ }
# Notifications
my %userenv = &Apache::lonnet::get('environment',['notification',
'permanentemail'],
@@ -550,6 +564,15 @@ sub user_normal_msg {
return $status;
}
+sub store_sent_mail {
+ my ($msgid,$message) = @_;
+ my $status =' '.&Apache::lonnet::critical(
+ 'put:'.$env{'user.domain'}.':'.$env{'user.name'}.
+ ':nohist_email_sent:'.
+ &Apache::lonnet::escape($msgid).'='.
+ &Apache::lonnet::escape($message),$env{'user.home'});
+ return $status;
+}
# ============================================================ List all folders
@@ -1117,7 +1140,7 @@ sub compout {
'
'.
''; }
+ &mt('Include in course RSS newsfeed').''; }
my %message;
my %content;
my $defdom=$env{'user.domain'};
@@ -1826,6 +1849,16 @@ sub displaymessage {
}
$r->print('');
}
+ my $tolist;
+ my @recipients = ();
+ for (my $i=0; $i<@{$content{'recuser'}}; $i++) {
+ $recipients[$i] = &Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($content{'recuser'}[$i],
+ $content{'recdomain'}[$i]),
+ $content{'recuser'}[$i],$content{'recdomain'}[$i]).
+ ' ('.$content{'recuser'}[$i].' at '.$content{'recdomain'}[$i].') ';
+ }
+ $tolist = join(', ',@recipients);
$r->print('
'.&mt('Subject').': '.$content{'subject'}.
($folder ne 'sent'?'
'.&mt('From').': '.
&Apache::loncommon::aboutmewrapper(
@@ -1833,11 +1866,7 @@ sub displaymessage {
$content{'sendername'},$content{'senderdomain'}).' ('.
$content{'sendername'}.' at '.
$content{'senderdomain'}.') ':'
'.&mt('To').': '.
- &Apache::loncommon::aboutmewrapper(
- &Apache::loncommon::plainname($content{'recuser'},$content{'recdomain'}),
- $content{'recuser'},$content{'recdomain'}).' ('.
- $content{'recuser'}.' at '.
- $content{'recdomain'}.') ').
+ $tolist).
($content{'courseid'}?'
'.&mt('Course').': '.$courseinfo{'description'}.
($content{'coursesec'}?' ('.&mt('Group/Section').': '.$content{'coursesec'}.')':''):'').
'
'.&mt('Time').': '.$content{'time'}.
@@ -1952,6 +1981,8 @@ sub sendoffmail {
my ($r,$folder)=@_;
my $suffix=&foldersuffix($folder);
my $sendstatus='';
+ my %broadcast_status;
+ my $numbroadcast = 0;
if ($env{'form.send'}) {
&printheader($r,'','Messages being sent.');
$r->rflush();
@@ -1996,18 +2027,22 @@ sub sendoffmail {
$toaddr{$auname.':'.$audom}='';
}
}
+
+ my $basicmsg;
+ my $msgtype;
+ if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) &&
+ (&Apache::lonnet::allowed('srm',$env{'request.course.id'}))) {
+ $basicmsg=&Apache::lonfeedback::clear_out_html($env{'form.message'},1);
+ $msgtype = '(critical)';
+ } else {
+ $basicmsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
+ }
foreach (keys %toaddr) {
my ($recuname,$recdomain)=split(/\:/,$_);
- my $msgtxt;
- if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) &&
- (&Apache::lonnet::allowed('srm',$env{'request.course.id'}))) {
- $msgtxt=&Apache::lonfeedback::clear_out_html($env{'form.message'},1);
- } else {
- $msgtxt=&Apache::lonfeedback::clear_out_html($env{'form.message'});
- }
+ my $msgtxt = $basicmsg;
if ($toaddr{$_}) { $msgtxt.='
'.$toaddr{$_}; }
- my $thismsg;
+ my $thismsg;
if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) &&
(&Apache::lonnet::allowed('srm',$env{'request.course.id'}))) {
$r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': ');
@@ -2021,17 +2056,52 @@ sub sendoffmail {
&Apache::lonfeedback::clear_out_html($env{'form.subject'}),
$msgtxt,
$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'},
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- 'Broadcast ['.$recuname.':'.$recdomain.']',
- $msgtxt);
- }
+ }
+ if (($env{'request.course.id'}) &&
+ ($env{'form.sendmode'} eq 'group')) {
+ $broadcast_status{$recuname.':'.$recdomain} = $thismsg;
+ if ($thismsg eq 'ok') {
+ $numbroadcast ++;
+ }
}
$r->print($thismsg.'
');
$sendstatus.=' '.$thismsg;
}
+ if (($env{'request.course.id'}) && ($env{'form.sendmode'} eq 'group')) {
+ my $subj_prefix;
+ if ($msgtype eq 'critical') {
+ $subj_prefix = 'Critical broadcast';
+ } else {
+ $subj_prefix = 'Broadcast';
+ }
+ my ($broadmsgid,$broadresult);
+ if ($numbroadcast) {
+ $broadresult = &user_normal_msg_raw(
+ $env{'course.'.$env{'request.course.id'}.'.num'},
+ $env{'course.'.$env{'request.course.id'}.'.domain'}, $subj_prefix.' to: '.$env{'course.'.$env{'request.course.id'}.'.description'}.
+ ' ('.$numbroadcast.' sent)',$basicmsg,undef,undef,undef,
+ undef,\$broadmsgid);
+ }
+ if ($broadresult eq 'ok') {
+ my $record_sent;
+ my @recusers = ();
+ my @recudoms = ();
+ foreach my $recipient (sort(keys(%toaddr))) {
+ if ($broadcast_status{$recipient} eq 'ok') {
+ my ($uname,$udom) = split/:/,$recipient;
+ push(@recusers,$uname);
+ push(@recudoms,$udom);
+ }
+ }
+ if (@recusers) {
+ my $broadmessage;
+ ($broadmsgid,$broadmessage)=&packagemsg(&Apache::lonfeedback::clear_out_html($env{'form.subject'}),$basicmsg,undef,undef,undef,\@recusers,\@recudoms,$broadmsgid);
+ $record_sent = &store_sent_mail($broadmsgid,$broadmessage);
+ }
+ } else {
+ &Apache::lonnet::logthis('Failed to create record of broadcast in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' at '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated');
+ }
+ }
} else {
&printheader($r,'','No messages sent.');
}