[LON-CAPA-cvs] cvs: loncom /interface lonmsg.pm lonpreferences.pm

raeburn lon-capa-cvs-allow@mail.lon-capa.org
Tue, 08 May 2007 17:23:11 -0000


This is a MIME encoded message

--raeburn1178644991
Content-Type: text/plain

raeburn		Tue May  8 13:23:11 2007 EDT

  Modified files:              
    /loncom/interface	lonmsg.pm lonpreferences.pm 
  Log:
  Bugs 4647 and 5164
  - User can set option for HTML tags to be included in message excerpt sent in notification emails. Default is strip HTML.
  - Interface changed for setting of notification email addresses - now set each address to receive all, critical only or non-critical only.
  - javascript checks notification e-mail address to see if it is a valid format.
  - Internationalization was missing in some places.
  
  
--raeburn1178644991
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20070508132311.txt"

Index: loncom/interface/lonmsg.pm
diff -u loncom/interface/lonmsg.pm:1.205 loncom/interface/lonmsg.pm:1.206
--- loncom/interface/lonmsg.pm:1.205	Tue May  8 12:50:02 2007
+++ loncom/interface/lonmsg.pm	Tue May  8 13:23:10 2007
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines for messaging
 #
-# $Id: lonmsg.pm,v 1.205 2007/05/08 16:50:02 raeburn Exp $
+# $Id: lonmsg.pm,v 1.206 2007/05/08 17:23:10 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -304,13 +304,12 @@
     my $critical=($crit?' critical':'');
     $text=~s/\&lt\;/\</gs;
     $text=~s/\&gt\;/\>/gs;
-    $text=~s/\<\/*[^\>]+\>//gs;
     my $url='http://'.
 	&Apache::lonnet::hostname(&Apache::lonnet::homeserver($touname,$toudom)).
       '/adm/email?username='.$touname.'&domain='.$toudom;
     my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid,
         $symb,$error) = &Apache::lonmsg::unpackmsgid($msgid);
-    my $coursetext;
+    my ($coursetext,$body,$bodystart,$bodyend);
     if ($fromcid ne '') {
         $coursetext = "\n".&mt('Course').': ';
         if ($env{'course.'.$fromcid.'.description'} ne '') {
@@ -323,14 +322,16 @@
         }
         $coursetext .= "\n\n";
     }
-    my $body = $coursetext. 
+    my @recipients = split(/,/,$to);
+    $bodystart = $coursetext. 
                &mt('You received a'.$critical.' message from [_1] in LON-CAPA.',$sender).' '.&mt('The subject is 
 
  [_1]
 
 ',$subj)."\n".
 '=== '.&mt('Excerpt')." ============================================================
-$text
+";
+    $bodyend = "
 ========================================================================
 
 ".&mt('Use 
@@ -338,7 +339,23 @@
  [_1]
 
 to access the full message.',$url);
-    &sendemail($to,'New'.$critical.' message from '.$sender,$body);
+    my %userenv = &Apache::lonnet::get('environment',['notifywithhtml'],$toudom,$touname);
+    my $subject = &mt("'New' $critical message from ").$sender;
+    if ($userenv{'notifywithhtml'} ne '') {
+        my @htmlexcerpt = split(/,/,$userenv{'notifywithhtml'});
+        foreach my $addr (@recipients) {
+            my $sendtext = $text;
+            if (!grep/^\Q$addr\E/,@htmlexcerpt) {
+                $sendtext =~ s/\<\/*[^\>]+\>//gs;
+            }
+            $body = $bodystart.$sendtext.$bodyend;
+            &sendemail($addr,$subject,$body);
+        }
+    } else {
+        $body = $bodystart.$text.$bodyend;
+        $text =~ s/\<\/*[^\>]+\>//gs;
+        &sendemail($to,$subject,$body);
+    }
 }
 # ============================================================= Check for email
 
@@ -634,9 +651,7 @@
 	   $$sentmessage = $packed_message;
        }
 # Notifications
-       my %userenv = &Apache::lonnet::get('environment',['notification',
-							 'permanentemail'],
-					  $domain,$user);
+       my %userenv = &Apache::loncommon::getemails($user,$domain);
        if ($userenv{'notification'}) {
 	   &sendnotification($userenv{'notification'},$user,$domain,$subject,0,
 			     $text,$msgid);
Index: loncom/interface/lonpreferences.pm
diff -u loncom/interface/lonpreferences.pm:1.101 loncom/interface/lonpreferences.pm:1.102
--- loncom/interface/lonpreferences.pm:1.101	Tue May  1 21:33:49 2007
+++ loncom/interface/lonpreferences.pm	Tue May  8 13:23:10 2007
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.101 2007/05/02 01:33:49 albertel Exp $
+# $Id: lonpreferences.pm,v 1.102 2007/05/08 17:23:10 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -566,33 +566,162 @@
 ################################################################
 
 sub msgforwardchanger {
-    my $r = shift;
+    my ($r,$message) = @_;
     my $user       = $env{'user.name'};
     my $domain     = $env{'user.domain'};
-    my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification']);
+    my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification','notifywithhtml']);
     my $msgforward=$userenv{'msgforward'};
-    my $notification=$userenv{'notification'};
-    my $critnotification=$userenv{'critnotification'};
+    my %lt = &Apache::lonlocal::texthash(
+                                          all   => 'All',
+                                          crit  => 'Critical only',
+                                          reg   => 'Non-critical only',
+                                          foad  => 'Forwarding Address(es)',
+                                          mnot  => 'Message Notification Email Address(es)',
+                                          chg   => 'Change',
+                                          email => 'The e-mail address you entered',
+                                          notv => 'is not a valid e-mail address',
+                                          toen => "To enter multiple addresses, enter one address at a time, click 'Change' and then add the next one', 
+                                          prme => 'Back to preferences menu',
+                                        );
     my $forwardingHelp = Apache::loncommon::help_open_topic("Prefs_Forwarding",
 							    "What are forwarding ".
 							    "and notification ".
 							    "addresses");
     my $criticalMessageHelp = Apache::loncommon::help_open_topic("Course_Critical_Message",
 								 "What are critical messages");
-
+    my @allow_html = split(/,/,$userenv{'notifywithhtml'});
+    my %allnot = &get_notifications(\%userenv);
+    my $validatescript = &Apache::lonhtmlcommon::javascript_valid_email();
+    my $jscript = qq|
+<script type="text/javascript">
+function validate() {
+    var checkaddress = 0;
+    for (var i=0; i<document.prefs.numnotify.value; i++) {
+        var addr = document.prefs.elements['address_'+i].value;
+        if (i < document.prefs.numnotify.value-1) {
+            if (document.prefs.elements['del_notify_'+i].value == false) {
+                checkaddress = 1;
+            } 
+        } else {
+            if (document.prefs.elements['add_notify_'+i].checked == true) { 
+                checkaddress = 1;
+            }
+        }
+        if (checkaddress== 1) {
+            var addr = document.prefs.elements['address_'+i].value;
+            if (validmail(document.prefs.elements['address_'+i]) == false) {
+                alert("$lt{'email'}: "+addr+" $lt{'notv'}.\\n($lt{'toen'}).");
+                return;
+            }
+        }
+    }
+    document.prefs.submit();
+}
+$validatescript
+</script>
+|;
     $r->print(<<ENDMSG);
-$forwardingHelp <br />
+$jscript
+$message
+$forwardingHelp
 <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_msgforward" />
-New Forwarding Address(es) (<tt>user:domain,user:domain,...</tt>):
+$lt{'foad'} (<tt>user:domain,user:domain,...</tt>):
 <input type="text" size="40" value="$msgforward" name="msgforward" /><hr />
-New Message Notification Email Address(es) (<tt>joe\@doe.com,jane\@doe.edu,...</tt>):
-<input type="text" size="40" value="$notification" name="notification" /><hr />
-New Critical Message Notification Email Address(es) (<tt>joe\@doe.com,jane\@doe.edu,...</tt>):
-<input type="text" size="40" value="$critnotification" name="critnotification" />$criticalMessageHelp<hr />
-<input type="submit" value="Change" />
-</form>
+$criticalMessageHelp
+$lt{'mnot'} (<tt>joe\@doe.com</tt>):<br />
 ENDMSG
+    my @sortforwards = sort (keys(%allnot));
+    my $output = &Apache::loncommon::start_data_table().
+                 &Apache::loncommon::start_data_table_header_row().
+                 '<th>'.&mt('Action').'</th>'.
+                 '<th>'.&mt('Notification address').'</th><th>'.
+                 &mt('Messages to forward').'</th><th>'.
+                 &mt('Excerpt retains HTML tags included in message').'</th>'.
+                 &Apache::loncommon::end_data_table_header_row();
+    my $num = 0;
+    foreach my $item (@sortforwards) {
+        $output .= &Apache::loncommon::start_data_table_row().
+                   '<td><input type="checkbox" name="del_notify_'.$num.'" />'.
+                   &mt('Delete').'</td>'.
+                   '<td><input type="text" value="'.$item.'" name="address_'.
+                   $num.'" /></td><td>';
+        my %chk;
+        if (defined($allnot{$item}{'crit'})) {
+            if (defined($allnot{$item}{'reg'})) {
+                $chk{'all'} = 'checked="checked" ';
+            } else {
+                $chk{'crit'} = 'checked="checked" ';
+            }
+        } else {
+            $chk{'reg'} = 'checked="checked" ';
+        }
+        foreach my $type ('all','crit','reg') {
+            $output .= '<span class="LC_nobreak"><label>'.
+                       '<input type="radio" name="notify_type_'.$num. 
+                       '" value="'.$type.'" '.$chk{$type}.'/>'.$lt{$type}.'</label></span>&nbsp;';
+        }
+        my $htmlon = '';
+        my $htmloff = '';
+        if (grep/^\Q$item\E/,@allow_html) {
+            $htmlon = 'checked="checked" '; 
+        } else {
+            $htmloff = 'checked="checked" ';
+        }
+        $output .= '</td><td><label><input type="radio" name="html_'.$num.
+                   '" value="1" '.$htmlon.'/>'.&mt('Yes').'</label>&nbsp;'.
+                   '<label><input type="radio" name="html_'.$num.'" value="0" '.
+                   $htmloff.'/>'.&mt('No').'</label></td>'.
+                   &Apache::loncommon::end_data_table_row();
+        $num ++;
+    }
+    my %defchk = (
+                   all => 'checked="checked" ',
+                   crit => '',
+                   reg => '',
+                 );
+    $output .= &Apache::loncommon::start_data_table_row().
+               '<td><input type="checkbox" name="add_notify_'.$num.'" />'.
+               &mt('Add').'</td>'.
+               '<td><input type="text" value="" name="address_'.$num.
+               '" /></td><td>';
+    foreach my $type ('all','crit','reg') {
+        $output .= '<span class="LC_nobreak"><label>'.
+                   '<input type="radio" name="notify_type_'.$num.
+                   '" value="'.$type.'" '.$defchk{$type}.'/>'.
+                   $lt{$type}.'</label></span>&nbsp;';
+    }
+    $output .= '</td><td><label><input type="radio" name="html_'.$num.
+               '" value="1" />'.&mt('Yes').'</label>&nbsp;'.
+               '<label><input type="radio" name="html_'.$num.'" value="0" '.
+               ' checked="checked" />'.
+               &mt('No').'</label></td>'.
+               &Apache::loncommon::end_data_table_row().
+               &Apache::loncommon::end_data_table();
+    $num ++;
+    $r->print($output);
+    $r->print(qq|
+<hr />
+<input type="hidden" name="numnotify" value="$num" />
+<input type="button" value="$lt{'chg'}" onclick="javascript:validate()" />
+<input type="button" value="$lt{'prme'}" onclick="location.href='/adm/preferences'" />
+</form>
+|);
+
+}
+
+sub get_notifications {
+    my ($userenv) = @_;
+    my %allnot;
+    my @critnot = split(/,/,$userenv->{'critnotification'});
+    my @regnot = split(/,/,$userenv->{'notification'});
+    foreach my $item (@critnot) {
+        $allnot{$item}{crit} = 1;
+    }
+    foreach my $item (@regnot) {
+        $allnot{$item}{reg} = 1;
+    }
+    return %allnot;
 }
 
 sub verify_and_change_msgforward {
@@ -609,7 +738,7 @@
 	    if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') {
                $newscreen.=$msuser.':'.$msdomain.',';
 	   } else {
-               $message.='No such user: '.$msuser.':'.$msdomain.'<br>';
+               $message.= &mt('No such user: ').$msuser.':'.$msdomain.'<br>';
            }
         }
     }
@@ -617,37 +746,78 @@
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'msgforward' => $newscreen});
         &Apache::lonnet::appenv('environment.msgforward' => $newscreen);
-        $message.='Set new message forwarding to '.$newscreen.'<br />';
+        $message .= &mt('Set message forwarding to: ').'<tt>'.$newscreen.
+                    '</tt><br />';
     } else {
         &Apache::lonnet::del('environment',['msgforward']);
         &Apache::lonnet::delenv('environment\.msgforward');
-        $message.='Reset message forwarding<br />';
+        $message.= &mt("Set message forwarding to 'off'.").'<br />';
     }
-    my $notification=$env{'form.notification'};
+    my $critnotification;
+    my $notification;
+    my $notify_with_html;
+    my $lastnotify = $env{'form.numnotify'}-1;
+    for (my $i=0; $i<$env{'form.numnotify'}; $i++) {
+        if ((!defined($env{'form.del_notify_'.$i})) &&  
+           ((($i==$lastnotify) && (defined($env{'form.add_notify_'.$lastnotify}))) ||
+            ($i<$lastnotify))) {
+            if (defined($env{'form.address_'.$i})) {
+                if ($env{'form.notify_type_'.$i} eq 'all') {
+                    $critnotification .= $env{'form.address_'.$i}.',';
+                    $notification .= $env{'form.address_'.$i}.',';
+                } elsif ($env{'form.notify_type_'.$i} eq 'crit') {
+                    $critnotification .= $env{'form.address_'.$i}.',';
+                } elsif ($env{'form.notify_type_'.$i} eq 'reg') {
+                    $notification .= $env{'form.address_'.$i}.','; 
+                }
+                if ($env{'form.html_'.$i} eq '1') {
+		    $notify_with_html .= $env{'form.address_'.$i}.',';       	
+                }
+            }
+        }
+    }
+    $critnotification =~ s/,$//;
+    $critnotification=~s/\s//gs;
+    $notification =~ s/,$//;
     $notification=~s/\s//gs;
+    $notify_with_html =~ s/,$//;
+    $notify_with_html =~ s/\s//gs;
     if ($notification) {
         &Apache::lonnet::put('environment',{'notification' => $notification});
         &Apache::lonnet::appenv('environment.notification' => $notification);
-        $message.='Set message notification address to '.$notification.'<br />';
+        $message.=&mt('Set non-critical message notification address(es) to: ').'<tt>'.$notification.'</tt><br />';
     } else {
         &Apache::lonnet::del('environment',['notification']);
         &Apache::lonnet::delenv('environment\.notification');
-        $message.='Reset message notification<br />';
+        $message.=&mt("Non-critical message notification set to 'off'.").'<br />';
     }
-    my $critnotification=$env{'form.critnotification'};
-    $critnotification=~s/\s//gs;
     if ($critnotification) {
         &Apache::lonnet::put('environment',{'critnotification' => $critnotification});
         &Apache::lonnet::appenv('environment.critnotification' => $critnotification);
-        $message.='Set critical message notification address to '.$critnotification;
+        $message.=&mt('Set critical message notification address(es) to: ').'<tt>'.$critnotification.'</tt><br />';
     } else {
         &Apache::lonnet::del('environment',['critnotification']);
         &Apache::lonnet::delenv('environment\.critnotification');
-        $message.='Reset critical message notification<br />';
+        $message.=&mt('Critical message notification set to off').'<br />';
     }
-    $r->print(<<ENDVCMSG);
-$message
-ENDVCMSG
+    if ($critnotification || $notification) {
+        if ($notify_with_html) {
+            &Apache::lonnet::put('environment',{'notifywithhtml' => $notify_with_html});
+            &Apache::lonnet::appenv('environment.notifywithhtml' => $notify_with_html);
+            $message.=&mt('Set address(es) to receive excerpts with html retained: ').'<tt>'.$notify_with_html.'</tt>';
+        } else {
+            &Apache::lonnet::del('environment',['notifywithhtml']);
+            &Apache::lonnet::delenv('environment\.notifywithhtml');
+            $message.=&mt("Set all notification address(es) to receive excerpts with html stripped.").'<br />';
+        }
+    } else {
+        &Apache::lonnet::del('environment',['notifywithhtml']);
+        &Apache::lonnet::delenv('environment\.notifywithhtml');
+    }
+    if ($message) {
+        $message .= '<br /><hr />';
+    }
+    &msgforwardchanger($r,$message);
 }
 
 ################################################################
@@ -1405,7 +1575,7 @@
                       breadcrumb => 
                           { href => '/adm/preferences?action=changemsgforward',
                             text => 'Change Message Forwarding'},
-                      printmenu => 'yes',
+                      printmenu => 'no',
                       subroutine => \&verify_and_change_msgforward }));
     my $aboutmeaction=
         '/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme';

--raeburn1178644991--