[LON-CAPA-cvs] cvs: loncom /interface lonmsg.pm lonmsgdisplay.pm
raeburn
lon-capa-cvs-allow@mail.lon-capa.org
Wed, 02 May 2007 19:56:39 -0000
This is a MIME encoded message
--raeburn1178135799
Content-Type: text/plain
raeburn Wed May 2 15:56:39 2007 EDT
Modified files:
/loncom/interface lonmsg.pm lonmsgdisplay.pm
Log:
Bug 4614
- Messages composed using COM screen can now specify either Cc or Bcc for the additional recipients textbox.
- recipients written as key = frozenhash to nohist_emailrecip db file in sender's space
- key stored in packaged message
- display of message includes Cc list
- when replying to message can use checkboxes for Ccs and/or "check all", "uncheck all" buttons to include Ccs in reply.
- Does not currently apply to users added via checkboxes in broadcast mode or specified in file in upload mode.
--raeburn1178135799
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20070502155639.txt"
Index: loncom/interface/lonmsg.pm
diff -u loncom/interface/lonmsg.pm:1.201 loncom/interface/lonmsg.pm:1.202
--- loncom/interface/lonmsg.pm:1.201 Tue May 1 14:40:57 2007
+++ loncom/interface/lonmsg.pm Wed May 2 15:56:34 2007
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines for messaging
#
-# $Id: lonmsg.pm,v 1.201 2007/05/01 18:40:57 raeburn Exp $
+# $Id: lonmsg.pm,v 1.202 2007/05/02 19:56:34 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -78,7 +78,7 @@
sub packagemsg {
my ($subject,$message,$citation,$baseurl,$attachmenturl,
- $recuser,$recdomain,$msgid,$type,$crsmsgid,$symb,$error)=@_;
+ $recuser,$recdomain,$msgid,$type,$crsmsgid,$symb,$error,$recipid)=@_;
$message =&HTML::Entities::encode($message,'<>&"');
$citation=&HTML::Entities::encode($citation,'<>&"');
$subject =&HTML::Entities::encode($subject,'<>&"');
@@ -160,6 +160,9 @@
}
}
}
+ if (defined($recipid)) {
+ $result.= '<recipid>'.$recipid.'</recipid>';
+ }
return ($msgid,$result);
}
@@ -445,7 +448,7 @@
sub user_crit_msg_raw {
my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage,
- $nosentstore)=@_;
+ $nosentstore,$recipid)=@_;
# Check if allowed missing
my ($status,$packed_message);
my $msgid='undefined';
@@ -453,7 +456,9 @@
my $text=$message;
my $homeserver=&Apache::lonnet::homeserver($user,$domain);
if ($homeserver ne 'no_host') {
- ($msgid,$packed_message)=&packagemsg($subject,$message);
+ ($msgid,$packed_message)=&packagemsg($subject,$message,undef,undef,
+ undef,undef,undef,undef,undef,undef,undef,
+ undef,$recipid);
if ($sendback) { $packed_message.='<sendback>true</sendback>'; }
$status=&Apache::lonnet::critical(
'put:'.$domain.':'.$user.':critical:'.
@@ -499,7 +504,7 @@
=pod
-=item * B<user_crit_msg($user, $domain, $subject, $message, $sendback, $nosentstore)>:
+=item * B<user_crit_msg($user, $domain, $subject, $message, $sendback, $nosentstore,$recipid)>:
Sends a critical message $message to the $user at $domain. If $sendback
is true, a receipt will be sent to the current user when $user receives
the message.
@@ -516,7 +521,7 @@
sub user_crit_msg {
my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage,
- $nosentstore)=@_;
+ $nosentstore,$recipid)=@_;
my @status;
my %userenv = &Apache::lonnet::get('environment',['msgforward'],
$domain,$user);
@@ -526,12 +531,13 @@
my ($forwuser,$forwdomain)=split(/\:/,$addr);
push(@status,
&user_crit_msg_raw($forwuser,$forwdomain,$subject,$message,
- $sendback,$toperm,$sentmessage,$nosentstore));
+ $sendback,$toperm,$sentmessage,$nosentstore,
+ $recipid));
}
} else {
push(@status,
&user_crit_msg_raw($user,$domain,$subject,$message,$sendback,
- $toperm,$sentmessage,$nosentstore));
+ $toperm,$sentmessage,$nosentstore,$recipid));
}
if (wantarray) {
return @status;
@@ -570,7 +576,7 @@
sub user_normal_msg_raw {
my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
$toperm,$currid,$newid,$sentmessage,$crsmsgid,$symb,$restitle,
- $error,$nosentstore)=@_;
+ $error,$nosentstore,$recipid)=@_;
# Check if allowed missing
my ($status,$packed_message);
my $msgid='undefined';
@@ -581,7 +587,7 @@
($msgid,$packed_message)=
&packagemsg($subject,$message,$citation,$baseurl,
$attachmenturl,$user,$domain,$currid,
- undef,$crsmsgid,$symb,$error);
+ undef,$crsmsgid,$symb,$error,$recipid);
# Store in user folder
$status=&Apache::lonnet::critical(
@@ -633,7 +639,7 @@
=item * B<user_normal_msg($user, $domain, $subject, $message, $citation,
$baseurl, $attachmenturl, $toperm, $sentmessage, $symb, $restitle,
- $error,$nosentstore)>:
+ $error,$nosentstore,$recipid)>:
Sends a message to the $user at $domain, with subject $subject and message $message.
Additionally it will check if the user has a Forwarding address
@@ -648,7 +654,7 @@
sub user_normal_msg {
my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
- $toperm,$sentmessage,$symb,$restitle,$error,$nosentstore)=@_;
+ $toperm,$sentmessage,$symb,$restitle,$error,$nosentstore,$recipid)=@_;
my @status;
my %userenv = &Apache::lonnet::get('environment',['msgforward'],
$domain,$user);
@@ -660,13 +666,13 @@
&user_normal_msg_raw($forwuser,$forwdomain,$subject,$message,
$citation,$baseurl,$attachmenturl,$toperm,
undef,undef,$sentmessage,undef,$symb,
- $restitle,$error,$nosentstore));
+ $restitle,$error,$nosentstore,$recipid));
}
} else {
push(@status,&user_normal_msg_raw($user,$domain,$subject,$message,
$citation,$baseurl,$attachmenturl,$toperm,
undef,undef,$sentmessage,undef,$symb,
- $restitle,$error,$nosentstore));
+ $restitle,$error,$nosentstore,$recipid));
}
if (wantarray) {
return @status;
@@ -708,6 +714,25 @@
return $status;
}
+sub store_recipients {
+ my ($subject,$sendername,$senderdom,$reciphash) = @_;
+ my $context = &get_course_context();
+ my $now = time;
+ my $msgcount = &get_uniq();
+ my $recipid =
+ &buildmsgid($now,$subject,$sendername,$senderdom,$msgcount,$context,$$);
+ my %recipinfo = (
+ $recipid => $reciphash,
+ );
+ my $status = &Apache::lonnet::put('nohist_emailrecip',\%recipinfo,
+ $senderdom,$sendername);
+ if ($status eq 'ok') {
+ return ($recipid,$status);
+ } else {
+ return (undef,$status);
+ }
+}
+
# =============================================================== Folder suffix
sub foldersuffix {
Index: loncom/interface/lonmsgdisplay.pm
diff -u loncom/interface/lonmsgdisplay.pm:1.72 loncom/interface/lonmsgdisplay.pm:1.73
--- loncom/interface/lonmsgdisplay.pm:1.72 Tue May 1 21:33:49 2007
+++ loncom/interface/lonmsgdisplay.pm Wed May 2 15:56:34 2007
@@ -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.73 2007/05/02 19:56:34 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -390,6 +390,9 @@
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);
}
@@ -1279,6 +1282,12 @@
&mt('Show re-usable messages').'</a><br />';
}
}
+ my $jscript = &Apache::loncommon::check_uncheck_jscript();
+ $r->print(<<"ENDREPSCRIPT");
+<script type="text/javascript">
+$jscript
+</script>
+ENDREPSCRIPT
}
my $citation=&displayresource(%content);
my ($can_grp_broadcast,$viewgrps,$editgrps);
@@ -1318,6 +1327,22 @@
'<input type="hidden" name="recuname" value="'.$content{'sendername'}.'" />'.
'<input type="hidden" name="recdomain" value="'.$content{'senderdomain'}.'" />'.
'</td></tr>');
+ if ($content{'recipid'}) {
+ my @ccs = &retrieve_cc_recips('replying',%content);
+ if (@ccs > 0) {
+ my $replyall = qq|
+ <span class="LC_nobreak">
+ <input type="button" value="check all"
+ onclick="javascript:checkAll(document.compemail.replying_cc)" />
+
+ <input type="button" value="uncheck all"
+ onclick="javascript:uncheckAll(document.compemail.replying_cc)" />
+ </span>
+|;
+ my $cclist = join(' ',@ccs);
+ $r->print('<tr><td>'.&mt('Reply to other recipients').':<br />'.$replyall.'</td><td>'.$cclist.'</td></tr>');
+ }
+ }
} else {
$r->print(&recipient_input_row($defdom,%lt));
}
@@ -1437,10 +1462,13 @@
sub additional_rec_row {
my ($lt) = @_;
+ my $cc = &mt('Cc:');
+ my $bcc = &mt('Bcc:');
my $output = <<"ENDADD";
-<tr><td>$lt->{'ad'}:<br /><tt>username:domain,username:domain, ...
-</tt></td><td>
-<input type="text" size="50" name="additionalrec" /></td></tr>
+<tr><td>$lt->{'ad'} :<br /><tt>username:domain,username:domain, ...
+</tt></td><td> <span class="span.LC_nobreak">$cc
+<input type="text" size="50" name="additionalrec_cc" /></nospan><br />
+<span class="span.LC_nobreak">$bcc <input type="text" size="50" name="additionalrec_bcc" /></nospan></td></tr>
ENDADD
return $output;
}
@@ -1984,7 +2012,6 @@
}
my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
my %content=&Apache::lonmsg::unpackagemsg($message{$msgid});
-
my $counter=0;
$r->print('<pre>');
my $escmsgid=&escape($msgid);
@@ -2039,16 +2066,22 @@
}
$r->print('</tr></table>');
}
- 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].' 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 +2094,27 @@
$baseurl = &Apache::lonenc::check_encrypt($content{'baseurl'});
}
$r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'}));
- $r->print('<br /><b>'.&mt('Subject').':</b> '.$content{'subject'}.
- ($folder ne 'sent'?'<br /><b>'.&mt('From').':</b> '.
+ $r->print('<br /><b>'.&mt('Subject').':</b> '.$content{'subject'});
+ if ($folder eq 'sent') {
+ $r->print('<br /><b>'.&mt('To').':</b> '.$tolist);
+ } else {
+ $r->print('<br /><b>'.&mt('From').':</b> '.
&Apache::loncommon::aboutmewrapper(
&Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),
$content{'sendername'},$content{'senderdomain'}).' ('.
$content{'sendername'}.' at '.
- $content{'senderdomain'}.') ':'<br /><b>'.&mt('To').':</b> '.
- $tolist).
- ($content{'courseid'}?'<br /><b>'.&mt($crstype).':</b> '.$courseinfo{'description'}.
- ($content{'coursesec'}?' ('.&mt('Section').': '.$content{'coursesec'}.')':''):'').
- '<br /><b>'.&mt('Time').':</b> '.$content{'time'});
+ $content{'senderdomain'}.') ');
+ if ($cclist) {
+ $r->print('<br /><b>'.&mt('Cc').':</b> '.$cclist);
+ }
+ }
+ if ($content{'courseid'}) {
+ $r->print('<br /><b>'.&mt($crstype).':</b> '.$courseinfo{'description'});
+ if ($content{'coursesec'}) {
+ $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')');
+ }
+ }
+ $r->print('<br /><b>'.&mt('Time').':</b> '.$content{'time'});
if ($baseurl) {
if (defined($content{'courseid'}) && defined($env{'request.course.id'})) {
if ($content{'courseid'} eq $env{'request.course.id'}) {
@@ -2124,6 +2167,34 @@
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 ='<span class="LC_nobreak">';
+ if ($context eq 'replying') {
+ $showcc = '<label><input type="checkbox" name="replying_cc" value="'.$cc.'">';
+ }
+ $showcc .= &Apache::loncommon::aboutmewrapper(
+ &Apache::loncommon::plainname($ccname,
+ $ccdom),$ccname,$ccdom).'</label></span>';
+ push (@ccs,$showcc);
+ }
+ }
+ }
+ }
+ return @ccs;
+}
+
# =========================================================== Show the citation
sub displayresource {
@@ -2271,7 +2342,7 @@
&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 +2372,38 @@
} 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 +2419,24 @@
} 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.='<hr />'.$toaddr{$address}; }
+ if ($toaddr{$address}) {
+ $msgtxt.='<hr />'.$toaddr{$address};
+ }
my @thismsg;
if ($msgtype eq 'critical') {
$r->print(&mt('Sending critical message').' '.
@@ -2343,7 +2447,7 @@
$env{'form.sendbck'},
$env{'form.permanent'},
\$sentmessage{$address},
- $nosentstore);
+ $nosentstore,$recipid);
} else {
$r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
@thismsg=
@@ -2354,7 +2458,7 @@
$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)/) {
--raeburn1178135799--