--- loncom/interface/lonmsgdisplay.pm 2007/05/02 01:33:49 1.72
+++ loncom/interface/lonmsgdisplay.pm 2007/05/05 03:14:21 1.78
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging display
#
-# $Id: lonmsgdisplay.pm,v 1.72 2007/05/02 01:33:49 albertel Exp $
+# $Id: lonmsgdisplay.pm,v 1.78 2007/05/05 03:14:21 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -390,6 +390,9 @@ sub renamefolder {
if ($env{'form.renamed'} eq '') {
return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is an invalid name.',$folder,$newname);
}
+ if (defined($permfolders{$folder})) {
+ return &mt('The folder "[_1]" may not be renamed as it is a folder provided by the system.',$folder);
+ }
if (defined($permfolders{$newname})) {
return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is reserved for folders provided automatically by the system.',$folder,$newname);
}
@@ -734,12 +737,27 @@ $content{'sendername'}.':'.
' '.&mt('Subject').': '.$content{'subject'}.
'
'.
&Apache::lontexconvert::msgtexconverted($content{'message'}).
- ' '.
-&mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox').
- ' '.
- ' '.
- ' ';
+ '';
+ my ($rec_button,$reprec_button);
+ $rec_button = &mt('Move to Inbox');
+ if (!$content{'noreplies'}) {
+ $reprec_button = &mt('Move to Inbox/Compose reply');
+ }
+ if ($content{'sendback'}) {
+ $rec_button = &mt('Confirm Receipt');
+ if (!$content{'noreplies'}) {
+ $reprec_button = &mt('Confirm Receipt and Reply');
+ }
+ $result .= &mt('You have to confirm that you have received this message before you can view other pages. After confirmation, this message will be moved to your regular inbox');
+ } else {
+ $result .= &mt('Access to other pages will be prevented until you have moved the message to your inbox.');
+ }
+ $result .= ' '.
+ ' ';
+ if (!$content{'noreplies'}) {
+ $result .= ' ';
+ }
}
# Check to see if there were any messages.
if ($result eq '') {
@@ -1206,6 +1224,8 @@ will be forwarded to the recipient(s) yo
my %lt=&Apache::lonlocal::texthash('us' => 'Username',
'do' => 'Domain',
'ad' => 'Additional Recipients',
+ 'rt' => 'Reply to',
+ 'ar' => 'Allow replies',
'sb' => 'Subject',
'ca' => 'Cancel',
'ma' => 'Mail',
@@ -1279,6 +1299,12 @@ will be forwarded to the recipient(s) yo
&mt('Show re-usable messages').' ';
}
}
+ my $jscript = &Apache::loncommon::check_uncheck_jscript();
+ $r->print(<<"ENDREPSCRIPT");
+
+ENDREPSCRIPT
}
my $citation=&displayresource(%content);
my ($can_grp_broadcast,$viewgrps,$editgrps);
@@ -1310,14 +1336,52 @@ will be forwarded to the recipient(s) yo
}
if (($broadcast ne 'group') && ($broadcast ne 'upload')) {
if ($replying) {
- $r->print(''.&mt('Replying to').' '.
- &Apache::loncommon::aboutmewrapper(
+ if ($content{'noreplies'}) {
+ $r->print(' '.&mt('This message was designated by the sender not to allow replies.').' ');
+ return;
+ }
+ $r->print(''.&mt('Replying to').' ');
+ if ($content{'replytoaddr'}) {
+ my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+ if ($replytoname ne '' && $replytodom ne '') {
+ $r->print(&Apache::loncommon::plainname($replytoname,
+ $replytodom).' ('.$replytoname.':'.
+ $replytodom.')');
+ $r->print(' '.
+ ' ');
+
+ } else {
+ $r->print(&mt('The sender did not designate a reply to address for this message.').'');
+ return;
+ }
+ } else {
+ $r->print(&Apache::loncommon::aboutmewrapper(
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.
$content{'sendername'}.':'.
- $content{'senderdomain'}.')'.
- ' '.
- ' '.
- '');
+ $content{'senderdomain'}.')');
+ $r->print(' '.
+ ' ');
+ }
+ if ($content{'recipid'}) {
+ my @ccs = &retrieve_cc_recips('replying',%content);
+ if (@ccs > 0) {
+ my $replyall = qq|
+
+
+
+
+
+|;
+ my $cclist = join(' ',@ccs);
+ $r->print(''.&mt('Reply to other recipients').': '.$replyall.' '.$cclist.' ');
+ }
+ }
} else {
$r->print(&recipient_input_row($defdom,%lt));
}
@@ -1354,6 +1418,11 @@ $latexHelp.
} elsif ($broadcast ne 'upload') {
$subj_size = '50';
$r->print(&additional_rec_row(\%lt));
+ if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
+ || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'})) {
+ $r->print(&reply_to_row(\%lt));
+ }
$r->print(&msg_subject_row($dissub,\%lt,$subj_size));
$r->print(<<"ENDCOMP");
@@ -1428,19 +1497,30 @@ sub recipient_input_row {
&Apache::loncommon::selectstudent_link('compemail','recuname',
'recdomain');
my $output = <<"ENDREC";
-$lt{'us'}: $selectlink
-$lt{'do'}:
-$domform
+$lt{'us'}: $lt{'do'}: $domform $selectlink
ENDREC
return $output;
}
+sub reply_to_row {
+ my ($lt) = @_;
+ my $radioyes = &mt('Yes');
+ my $radiono = &mt('No');
+ my $output = <<"ENDREP";
+$lt->{'ar'}: $radioyes $radiono $lt->{'rt'}:
+ENDREP
+ return $output;
+}
+
sub additional_rec_row {
my ($lt) = @_;
+ my $cc = &mt('Cc:');
+ my $bcc = &mt('Bcc:');
my $output = <<"ENDADD";
-$lt->{'ad'}:username:domain,username:domain, ...
-
-
+$lt->{'ad'} :username:domain,username:domain, ...
+ $cc
+
+$bcc
ENDADD
return $output;
}
@@ -1458,7 +1538,7 @@ sub submit_button_row {
sub msg_subject_row {
my ($dissub,$lt,$subj_size,$extra) = @_;
- my $output = ''.$lt->{'sb'}.': '.$lt->{'sb'}.': '.$extra.
' ';
return $output;
@@ -1984,7 +2064,6 @@ sub displaymessage {
}
my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
my %content=&Apache::lonmsg::unpackagemsg($message{$msgid});
-
my $counter=0;
$r->print('');
my $escmsgid=&escape($msgid);
@@ -2000,10 +2079,12 @@ sub displaymessage {
&printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});
my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});
# Functions
- $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],
+ my ($tolist,$cclist);
+ my (@recipients,@ccs);
+ if (ref($content{'recuser'}) eq 'ARRAY') {
+ 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].') ';
+ $content{'recuser'}[$i],$content{'recdomain'}[$i]).
+ ' ('.$content{'recuser'}[$i].' '.&mt('at').' '.$content{'recdomain'}[$i].') ';
+ }
}
$tolist = join(', ',@recipients);
+ if ($content{'recipid'}) {
+ @ccs = &retrieve_cc_recips('display',%content);
+ $cclist = join(', ',@ccs);
+ }
my ($restitle,$baseurl,$refers_to);
if (defined($content{'resource_title'})) {
$restitle = $content{'resource_title'};
@@ -2061,17 +2148,46 @@ sub displaymessage {
$baseurl = &Apache::lonenc::check_encrypt($content{'baseurl'});
}
$r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'}));
- $r->print(''.&mt('Subject').': '.$content{'subject'}.
- ($folder ne 'sent'?''.&mt('From').': '.
+ $r->print(''.&mt('Subject').': '.$content{'subject'});
+ if ($folder eq 'sent') {
+ $r->print(''.&mt('To').': '.$tolist);
+ if ($content{'replytoaddr'}) {
+ my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+ if ($replytoname ne '' && $replytodom ne '') {
+ $r->print(''.&mt('Reply To').': '.
+ $replytoname.' '.&mt('at').' '.$replytodom);
+ }
+ }
+ } else {
+ $r->print(''.&mt('From').': '.
&Apache::loncommon::aboutmewrapper(
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),
- $content{'sendername'},$content{'senderdomain'}).' ('.
- $content{'sendername'}.' at '.
- $content{'senderdomain'}.') ':''.&mt('To').': '.
- $tolist).
- ($content{'courseid'}?''.&mt($crstype).': '.$courseinfo{'description'}.
- ($content{'coursesec'}?' ('.&mt('Section').': '.$content{'coursesec'}.')':''):'').
- ''.&mt('Time').': '.$content{'time'});
+ $content{'sendername'},$content{'senderdomain'}));
+ if ($content{'noreplies'}) {
+ $r->print(' ('.&mt('No replies to sender').')');
+ } else {
+ if ($content{'replytoaddr'}) {
+ my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+ if ($replytoname ne '' && $replytodom ne '') {
+ $r->print(''.&mt('Reply To').': '.
+ $replytoname.' '.&mt('at').' '.$replytodom);
+ }
+ } else {
+ $r->print(' ('.$content{'sendername'}.' '&mt('at').' '.
+ $content{'senderdomain'}.') ');
+ }
+ if ($cclist) {
+ $r->print(''.&mt('Cc').': '.$cclist);
+ }
+ }
+ }
+ if ($content{'courseid'}) {
+ $r->print(''.&mt($crstype).': '.$courseinfo{'description'});
+ if ($content{'coursesec'}) {
+ $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')');
+ }
+ }
+ $r->print(''.&mt('Time').': '.$content{'time'});
if ($baseurl) {
if (defined($content{'courseid'}) && defined($env{'request.course.id'})) {
if ($content{'courseid'} eq $env{'request.course.id'}) {
@@ -2124,6 +2240,38 @@ sub displaymessage {
return;
}
+sub retrieve_cc_recips {
+ my ($context,%content) = @_;
+ my %reciphash =
+ &Apache::lonnet::get('nohist_emailrecip',[$content{'recipid'}],
+ $content{'senderdomain'},$content{'sendername'});
+ my $recipinfo = $reciphash{$content{'recipid'}};
+ my @ccs;
+ if (ref($recipinfo) eq 'HASH') {
+ if (ref($recipinfo->{'cc'}) eq 'HASH') {
+ foreach my $cc (sort(keys(%{$recipinfo->{'cc'}}))) {
+ my ($ccname,$ccdom) = split(/:/,$cc);
+ if (!(($ccname eq $env{'user.name'}) &&
+ ($ccdom eq $env{'user.domain'}))) {
+ my $showcc ='';
+ if ($context eq 'replying') {
+ $showcc = ' ';
+ }
+ $showcc .= &Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($ccname,
+ $ccdom),$ccname,$ccdom);
+ if ($context eq 'replying') {
+ $showcc .=' ';
+ }
+ $showcc .= ' ';
+ push(@ccs,$showcc);
+ }
+ }
+ }
+ }
+ return @ccs;
+}
+
# =========================================================== Show the citation
sub displayresource {
@@ -2271,7 +2419,7 @@ sub sendoffmail {
&Apache::loncommon::get_env_multiple('form.selectedusers_forminput');
my $mode = $env{'form.sendmode'};
- my %toaddr;
+ my (%toaddr,$cc,$bcc);
if (@to) {
foreach my $dest (@to) {
my ($user,$domain) = split(/:/, $dest);
@@ -2301,17 +2449,38 @@ sub sendoffmail {
} else {
if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {
$toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
+ $cc->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
}
}
- if ($env{'form.additionalrec'}) {
- foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec'})) {
+ if ($env{'form.additionalrec_cc'}) {
+ foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) {
my ($auname,$audom)=split(/:/,$rec);
if (($auname ne "") && ($audom ne "")) {
- $toaddr{$auname.':'.$audom}='';
+ $toaddr{$auname.':'.$audom}='';
+ $cc->{$auname.':'.$audom}='';
}
}
}
-
+ if ($env{'form.additionalrec_bcc'}) {
+ foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) {
+ my ($auname,$audom)=split(/:/,$rec);
+ if (($auname ne "") && ($audom ne "")) {
+ $toaddr{$auname.':'.$audom}='';
+ $bcc->{$auname.':'.$audom}='';
+ }
+ }
+ }
+ if ($env{'form.replying_cc'}) {
+ my @ccreplies =
+ &Apache::loncommon::get_env_multiple('form.replying_cc');
+ foreach my $rec (@ccreplies) {
+ my ($auname,$audom)=split(/:/,$rec);
+ if (($auname ne "") && ($audom ne "")) {
+ $toaddr{$auname.':'.$audom}='';
+ $cc->{$auname.':'.$audom}='';
+ }
+ }
+ }
my $savemsg;
my $msgtype;
my %sentmessage;
@@ -2327,12 +2496,24 @@ sub sendoffmail {
} else {
$savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
}
+ my %reciphash = (
+ cc => $cc,
+ bcc => $bcc,
+ );
+ my ($recipid,$recipstatus) =
+ &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'},
+ $env{'user.domain'},\%reciphash);
+ if ($recipstatus ne 'ok') {
+ &Apache::lonnet::logthis('Failed to store Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'});
+ }
my @recusers;
my @recudoms;
foreach my $address (sort(keys(%toaddr))) {
my ($recuname,$recdomain)=split(/\:/,$address);
my $msgtxt = $savemsg;
- if ($toaddr{$address}) { $msgtxt.=' '.$toaddr{$address}; }
+ if ($toaddr{$address}) {
+ $msgtxt.=' '.$toaddr{$address};
+ }
my @thismsg;
if ($msgtype eq 'critical') {
$r->print(&mt('Sending critical message').' '.
@@ -2343,7 +2524,7 @@ sub sendoffmail {
$env{'form.sendbck'},
$env{'form.permanent'},
\$sentmessage{$address},
- $nosentstore);
+ $nosentstore,$recipid);
} else {
$r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
@thismsg=
@@ -2354,7 +2535,7 @@ sub sendoffmail {
$env{'form.permanent'},
\$sentmessage{$address},
undef,undef,undef,
- $nosentstore);
+ $nosentstore,$recipid);
}
$msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);
if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {
@@ -2411,7 +2592,7 @@ sub sendoffmail {
\@recudoms);
}
} else {
- &Apache::lonnet::logthis('Failed to create record of critical, broadcast or archived message 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, broadcast or archived message in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' '&mt('at').' '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated');
}
} else {
my $stamp = time;
@@ -2528,16 +2709,19 @@ sub handler {
&printheader($r,'','Confirmed Receipt');
my $replying = 0;
foreach my $envkey (keys(%env)) {
- if ($envkey=~/^form\.rec\_(.*)$/) {
- $r->print(''.&mt('Confirming Receipt').': '.
- &Apache::lonmsg::user_crit_received($1).' ');
- }
- if ($envkey=~/^form\.reprec\_(.*)$/) {
- my $msgid=$1;
- $r->print(''.&mt('Confirming Receipt').': '.
- &Apache::lonmsg::user_crit_received($msgid).' ');
- &compout($r,'','','',$msgid);
- $replying = 1;
+ if ($envkey=~/^form\.(rep)?rec\_(.*)$/) {
+ my $repchk = $1;
+ my $msgid = $2;
+ $r->print(''.&mt('Confirming Receipt').': ');
+ my $result = &Apache::lonmsg::user_crit_received($msgid);
+ if ($result =~ /trans:\s+ok/) {
+ &statuschange($msgid,'read');
+ }
+ $r->print($result.' ');
+ if ($repchk eq 'rep') {
+ &compout($r,'','','',$msgid);
+ $replying = 1;
+ }
}
}
if (!$replying) {