--- loncom/interface/lonmsgdisplay.pm 2006/12/08 14:43:38 1.50 +++ loncom/interface/lonmsgdisplay.pm 2006/12/23 04:39:32 1.55 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging display # -# $Id: lonmsgdisplay.pm,v 1.50 2006/12/08 14:43:38 raeburn Exp $ +# $Id: lonmsgdisplay.pm,v 1.55 2006/12/23 04:39:32 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -137,11 +137,12 @@ my $interdis; # ============================================================ List all folders sub folderlist { - my $folder=shift; + my ($folder,$msgstatus) = @_; my %lt = &Apache::lonlocal::texthash( actn => 'Action', fold => 'Folder', show => 'Show', + status => 'Message Status', go => 'Go', nnff => 'New Name for Folder', newn => 'New Name', @@ -160,6 +161,10 @@ sub folderlist { ); $actions{'select_form_order'} = ['view','rename','delete']; + my %statushash = &get_msgstatus_types(); + + $statushash{'select_form_order'} = ['','new','read','replied','forwarded']; + my %permfolders = &get_permanent_folders(); my $permlist = join("','",sort(keys(%permfolders))); my ($permlistkeys,$permlistvals); @@ -173,6 +178,7 @@ sub folderlist { my %userfolders; foreach my $key (keys(%gotfolders)) { + $key =~ s/(['"])/\$1/g; #' stupid emacs $userfolders{$key} = $key; } my @userorder = sort(keys(%userfolders)); @@ -180,7 +186,7 @@ sub folderlist { my $folderlist = join("','",@userorder); $folderlist .= "','".$permlistvals; - $formhash{'select_form_order'} = ['','critical','new',@userorder,'sent','trash']; + $formhash{'select_form_order'} = ['','critical',@userorder,'sent','trash']; my $output = qq| ENDDISHEADER + my $fsqs='&folder='.$folder; - my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder); + my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus); my $totalnumber=$#temp+1; - unless ($totalnumber>0) { - $r->print('

'.&mt('Empty Folder').'

'); + if ($totalnumber < 1) { + if ($msgstatus eq '') { + $r->print('

'.&mt('Empty Folder').'

'); + } elsif ($msgstatus eq 'replied') { + $r->print('

'.&mt('You have not replied to any messages in this folder.').'

'); + } else { + $r->print('

'.&mt('There are no '.lc($statushash{$msgstatus}).' messages in this folder.').'

'); + } return; } unless ($interdis) { $interdis=20; } my $number=int($totalnumber/$interdis); + if ($interdis) { + if ($totalnumber%$interdis == 0) { + $number--; + } + } + if (($startdis<0) || ($startdis>$number)) { $startdis=$number; } my $firstdis=$interdis*$startdis; if ($firstdis>$#temp) { $firstdis=$#temp-$interdis+1; } my $lastdis=$firstdis+$interdis-1; if ($lastdis>$#temp) { $lastdis=$#temp; } - $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber)); + $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber,$msgstatus)); $r->print('
'. - '
 '); + ''); } else { @@ -1068,14 +1058,28 @@ ENDDISHEADER $dis_domain = join('
',@{$content{'recdomain'}}); } } - $r->print(''. - ''."\n"); + my $localsenttime = &Apache::lonlocal::locallocaltime($sendtime); + my $count = $n +1; + $r->print(''); + foreach my $item ($localsenttime,$dis_name,$dis_domain,$shortsubj) { + $r->print(''); + } + my $showstatus; + my %statushash = &get_msgstatus_types(); + if ($status eq '') { + $showstatus = ''; + } else { + $showstatus = $statushash{$status}; + } + $r->print(''."\n"); } elsif ($status eq 'deleted') { # purge my ($result,$msg) = @@ -1083,30 +1087,55 @@ ENDDISHEADER } } - $r->print("
 '); if ($env{'form.sortedby'} eq "revdate") { $r->print(''.&mt('Date').''.&mt('Open').''. - ($folder ne 'trash'?''.&mt('Delete'):' ').''.&Apache::lonlocal::locallocaltime($sendtime).''. - $dis_name.''.$dis_domain.''. - $shortsubj.''. - $description.''.$status.'
'.(($status eq 'new')?'':''). + $count.'.'.(($status eq 'new')?'':'').' '. + ''.(($status eq 'new')?'':''). + ''. + $item.(($status eq 'new')?'':'').''.(($status eq 'new')?'':'').$description. + (($status eq 'new')?'':'').''. + (($status eq 'new')?'':'').$showstatus. + (($status eq 'new')?'':'').'
\n

". - ''.&mt('Check All').' '. - ''.&mt('Uncheck All').'

'. - ''); + $r->print("
\n"); + $r->print(' + + '."\n". + ''."\n"); + + if (keys(%gotfolders) > 0) { + $r->print(''); + } + $r->print(''."\n". + '
'. + '
'."\n". + ''."\n". + '
 '.&mt('Action').'
'."\n". + '

'); + $r->print(' '."\n"); } - $r->print('

'); - my %gotfolders = &Apache::lonmsg::get_user_folders(); - my %userfolders; - foreach my $key (keys(%gotfolders)) { - $userfolders{$key} = $key; + if ($msgstatus ne 'read') { + $r->print(' ."\n"'); } - $r->print( - &Apache::loncommon::select_form('','movetofolder', - %userfolders)); + if ($msgstatus ne 'unread') { + $r->print(' '."\n"); + } + $r->print(' '."\n"); + + my %gotfolders = &Apache::lonmsg::get_user_folders(); + if (keys(%gotfolders) > 0) { + $r->print(' '); + } + $r->print("\n".'

'.&mt('Destination folder').'
'); + my %userfolders; + foreach my $key (keys(%gotfolders)) { + $userfolders{$key} = $key; + } + $userfolders{''} = ""; + $r->print(&Apache::loncommon::select_form('','movetofolder',%userfolders). + '
   '. + '
'); my $postedstartdis=$startdis+1; - $r->print('
'); + $r->print(''); if ($numblocked > 0) { my $beginblock = &Apache::lonlocal::locallocaltime($startblock); my $finishblock = &Apache::lonlocal::locallocaltime($endblock); $r->print('

'. - &mt('[_1,quant,message is, messages are] not viewable because display of LON-CAPA messages sent to you by other students between [_2] and [_3] is currently being blocked because of online exams.',$numblocked,$beginblock,$finishblock)); + &mt('[quant,_1,message is, messages are] not viewable because display of LON-CAPA messages sent to you by other students between [_2] and [_3] is currently being blocked because of online exams.',$numblocked,$beginblock,$finishblock)); $r->print(&Apache::loncommon::build_block_table($startblock,$endblock, \%setters)); } @@ -1115,7 +1144,8 @@ ENDDISHEADER # ============================================================== Compose output sub compout { - my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode)=@_; + my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode, + $multiforward)=@_; my $suffix=&Apache::lonmsg::foldersuffix($folder); my ($cdom,$cnum,$group,$refarg); if (exists($env{'form.group'})) { @@ -1145,6 +1175,13 @@ sub compout { } elsif ($replycrit) { $r->print('

'.&mt('Replying to a Critical Message').'

'); $replying=$replycrit; + } elsif ($multiforward) { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/email?folder=".&escape($folder), + text=>"Display All Messages"}); + &printheader($r,'/adm/email?compose=multiforward', + 'Forwarding Multiple Messages'); + $r->print(&mt('Each of the [quant,_1,message] you checked will be forwarded to the recipient(s) you select below.',$multiforward).'
'); } else { &printheader($r,'/adm/email?compose=upload', 'Distribute from Uploaded File'); @@ -1161,6 +1198,7 @@ sub compout { 'sb' => 'Subject', 'ca' => 'Cancel', 'ma' => 'Mail', + 'msg' => 'Messages', 'gen' => 'Generate messages from a file', 'gmt' => 'General message text', 'tff' => 'The file format for the uploaded portion of the message is', @@ -1262,24 +1300,49 @@ sub compout { } } my $latexHelp = Apache::loncommon::helpLatexCheatsheet(); - if ($broadcast ne 'upload') { - $r->print(<<"ENDCOMP"); -$lt{'ad'}:
username:domain,username:domain, ... - - -$lt{'sb'}: - + my $subj_size; + if ($multiforward) { + $r->print(&additional_rec_row(\%lt)); + $r->print(''. + &mt('Unless you choose otherwise:').''); + $func=&mt('Forward'); + $dissub = &mt('Forwarding').': '; + $subj_size = '10'; + my $extra = '<'.&mt('original subject').'>   '. + ''.&mt('Yes').' '.&mt('No'); + $dismsg = &mt('Forwarded message from ').' '; + my $sender = &mt("sender's name"); + $r->print(&msg_subject_row($dissub,\%lt,$subj_size,$extra)); + $r->print(''.&mt('Message begins with:').' '.$sender.'   '.&mt('Yes').' '.&mt('No').' + +
'. +$latexHelp. +&mt("Any new text to display before the text of the original messages:").'
+


'); + my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msg (@to_forward) { + $r->print(''); + } + $r->print(&submit_button_row($folder,$dismode,$func.' '.$lt{'msg'}, + \%lt)); + } elsif ($broadcast ne 'upload') { + $subj_size = '50'; + $r->print(&additional_rec_row(\%lt)); + $r->print(&msg_subject_row($dissub,\%lt,$subj_size)); + $r->print(<<"ENDCOMP"); + $latexHelp


$dispcrit $disbase - - - -
-$citation ENDCOMP + $r->print(&submit_button_row($folder,$dismode,$func.' '.$lt{'ma'}, + \%lt)); + $r->print($citation); if (exists($env{'form.ref'})) { $r->print(''); @@ -1349,6 +1412,35 @@ ENDREC return $output; } +sub additional_rec_row { + my ($lt) = @_; + my $output = <<"ENDADD"; +$lt->{'ad'}:
username:domain,username:domain, ... + + +ENDADD + return $output; +} + +sub submit_button_row { + my ($folder,$dismode,$sendtext,$lt) = @_; + my $output = qq| + + + +
+|; + return $output; +} + +sub msg_subject_row { + my ($dissub,$lt,$subj_size,$extra) = @_; + my $output = ''.$lt->{'sb'}.':'.$extra. + ''; + return $output; +} + sub retrieve_instructor_comments { my ($user,$domain)=@_; my $target=$env{'form.grade_target'}; @@ -1835,7 +1927,7 @@ sub blocktype_text { # ----------------------------------------------------------- Display a message sub displaymessage { - my ($r,$msgid,$folder)=@_; + my ($r,$msgid,$folder,$msgstatus)=@_; my $suffix=&Apache::lonmsg::foldersuffix($folder); my %blocked = (); my %setters = (); @@ -1844,7 +1936,7 @@ sub displaymessage { # info to generate "next" and "previous" buttons and check if message is blocked my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com'); - my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder); + my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus); if ( $blocked{$msgid} eq 'ON' ) { &printheader($r,'/adm/email',&mt('Display a Message')); $r->print(&mt('You attempted to display a message that is currently blocked because you are enrolled in one or more courses for which there is an ongoing online exam.')); @@ -1880,7 +1972,6 @@ sub displaymessage { ''.&mt('Delete').''. ''.&mt('Back to Folder Display').''); if ($counter > 0){ $r->print(''.&mt('Completed.').''); - if ($env{'form.displayedcrit'}) { - &discrit($r); - } - if ($group ne '') { - $r->print(&groupmail_sent($group,$cdom,$cnum)); - } else { - &Apache::loncommunicate::menu($r); - } - } else { - $r->print('

'.&mt('Could not deliver message').' '. + if (!$env{'form.multiforward'}) { + if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) { + $r->print('
'.&mt('Completed.'). + ''); + if ($env{'form.displayedcrit'}) { + &discrit($r); + } + if ($group ne '') { + $r->print(&groupmail_sent($group,$cdom,$cnum)); + } 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 '."($sendstatus)").'

'); + } } + return $sendstatus; } # ===================================================================== Handler @@ -2260,7 +2357,8 @@ sub handler { ['display','replyto','forward','markread','markdel','markunread', 'sendreply','compose','sendmail','critical','recname','recdom', 'recordftf','sortedby','block','folder','startdis','interdis', - 'showcommentbaseurl','dismode','group','subject','text','ref']); + 'showcommentbaseurl','dismode','group','subject','text','ref', + 'msgstatus']); $sqs='&sortedby='.$env{'form.sortedby'}; # ------------------------------------------------------ They checked for email @@ -2294,9 +2392,11 @@ sub handler { } # --------------------------------------------------------------------- Display - + my $msgstatus = $env{'form.msgstatus'}; $startdis=$env{'form.startdis'}; - $startdis--; + if ($startdis ne '') { + $startdis--; + } unless ($startdis) { $startdis=0; } $interdis=$env{'form.interdis'}; @@ -2321,7 +2421,7 @@ sub handler { # --------------------------------------------------------------- Render Output if ($env{'form.display'}) { - &displaymessage($r,$env{'form.display'},$folder); + &displaymessage($r,$env{'form.display'},$folder,$msgstatus); } elsif ($env{'form.replyto'}) { &compout($r,'',$env{'form.replyto'},undef,undef,$folder,$dismode); } elsif ($env{'form.confirm'}) { @@ -2358,47 +2458,82 @@ sub handler { '

'.$msg."

\n"); } &Apache::loncommunicate::menu($r); - &disall($r,($folder?$folder:$dismode)); - } elsif ($env{'form.markedmove'}) { - my ($total,$failed,@failed_msg)=(0,0); - foreach my $key (keys(%env)) { - if ($key=~/^form\.delmark_(.*)$/) { - my ($result,$msg) = - &movemsg(&unescape($1),$folder, - $env{'form.movetofolder'}); - if ($result) { + &disall($r,($folder?$folder:$dismode),$msgstatus); + } elsif ($env{'form.markedaction'} eq 'markedforward') { + my $total = 0; + my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_forward) { + &statuschange(&unescape($msgid),'forwarded',$folder); + $total ++; + } + if ($total > 0) { + &compout($r,undef,undef,undef,undef,$folder,$dismode,$total); + } + } elsif ($env{'form.markedaction'} eq 'markedread') { + my $total = 0; + my @to_markread = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_markread) { + &statuschange(&unescape($msgid),'read',$folder); + $total ++; + } + &printheader($r,'','Marked Messages Read'); + $r->print(&mt('Marked [_1] message(s) read',$total).'

'); + &Apache::loncommunicate::menu($r); + &disall($r,($folder?$folder:$dismode),$msgstatus); + } elsif ($env{'form.markedaction'} eq 'markedunread') { + my $total = 0; + my @to_markunread = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_markunread) { + &statuschange(&unescape($msgid),'new',$folder); + $total ++; + } + &printheader($r,'','Marked Messages Unread'); + $r->print(&mt('Marked [_1] message(s) unread',$total).'

'); + &Apache::loncommunicate::menu($r); + &disall($r,($folder?$folder:$dismode),$msgstatus); + } elsif ($env{'form.markedaction'} eq 'markedmove') { + my $destfolder = $env{'form.movetofolder'}; + my %gotfolders = &Apache::lonmsg::get_user_folders(); + &printheader($r,'','Moved Messages'); + if (!defined($gotfolders{$destfolder})) { + $r->print(&mt('Destination folder [_1] is not a valid folder', + $destfolder)); + } else { + my ($total,$failed,@failed_msg)=(0,0); + my @to_move = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_move) { + my ($result,$msg) = &movemsg(&unescape($msgid),$folder, + $env{'form.movetofolder'}); + if ($result) { $total++; - } else { + } else { $failed++; push(@failed_msg,$msg); - } + } } - } - &printheader($r,'','Moved Messages'); - if ($failed) { - $r->print('

+ 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).'

'); + $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'}) { + &disall($r,($folder?$folder:$dismode),$msgstatus); + } elsif ($env{'form.markedaction'} eq 'markeddel') { my ($total,$failed,@failed_msg)=(0,0); - foreach my $key (keys(%env)) { - if ($key=~/^form\.delmark_(.*)$/) { - my ($result,$msg) = - &statuschange(&unescape($1),'deleted', - $folder); - if ($result) { - $total++; - } else { - $failed++; - push(@failed_msg,$msg); - } + my @to_delete = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $msgid (@to_delete) { + my ($result,$msg) = &statuschange(&unescape($msgid),'deleted', + $folder); + if ($result) { + $total++; + } else { + $failed++; + push(@failed_msg,$msg); } } &printheader($r,'','Deleted Messages'); @@ -2412,12 +2547,12 @@ sub handler { } $r->print(&mt('Deleted [_1] message(s)',$total).'

'); &Apache::loncommunicate::menu($r); - &disall($r,($folder?$folder:$dismode)); + &disall($r,($folder?$folder:$dismode),$msgstatus); } elsif ($env{'form.markunread'}) { &printheader($r,'','Marked Message as Unread'); &statuschange($env{'form.markunread'},'new'); &Apache::loncommunicate::menu($r); - &disall($r,($folder?$folder:$dismode)); + &disall($r,($folder?$folder:$dismode),$msgstatus); } elsif ($env{'form.compose'}) { &compout($r,'','',$env{'form.compose'}); } elsif ($env{'form.recordftf'}) { @@ -2425,7 +2560,63 @@ sub handler { } elsif ($env{'form.block'}) { &examblock($r,$env{'form.block'}); } elsif ($env{'form.sendmail'}) { - &sendoffmail($r,$folder); + if ($env{'form.multiforward'}) { + &printheader($r,'','Messages being sent.'); + my $fixed_subj = $env{'form.subject'}; + my $suffix=&Apache::lonmsg::foldersuffix($folder); + my (%sendresult,%forwardok,%forwardfail,$fwdcount); + my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark'); + foreach my $item (@to_forward) { + my $msgid=&unescape($item); + my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]); + my %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1); + if ($env{'form.showorigsubj'}) { + $env{'form.subject'} = $fixed_subj.$content{'subject'}; + } else { + $env{'form.subject'} = ''; + } + my $uname = $content{'sendername'}; + my $udom = $content{'senderdomain'}; + &statuschange($msgid,'forwarded',$folder); + if ($env{'form.showorigsender'}) { + $env{'form.message'} = $env{'form.msgheader'}.' '. + &Apache::loncommon::plainname($uname,$udom).' ('. + $uname.':'.$udom.')'; + } + $env{'form.message'} .= "\n\n-- Forwarded message --\n\n". + $content{'message'}; + $fwdcount ++; + $r->print($fwdcount.': '); + $sendresult{$msgid} = &sendoffmail($r,$folder); + $r->print('
'); + } + foreach my $key (keys(%sendresult)) { + if ($sendresult{$key} =~/^(\s*(?:ok|con_delayed)\s*)*$/) { + $forwardok{$key} = $sendresult{$key}; + } else { + $forwardfail{$key} = $sendresult{$key}; + } + } + if (keys(%forwardok) > 0) { + my $count = keys(%forwardok); + $r->print('
'. + &mt('[quant,_1,message] forwarded.',$count). + ''); + } + if (keys(%forwardfail) > 0) { + my $count = keys(%forwardfail); + $r->print('

'. + &mt('Could not forward [quant,_1,message].',$count). + ' '); + foreach my $key (keys(%forwardfail)) { + $r->print(&mt('Could not deliver forwarded message.').' '. + &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.').

'); + } + } + &Apache::loncommunicate::menu($r); + } else { + &sendoffmail($r,$folder); + } if ($env{'form.storebasecomment'}) { &storecomment($r); } @@ -2437,7 +2628,7 @@ sub handler { $env{'form.message'},'/adm/communicate','public'); } if ((!exists($env{'form.group'})) && (!$env{'form.displayedcrit'})) { - &disall($r,($folder?$folder:$dismode)); + &disall($r,($folder?$folder:$dismode),$msgstatus); } } elsif ($env{'form.newfolder'}) { &printheader($r,'','New Folder'); @@ -2451,7 +2642,7 @@ sub handler { $showfolder = $folder; } &Apache::loncommunicate::menu($r); - &disall($r,$showfolder); + &disall($r,$showfolder,$msgstatus); } elsif ($env{'form.showcommentbaseurl'}) { &storedcommentlisting($r); } elsif ($env{'form.folderaction'} eq 'delete') { @@ -2465,7 +2656,7 @@ sub handler { $showfolder = $folder; } &Apache::loncommunicate::menu($r); - &disall($r,$showfolder); + &disall($r,$showfolder,$msgstatus); } elsif ($env{'form.folderaction'} eq 'rename') { &printheader($r,'','Renamed Folder'); my $showfolder = $env{'form.renamed'}; @@ -2477,11 +2668,11 @@ sub handler { $showfolder = $folder; } &Apache::loncommunicate::menu($r); - &disall($r,$showfolder); + &disall($r,$showfolder,$msgstatus); } else { &printheader($r,'','Display All Messages'); &Apache::loncommunicate::menu($r); - &disall($r,($folder?$folder:$dismode)); + &disall($r,($folder?$folder:$dismode),$msgstatus); } $r->print(&Apache::loncommon::end_page()); return OK;