--- loncom/interface/lonnotify.pm 2005/10/11 21:29:39 1.4 +++ loncom/interface/lonnotify.pm 2010/07/09 14:40:20 1.37 @@ -1,3 +1,7 @@ +# The LearningOnline Network with CAPA +# Sending messages +# +# $Id: lonnotify.pm,v 1.37 2010/07/09 14:40:20 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,13 +31,15 @@ package Apache::lonnotify; use strict; use Apache::lonnet; use Apache::loncommon; -use Apache::lonsupportreq; +use Apache::courseclassifier; use LONCAPA::Enrollment; use Apache::Constants qw(:common :http); use Apache::lonlocal; use Mail::Send; use HTML::TokeParser; use HTML::Entities; +use lib '/home/httpd/lib/perl/'; +use LONCAPA; sub handler { my ($r) = @_; @@ -53,37 +59,78 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['command']); my $command = $env{'form.command'}; + my $origin = $env{'form.origin'}; + &Apache::lonhtmlcommon::clear_breadcrumbs(); - my %ltext=&Apache::lonlocal::texthash( - 'note' => 'Notification E-mail', - ); - my $function = &Apache::loncommon::get_users_function(); - my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); - my $bodytag = &Apache::loncommon::bodytag('Broadcast e-mail to users'); - my $html=&Apache::lonxml::xmlbegin(); + &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/notify', text=>"Broadcast E-mail"}); if ($command eq 'process') { - &print_request_receipt($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_request_receipt($r,$command,$cdom); } elsif ($command eq 'compose') { - &print_composition_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_composition_form($r,$command,$cdom); } elsif ($command eq 'pick_target') { - &print_selection_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_selection_form($r,$command,$cdom); } elsif ($command eq 'pick_display') { - &print_display_option_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_display_option_form($r,$command,$cdom); } elsif ($command eq 'display') { - &print_display($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_display($r,$command,$cdom); } else { - &print_front_page($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_front_page($r,'front',$cdom); } return OK; } +sub add_script { + my ($js) = @_; + return '<script type="text/javascript">'."\n".$js."\n".'</script>'; +} + +sub start_page { + my ($jscript,$bread_title,$formname) = @_; + + my $loadcode; + if ((defined($env{'form.origin'})) + && ($env{'form.command'} eq 'compose' + || $env{'form.command'} eq 'pick_target' + || $env{'form.command'} eq 'pick_display')) { + if ($env{'form.origin'} ne '') { + $loadcode = 'javascript:setFormElements(document.'.$env{'form.command'}.')'; + if (($env{'form.command'} eq 'pick_target') + && (($env{'form.origin'} eq 'compose') + || ($env{'form.origin'} eq 'process'))) { + if ($env{'form.coursepick'} eq 'category') { + $loadcode .= ';javascript:setCourseCat(document.'.$env{'form.command'}.')'; + } + } + } + } + + my $start_page = + &Apache::loncommon::start_page('Broadcast e-mail to users', $jscript, + {'add_entries' => + {'onload' => $loadcode,},}); + my $breadcrumbs = + &Apache::lonhtmlcommon::breadcrumbs($bread_title, + 'Broadcast_system_email'); + my $output = <<"ENDONE"; +$start_page +$breadcrumbs +<br /> +<form name="$formname" method="post" action=""> +ENDONE + + return $output; +} + +sub end_page { + return '</form>'.&Apache::loncommon::end_page(); +} + sub print_front_page { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs - (undef,'Broadcast e-mail to Domain','Broadcast_system_email'); + my ($r,$formname,$cdom) = @_; + my $jscript = qq| function next_page(caller) { if (caller == 'view') { @@ -95,214 +142,186 @@ function next_page(caller) { document.front.submit() } |; - my %lt=&Apache::lonlocal::texthash( - 'note' => 'Notification E-mail', + + + my @menu= + ({ categorytitle=>'Broadcast e-mail to Domain', + items =>[ + { linktext => 'Send e-mail to selected users', + url => 'javascript:next_page('."'new'".')', + permission => 1, + #help => '', + icon => 'mail-reply-all.png', + linktitle => 'Send a new e-mail to selected users from this domain' + }, + { linktext => 'Display sent e-mails', + url => 'javascript:next_page('."'view'".')', + permission => 1, + #help => '', + icon => 'messalog.png', + linktitle => 'Display e-mail sent by Domain Coordinators in this domain' + }, + ] + }, + ); + + $r->print( + &start_page(&add_script($jscript), + 'Broadcast e-mail to Domain', $formname) + .'<input type="hidden" name="command" />' + .&Apache::lonhtmlcommon::generate_menu(@menu) + .&end_page() ); - my $output = <<"ENDONE"; -$html -<head> - <title>LON-CAPA $lt{'note'}</title> -<script type"text/javascript"> -$jscript -</script> -</head> -$bodytag -$breadcrumbs -<br /> -ENDONE - $output .= '<form name="front" method="post">'. - '<input type="hidden" name="command" />'; - $output .= &Apache::lonhtmlcommon::start_pick_box(); - $output .= '<table cellspacing="8" cellpadding="8">'. - '<tr><td><a href="javascript:next_page('."'new'".')">'. - 'Send a new e-mail message to selected users from this domain</a></td></tr><tr>'. - '<td><a href="javascript:next_page('."'view'".')">'. - 'Display e-mail sent by Domain Coordinators in this domain'. - '</a></td></tr></table>'; - $output .= &Apache::lonhtmlcommon::end_pick_box(); - $output .= qq( -</form> -</body> -</html>); - $r->print($output); return; } sub print_display_option_form { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; - &Apache::lonhtmlcommon::add_breadcrumb - ({text=>"Display options"}); - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs - (undef,'Broadcast e-mail display options','Broadcast_system_email'); - my $table_width = ''; - my $col_width = '200'; - my $formname = 'display_options'; + my ($r,$formname,$cdom) = @_; + &Apache::lonhtmlcommon::add_breadcrumb({text=>"Display options"}); + my $cmd = 'display'; - my $submit_text = 'Display e-mail'; + my $submit_text = &mt('Display e-mail'); my @roles = ('dc'); my $now = time; - my %lt=&Apache::lonlocal::texthash( - 'note' => 'Notification E-mail', - ); + my $startdateform = &Apache::lonhtmlcommon::date_setter($formname, 'startdate', $now); my $enddateform = &Apache::lonhtmlcommon::date_setter($formname, 'enddate', $now); - my $jscript; - my $output = <<"ENDONE"; -$html -<head> - <title>LON-CAPA $lt{'note'}</title> -<script type"text/javascript"> -$jscript -</script> -</head> -$bodytag -$breadcrumbs -<br /> -<form method="post" name="$formname"> -ENDONE - $output .= &Apache::lonhtmlcommon::start_pick_box($table_width); - $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Date range')); - $output .= '<td><table><tr><td>Earliest to display: </td><td>'. + my %elements = ( + startdate_month => 'selectbox', + startdate_hour => 'selectbox', + enddate_month => 'selectbox', + enddate_hour => 'selectbox', + startdate_day => 'text', + startdate_year => 'text', + startdate_minute => 'text', + startdate_second => 'text', + enddate_day => 'text', + enddate_year => 'text', + enddate_minute => 'text', + enddate_second => 'text', + sender => 'checkbox', + ); + my $jscript = &Apache::lonhtmlcommon::set_form_elements(\%elements); + + my $output = &start_page(&add_script($jscript), + 'Broadcast e-mail display options', $formname); + + $output .= &Apache::lonhtmlcommon::start_pick_box(); + $output .= &Apache::lonhtmlcommon::row_title(&mt('Date range')); + $output .= '<table><tr><td>'.&mt('Earliest to display:').' </td><td>'. $startdateform.'</td></tr>'; - $output .= '<tr><td>Latest to display: </td><td>'.$enddateform. - '</td></tr></table></td>'; + $output .= '<tr><td>'.&mt('Latest to display:').' </td><td>'.$enddateform. + '</td></tr></table>'; $output .= &Apache::lonhtmlcommon::row_closure(); - $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Choose sender(s)')); + $output .= &Apache::lonhtmlcommon::row_title(&mt('Choose sender(s)')); my %personnel = &Apache::lonnet::get_domain_roles($cdom,\@roles); - $output .= '<td>'; my @domcc = (); foreach my $server (keys %personnel) { - print STDERR "key level 1 is $server\n"; foreach my $user (sort(keys %{$personnel{$server}})) { - print STDERR "key level 2 is $user\n"; my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user); unless (grep/^$uname:$udom$/,@domcc) { my %userinfo = &Apache::lonnet::get('environment',['lastname','firstname'],$udom,$uname); - $output .= '<input type="checkbox" name="sender" value="'.$uname.':'.$udom.'" /> '.$userinfo{firstname}.' '.$userinfo{lastname}.' ('.$uname.':'.$udom.')'; + $output .= '<input type="checkbox" name="sender" value="'.$uname.':'.$udom.'" /> '.$userinfo{'firstname'}.' '.$userinfo{'lastname'}.' ('.$uname.':'.$udom.')'; push (@domcc,$uname.':'.$udom); } } } - $output .= '</td>'; $output .= &Apache::lonhtmlcommon::row_closure(); - $output .= &Apache::lonhtmlcommon::submit_row($col_width,$tablecolor,&mt('Submit'),$cmd,$submit_text); + $output .= &Apache::lonhtmlcommon::submit_row(&mt('Submit'),$cmd,$submit_text); $output .= &Apache::lonhtmlcommon::end_pick_box(); - $output .= qq( -<input type="hidden" name="sortby" value="date" /> -</form> -</body> -</html>); + $output .= qq(<input type="hidden" name="sortby" value="date" />\n). + &end_page(); $r->print($output); return; } sub print_display { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + my ($r,$formname,$cdom) = @_; &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/notify?command=pick_display', + ({href=>"javascript:goBack('pick_display')", text=>"Display options"}, {text=>"E-mail display"}); - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs - (undef,'Display Broadcast e-mail','Broadcast_system_email'); - my $table_width = ''; - my $col_width = '200'; - my $rowColor1 = "#ffffff"; - my $rowColor2 = "#eeeeee"; - my $rowColor; + my $msgcount = 0; - my $formname = 'display_sent'; my $start = &Apache::lonhtmlcommon::get_date_from_form('startdate'); my $end = &Apache::lonhtmlcommon::get_date_from_form('enddate'); my @senders = &Apache::loncommon::get_env_multiple('form.sender'); - my $senderlist = join('&',@senders); - my %sentmail = &Apache::lonnet::dcmaildump($cdom,$start,$end,$senderlist); + my %sentmail = &Apache::lonnet::dcmaildump($cdom,$start,$end,\@senders); my %dcmail = (); my %Sortby = (); my $jscript = <<"ENDSCRIPT"; function changeSort(caller) { + document.$formname.command.value = '$formname'; document.$formname.sortby.value = caller; - document.$formname.submit(); + document.$formname.submit(); } +function goBack(target) { + document.$formname.command.value = target; + document.$formname.submit(); +} + ENDSCRIPT - my $output = <<"ENDONE"; -$html -<head> - <title>LON-CAPA $$ltext{'note'}</title> - <script type"text/javascript"> -$jscript - </script> -</head> -$bodytag -$breadcrumbs -<br /> -<form method="post" name="$formname"> -ENDONE - foreach my $server (keys(%sentmail)) { - foreach my $msgid (keys(%{$sentmail{$server}})) { - my %content = &unpackagemail($sentmail{$server}{$msgid}); - if (defined($dcmail{$msgid})) { - foreach my $user (keys(%{$content{'recipients'}})) { - $dcmail{$msgid}{recipients}{$user} = $content{recipients}{$user}; + my $output = &start_page(&add_script($jscript), + 'Display Broadcast e-mail', $formname); + + foreach my $msgid (keys(%sentmail)) { + my %content = &Apache::lonmsg::unpackagemsg($sentmail{$msgid}); + $msgcount ++; + %{$dcmail{$msgid}} = (); + foreach my $item (keys(%content)) { + if ($item eq 'recipient') { + foreach my $user (keys(%{$content{recipient}})) { + $dcmail{$msgid}{recipient}{$user} = $content{recipient}{$user}; } } else { - $msgcount ++; - %{$dcmail{$msgid}} = (); - foreach my $item (keys(%content)) { - if ($item eq 'recipients') { - foreach my $user (keys(%{$content{recipients}})) { - $dcmail{$msgid}{recipients}{$user} = $content{recipients}{$user}; - } - } else { - $dcmail{$msgid}{$item} = $content{$item}; - } - } + $dcmail{$msgid}{$item} = $content{$item}; } } } - $output .= &Apache::lonhtmlcommon::start_pick_box(); + $output .= &Apache::loncommon::start_data_table(); if ($msgcount > 0) { - my $rowNum = 0; - $output .= '<tr><td><table cellpadding="4" cellspacing="2" width="100%"> - <tr bgcolor="'.$tablecolor.'" align="center"> - <td><b><a href="javascript:changeSort('."'date'".')">Date</a></b></td> - <td><b><a href="javascript:changeSort('."'subject'".')">Subject</a></b></td> - <td><b><a href="javascript:changeSort('."'sender'".')">Sender</a></b></td> - <td><b><a href="javascript:changeSort('."'message'".')">Message</a></b></td> - <td><b><a href="javascript:changeSort('."'recipients'".')">Recipients</a></b></td> - </tr>'; + $output .= &Apache::loncommon::start_data_table_header_row(). + '<th><a href="javascript:changeSort(\'date\')">Date</a></th>'. + '<th><a href="javascript:changeSort(\'subject\')">Subject</a></th>'. + '<th><a href="javascript:changeSort(\'sender\')">Sender</a></th>'. + '<th><a href="javascript:changeSort(\'message\')">Message</a></th>'. + '<th><a href="javascript:changeSort(\'recipients\')">Recipients</a></th>'. + &Apache::loncommon::end_data_table_header_row(); + if (($env{'form.sortby'} eq 'date') || ($env{'form.sortby'} eq '') || (!defined($env{'form.sortby'})) || (($env{'form.sortby'} eq 'sender') && (@senders <= 1))) { foreach my $msgid (sort(keys(%dcmail))) { - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $rowColor = $rowColor2; - } my $recipients = ''; - my ($date,$subj,$sname,$sdom,$cdom) = split(/:/,$msgid,5); + my ($date,undef,$sname,$sdom) = + &Apache::lonmsg::unpackmsgid($msgid,undef,1); $date = &Apache::lonlocal::locallocaltime($date); - foreach my $user (sort(keys(%{$dcmail{$msgid}{recipients}}))) { - $recipients .= $dcmail{$msgid}{recipients}{$user}.', '; + foreach my $user (sort(keys(%{$dcmail{$msgid}{recipient}}))) { + $recipients .= $dcmail{$msgid}{recipient}{$user}.', '; } $recipients =~ s/,\s$//; - $output .= '<tr bgcolor="'.$rowColor.'"><td><small>'.$date.'</small></td><td><small>'.$dcmail{$msgid}{subject}.'</small></td><td><small>'.$sname.':'.$sdom.'</small></td><td><small>'.$dcmail{$msgid}{message}.'</small></td><td><small>'.$recipients.'</small></td></tr>'."\n"; - $rowNum ++; + $output .= &Apache::loncommon::start_data_table_row(). + '<td><small>'.$date.'</small></td>'. + '<td><small>'.&cr_to_br($dcmail{$msgid}{subject}).'</small></td>'. + '<td><small>'.$sname.':'.$sdom.'</small></td><td><small>'.&cr_to_br($dcmail{$msgid}{message}).'</small></td>'. + '<td><small>'.$recipients.'</small></td>'."\n". + &Apache::loncommon::end_data_table_row(); } } else { foreach my $msgid (sort(keys(%dcmail))) { - my ($date,$subj,$sname,$sdom,$cdom) = split(/:/,$msgid,5); + my ($date,undef,$sname,$sdom) = + &Apache::lonmsg::unpackmsgid($msgid,undef,1); if ($env{'form.sortby'} eq 'subject') { push @{$Sortby{$dcmail{$msgid}{subject}}},$msgid; } elsif ($env{'form.sortby'} eq 'message') { push @{$Sortby{$dcmail{$msgid}{message}}},$msgid; } elsif ($env{'form.sortby'} eq 'recipients') { my $recipients =''; - foreach my $user (sort(keys(%{$dcmail{$msgid}{recipients}}))) { - $recipients .= $dcmail{$msgid}{recipients}{$user}.', '; + foreach my $user (sort(keys(%{$dcmail{$msgid}{recipient}}))) { + $recipients .= $dcmail{$msgid}{recipient}{$user}.', '; } $recipients =~ s/,\s$//; push @{$Sortby{$recipients}},$msgid; @@ -314,46 +333,51 @@ ENDONE } foreach my $key (sort(keys(%Sortby))) { foreach my $msgid (@{$Sortby{$key}}) { - if ($rowNum %2 == 1) { - $rowColor = $rowColor1; - } else { - $rowColor = $rowColor2; - } my $recipients = ''; if ($env{'form.sortby'} eq 'recipients') { $recipients = $key; } else { - foreach my $user (sort(keys(%{$dcmail{$msgid}{recipients}}))) { - $recipients .= $dcmail{$msgid}{recipients}{$user}.', '; + foreach my $user (sort(keys(%{$dcmail{$msgid}{recipient}}))) { + $recipients .= $dcmail{$msgid}{recipient}{$user}.', '; } $recipients =~ s/,\s$//; } - my ($date,$subj,$sname,$sdom,$cdom) = split(/:/,$msgid,5); + my ($date,undef,$sname,$sdom) = + &Apache::lonmsg::unpackmsgid($msgid,undef,1); $date = &Apache::lonlocal::locallocaltime($date); - $output .= '<tr bgcolor="'.$rowColor.'"><td><small>'.$date.'</small></td><td><small>'.$dcmail{$msgid}{subject}.'</small></td><td><small>'.$sname.':'.$sdom.'</small></td><td><small>'.$dcmail{$msgid}{message}.'</small></td><td><small>'.$recipients.'</small></td></tr>'."\n"; - $rowNum ++; + $output .= &Apache::loncommon::start_data_table_row(). + '<td><small>'.$date.'</small></td>'. + '<td><small>'.&cr_to_br($dcmail{$msgid}{subject}).'</small></td>'. + '<td><small>'.$sname.':'.$sdom.'</small></td>'. + '<td><small>'.&cr_to_br($dcmail{$msgid}{message}).'</small></td>'. + '<td><small>'.$recipients.'</small></td>'."\n". + &Apache::loncommon::end_data_table_row(); } } } - $output .= '</table></td></tr>'; } else { - $output .= '<tr bgcolor="#ffffff"><td> </td><td><br><center><i><b><small> No mail sent matching supplied criteria </small><br><br></b></i></td><td> </td></tr>'; + $output .= &Apache::loncommon::start_data_table_empty_row(). + '<td>No mail sent matching supplied criteria</td>'. + &Apache::loncommon::end_data_table_empty_row(); + } + $output .= &Apache::loncommon::end_data_table(); + $output .= &Apache::lonhtmlcommon::echo_form_input(['sortby','command','origin']); + my $curr_sortby; + if (defined($env{'form.sortby'})) { + $curr_sortby = $env{'form.sortby'}; + } else { + $curr_sortby = 'date'; } - $output .= &Apache::lonhtmlcommon::end_pick_box(); - $output .= &echo_form_input(); - unless (defined($env{'form.sortby'})) { - $output .= qq(<input type="hidden" name="sortby" value="date" />\n); - } - $output .= qq( -</form> -</body> -</html>); + $output .= qq(<input type="hidden" name="origin" value="$formname" />\n); + $output .= qq(<input type="hidden" name="command" />\n); + $output .= qq(<input type="hidden" name="sortby" value="$curr_sortby" />\n); + $output .= &end_page(); $r->print($output); return; } sub print_selection_form { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + my ($r,$formname,$cdom) = @_; my %coursecodes = (); my %codes = (); my @codetitles = (); @@ -366,127 +390,157 @@ sub print_selection_form { my $totcodes = 0; my $format_reply; my $jscript = ''; - my $formname = 'rolefilter'; - my $table_width = '100%'; - my $col_width = '200'; my %lt=&Apache::lonlocal::texthash( - 'note' => 'Notification E-mail', 'buil' => 'Building valid e-mail address from username, if missing from preferences:', 'kerb' => 'Kerberos: enter default for each realm used in the domain, with comma separation of entries', 'infs' => 'Internal, Filesystem and Local authentication: enter single default.', - 'comp' => 'Compose Message' + 'comp' => 'Compose E-mail' ); - my $loaditems = qq| -function initialize_codes() { - return; -} - |; &Apache::lonhtmlcommon::add_breadcrumb ({text=>"Select Audience"}); - $totcodes = &Apache::lonsupportreq::retrieve_instcodes(\%coursecodes,$cdom,$totcodes); + $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$cdom,$totcodes); if ($totcodes > 0) { $format_reply = &Apache::lonnet::auto_instcode_format($caller,$cdom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order); if ($format_reply eq 'ok') { my $numtypes = @codetitles; - &Apache::lonsupportreq::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles); - &Apache::lonsupportreq::javascript_code_selections($formname,$numtypes,\%cat_titles,\$jscript,\%idlist,\%idnums,\%idlist_titles,\@codetitles); - $loaditems = ''; + &Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles); + my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles); + my $longtitles_str = join('","',@{$longtitles}); + my $allidlist = $idlist{$codetitles[0]}; + $jscript .= &Apache::courseclassifier::courseset_js_start($formname,$longtitles_str,$allidlist); + $jscript .= $scripttext; + $jscript .= &Apache::courseclassifier::javascript_code_selections($formname,@codetitles); } } + my @standardnames = &Apache::loncommon::get_standard_codeitems(); - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs - (undef,'Choose e-mail audience','Broadcast_system_email'); my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($cdom); - my $output = <<"ENDONE"; -$html -<head> - <title>LON-CAPA $lt{'note'}</title> -<script type"text/javascript"> -$jscript -</script> -$cb_jscript -</head> -$bodytag -$breadcrumbs -<br /> -<form method="post" name="$formname"> -ENDONE - $output .= &Apache::lonhtmlcommon::start_pick_box($table_width); - my @roles = ('cc','in','ta','ep','ad','st','cr'); - my %longtypes = (); - my %authtypes = (); - &form_elements(\%longtypes,\%authtypes); - my $descrip = $lt{'buil'}.' + + my %elements = ( + roles => 'selectbox', + types => 'selectbox', + Year => 'selectbox', + coursepick => 'radio', + coursetotal => 'text', + courselist => 'text', + internal => 'text', + krb4 => 'text', + krb5 => 'text', + localauth => 'text', + unix => 'text', + ); + $jscript .= &Apache::lonhtmlcommon::set_form_elements(\%elements); + if ($env{'form.coursepick'} eq 'category') { + $jscript .= qq| +function setCourseCat(formname) { + if (formname.Year.options[formname.Year.selectedIndex].value == -1) { + return; + } + courseSet('$codetitles[0]'); + for (var j=0; j<formname.Semester.length; j++) { + if (formname.Semester.options[j].value == "$env{'form.Semester'}") { + formname.Semester.options[j].selected = true; + } + } + if (formname.Semester.options[formname.Semester.selectedIndex].value == -1) { + return; + } + courseSet('$codetitles[1]'); + for (var j=0; j<formname.Department.length; j++) { + if (formname.Department.options[j].value == "$env{'form.Department'}") { + formname.Department.options[j].selected = true; + } + } + if (formname.Department.options[formname.Department.selectedIndex].value == -1) { + return; + } + courseSet('$codetitles[2]'); + for (var j=0; j<formname.Number.length; j++) { + if (formname.Number.options[j].value == "$env{'form.Number'}") { + formname.Number.options[j].selected = true; + } + } +} +|; + } + + + my $output = &start_page(&add_script($jscript).$cb_jscript, + 'Choose e-mail audience', $formname); + + $output .= &Apache::lonhtmlcommon::start_pick_box(); + my @roles = ('ow','cc','in','ta','ep','st','cr'); + my %longtypes = (); + my %authtypes = (); + &form_elements(\%longtypes,\%authtypes); + my $descrip = $lt{'buil'}.' <ul> <li>'.$lt{'kerb'}.'<br />(e.g., MSU.EDU=msu.edu, MSUE.EDU=msue.msu.edu).</li> <li>'.$lt{'infs'}.'</li> </ul>'."\n"; - my $submit_text = $lt{'comp'}; - my $cmd = 'compose'; - $output .= &Apache::lonhtmlcommon::role_select_row(\@roles,$col_width,$tablecolor,'Roles'); - $output .= &Apache::lonhtmlcommon::course_select_row($col_width,$tablecolor,'Courses',$formname,$totcodes,\@codetitles,\%idlist,\%idlist_titles); - $output .= &Apache::lonhtmlcommon::status_select_row(\%longtypes,$col_width,$tablecolor,&mt('Access status')); - $output .= &Apache::lonhtmlcommon::email_default_row(\%authtypes,$col_width,$tablecolor,&mt('Username -> Email conversion'),$descrip); - $output .= &Apache::lonhtmlcommon::submit_row($col_width,$tablecolor,&mt('Submit'),$cmd,$submit_text); - $output .= &Apache::lonhtmlcommon::end_pick_box(); - $output .= qq( -</form> -</body> -</html>); + my $submit_text = $lt{'comp'}; + my $cmd = 'compose'; + $output .= &Apache::lonhtmlcommon::role_select_row(\@roles,&mt('Roles')); + $output .= &Apache::lonhtmlcommon::course_select_row(&mt('Courses'),$formname,$totcodes,\@codetitles,\%idlist,\%idlist_titles,undef,undef,\@standardnames); + $output .= &Apache::lonhtmlcommon::status_select_row(\%longtypes,&mt('Access status')); + $output .= &Apache::lonhtmlcommon::email_default_row(\%authtypes,&mt('Username -> E-mail conversion'),$descrip); + $output .= &Apache::lonhtmlcommon::submit_row(&mt('Submit'),$cmd,$submit_text); + $output .= &Apache::lonhtmlcommon::end_pick_box(); + $output .= &end_page(); $r->print($output); return; } sub print_composition_form { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + my ($r,$formname,$cdom) = @_; &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/notify?command=pick_target', + ({href=>"javascript:goBack('pick_target')", text=>"Select Audience"}, - {text=>"Compose Message"}); + {text=>"Compose E-mail"}); my $jscript = &Apache::loncommon::check_uncheck_jscript(); - my $breadcrumbs = (&Apache::lonhtmlcommon::breadcrumbs - (undef,'Broadcast e-mail to users','Broadcast_system_email')); + $jscript .= qq| +function goBack(target) { + document.$formname.command.value = target; + document.$formname.submit(); +} +|; my %lt=&Apache::lonlocal::texthash( - 'note' => 'Notification E-mail', 'nore' => 'No recipients identified', 'emad' => 'e-mail address', ); - $r->print(<<ENDONE); -$html -<head> - <title>LON-CAPA $lt{'note'}</title> -<script type"text/javascript"> -$jscript -</script> -</head> -$bodytag $breadcrumbs -<br /> -ENDONE + my %elements = ( + subject => 'text', + message => 'text', + sender => 'text', + recipient => 'checkbox', + ); + $jscript .= &Apache::lonhtmlcommon::set_form_elements(\%elements); + + $r->print(&start_page(&add_script($jscript), + 'Broadcast e-mail to users', $formname)); + my $coursefilter = $env{'form.coursepick'}; - my %courses = (); + my %courses; if ($coursefilter eq 'all') { - %courses = &Apache::lonnet::courseiddump($cdom,'.','.','.','.','.'); + %courses = &Apache::lonnet::courseiddump($cdom,'.','.','.','.','.', + undef,undef,'Course'); } elsif ($coursefilter eq 'category') { - my $instcode = ''; - my @cats = ('Semester','Year','Department','Number'); - foreach my $category (@cats) { - if (defined($env{'form.'.$category})) { - unless ($env{'form.'.$category} eq '-1') { - $instcode .= $env{'form.'.$category}; - } - } - } + my $instcode = &Apache::courseclassifier::instcode_from_selectors($cdom); + my $regexp = ''; if ($instcode eq '') { $instcode = '.'; + } else { + $regexp = 1; } - %courses = &Apache::lonnet::courseiddump($cdom,'.','.',$instcode,'.','.'); + %courses = &Apache::lonnet::courseiddump($cdom,'.','.',$instcode,'.','.', + undef,undef,'Course',$regexp); } elsif ($coursefilter eq 'specific') { if ($env{'form.coursetotal'} > 1) { my @course_ids = split(/&&/,$env{'form.courselist'}); - foreach (@course_ids) { - $courses{$_} = ''; + foreach my $cid (@course_ids) { + $courses{$cid} = ''; } } else { $courses{$env{'form.courselist'}} = ''; @@ -499,8 +553,6 @@ ENDONE my %longtypes = (); my %authtypes = (); my %email_defaults = (); - my $table_width = '100%'; - my $col_width = '200'; &form_elements(\%longtypes,\%authtypes); foreach my $auth (keys(%authtypes)) { @@ -531,6 +583,7 @@ ENDONE my %recipients = (); my %users = (); my %access = (); + my @sections = (); my $totalrecip = 0; my @unmatched = (); foreach my $role (@roles) { @@ -540,8 +593,11 @@ ENDONE $access{$type} = $type; } foreach my $course_id (keys(%courses)) { - my ($cdom,$cnum) = split(/_/,$course_id); - &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\%users); + my %coursehash = + &Apache::lonnet::coursedescription($course_id,{'one_time' => 1}); + my $cdom = $coursehash{'domain'}; + my $cnum = $coursehash{'num'}; + &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\@sections,\%users); } foreach my $role (keys(%users)) { foreach my $user (keys(%{$users{$role}})) { @@ -555,135 +611,134 @@ ENDONE } } } - my $output = '<form name="compose" method="post">'."\n"; + my $output; if ($totalrecip > 0) { - $output .= &Apache::lonhtmlcommon::start_pick_box($table_width); - $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Subject')); - $output .= ' <td><input type="text" name="subject" size="30" /></td>'; + $output .= &Apache::lonhtmlcommon::start_pick_box(); + $output .= &Apache::lonhtmlcommon::row_title(&mt('Subject')); + $output .= '<input type="text" name="subject" size="30" />'; $output .= &Apache::lonhtmlcommon::row_closure(); - $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Message')); - $output .= ' <td><textarea name="message" id="message" - cols="60" rows="10" wrap="hard"></textarea></td>'; + $output .= &Apache::lonhtmlcommon::row_title(&mt('Message')); + $output .= ' <textarea name="message" id="message" + cols="60" rows="10" wrap="hard"></textarea>'; $output .= &Apache::lonhtmlcommon::row_closure(); - $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Recipients')); - $output .= '<td><input type="button" value="check all" + $output .= &Apache::lonhtmlcommon::row_title(&mt('Recipients')); + $output .= '<input type="button" value="check all" onclick="javascript:checkAll(document.compose.recipient)" /> <input type="button" value="uncheck all" onclick="javascript:uncheckAll(document.compose.recipient)" /> - <br /><table border="0">'; + <br />'; + $output .= &Apache::loncommon::start_data_table(); if (keys(%recipients) > 0) { - $output .= '<tr><td> </td><td><small><b>username:domain</b></small></td><td> </td><td><small><b>'.$lt{'emad'}.'</b></small></td></tr>'; + $output .= &Apache::loncommon::start_data_table_header_row(); + $output .= '<th> <th>username:domain</th><th>'.$lt{'emad'}.'</th>'; + $output .= &Apache::loncommon::end_data_table_header_row(); } foreach my $username (sort(keys(%recipients))) { + $output .= &Apache::loncommon::start_data_table_row(); if ($recipients{$username} =~ /\@/) { - my $value=&Apache::lonnet::escape($username).':'.&Apache::lonnet::escape($recipients{$username}); - $output .= '<tr><td><input type="checkbox" name="recipient" value="'.$value.'" checked="checked" /></td><td>'.$username.'</td><td> </td><td>'.$recipients{$username}.'</td></tr>'; + my $value=&escape($username).':'.&escape($recipients{$username}); + $output .= '<td><input type="checkbox" name="recipient" value="'.$value.'" /></td><td>'.$username.'</td><td>'.$recipients{$username}.'</td>'; + } + $output .= &Apache::loncommon::end_data_table_row(); + } + $output .= &Apache::loncommon::end_data_table(); + if (@unmatched) { + $output .= '<br /><br />'.&mt('Could not determine e-mail addresses for the following users:').'<ul>'; + foreach my $username (sort @unmatched) { + $output .= '<li>'.$username.'</li>'; } + $output .= '</ul>'; } - $output .= '</table></td>'; $output .= &Apache::lonhtmlcommon::row_closure(); - $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Sender e-mail address')); - $output .= '<td><input type="text" name="sender" value="'.$sender.'" /></td>'; + $output .= &Apache::lonhtmlcommon::row_title(&mt('Sender e-mail address')); + $output .= '<input type="text" name="sender" value="'.$sender.'" />'; $output .= &Apache::lonhtmlcommon::row_closure(); - $output .= &Apache::lonhtmlcommon::submit_row($col_width,$tablecolor,&mt('Submit'),'process',&mt('Send Message')); + $output .= &Apache::lonhtmlcommon::submit_row(&mt('Submit'),'process',&mt('Send')); $output .= &Apache::lonhtmlcommon::end_pick_box(); } else { - $output .= $lt{'nore'}; + $output .= $lt{'nore'}."\n". + '<input type="hidden" name="command" value="" />'."\n"; } - $output .= &echo_form_input('command'); - $output .= '</form></body></html>'; + $output .= '<input type="hidden" name="origin" value="'.$formname.'" />'."\n"; + $output .= &Apache::lonhtmlcommon::echo_form_input(['command','origin','subject','message','recipient','sender'],); + $output .= &end_page(); $r->print($output); return; } sub print_request_receipt { - my ($r,$dom,$tablecolor,$bodytag,$html,$ltext) =@_; + my ($r,$formname,$dom) =@_; my @recipients = &Apache::loncommon::get_env_multiple('form.recipient'); my $subject = $env{'form.subject'}; my $message = $env{'form.message'}; my $from = $env{'form.sender'}; my $jscript = <<ENDSCRIPT; -function showCompose() { - document.goback.command.value = 'compose'; - document.goback.submit(); +function goBack(target) { + document.$formname.command.value = target; + document.$formname.submit(); } ENDSCRIPT + &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/notify?command=pick_target', + ({href=>"javascript:goBack('pick_target')", text=>"Select audience"}); &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'javascript:showCompose()', - text=>"Compose Message"}); + ({href=>"javascript:goBack('compose')", + text=>"Compose E-mail"}); &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/notify?command=process', + ({href=>"/adm/notify?command=process", text=>"Outcome"}); - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs - (undef,'E-mail Delivery','Broadcast_system_email'); - my $output = <<ENDONE; -$html -<head> - <title>LON-CAPA Notification E-mail</title> -<script type"text/javascript"> -$jscript -</script> -</head> -$bodytag -$breadcrumbs -<br /> -<form name="goback" method="post"> -ENDONE - $output .= &Apache::lonhtmlcommon::start_pick_box(); + + + my $output = &start_page(&add_script($jscript), 'E-mail Delivery', + $formname); + + my @deliveries = (); &broadcast_email(\@recipients,$subject,$from,$message,\@deliveries); if (@deliveries > 0) { - $output .= '<tr> - <td> - <table cellpadding="4" cellspacing="2" width="100%"> - <tr bgcolor="'.$tablecolor.'" align="center"> - <td><b>Status</b></td> - <td><b>Subject</b></td> - <td><b>Message</b></td> - <td><b>Recipients</b></td> - </tr> - <tr bgcolor="#eeeeee"> - <td valign="middle">Sent</td> - <td valign="middle">'.$subject.'</td> - <td valign="middle">'.$message.'</td> - <td>'; + $output .= &Apache::loncommon::start_data_table(); + &store_mail($subject,$message,$dom,\@deliveries); + $output .= &Apache::loncommon::start_data_table_header_row(). + '<th>'.&mt('Status').'</th>'. + '<th>'.&mt('Subject').'</th>'. + '<th>'.&mt('Message').'</th>'. + '<th>'.&mt('Recipents').'</th>'. + &Apache::loncommon::end_data_table_header_row(); + $output .= &Apache::loncommon::start_data_table_row(). + '<td valign="middle">'.&mt('Sent').'</td>'. + '<td valign="middle">'.&cr_to_br($subject).'</td>'. + '<td valign="middle">'.&cr_to_br($message).'</td>'. + '<td>'; foreach my $person (@deliveries) { my ($username,$email) = split(/:/,$person); - $output .= &Apache::lonnet::unescape($email).' ('.&Apache::lonnet::unescape($username).')<br />'."\n"; + $output .= &unescape($email).' ('.&unescape($username).')<br />'."\n"; } - $output .= '</td> - </tr> - </table> - </td> - </tr>'; - &store_mail($subject,$message,$dom,\@deliveries); + $output .= '</td>'. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(); } else { $output .= 'No mail sent - no recipients identified'; } - $output .= &Apache::lonhtmlcommon::end_pick_box(); - $output .= '<br /><a href="/adm/notify">Send another message?</a>'."\n"; - $output .= &echo_form_input(); - $output .= ' -</form> -</body> -</html>'; + $output .= '<br /><a href="/adm/notify">'.&mt('Send another e-mail').'</a>'."\n"; + $output .= '<input type="hidden" name="command" />'."\n". + '<input type="hidden" name="origin" value="'.$formname.'" />'."\n"; + $output .= &Apache::lonhtmlcommon::echo_form_input(['command','origin']); + $output .= &end_page(); $r->print($output); return; } sub broadcast_email { - my ($recipients,$subject,$from,$message,$deliveries,$ltext)=@_; -# find some way to spread out delivery for large numbers of recipients. + my ($recipients,$subject,$from,$message,$deliveries)=@_; +# Should implement staggered delivery for large numbers of recipients?. foreach my $user (@{$recipients}) { my $msg = new Mail::Send; my ($username,$to) = split(/:/,$user); - $username = &Apache::lonnet::unescape($username); - $to = &Apache::lonnet::unescape($to); + $username = &unescape($username); + $to = &unescape($to); $msg->to($to); $msg->subject($subject); $msg->add('From',"$from"); @@ -696,10 +751,10 @@ sub broadcast_email { } sub get_user_info { - my ($user,%email_defaults,$ltext) = @_; + my ($user,%email_defaults) = @_; my ($uname,$udom) = split(/:/,$user); my @emailtypes = ('permanentemail','critnotification','notification'); - my %userinfo = &Apache::lonnet::get('environment',\@emailtypes,$udom,$uname); + my %userinfo = &Apache::loncommon::getemails($uname,$udom); my $email = ''; foreach my $type (@emailtypes) { $email = $userinfo{$type}; @@ -715,7 +770,7 @@ sub get_user_info { $email = $uname.'@'.$email_defaults{$authtype}{$autharg}; } } else { - if (defined($email_defaults{$authtype})) { + if ((defined($email_defaults{$authtype})) && ($email_defaults{$authtype} ne '')) { $email = $uname.'@'.$email_defaults{$authtype}; } } @@ -724,137 +779,46 @@ sub get_user_info { } sub form_elements { - my ($longtypes,$authtypes,$ltext) = @_; + my ($longtypes,$authtypes) = @_; %{$longtypes} = ( - active => 'Currently has access', - previous => 'Previously had access', - future => 'Will have future access', + active => &mt('Currently has access'), + previous => &mt('Previously had access'), + future => &mt('Will have future access'), ); %{$authtypes} = ( krb4 => 'Kerberos 4', krb5 => 'Kerberos 5', - int => 'Internal (LON-CAPA)', + internal => 'Internal (LON-CAPA)', unix => 'Filesystem (UNIX)', - local => 'Local/Customized', + localauth => 'Local/Customized', ); return; } sub store_mail { - my ($subject,$message,$domain,$recipients,$attachmenturl,$ltext) = @_; - my %servers = (); - my $msgid=&packagemail($subject,$message,$domain, - $recipients,\%servers,$attachmenturl); -# Store in dc email db files on appropriate servers. - foreach my $server (keys(%servers)) { - unless (&Apache::lonnet::dcmailput($domain,$msgid,\%servers,$server) eq 'ok') { - &logthis('Storage of dc mail failed for domain'.$domain.' for server: '. - $server.'. Message ID was '.$msgid); - } - } -} - -sub packagemail { - my ($subject,$message,$dom,$recipients,$servers,$attachmenturl,$ltext) = @_; - my %record = (); - my $partsubj=$subject; - $partsubj=&Apache::lonnet::escape($partsubj); - $message =&HTML::Entities::encode($message,'<>&"'); - $subject =&HTML::Entities::encode($subject,'<>&"'); - #remove machine specification - $attachmenturl =~ s|^http://[^/]+/|/|; - $attachmenturl =&HTML::Entities::encode($attachmenturl,'<>&"'); - my $now=time; - my $msgid= &Apache::lonnet::escape($now).':'.$partsubj.':'. - &Apache::lonnet::escape($env{'user.name'}).':'. - &Apache::lonnet::escape($env{'user.domain'}).':'. - &Apache::lonnet::escape($dom).':'.$$; - my $result='<sendername>'.$env{'user.name'}.'</sendername>'. - '<senderdomain>'.$env{'user.domain'}.'</senderdomain>'. - '<time>'.&Apache::lonlocal::locallocaltime($now).'</time>'. - '<servername>'.$ENV{'SERVER_NAME'}.'</servername>'. - '<host>'.$ENV{'HTTP_HOST'}.'</host>'. - '<client>'.$ENV{'REMOTE_ADDR'}.'</client>'. - '<msgid>'.$msgid.'</msgid>'. - '<dcdomain>'.$dom.'</dcdomain>'. - '<subject>'.$subject.'</subject>'. - '<message>'.$message.'</message>'."\n"; - if (defined($attachmenturl)) { - $result.= '<attachmenturl>'.$attachmenturl.'</attachmenturl>'; - } - foreach my $recip (@{$recipients}) { - my ($username,$email) = split(/:/,$recip); - $username = &Apache::lonnet::unescape($username); - $email = &Apache::lonnet::unescape($email); - my ($uname,$udom) = split(/:/,$username); - my $uhom=&Apache::lonnet::homeserver($uname,$udom); - if ($uhom ne 'no_host') { - $username = &HTML::Entities::encode($username,'<>&"'); - $email = &HTML::Entities::encode($email,'<>&"'); - $record{$uhom} .= '<recipient username="'.$username.'">'. - $email.'</recipient>'; - } - } - foreach my $server (keys(%record)) { - $$servers{$server} = $result.$record{$server}; - } - return $msgid; -} - -sub unpackagemail { - my ($message,$notoken,$ltext)=@_; - my $parser=HTML::TokeParser->new(\$message); - my $token; - my %content=(); - %{$content{recipients}} = (); - while ($token=$parser->get_token()) { - if ($token->[0] eq 'S') { - my $entry=$token->[1]; - my $value=$parser->get_text('/'.$entry); - my ($username,$email); - if ($entry eq 'recipient') { - $username = $token->[2]{'username'}; - $username = &HTML::Entities::decode($username,'<>&"'); - $content{recipients}{$username} = - &HTML::Entities::decode($value,'<>&"'); - } elsif ($entry eq 'subject' || $entry eq 'message') { - $content{$entry}=&HTML::Entities::decode($value,'<>&"'); - } else { - $content{$entry}=$value; - } - } - } - if ($content{'attachmenturl'}) { - my ($fname)=($content{'attachmenturl'}=~m|/([^/]+)$|); - if ($notoken) { - $content{'message'}.='<p>'.&mt('Attachment').': <tt>'.$fname.'</tt>'; } else { - &Apache::lonnet::allowuploaded('/adm/notify', - $content{'attachmenturl'}); - $content{'message'}.='<p>'.&mt('Attachment'). - ': <a href="'.$content{'attachmenturl'}.'"><tt>'. - $fname.'</tt></a>'; + my ($subject,$message,$domain,$recipients,$attachmenturl) = @_; + my $msgid; + ($msgid,$message) = &Apache::lonmsg::packagemsg($subject,$message,undef,undef, + $attachmenturl,$recipients,undef,undef,'dcmail'); + +# Store in dc email db files on primary library server for domain. + my $server = &Apache::lonnet::domain($domain,'primary'); + if (defined($server)) { + unless (&Apache::lonnet::dcmailput($domain,$msgid,$message,$server) + eq 'ok') { + &Apache::lonnet::logthis('Storage of dc mail failed for domain'. + $domain.' for server: '. $server.'. Message ID was '.$msgid); } + } else { + &Apache::lonnet::logthis('Storage of dc mail failed for domain'. + $domain.' as no primary server identified. Message ID was '.$msgid); } - return %content; } -sub echo_form_input { - my (@excluded) = @_; - my $output = ''; - foreach my $key (keys(%env)) { - if ($key =~ /^form\.(.+)$/) { - if ((!@excluded) || (!grep/^$1$/,@excluded)) { - if (ref($env{$key})) { - foreach my $value (@{$env{$key}}) { - $output .= qq(<input type="hidden" name="$1" value="$value" />\n); - } - } else { - $output .= qq(<input type="hidden" name="$1" value="$env{$key}" />\n); - } - } - } - } - return $output; +sub cr_to_br { + my $incoming = shift; + $incoming =~ s/\n/\<br \/\>/g; + return $incoming; } 1;