[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/\<\;/\</gs;
$text=~s/\>\;/\>/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> ';
+ }
+ 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> '.
+ '<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> ';
+ }
+ $output .= '</td><td><label><input type="radio" name="html_'.$num.
+ '" value="1" />'.&mt('Yes').'</label> '.
+ '<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--