--- loncom/interface/lonmsg.pm 2007/05/09 21:04:51 1.207 +++ loncom/interface/lonmsg.pm 2008/11/04 04:18:22 1.214 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging # -# $Id: lonmsg.pm,v 1.207 2007/05/09 21:04:51 raeburn Exp $ +# $Id: lonmsg.pm,v 1.214 2008/11/04 04:18:22 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -120,6 +120,9 @@ sub packagemsg { ''.$env{'request.role'}.''. ''.$env{'request.filename'}.''. ''.$msgid.''; + if (defined($env{'form.group'})) { + $result .= ''.$env{'form.group'}.''; + } if (ref($recuser) eq 'ARRAY') { for (my $i=0; $i<@{$recuser}; $i++) { if ($type eq 'dcmail') { @@ -179,9 +182,17 @@ sub packagemsg { sub get_course_context { my $course_context; + my $msgkey; if (defined($env{'form.replyid'})) { + $msgkey = $env{'form.replyid'}; + } elsif (defined($env{'form.forwid'})) { + $msgkey = $env{'form.forwid'} + } elsif (defined($env{'form.multiforwid'})) { + $msgkey = $env{'form.multiforwid'}; + } + if ($msgkey ne '') { my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$origcid)= - split(/\:/,&unescape($env{'form.replyid'})); + split(/\:/,&unescape($msgkey)); $course_context = $origcid; } foreach my $key (keys(%env)) { @@ -201,7 +212,7 @@ sub get_course_context { # ================================================== Unpack message into a hash sub unpackagemsg { - my ($message,$notoken)=@_; + my ($message,$notoken,$noattachmentlink)=@_; my %content=(); my $parser=HTML::TokeParser->new(\$message); my $token; @@ -221,7 +232,7 @@ sub unpackagemsg { } } if (!exists($content{'recuser'})) { $content{'recuser'} = []; } - if ($content{'attachmenturl'}) { + if (($content{'attachmenturl'}) && (!$noattachmentlink)) { my ($fname)=($content{'attachmenturl'}=~m|/([^/]+)$|); if ($notoken) { $content{'message'}.='

'.&mt('Attachment').': '.$fname.''; @@ -271,7 +282,7 @@ sub unpackmsgid { sub sendemail { - my ($to,$subject,$body)=@_; + my ($to,$subject,$body,$to_uname,$to_udom,$user_lh)=@_; my %senderemails=&Apache::loncommon::getemails(); my $senderaddress=''; foreach my $type ('notification','permanentemail','critnotification') { @@ -280,9 +291,9 @@ sub sendemail { } } $body= - "*** ".&mt('This is an automatic message generated by the LON-CAPA system.')."\n". - "*** ".($senderaddress?&mt('You can reply to this message'):&mt('Please do not reply to this address.')."\n*** ". - &mt('A reply will not be received by the recipient!'))."\n\n".$body; + "*** ".&mt_user($user_lh,'This is an automatic message generated by the LON-CAPA system.')."\n". + "*** ".($senderaddress?&mt_user($user_lh,'You can reply to this message'):&mt_user($user_lh,'Please do not reply to this address.')."\n*** ". + &mt_user($user_lh,'A reply will not be received by the recipient!'))."\n\n".$body; my $msg = new Mail::Send; $msg->to($to); $msg->subject('[LON-CAPA] '.$subject); @@ -299,9 +310,10 @@ sub sendnotification { my ($to,$touname,$toudom,$subj,$crit,$text,$msgid)=@_; my $sender=$env{'environment.firstname'}.' '.$env{'environment.lastname'}; unless ($sender=~/\w/) { - $sender=$env{'user.name'}.'@'.$env{'user.domain'}; + $sender=$env{'user.name'}.':'.$env{'user.domain'}; } my $critical=($crit?' critical':''); + $text=~s/\<\;/\/gs; my $url='http://'. @@ -309,9 +321,10 @@ sub sendnotification { '/adm/email?username='.$touname.'&domain='.$toudom; my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid, $symb,$error) = &Apache::lonmsg::unpackmsgid($msgid); - my ($coursetext,$body,$bodystart,$bodyend); + my ($coursetext,$body,$bodybegin,$bodysubj,$bodyend); + my $user_lh = &user_lang($touname,$toudom,$fromcid); if ($fromcid ne '') { - $coursetext = "\n".&mt('Course').': '; + $coursetext = "\n".&mt_user($user_lh,'Course').': '; if ($env{'course.'.$fromcid.'.description'} ne '') { $coursetext .= $env{'course.'.$fromcid.'.description'}; } else { @@ -323,38 +336,61 @@ sub sendnotification { $coursetext .= "\n\n"; } my @recipients = split(/,/,$to); - $bodystart = $coursetext. - &mt('You received a'.$critical.' message from [_1] in LON-CAPA.',$sender).' '.&mt('The subject is + $bodybegin = $coursetext. + &mt_user($user_lh, + 'You received a'.$critical.' message from [_1] in LON-CAPA.',$sender).' '; + $bodysubj = &mt_user($user_lh,'The subject is [_1] ',$subj)."\n". -'=== '.&mt('Excerpt')." ============================================================ +'=== '.&mt_user($user_lh,'Excerpt')." ============================================================ "; $bodyend = " ======================================================================== -".&mt('Use +".&mt_user($user_lh,'Use [_1] to access the full message.',$url); my %userenv = &Apache::lonnet::get('environment',['notifywithhtml'],$toudom,$touname); - my $subject = &mt("'New' $critical message from ").$sender; + my $subject = &mt_user($user_lh,"'New' $critical message from ").$sender; + + my ($blocked,$blocktext); + if (!$crit) { + my %setters; + my ($startblock,$endblock) = + &Apache::loncommon::blockcheck(\%setters,'com',$touname,$toudom); + if ($startblock && $endblock) { + $blocked = 1; + my $showstart = &Apache::lonlocal::locallocaltime($startblock); + my $showend = &Apache::lonlocal::locallocaltime($endblock); + $blocktext = &mt_user($user_lh,'LON-CAPA messages sent to you between [_1] and [_2] will be inaccessible until the end of this time period, because you are a student in a course with an active communications block.',$showstart,$showend); + } + } 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; + if ($blocked) { + $body = $bodybegin."\n".$blocktext."\n".$bodyend; + } else { + my $sendtext = $text; + if (!grep/^\Q$addr\E/,@htmlexcerpt) { + $sendtext =~ s/\<\/*[^\>]+\>//gs; + } + $body = $bodybegin.$bodysubj.$sendtext.$bodyend; } - $body = $bodystart.$sendtext.$bodyend; - &sendemail($addr,$subject,$body); + &sendemail($addr,$subject,$body,$touname,$toudom,$user_lh); } } else { - $text =~ s/\<\/*[^\>]+\>//gs; - $body = $bodystart.$text.$bodyend; - &sendemail($to,$subject,$body); + if ($blocked) { + $body = $bodybegin."\n".$blocktext."\n".$bodyend; + } else { + $text =~ s/\<\/*[^\>]+\>//gs; + $body = $bodybegin.$bodysubj.$text.$bodyend; + } + &sendemail($to,$subject,$body,$touname,$toudom,$user_lh); } } # ============================================================= Check for email @@ -362,7 +398,7 @@ to access the full message.',$url); sub newmail { if ((time-$env{'user.mailcheck.time'})>300) { my %what=&Apache::lonnet::get('email_status',['recnewemail']); - &Apache::lonnet::appenv('user.mailcheck.time'=>time); + &Apache::lonnet::appenv({'user.mailcheck.time'=>time}); if ($what{'recnewemail'}>0) { return 1; } } return 0; @@ -476,7 +512,7 @@ sub store_instructor_comment { sub user_crit_msg_raw { my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, - $nosentstore,$recipid)=@_; + $nosentstore,$recipid,$attachmenturl)=@_; # Check if allowed missing my ($status,$packed_message); my $msgid='undefined'; @@ -485,20 +521,18 @@ sub user_crit_msg_raw { my $homeserver=&Apache::lonnet::homeserver($user,$domain); if ($homeserver ne 'no_host') { ($msgid,$packed_message)=&packagemsg($subject,$message,undef,undef, - undef,undef,undef,undef,undef,undef,undef, - undef,$recipid); + $attachmenturl,undef,undef,undef,undef,undef, + undef,undef,$recipid); if ($sendback) { $packed_message.='true'; } - $status=&Apache::lonnet::critical( - 'put:'.$domain.':'.$user.':critical:'. - &escape($msgid).'='. - &escape($packed_message),$homeserver); + $status=&Apache::lonnet::cput('critical', {$msgid => $packed_message}, + $domain,$user); if (defined($sentmessage)) { $$sentmessage = $packed_message; } if (!$nosentstore) { (undef,my $packed_message_no_citation) = - &packagemsg($subject,$message,undef,undef,undef,$user,$domain, - $msgid); + &packagemsg($subject,$message,undef,undef,$attachmenturl,$user, + $domain,$msgid); if ($status eq 'ok' || $status eq 'con_delayed') { &store_sent_mail($msgid,$packed_message_no_citation); } @@ -532,7 +566,7 @@ sub user_crit_msg_raw { =pod -=item * B: +=item * B: 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. @@ -549,7 +583,7 @@ sub user_crit_msg_raw { sub user_crit_msg { my ($user,$domain,$subject,$message,$sendback,$toperm,$sentmessage, - $nosentstore,$recipid)=@_; + $nosentstore,$recipid,$attachmenturl)=@_; my @status; my %userenv = &Apache::lonnet::get('environment',['msgforward'], $domain,$user); @@ -560,12 +594,13 @@ sub user_crit_msg { push(@status, &user_crit_msg_raw($forwuser,$forwdomain,$subject,$message, $sendback,$toperm,$sentmessage,$nosentstore, - $recipid)); + $recipid,$attachmenturl)); } } else { push(@status, &user_crit_msg_raw($user,$domain,$subject,$message,$sendback, - $toperm,$sentmessage,$nosentstore,$recipid)); + $toperm,$sentmessage,$nosentstore,$recipid, + $attachmenturl)); } if (wantarray) { return @status; @@ -628,10 +663,9 @@ sub user_normal_msg_raw { undef,$crsmsgid,$symb,$error,$recipid); # Store in user folder - $status=&Apache::lonnet::critical( - 'put:'.$domain.':'.$user.':nohist_email:'. - &escape($msgid).'='. - &escape($packed_message),$homeserver); + $status= + &Apache::lonnet::cput('nohist_email',{$msgid => $packed_message}, + $domain,$user); # Save new message received time &Apache::lonnet::put ('email_status',{'recnewemail'=>time},$domain,$user); @@ -657,8 +691,10 @@ sub user_normal_msg_raw { $text,$msgid); } if ($toperm && $userenv{'permanentemail'}) { - &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0, - $text,$msgid); + if ((!$userenv{'notification'}) || ($userenv{'notification'} ne $userenv{'permanentemail'})) { + &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0, + $text,$msgid); + } } &Apache::lonnet::log($env{'user.domain'},$env{'user.name'}, $env{'user.home'}, @@ -717,7 +753,7 @@ sub user_normal_msg { } sub process_sent_mail { - my ($msgsubj,$subj_prefix,$numsent,$stamp,$msgname,$msgdom,$msgcount,$context,$pid,$savemsg,$recusers,$recudoms,$baseurl,$attachmenturl,$symb,$error,$senderuname,$senderdom,$senderhome) = @_; + my ($msgsubj,$subj_prefix,$numsent,$stamp,$msgname,$msgdom,$msgcount,$context,$pid,$savemsg,$recusers,$recudoms,$baseurl,$attachmenturl,$symb,$error,$senderuname,$senderdom,$recipid) = @_; my $sentsubj; if ($numsent > 1) { $sentsubj = $subj_prefix.' ('.$numsent.' sent) '.$msgsubj; @@ -732,26 +768,23 @@ sub process_sent_mail { &buildmsgid($stamp,$sentsubj,$msgname,$msgdom,$msgcount,$context,$pid); (undef,my $sentmessage) = &packagemsg($msgsubj,$savemsg,undef,$baseurl,$attachmenturl,$recusers, - $recudoms,$sentmsgid,undef,undef,$symb,$error); + $recudoms,$sentmsgid,undef,undef,$symb,$error,$recipid); my $status = &store_sent_mail($sentmsgid,$sentmessage,$senderuname, - $senderdom,$senderhome); + $senderdom); return $status; } sub store_sent_mail { - my ($msgid,$message,$senderuname,$senderdom,$senderhome) = @_; + my ($msgid,$message,$senderuname,$senderdom) = @_; if ($senderuname eq '') { $senderuname = $env{'user.name'}; } if ($senderdom eq '') { $senderdom = $env{'user.domain'}; } - if ($senderhome eq '') { - $senderhome = $env{'user.home'}; - } - my $status =' '.&Apache::lonnet::critical( - 'put:'.$senderdom.':'.$senderuname.':nohist_email_sent:'. - &escape($msgid).'='.&escape($message),$senderhome); + my $status =' '.&Apache::lonnet::cput('nohist_email_sent', + {$msgid => $message}, + $senderdom,$senderuname); return $status; } @@ -896,6 +929,28 @@ sub decide_receiver { return ($typestyle,%to); } +sub user_lang { + my ($touname,$toudom,$fromcid) = @_; + my @userlangs; + if (($fromcid ne '') && ($env{'course.'.$fromcid.'.languages'} ne '')) { + @userlangs=(@userlangs,split(/\s*(\,|\;|\:)\s*/, + $env{'course.'.$fromcid.'.languages'})); + } else { + my %langhash = &Apache::lonnet::get('environment',['languages'],$toudom,$touname); + if ($langhash{'languages'} ne '') { + @userlangs = split(/\s*(\,|\;|\:)\s*/,$langhash{'languages'}); + } else { + my %domdefs = &Apache::lonnet::get_domain_defaults($toudom); + if ($domdefs{'lang_def'} ne '') { + @userlangs = ($domdefs{'lang_def'}); + } + } + } + my @languages=&Apache::loncommon::get_genlanguages(@userlangs); + my $user_lh = Apache::localize->get_handle(@languages); + return $user_lh; +} + =pod =back