'Open',
'do' => 'Domain'
);
- my @msgids = sort split(/\&/,&Apache::lonnet::reply
- ('keys:'.$env{'user.domain'}.':'.
- $env{'user.name'}.':nohist_email',
- $env{'user.home'}));
+ my @msgids = sort(&Apache::lonnet::getkeys('nohist_email'));
my @newmsgs;
my %setters = ();
my $startblock = 0;
@@ -901,11 +987,15 @@ sub disnew {
my $numblocked = 0;
# Check for blocking of display because of scheduled online exams.
&blockcheck(\%setters,\$startblock,\$endblock);
+ my %status_cache =
+ &Apache::lonnet::get('email_status',\@msgids);
+ my %descriptions;
foreach (@msgids) {
+ my $msgid=&Apache::lonnet::escape($_);
my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
- &Apache::lonmsg::unpackmsgid($_);
+ &Apache::lonmsg::unpackmsgid($msgid,undef,undef,\%status_cache);
if (defined($sendtime) && $sendtime!~/error/) {
- my $description = &get_course_desc($fromcid);
+ my $description = &get_course_desc($fromcid,\%descriptions);
my $numsendtime = $sendtime;
$sendtime = &Apache::lonlocal::locallocaltime($sendtime);
if ($status eq 'new') {
@@ -914,7 +1004,7 @@ sub disnew {
$numblocked ++;
} else {
push @newmsgs, {
- msgid => $_,
+ msgid => $msgid,
sendtime => $sendtime,
shortsub => &Apache::lonnet::unescape($shortsubj),
from => $fromname,
@@ -1158,7 +1248,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 .
@@ -1167,8 +1259,8 @@ sub compout {
&mt('and return receipt') . '' . $crithelp .
'
'.
-''; }
+''; }
my %message;
my %content;
my $defdom=$env{'user.domain'};
@@ -1284,7 +1376,7 @@ $dispcrit
ENDUPLOAD
}
if ($broadcast eq 'group') {
- &discourse;
+ &discourse($r);
}
$r->print(''.
&Apache::lonfeedback::generate_preview_button('compemail','message').
@@ -1297,7 +1389,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',
@@ -1322,7 +1416,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',
@@ -1338,12 +1435,30 @@ sub disfacetoface {
$result.=''.&mt('Record').'
';
} elsif ($content{'subject'}=~/^Broadcast/) {
$result .=''.&mt('Broadcast Message').'
';
+ if ($content{'subject'}=~/^Broadcast\./) {
+ if (defined($content{'coursemsgid'})) {
+ my $crsmsgid = &Apache::lonnet::escape($content{'coursemsgid'});
+ my $broadcast_message = &general_message($crsmsgid);
+ $content{'message'} = ''.&mt('Subject').': '.$content{'message'}.'
'.$broadcast_message;
+ } else {
+ %content=&unpackagemsg($content{'message'});
+ $content{'message'} =
+ ''.&mt('Subject').': '.$content{'subject'}.'
'.
+ $content{'message'};
+ }
+ }
} else {
$result.=''.&mt('Critical Message').'
';
- %content=&unpackagemsg($content{'message'});
- $content{'message'}=
+ if (defined($content{'coursemsgid'})) {
+ my $crsmsgid=&Apache::lonnet::escape($content{'coursemsgid'});
+ my $critical_message = &general_message($crsmsgid);
+ $content{'message'} = ''.&mt('Subject').': '.$content{'message'}.'
'.$critical_message;
+ } else {
+ %content=&unpackagemsg($content{'message'});
+ $content{'message'}=
''.&mt('Subject').': '.$content{'subject'}.'
'.
$content{'message'};
+ }
}
$result.=&mt('By').': '.
&Apache::loncommon::aboutmewrapper(
@@ -1366,11 +1481,26 @@ $content{'sendername'}.'@'.
}
}
+sub general_message {
+ my ($crsmsgid) = @_;
+ my %general_content;
+ if ($crsmsgid) {
+ my %course_content = &Apache::lonnet::get('nohist_email',[$crsmsgid],
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'});
+ %general_content = &unpackagemsg($course_content{$crsmsgid});
+ }
+ return $general_content{'message'};
+}
+
# ---------------------------------------------------------------- Face to face
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,
@@ -1413,12 +1543,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'}).'
');
@@ -1444,7 +1575,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',
@@ -1935,9 +2071,10 @@ sub displayresource {
$content{'sendername'},
$content{'senderdomain'},
$content{'courseid'});
- } else {
+ } elsif ($env{'user.adv'}) {
return $content{'citation'};
}
+ return '';
}
# ================================================================== The Header
@@ -2009,8 +2146,8 @@ sub sendoffmail {
my ($r,$folder)=@_;
my $suffix=&foldersuffix($folder);
my $sendstatus='';
- my %broadcast_status;
- my $numbroadcast = 0;
+ my %specialmsg_status;
+ my $numspecial = 0;
if ($env{'form.send'}) {
&printheader($r,'','Messages being sent.');
$r->rflush();
@@ -2056,78 +2193,100 @@ sub sendoffmail {
}
}
- my $basicmsg;
+ my $savemsg;
my $msgtype;
+ my %sentmessage;
+ my $msgsubj=&Apache::lonfeedback::clear_out_html($env{'form.subject'});
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)';
+ (&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 {
- $basicmsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
+ $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
}
foreach (keys %toaddr) {
my ($recuname,$recdomain)=split(/\:/,$_);
- my $msgtxt = $basicmsg;
+ my $msgtxt = $savemsg;
if ($toaddr{$_}) { $msgtxt.='
'.$toaddr{$_}; }
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'});
+ $thismsg=&user_crit_msg($recuname,$recdomain,$msgsubj,$msgtxt,
+ $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'});
+ $thismsg=&user_normal_msg($recuname,$recdomain,$msgsubj,$msgtxt,
+ $content{'citation'},undef,undef,$env{'form.permanent'},\$sentmessage{$_});
}
- if (($env{'request.course.id'}) &&
- ($env{'form.sendmode'} eq 'group')) {
- $broadcast_status{$recuname.':'.$recdomain} = $thismsg;
+ if (($env{'request.course.id'}) && (($msgtype eq 'critical') ||
+ ($env{'form.sendmode'} eq 'group'))) {
+ $specialmsg_status{$recuname.':'.$recdomain} = $thismsg;
if ($thismsg eq 'ok') {
- $numbroadcast ++;
+ $numspecial ++;
}
}
$r->print($thismsg.'
');
$sendstatus.=' '.$thismsg;
}
- if (($env{'request.course.id'}) && ($env{'form.sendmode'} eq 'group')) {
+ if (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group')
+ || ($msgtype eq 'critical'))) {
my $subj_prefix;
if ($msgtype eq 'critical') {
- $subj_prefix = 'Critical broadcast';
+ $subj_prefix = 'Critical.';
} else {
- $subj_prefix = 'Broadcast';
+ $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);
+ 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 ($broadresult eq 'ok') {
+ if ($specialresult eq 'ok') {
my $record_sent;
my @recusers = ();
my @recudoms = ();
+ my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) =
+ split(/\:/,&Apache::lonnet::unescape($specialmsgid));
foreach my $recipient (sort(keys(%toaddr))) {
- if ($broadcast_status{$recipient} eq 'ok') {
+ 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.']',$msgsubj,undef,
+ undef,undef,undef,$usermsgid,undef,undef,$specialmsgid);
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);
+ my $specialmessage;
+ my $sentsubj = $subj_prefix.' ('.$numspecial.' sent) '.
+ $msgsubj;
+ $sentsubj = &HTML::Entities::encode($sentsubj,'<>&"');
+ my $sentmsgid = &buildmsgid($stamp,$sentsubj,$msgname,
+ $msgdom,$msgcount,$context,$pid);
+ ($specialmsgid,$specialmessage) = &packagemsg($msgsubj,$savemsg,
+ undef,undef,undef,\@recusers,\@recudoms,$sentmsgid);
+ $record_sent = &store_sent_mail($specialmsgid,$specialmessage);
}
} 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');
+ &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 {