[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)" />
+        &nbsp;&nbsp;
+      <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>&nbsp;<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--