--- loncom/interface/lonmsgdisplay.pm 2006/04/08 06:53:37 1.1 +++ loncom/interface/lonmsgdisplay.pm 2006/04/25 19:45:50 1.12 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging display # -# $Id: lonmsgdisplay.pm,v 1.1 2006/04/08 06:53:37 albertel Exp $ +# $Id: lonmsgdisplay.pm,v 1.12 2006/04/25 19:45:50 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -116,7 +116,6 @@ recipients of the message/e-mail. use strict; use Apache::lonnet; -use vars qw($msgcount); use HTML::TokeParser(); use Apache::Constants qw(:common); use Apache::loncommon(); @@ -173,7 +172,7 @@ sub scrollbuttons { sub statuschange { my ($msgid,$newstatus,$folder)=@_; - my $suffix=&foldersuffix($folder); + my $suffix=&Apache::lonmsg::foldersuffix($folder); my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]); if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; } unless ($status{$msgid}) { $status{$msgid}='new'; } @@ -185,8 +184,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 @@ -205,21 +205,55 @@ sub makefolder { sub movemsg { my ($msgid,$srcfolder,$trgfolder)=@_; if ($srcfolder eq 'new') { $srcfolder=''; } - my $srcsuffix=&foldersuffix($srcfolder); - my $trgsuffix=&foldersuffix($trgfolder); + my $srcsuffix=&Apache::lonmsg::foldersuffix($srcfolder); + my $trgsuffix=&Apache::lonmsg::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 @@ -314,7 +348,7 @@ ENDDISHEADER sub discrit { my $r=shift; - my $header = '

'.&mt('Critical Messages').'

'. + my $header = '

'.&mt('Critical Messages').'

'. '
'. ''; my %what=&Apache::lonnet::dump('critical'); @@ -358,18 +392,30 @@ sub sortedmessages { my %descriptions; my %status_cache = &Apache::lonnet::get('email_status'.&Apache::lonmsg::foldersuffix($folder),\@messages); - foreach (@messages) { - my $msgid=&Apache::lonnet::escape($_); + + my $get_received; + if ($folder eq 'sent' + && ($env{'form.sortedby'} =~ m/^(rev)?(user|domain)$/)) { + $get_received = 1; + } + + foreach my $msgid (@messages) { + my $esc_msgid=&Apache::lonnet::escape($msgid); my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid)= - &Apache::lonmsg::unpackmsgid($msgid,$folder,undef, + &Apache::lonmsg::unpackmsgid($esc_msgid,$folder,undef, \%status_cache); my $description = &get_course_desc($fromcid,\%descriptions); my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status, - $msgid,$description); + $esc_msgid,$description); + if ($get_received) { + my %message = &Apache::lonnet::get('nohist_email'.$suffix, + [$msgid]); + my %content = &Apache::lonmsg::unpackagemsg($message{$msgid}); + push(@temp1,$content{'recuser'},$content{'recdomain'}); + } # Check whether message was sent during blocking period. if ($sendtime >= $startblock && ($sendtime <= $endblock && $endblock > 0) ) { - my $escid = &Apache::lonnet::unescape($msgid); - $$blocked{$escid} = 'ON'; + $$blocked{$msgid} = 'ON'; $$numblocked ++; } else { push @temp ,\@temp1; @@ -384,16 +430,32 @@ sub sortedmessages { @temp = sort {$b->[0] <=> $a->[0]} @temp; } if ($env{'form.sortedby'} eq "user"){ - @temp = sort {lc($a->[2]) cmp lc($b->[2])} @temp; + if ($get_received) { + @temp = sort {lc($a->[7][0]) cmp lc($b->[7][0])} @temp; + } else { + @temp = sort {lc($a->[2]) cmp lc($b->[2])} @temp; + } } if ($env{'form.sortedby'} eq "revuser"){ - @temp = sort {lc($b->[2]) cmp lc($a->[2])} @temp; + if ($get_received) { + @temp = sort {lc($b->[7][0]) cmp lc($a->[7][0])} @temp; + } else { + @temp = sort {lc($b->[2]) cmp lc($a->[2])} @temp; + } } if ($env{'form.sortedby'} eq "domain"){ - @temp = sort {$a->[3] cmp $b->[3]} @temp; + if ($get_received) { + @temp = sort {$a->[8][0] cmp $b->[8][0]} @temp; + } else { + @temp = sort {$a->[3] cmp $b->[3]} @temp; + } } if ($env{'form.sortedby'} eq "revdomain"){ - @temp = sort {$b->[3] cmp $a->[3]} @temp; + if ($get_received) { + @temp = sort {$b->[8][0] cmp $a->[8][0]} @temp; + } else { + @temp = sort {$b->[3] cmp $a->[3]} @temp; + } } if ($env{'form.sortedby'} eq "subject"){ @temp = sort {lc($a->[1]) cmp lc($b->[1])} @temp; @@ -479,7 +541,7 @@ sub disnew { push @newmsgs, { msgid => $msgid, sendtime => $sendtime, - shortsub => &Apache::lonnet::unescape($shortsubj), + shortsub => $shortsubj, from => $fromname, fromdom => $fromdom, course => $description @@ -491,13 +553,12 @@ sub disnew { if ($#newmsgs >= 0) { $r->print(<$lt{'nm'} - +
 
TABLEHEAD foreach my $msg (@newmsgs) { $r->print(<<"ENDLINK"); - + ENDLINK foreach ('sendtime','from','fromdom','shortsub','course') { @@ -589,7 +650,7 @@ ENDDISHEADER if ($lastdis>$#temp) { $lastdis=$#temp; } $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber)); $r->print(''. - '
  $lt{'da'}$lt{'us'}$lt{'do'}$lt{'su'}$lt{'co'}
$lt{'op'}
 '); + ''); } else { @@ -626,29 +687,49 @@ ENDDISHEADER $r->print(''.&mt('Status').''); } $r->print("\n"); + + my $suffix = &Apache::lonmsg::foldersuffix($folder); for (my $n=$firstdis;$n<=$lastdis;$n++) { - my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID,$description)= @{$temp[$n]}; + my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID, + $description,$recv_name,$recv_domain)= + @{$temp[$n]}; if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) { if ($status eq 'new') { - $r->print(''); + $r->print(''); } elsif ($status eq 'read') { - $r->print(''); + $r->print(''); } elsif ($status eq 'replied') { - $r->print(''); + $r->print(''); } else { - $r->print(''); + $r->print(''); + } + my ($dis_name,$dis_domain) = ($fromname,$fromdomain); + if ($folder eq 'sent') { + if (defined($recv_name) && !defined($recv_domain)) { + $dis_name = join('
',@{$recv_name}); + $dis_domain = join('
',@{$recv_domain}); + } else { + my $msg_id = &Apache::lonnet::unescape($origID); + my %message = &Apache::lonnet::get('nohist_email'.$suffix, + [$msg_id]); + my %content = &Apache::lonmsg::unpackagemsg($message{$msg_id}); + $dis_name = join('
',@{$content{'recuser'}}); + $dis_domain = join('
',@{$content{'recdomain'}}); + } } $r->print(''. ''."\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("
 '); if ($env{'form.sortedby'} eq "revdate") { $r->print(''.&mt('Date').'
'.&mt('Open').''. ($folder ne 'trash'?''.&mt('Delete'):' ').''.&Apache::lonlocal::locallocaltime($sendtime).''. - $fromname.''.$fromdomain.''. - &Apache::lonnet::unescape($shortsubj).''. + $dis_name.''.$dis_domain.''. + $shortsubj.''. $description.''.$status.'
\n

". @@ -1667,7 +1748,8 @@ sub sendoffmail { my $savemsg; my $msgtype; my %sentmessage; - my $msgsubj=&Apache::lonfeedback::clear_out_html($env{'form.subject'}); + my $msgsubj=&Apache::lonfeedback::clear_out_html($env{'form.subject'}, + undef,1); if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) && (&Apache::lonnet::allowed('srm',$env{'request.course.id'}) || &Apache::lonnet::allowed('srm',$env{'request.course.id'}. @@ -1683,29 +1765,32 @@ sub sendoffmail { my ($recuname,$recdomain)=split(/\:/,$_); my $msgtxt = $savemsg; if ($toaddr{$_}) { $msgtxt.='


'.$toaddr{$_}; } - my $thismsg; + my @thismsg; if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) && (&Apache::lonnet::allowed('srm',$env{'request.course.id'}) || &Apache::lonnet::allowed('srm',$env{'request.course.id'}. '/'.$env{'request.course.sec'}))) { $r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': '); - $thismsg=&Apache::lonmsg::user_crit_msg($recuname,$recdomain,$msgsubj,$msgtxt, + @thismsg=&Apache::lonmsg::user_crit_msg($recuname,$recdomain,$msgsubj,$msgtxt, $env{'form.sendbck'},$env{'form.permanent'}, \$sentmessage{$_}); } else { $r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': '); - $thismsg=&Apache::lonmsg::user_normal_msg($recuname,$recdomain,$msgsubj,$msgtxt, + @thismsg=&Apache::lonmsg::user_normal_msg($recuname,$recdomain,$msgsubj,$msgtxt, $content{'citation'},undef,undef,$env{'form.permanent'},\$sentmessage{$_}); } if (($env{'request.course.id'}) && (($msgtype eq 'critical') || ($env{'form.sendmode'} eq 'group'))) { - $specialmsg_status{$recuname.':'.$recdomain} = $thismsg; - if ($thismsg eq 'ok') { - $numspecial ++; - } + $specialmsg_status{$recuname.':'.$recdomain} = + join(' ',@thismsg); + foreach my $result (@thismsg) { + if ($result eq 'ok') { + $numspecial++; + } + } } - $r->print($thismsg.'
'); - $sendstatus.=' '.$thismsg; + $r->print(join(' ',@thismsg).'
'); + $sendstatus.=' '.join(' ',@thismsg); } if (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group') || ($msgtype eq 'critical'))) { @@ -1769,17 +1854,15 @@ sub sendoffmail { &printheader($r,'','No messages sent.'); } if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) { - $r->print('
'.&mt('Completed.').''); + $r->print('
'.&mt('Completed.').''); if ($env{'form.displayedcrit'}) { &discrit($r); } else { &Apache::loncommunicate::menu($r); } } else { - $r->print( - '

'.&mt('Could not deliver message').'

'. - &mt('Please use the browser "Back" button and correct the recipient addresses') - ); + $r->print('

'.&mt('Could not deliver message').' '. + &mt('Please use the browser "Back" button and correct the recipient addresses').'

'); } } @@ -1886,32 +1969,67 @@ 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('

'. + &mt('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'); - $r->print('Moved '.$total.' message(s)

'); + if ($failed) { + $r->print('

+ '.&mt('Failed to move [_1] message(s)',$failed). + '

'); + $r->print('

'. + join("

\n

",@failed_msg). + "

\n"); + } + $r->print(&mt('Moved [_1] message(s)',$total).'

'); &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'); - $r->print('Deleted '.$total.' message(s)

'); + if ($failed) { + $r->print('

+ '.&mt('Failed to delete [_1] message(s)',$failed). + '

'); + $r->print('

'. + join("

\n

",@failed_msg). + "

\n"); + } + $r->print(&mt('Deleted [_1] message(s)',$total).'

'); &Apache::loncommunicate::menu($r); &disall($r,($folder?$folder:$dismode)); } elsif ($env{'form.markunread'}) { @@ -1955,10 +2073,6 @@ sub handler { } # ================================================= Main program, reset counter -BEGIN { - $msgcount=0; -} - =pod =back