--- loncom/interface/lonmsgdisplay.pm 2006/04/08 06:53:37 1.1 +++ loncom/interface/lonmsgdisplay.pm 2006/04/23 07:13:21 1.11 @@ -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.11 2006/04/23 07:13:21 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 = '<h1><font color=red>'.&mt('Critical Messages').'</font></h1>'. + my $header = '<h1><font color="red">'.&mt('Critical Messages').'</font></h1>'. '<form action="/adm/email" method="POST">'. '<input type="hidden" name="confirm" value="true" />'; 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(<<TABLEHEAD); <h2>$lt{'nm'}</h2> -<table border=2><tr><th> </th> +<table class="LC_mail_list"><tr><th> </th> <th>$lt{'da'}</th><th>$lt{'us'}</th><th>$lt{'do'}</th><th>$lt{'su'}</th><th>$lt{'co'}</th></tr> TABLEHEAD foreach my $msg (@newmsgs) { $r->print(<<"ENDLINK"); -<tr class="new" bgcolor="#FFBB77" onMouseOver="javascript:style.backgroundColor='#DD9955'" -onMouseOut="javascript:style.backgroundColor='#FFBB77'"> +<tr class="LC_mail_new"> <td><a href="/adm/email?dismode=new&display=$msg->{'msgid'}">$lt{'op'}</a></td> 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('<form method="post" name="disall" action="/adm/email">'. - '<table border=2><tr><th colspan="3"> </th><th>'); + '<table class="LC_mail_list"><tr><th colspan="3"> </th><th>'); if ($env{'form.sortedby'} eq "revdate") { $r->print('<a href = "?sortedby=date'.$fsqs.'">'.&mt('Date').'</a></th>'); } else { @@ -626,29 +687,49 @@ ENDDISHEADER $r->print('<a href = "?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</a></th>'); } $r->print("</tr>\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('<tr bgcolor="#FFBB77" onMouseOver="javascript:style.backgroundColor=\'#DD9955\'" onMouseOut="javascript:style.backgroundColor=\'#FFBB77\'">'); + $r->print('<tr class="LC_mail_new">'); } elsif ($status eq 'read') { - $r->print('<tr bgcolor="#BBBB77" onMouseOver="javascript:style.backgroundColor=\'#999944\'" onMouseOut="javascript:style.backgroundColor=\'#BBBB77\'">'); + $r->print('<tr class="LC_mail_read">'); } elsif ($status eq 'replied') { - $r->print('<tr bgcolor="#AAAA88" onMouseOver="javascript:style.backgroundColor=\'#888855\'" onMouseOut="javascript:style.backgroundColor=\'#AAAA88\'">'); + $r->print('<tr class="LC_mail_replied">'); } else { - $r->print('<tr bgcolor="#99BBBB" onMouseOver="javascript:style.backgroundColor=\'#669999\'" onMouseOut="javascript:style.backgroundColor=\'#99BBBB\'">'); + $r->print('<tr class="LC_mail_other">'); + } + my ($dis_name,$dis_domain) = ($fromname,$fromdomain); + if ($folder eq 'sent') { + if (defined($recv_name) && !defined($recv_domain)) { + $dis_name = join('<br />',@{$recv_name}); + $dis_domain = join('<br />',@{$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('<br />',@{$content{'recuser'}}); + $dis_domain = join('<br />',@{$content{'recdomain'}}); + } } $r->print('<td><input type="checkbox" name="delmark_'.$origID.'" /></td><td><a href="/adm/email?display='.$origID.$sqs. '">'.&mt('Open').'</a></td><td>'. ($folder ne 'trash'?'<a href="/adm/email?markdel='.$origID.$sqs. '">'.&mt('Delete'):' ').'</a></td>'. '<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'. - $fromname.'</td><td>'.$fromdomain.'</td><td>'. - &Apache::lonnet::unescape($shortsubj).'</td><td>'. + $dis_name.'</td><td>'.$dis_domain.'</td><td>'. + $shortsubj.'</td><td>'. $description.'</td><td>'.$status.'</td></tr>'."\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("</table>\n<p>". @@ -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'}. @@ -1769,17 +1851,15 @@ sub sendoffmail { &printheader($r,'','No messages sent.'); } if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) { - $r->print('<br /><font color="green">'.&mt('Completed.').'</font>'); + $r->print('<br /><span class="LC_success">'.&mt('Completed.').'</span>'); if ($env{'form.displayedcrit'}) { &discrit($r); } else { &Apache::loncommunicate::menu($r); } } else { - $r->print( - '<h2><font color="red">'.&mt('Could not deliver message').'</font></h2>'. - &mt('Please use the browser "Back" button and correct the recipient addresses') - ); + $r->print('<p><span class="LC_error">'.&mt('Could not deliver message').'</span> '. + &mt('Please use the browser "Back" button and correct the recipient addresses').'</p>'); } } @@ -1886,32 +1966,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('<p class="LC_error">'. + &mt('Failed to delete the message.').'</p>'. + '<p class="LC_error">'.$msg."</p>\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)<p>'); + if ($failed) { + $r->print('<p class="LC_error"> + '.&mt('Failed to move [_1] message(s)',$failed). + '</p>'); + $r->print('<p class="LC_error">'. + join("</p>\n<p class=\"LC_error\">",@failed_msg). + "</p>\n"); + } + $r->print(&mt('Moved [_1] message(s)',$total).'<p>'); &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)<p>'); + if ($failed) { + $r->print('<p class="LC_error"> + '.&mt('Failed to delete [_1] message(s)',$failed). + '</p>'); + $r->print('<p class="LC_error">'. + join("</p>\n<p class=\"LC_error\">",@failed_msg). + "</p>\n"); + } + $r->print(&mt('Deleted [_1] message(s)',$total).'<p>'); &Apache::loncommunicate::menu($r); &disall($r,($folder?$folder:$dismode)); } elsif ($env{'form.markunread'}) { @@ -1955,10 +2070,6 @@ sub handler { } # ================================================= Main program, reset counter -BEGIN { - $msgcount=0; -} - =pod =back