$lt{'nm'}
  |
-$lt{'da'} | $lt{'us'} | $lt{'do'} | $lt{'su'} |
+$lt{'da'} | $lt{'us'} | $lt{'do'} | $lt{'su'} | $lt{'co'} |
TABLEHEAD
foreach my $msg (@newmsgs) {
$r->print(<<"ENDLINK");
@@ -892,7 +1050,7 @@ TABLEHEAD
onMouseOut="javascript:style.backgroundColor='#FFBB77'">
$lt{'op'} |
ENDLINK
- foreach ('sendtime','from','fromdom','shortsub') {
+ foreach ('sendtime','from','fromdom','shortsub','course') {
$r->print("$msg->{$_} | ");
}
$r->print("");
@@ -1006,6 +1164,12 @@ ENDDISHEADER
$r->print(''.&mt('Subject').'');
}
$r->print('');
+ if ($env{'form.sortedby'} eq "revcourse") {
+ $r->print(''.&mt('Course').'');
+ } else {
+ $r->print(''.&mt('Course').'');
+ }
+ $r->print(' | ');
if ($env{'form.sortedby'} eq "revstatus") {
$r->print(''.&mt('Status').' | ');
} else {
@@ -1013,7 +1177,7 @@ ENDDISHEADER
}
$r->print("\n");
for (my $n=$firstdis;$n<=$lastdis;$n++) {
- my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID)= @{$temp[$n]};
+ my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID,$description)= @{$temp[$n]};
if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {
if ($status eq 'new') {
$r->print('');
@@ -1031,10 +1195,12 @@ ENDDISHEADER
''.&Apache::lonlocal::locallocaltime($sendtime).' | '.
$fromname.' | '.$fromdomain.' | '.
&Apache::lonnet::unescape($shortsubj).' | '.
- $status." |
\n");
+ $description.''.$status.' | '."\n");
} elsif ($status eq 'deleted') {
# purge
- &movemsg(&Apache::lonnet::unescape($origID),$folder,'trash');
+ my ($result,$msg) =
+ &movemsg(&Apache::lonnet::unescape($origID),$folder,'trash');
+
}
}
$r->print("
\n".
@@ -1107,7 +1273,9 @@ sub compout {
'ca' => 'Cancel',
'ma' => 'Mail');
- if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})) {
+ if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})) {
my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");
$dispcrit=
'
' . $crithelp .
@@ -1116,8 +1284,8 @@ sub compout {
&mt('and return receipt') . '' . $crithelp .
'
'.
-''; }
+''; }
my %message;
my %content;
my $defdom=$env{'user.domain'};
@@ -1233,7 +1401,7 @@ $dispcrit
ENDUPLOAD
}
if ($broadcast eq 'group') {
- &discourse;
+ &discourse($r);
}
$r->print(''.
&Apache::lonfeedback::generate_preview_button('compemail','message').
@@ -1246,7 +1414,9 @@ sub retrieve_instructor_comments {
my ($user,$domain)=@_;
my $target=$env{'form.grade_target'};
if (! $env{'request.course.id'}) { return; }
- if (! &Apache::lonnet::allowed('srm',$env{'request.course.id'})) {
+ if (! &Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})) {
return;
}
my %records=&Apache::lonnet::dump('nohist_email',
@@ -1271,7 +1441,10 @@ sub disfacetoface {
my ($r,$user,$domain)=@_;
my $target=$env{'form.grade_target'};
unless ($env{'request.course.id'}) { return; }
- unless (&Apache::lonnet::allowed('srm',$env{'request.course.id'})) {
+ if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})) {
+ $r->print('Not allowed');
return;
}
my %records=&Apache::lonnet::dump('nohist_email',
@@ -1287,6 +1460,12 @@ sub disfacetoface {
$result.=''.&mt('Record').'
';
} elsif ($content{'subject'}=~/^Broadcast/) {
$result .=''.&mt('Broadcast Message').'
';
+ if ($content{'subject'}=~/^Broadcast\./) {
+ %content=&unpackagemsg($content{'message'});
+ $content{'message'}=
+ ''.&mt('Subject').': '.$content{'subject'}.'
'.
+ $content{'message'};
+ }
} else {
$result.=''.&mt('Critical Message').'
';
%content=&unpackagemsg($content{'message'});
@@ -1319,7 +1498,10 @@ $content{'sendername'}.'@'.
sub facetoface {
my ($r,$stage)=@_;
- unless (&Apache::lonnet::allowed('srm',$env{'request.course.id'})) {
+ if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})) {
+ $r->print('Not allowed');
return;
}
&printheader($r,
@@ -1362,12 +1544,13 @@ ENDTREC
($env{'form.recdomain'}) && ($env{'form.recuname'})) {
chomp($env{'form.newrecord'});
if ($env{'form.newrecord'}) {
+ my $recordtxt = $env{'form.newrecord'};
&user_normal_msg_raw(
$env{'course.'.$env{'request.course.id'}.'.num'},
$env{'course.'.$env{'request.course.id'}.'.domain'},
&mt('Record').
' ['.$env{'form.recuname'}.':'.$env{'form.recdomain'}.']',
- $env{'form.newrecord'});
+ $recordtxt);
}
$r->print(''.&Apache::loncommon::plainname($env{'form.recuname'},
$env{'form.recdomain'}).'
');
@@ -1393,7 +1576,12 @@ ENDBFORM
sub examblock {
my ($r,$action) = @_;
unless ($env{'request.course.id'}) { return;}
- unless (&Apache::lonnet::allowed('srm',$env{'request.course.id'})) { $r->print('Not allowed'); }
+ if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})) {
+ $r->print('Not allowed');
+ return;
+ }
my %lt=&Apache::lonlocal::texthash(
'comb' => 'Communication Blocking',
'cbds' => 'Communication blocking during scheduled exams',
@@ -1826,6 +2014,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 +2031,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'}.
@@ -1878,9 +2072,10 @@ sub displayresource {
$content{'sendername'},
$content{'senderdomain'},
$content{'courseid'});
- } else {
+ } elsif ($env{'user.adv'}) {
return $content{'citation'};
}
+ return '';
}
# ================================================================== The Header
@@ -1952,6 +2147,8 @@ sub sendoffmail {
my ($r,$folder)=@_;
my $suffix=&foldersuffix($folder);
my $sendstatus='';
+ my %specialmsg_status;
+ my $numspecial = 0;
if ($env{'form.send'}) {
&printheader($r,'','Messages being sent.');
$r->rflush();
@@ -1996,42 +2193,107 @@ sub sendoffmail {
$toaddr{$auname.':'.$audom}='';
}
}
+
+ my $savemsg;
+ my $msgtype;
+ my %sentmessage;
+ if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) &&
+ (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})
+ )) {
+ $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'},1);
+ $msgtype = 'critical';
+ } else {
+ $savemsg=&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 = $savemsg;
if ($toaddr{$_}) { $msgtxt.='
'.$toaddr{$_}; }
- my $thismsg;
+ my $thismsg;
if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) &&
- (&Apache::lonnet::allowed('srm',$env{'request.course.id'}))) {
+ (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'}))) {
$r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': ');
$thismsg=&user_crit_msg($recuname,$recdomain,
&Apache::lonfeedback::clear_out_html($env{'form.subject'}),
$msgtxt,
- $env{'form.sendbck'},$env{'form.permanent'});
+ $env{'form.sendbck'},$env{'form.permanent'},\$sentmessage{$_});
} else {
$r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': ');
$thismsg=&user_normal_msg($recuname,$recdomain,
&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);
- }
+ $content{'citation'},undef,undef,$env{'form.permanent'},\$sentmessage{$_});
+ }
+ if (($env{'request.course.id'}) && (($msgtype eq 'critical') ||
+ ($env{'form.sendmode'} eq 'group'))) {
+ $specialmsg_status{$recuname.':'.$recdomain} = $thismsg;
+ if ($thismsg eq 'ok') {
+ $numspecial ++;
+ }
}
$r->print($thismsg.'
');
$sendstatus.=' '.$thismsg;
}
+ if (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group')
+ || ($msgtype eq 'critical'))) {
+ my $subj_prefix;
+ if ($msgtype eq 'critical') {
+ $subj_prefix = 'Critical.';
+ } else {
+ $subj_prefix = 'Broadcast.';
+ }
+ my ($specialmsgid,$specialresult);
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $course_str = &Apache::lonnet::escape('['.$cnum.':'.$cdom.']');
+
+ if ($numspecial) {
+ $specialresult = &user_normal_msg_raw($cnum,$cdom,$subj_prefix.
+ ' '.$course_str,$savemsg,undef,undef,undef,
+ undef,undef,\$specialmsgid);
+ $specialmsgid = &Apache::lonnet::unescape($specialmsgid);
+ }
+ if ($specialresult eq 'ok') {
+ my $record_sent;
+ my @recusers = ();
+ my @recudoms = ();
+ my ($stamp,$msgsubj,$msgname,$msgdom,$msgcount,$context,$pid) =
+ split(/\:/,&Apache::lonnet::unescape($specialmsgid));
+ foreach my $recipient (sort(keys(%toaddr))) {
+ if ($specialmsg_status{$recipient} eq 'ok') {
+ my $usersubj = $subj_prefix.'['.$recipient.']';
+ my $usermsgid = &buildmsgid($stamp,$usersubj,$msgname,
+ $msgdom,$msgcount,$context,$pid);
+ &user_normal_msg_raw($cnum,$cdom,$subj_prefix.
+ ' ['.$recipient.']',$sentmessage{$recipient},
+ undef,undef,undef,undef,$usermsgid);
+ my ($uname,$udom) = split/:/,$recipient;
+ push(@recusers,$uname);
+ push(@recudoms,$udom);
+ }
+ }
+ if (@recusers) {
+ my $specialmessage;
+ my $sentsubj = $subj_prefix.' ('.$numspecial.' sent) '.
+ &Apache::lonfeedback::clear_out_html($env{'form.subject'});
+ $sentsubj = &HTML::Entities::encode($sentsubj,'<>&"');
+ my $sentmsgid = &buildmsgid($stamp,$sentsubj,$msgname,
+ $msgdom,$msgcount,$context,$pid);
+ ($specialmsgid,$specialmessage) =
+ &packagemsg(&Apache::lonfeedback::clear_out_html(
+ $env{'form.subject'}),$savemsg,undef,undef,undef,
+ \@recusers,\@recudoms,$sentmsgid);
+ $record_sent = &store_sent_mail($specialmsgid,$specialmessage);
+ }
+ } else {
+ &Apache::lonnet::logthis('Failed to create record of critical message or 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.');
}
@@ -2153,31 +2415,63 @@ sub handler {
&compout($r,$env{'form.forward'},undef,undef,undef,$folder);
} elsif ($env{'form.markdel'}) {
&printheader($r,'','Deleted Message');
- &statuschange($env{'form.markdel'},'deleted',$folder);
+ my ($result,$msg) =
+ &statuschange($env{'form.markdel'},'deleted',$folder);
+ if (!$result) {
+ $r->print('Failed to delete the message.
'.
+ ''.$msg."
\n");
+ }
&Apache::loncommunicate::menu($r);
&disall($r,($folder?$folder:$dismode));
} elsif ($env{'form.markedmove'}) {
- my $total=0;
- foreach (keys %env) {
- if ($_=~/^form\.delmark_(.*)$/) {
- &movemsg(&Apache::lonnet::unescape($1),$folder,
- $env{'form.movetofolder'});
- $total++;
+ my ($total,$failed,@failed_msg)=(0,0);
+ foreach my $key (keys(%env)) {
+ if ($key=~/^form\.delmark_(.*)$/) {
+ my ($result,$msg) =
+ &movemsg(&Apache::lonnet::unescape($1),$folder,
+ $env{'form.movetofolder'});
+ if ($result) {
+ $total++;
+ } else {
+ $failed++;
+ push(@failed_msg,$msg);
+ }
}
}
&printheader($r,'','Moved Messages');
+ if ($failed) {
+ $r->print('
+ Failed to move '.$failed.' message(s)
');
+ $r->print(''.
+ join("
\n",@failed_msg).
+ "
\n");
+ }
$r->print('Moved '.$total.' message(s)');
&Apache::loncommunicate::menu($r);
&disall($r,($folder?$folder:$dismode));
} elsif ($env{'form.markeddel'}) {
- my $total=0;
- foreach (keys %env) {
- if ($_=~/^form\.delmark_(.*)$/) {
- &statuschange(&Apache::lonnet::unescape($1),'deleted',$folder);
- $total++;
+ my ($total,$failed,@failed_msg)=(0,0);
+ foreach my $key (keys(%env)) {
+ if ($key=~/^form\.delmark_(.*)$/) {
+ my ($result,$msg) =
+ &statuschange(&Apache::lonnet::unescape($1),'deleted',
+ $folder);
+ if ($result) {
+ $total++;
+ } else {
+ $failed++;
+ push(@failed_msg,$msg);
+ }
}
}
&printheader($r,'','Deleted Messages');
+ if ($failed) {
+ $r->print('
+ Failed to delete '.$failed.' message(s)
');
+ $r->print(''.
+ join("
\n",@failed_msg).
+ "
\n");
+ }
$r->print('Deleted '.$total.' message(s)');
&Apache::loncommunicate::menu($r);
&disall($r,($folder?$folder:$dismode));