--- loncom/interface/lonmsg.pm 2006/01/09 20:07:27 1.170 +++ loncom/interface/lonmsg.pm 2006/04/23 05:47:33 1.173.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging # -# $Id: lonmsg.pm,v 1.170 2006/01/09 20:07:27 albertel Exp $ +# $Id: lonmsg.pm,v 1.173.2.1 2006/04/23 05:47:33 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -538,19 +538,23 @@ sub user_normal_msg_raw { my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl, $toperm,$currid,$newid,$sentmessage)=@_; # Check if allowed missing - my $status=''; + my ($status,$packed_message); my $msgid='undefined'; my $text=$message; unless (($message)&&($user)&&($domain)) { $status='empty'; }; my $homeserver=&Apache::lonnet::homeserver($user,$domain); if ($homeserver ne 'no_host') { - ($msgid,$message)=&packagemsg($subject,$message,$citation,$baseurl, + ($msgid,$packed_message)= + &packagemsg($subject,$message,$citation,$baseurl, + $attachmenturl,$user,$domain,$currid); + (undef, my $packed_message_no_citation)= + &packagemsg($subject,$message,undef ,$baseurl, $attachmenturl,$user,$domain,$currid); # Store in user folder $status=&Apache::lonnet::critical( 'put:'.$domain.':'.$user.':nohist_email:'. &Apache::lonnet::escape($msgid).'='. - &Apache::lonnet::escape($message),$homeserver); + &Apache::lonnet::escape($packed_message),$homeserver); # Save new message received time &Apache::lonnet::put ('email_status',{'recnewemail'=>time},$domain,$user); @@ -561,7 +565,7 @@ sub user_normal_msg_raw { (&Apache::lonnet::allowed('srm',$env{'request.course.id'}) || &Apache::lonnet::allowed('srm',$env{'request.course.id'}. '/'.$env{'request.course.sec'})))) { - $status .= &store_sent_mail($msgid,$message); + $status .= &store_sent_mail($msgid,$packed_message_no_citation); } } else { $status='no_host'; @@ -570,7 +574,7 @@ sub user_normal_msg_raw { $$newid = $msgid; } if (defined($sentmessage)) { - $$sentmessage = $message; + $$sentmessage = $packed_message; } # Notifications @@ -609,26 +613,28 @@ sub user_normal_msg { $domain,$user); my $msgforward=$userenv{'msgforward'}; if ($msgforward) { - foreach (split(/\,/,$msgforward)) { - my ($forwuser,$forwdomain)=split(/\:/,$_); - $status.= - &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message, - $citation,$baseurl,$attachmenturl,$toperm,undef,undef,$sentmessage).' '; - } + foreach (split(/\,/,$msgforward)) { + my ($forwuser,$forwdomain)=split(/\:/,$_); + $status.= + &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message, + $citation,$baseurl,$attachmenturl,$toperm, + undef,undef,$sentmessage).' '; + } } else { $status=&user_normal_msg_raw($user,$domain,$subject,$message, - $citation,$baseurl,$attachmenturl,$toperm,undef,undef,$sentmessage); + $citation,$baseurl,$attachmenturl,$toperm, + undef,undef,$sentmessage); } return $status; } sub store_sent_mail { my ($msgid,$message) = @_; - my $status =' '.&Apache::lonnet::critical( - 'put:'.$env{'user.domain'}.':'.$env{'user.name'}. - ':nohist_email_sent:'. - &Apache::lonnet::escape($msgid).'='. - &Apache::lonnet::escape($message),$env{'user.home'}); + my $status =' '.&Apache::lonnet::critical( + 'put:'.$env{'user.domain'}.':'.$env{'user.name'}. + ':nohist_email_sent:'. + &Apache::lonnet::escape($msgid).'='. + &Apache::lonnet::escape($message),$env{'user.home'}); return $status; } @@ -694,8 +700,9 @@ sub statuschange { &Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus}); } if ($newstatus eq 'deleted') { - &movemsg(&Apache::lonnet::unescape($msgid),$folder,'trash'); - } + return &movemsg($msgid,$folder,'trash'); + } + return ; } # ============================================================= Make new folder @@ -716,19 +723,53 @@ sub movemsg { if ($srcfolder eq 'new') { $srcfolder=''; } my $srcsuffix=&foldersuffix($srcfolder); my $trgsuffix=&foldersuffix($trgfolder); + if ($srcsuffix eq $trgsuffix) { + return (0,&mt('Message not moved, Attempted to move message to the same folder as it already is in.')); + } # Copy message my %message=&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid]); - &Apache::lonnet::put('nohist_email'.$trgsuffix,{$msgid => $message{$msgid}}); + if (!exists($message{$msgid}) || $message{$msgid} eq '') { + if (&Apache::slotrequest::network_error(%message)) { + return (0,&mt('Message not moved, A network error occurred.')); + } else { + return (0,&mt('Message not moved as the message is no longer in the source folder.')); + } + } + + my $result =&Apache::lonnet::put('nohist_email'.$trgsuffix, + {$msgid => $message{$msgid}}); + if (&Apache::slotrequest::network_error($result)) { + return (0,&mt('Message not moved, A network error occurred.')); + } # Copy status unless ($trgfolder eq 'trash') { - my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]); - &Apache::lonnet::put('email_status'.$trgsuffix,{$msgid => $status{$msgid}}); + my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]); + # a non-existant status is the mark of an unread msg + if (&Apache::slotrequest::network_error(%status)) { + return (0,&mt('Message copied to new folder but status was not, A network error occurred.')); + } + my $result=&Apache::lonnet::put('email_status'.$trgsuffix, + {$msgid => $status{$msgid}}); + if (&Apache::slotrequest::network_error($result)) { + return (0,&mt('Message copied to new folder but status was not, A network error occurred.')); + } } + # Delete orginals - &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]); - &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]); + my $result_del_msg = + &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]); + my $result_del_stat = + &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]); + if (&Apache::slotrequest::network_error($result_del_msg)) { + return (0,&mt('Message copied, but unable to delete the original from the source folder.')); + } + if (&Apache::slotrequest::network_error($result_del_stat)) { + return (0,&mt('Message copied, but unable to delete the original status from the source folder.')); + } + + return (1); } # ======================================================= Display a course list @@ -1157,7 +1198,9 @@ ENDDISHEADER $description.''.$status.''."\n"); } elsif ($status eq 'deleted') { # purge - &movemsg(&Apache::lonnet::unescape($origID),$folder,'trash'); + my ($result,$msg) = + &movemsg(&Apache::lonnet::unescape($origID),$folder,'trash'); + } } $r->print("\n

". @@ -2029,9 +2072,10 @@ sub displayresource { $content{'sendername'}, $content{'senderdomain'}, $content{'courseid'}); - } else { + } elsif ($env{'user.adv'}) { return $content{'citation'}; } + return ''; } # ================================================================== The Header @@ -2371,31 +2415,63 @@ sub handler { &compout($r,$env{'form.forward'},undef,undef,undef,$folder); } elsif ($env{'form.markdel'}) { &printheader($r,'','Deleted Message'); - &statuschange($env{'form.markdel'},'deleted',$folder); + my ($result,$msg) = + &statuschange($env{'form.markdel'},'deleted',$folder); + if (!$result) { + $r->print('

Failed to delete the message.

'. + '

'.$msg."

\n"); + } &Apache::loncommunicate::menu($r); &disall($r,($folder?$folder:$dismode)); } elsif ($env{'form.markedmove'}) { - my $total=0; - foreach (keys %env) { - if ($_=~/^form\.delmark_(.*)$/) { - &movemsg(&Apache::lonnet::unescape($1),$folder, - $env{'form.movetofolder'}); - $total++; + my ($total,$failed,@failed_msg)=(0,0); + foreach my $key (keys(%env)) { + if ($key=~/^form\.delmark_(.*)$/) { + my ($result,$msg) = + &movemsg(&Apache::lonnet::unescape($1),$folder, + $env{'form.movetofolder'}); + if ($result) { + $total++; + } else { + $failed++; + push(@failed_msg,$msg); + } } } &printheader($r,'','Moved Messages'); + if ($failed) { + $r->print('

+ Failed to move '.$failed.' message(s)

'); + $r->print('

'. + join("

\n

",@failed_msg). + "

\n"); + } $r->print('Moved '.$total.' message(s)

'); &Apache::loncommunicate::menu($r); &disall($r,($folder?$folder:$dismode)); } elsif ($env{'form.markeddel'}) { - my $total=0; - foreach (keys %env) { - if ($_=~/^form\.delmark_(.*)$/) { - &statuschange(&Apache::lonnet::unescape($1),'deleted',$folder); - $total++; + my ($total,$failed,@failed_msg)=(0,0); + foreach my $key (keys(%env)) { + if ($key=~/^form\.delmark_(.*)$/) { + my ($result,$msg) = + &statuschange(&Apache::lonnet::unescape($1),'deleted', + $folder); + if ($result) { + $total++; + } else { + $failed++; + push(@failed_msg,$msg); + } } } &printheader($r,'','Deleted Messages'); + if ($failed) { + $r->print('

+ Failed to delete '.$failed.' message(s)

'); + $r->print('

'. + join("

\n

",@failed_msg). + "

\n"); + } $r->print('Deleted '.$total.' message(s)

'); &Apache::loncommunicate::menu($r); &disall($r,($folder?$folder:$dismode));