--- loncom/interface/lonnotify.pm 2005/10/05 18:50:08 1.3 +++ loncom/interface/lonnotify.pm 2005/11/15 21:08:47 1.8 @@ -53,35 +53,50 @@ 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 $loadcode; my $tablecolor = &Apache::loncommon::designparm($function.'.tabbg'); - my $bodytag = &Apache::loncommon::bodytag('Broadcast e-mail to users'); + if ((defined($env{'form.origin'})) && ($command eq 'compose' || $command eq 'pick_target' || $command eq 'pick_display')) { + unless ($env{'form.origin'} eq '') { + $loadcode = 'javascript:setFormElements(document.'.$env{'form.command'}.')'; + if (($command eq 'pick_target') && ( + ($origin eq 'compose') || ($origin eq 'process'))) { + if ($env{'form.coursepick'} eq 'category') { + $loadcode .= ';javascript:setCourseCat(document.'.$env{'form.command'}.')'; + } + } + } + } + my $loaditems = ' onLoad="'.$loadcode.'" '; + my $bodytag = &Apache::loncommon::bodytag('Broadcast e-mail to users',$function,$loaditems); 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,$tablecolor,$bodytag,$html,\%ltext); } elsif ($command eq 'compose') { - &print_composition_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_composition_form($r,$command,$cdom,$tablecolor,$bodytag,$html,\%ltext); } elsif ($command eq 'pick_target') { - &print_selection_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_selection_form($r,$command,$cdom,$tablecolor,$bodytag,$html,\%ltext); } elsif ($command eq 'pick_display') { - &print_display_option_form($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_display_option_form($r,$command,$cdom,$tablecolor,$bodytag,$html,\%ltext); } elsif ($command eq 'display') { - &print_display($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_display($r,$command,$cdom,$tablecolor,$bodytag,$html,\%ltext); } else { - &print_front_page($r,$cdom,$tablecolor,$bodytag,$html,\%ltext); + &print_front_page($r,'front',$cdom,$tablecolor,$bodytag,$html,\%ltext); } return OK; } sub print_front_page { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + my ($r,$formname,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs (undef,'Broadcast e-mail to Domain','Broadcast_system_email'); my $jscript = qq| @@ -110,7 +125,7 @@ $bodytag $breadcrumbs
ENDONE - $output .= '
'. + $output .= ''. ''; $output .= &Apache::lonhtmlcommon::start_pick_box(); $output .= ''. @@ -129,14 +144,13 @@ ENDONE } sub print_display_option_form { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + my ($r,$formname,$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 $cmd = 'display'; my $submit_text = 'Display e-mail'; my @roles = ('dc'); @@ -150,9 +164,22 @@ sub print_display_option_form { my $enddateform = &Apache::lonhtmlcommon::date_setter($formname, 'enddate', $now); - my $jscript; - my %totals = (); - my %personnel = (); + 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 = <<"ENDONE"; $html @@ -174,14 +201,17 @@ ENDONE '
'; $output .= &Apache::lonhtmlcommon::row_closure(); $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Choose sender(s)')); -# FIXME - need to complete work on domain_roles_get -# &Apache::lonnet::domain_roles_get($cdom,\@roles,\%personnel,%totals); + my %personnel = &Apache::lonnet::get_domain_roles($cdom,\@roles); $output .= ''; - if ($totals{'dc'} > 0) { - foreach my $user (sort(keys(%{$personnel{'dc'}}))) { - my ($uname,$udom) = split(/:/,$user); - my %userinfo = &Apache::lonnet::get('environment',['lastname','firstname'],$udom,$uname); - $output .= ' '.$userinfo{firstname}.' '.$userinfo{lastname}.'  ('.$user.')'; + my @domcc = (); + foreach my $server (keys %personnel) { + foreach my $user (sort(keys %{$personnel{$server}})) { + 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 .= ' '.$userinfo{firstname}.' '.$userinfo{lastname}.'  ('.$uname.':'.$udom.')'; + push (@domcc,$uname.':'.$udom); + } } } $output .= ''; @@ -198,9 +228,9 @@ ENDONE } sub print_display { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + my ($r,$formname,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; &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 @@ -211,19 +241,23 @@ sub print_display { 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 @@ -286,7 +320,7 @@ ENDONE $recipients .= $dcmail{$msgid}{recipients}{$user}.', '; } $recipients =~ s/,\s$//; - $output .= ''.$date.''.$dcmail{$msgid}{subject}.''.$sname.':'.$sdom.''.$dcmail{$msgid}{message}.''.$recipients.''."\n"; + $output .= ''.$date.''.&cr_to_br($dcmail{$msgid}{subject}).''.$sname.':'.$sdom.''.&cr_to_br($dcmail{$msgid}{message}).''.$recipients.''."\n"; $rowNum ++; } } else { @@ -325,9 +359,10 @@ ENDONE } $recipients =~ s/,\s$//; } + my ($date,$subj,$sname,$sdom,$cdom) = split(/:/,$msgid,5); $date = &Apache::lonlocal::locallocaltime($date); - $output .= ''.$date.''.$dcmail{$msgid}{subject}.''.$sname.':'.$sdom.''.$dcmail{$msgid}{message}.''.$recipients.''."\n"; + $output .= ''.$date.''.&cr_to_br($dcmail{$msgid}{subject}).''.$sname.':'.$sdom.''.&cr_to_br($dcmail{$msgid}{message}).''.$recipients.''."\n"; $rowNum ++; } } @@ -337,10 +372,16 @@ ENDONE $output .= ' 
  No mail sent matching supplied criteria  

 '; } $output .= &Apache::lonhtmlcommon::end_pick_box(); - $output .= &echo_form_input(); - unless (defined($env{'form.sortby'})) { - $output .= qq(\n); - } + $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 .= qq(\n); + $output .= qq(\n); + $output .= qq(\n); $output .= qq( @@ -350,7 +391,7 @@ ENDONE } sub print_selection_form { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + my ($r,$formname,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; my %coursecodes = (); my %codes = (); my @codetitles = (); @@ -363,7 +404,6 @@ 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( @@ -373,11 +413,6 @@ sub print_selection_form { 'infs' => 'Internal, Filesystem and Local authentication: enter single default.', 'comp' => 'Compose Message' ); - my $loaditems = qq| -function initialize_codes() { - return; -} - |; &Apache::lonhtmlcommon::add_breadcrumb ({text=>"Select Audience"}); @@ -388,13 +423,60 @@ function initialize_codes() { 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 = ''; } } my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs (undef,'Choose e-mail audience','Broadcast_system_email'); my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($cdom); + + my %elements = ( + roles => 'selectbox', + types => 'selectbox', + Year => 'selectbox', + coursepick => 'radio', + coursetotal => 'text', + courselist => 'text', + internal => 'text', + krb4 => 'text', + krb5 => 'text', + local => '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('Year'); + for (var j=0; j @@ -410,7 +492,7 @@ $breadcrumbs
ENDONE $output .= &Apache::lonhtmlcommon::start_pick_box($table_width); - my @roles = ('cc','in','ta','ep','ad','st','cr'); + my @roles = ('ow','cc','in','ta','ep','st','cr'); my %longtypes = (); my %authtypes = (); &form_elements(\%longtypes,\%authtypes); @@ -436,12 +518,18 @@ ENDONE } sub print_composition_form { - my ($r,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; + my ($r,$formname,$cdom,$tablecolor,$bodytag,$html,$ltext) = @_; &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/notify?command=pick_target', + ({href=>"javascript:goBack('pick_target')", text=>"Select Audience"}, {text=>"Compose Message"}); my $jscript = &Apache::loncommon::check_uncheck_jscript(); + $jscript .= qq| +function goBack(target) { + document.$formname.command.value = target; + document.$formname.submit(); +} +|; my $breadcrumbs = (&Apache::lonhtmlcommon::breadcrumbs (undef,'Broadcast e-mail to users','Broadcast_system_email')); @@ -450,11 +538,19 @@ sub print_composition_form { 'nore' => 'No recipients identified', 'emad' => 'e-mail address', ); + my %elements = ( + subject => 'text', + message => 'text', + sender => 'text', + recipient => 'checkbox', + ); + $jscript .= &Apache::lonhtmlcommon::set_form_elements(\%elements); + $r->print(< LON-CAPA $lt{'note'} - @@ -528,6 +624,7 @@ ENDONE my %recipients = (); my %users = (); my %access = (); + my @sections = (); my $totalrecip = 0; my @unmatched = (); foreach my $role (@roles) { @@ -538,7 +635,7 @@ ENDONE } foreach my $course_id (keys(%courses)) { my ($cdom,$cnum) = split(/_/,$course_id); - &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\%users); + &Apache::loncommon::get_course_users($cdom,$cnum,\%access,\@roles,\@sections,\%users); } foreach my $role (keys(%users)) { foreach my $user (keys(%{$users{$role}})) { @@ -552,7 +649,7 @@ ENDONE } } } - my $output = ''."\n"; + my $output = ''."\n"; if ($totalrecip > 0) { $output .= &Apache::lonhtmlcommon::start_pick_box($table_width); @@ -575,10 +672,18 @@ ENDONE foreach my $username (sort(keys(%recipients))) { if ($recipients{$username} =~ /\@/) { my $value=&Apache::lonnet::escape($username).':'.&Apache::lonnet::escape($recipients{$username}); - $output .= ''.$username.'  '.$recipients{$username}.''; + $output .= ''.$username.'  '.$recipients{$username}.''; } } - $output .= ''; + $output .= ''; + if (@unmatched) { + $output .= '

'.&mt('Could not determine e-mail addresses for the following users:').'
    '; + foreach my $username (sort @unmatched) { + $output .= '
  • '.$username.'
  • '; + } + $output .= '
'; + } + $output .= ''; $output .= &Apache::lonhtmlcommon::row_closure(); $output .= &Apache::lonhtmlcommon::row_title($col_width,$tablecolor,&mt('Sender e-mail address')); $output .= ''; @@ -586,9 +691,11 @@ ENDONE $output .= &Apache::lonhtmlcommon::submit_row($col_width,$tablecolor,&mt('Submit'),'process',&mt('Send Message')); $output .= &Apache::lonhtmlcommon::end_pick_box(); } else { - $output .= $lt{'nore'}; + $output .= $lt{'nore'}."\n". + ''."\n"; } - $output .= &echo_form_input('command'); + $output .= ''."\n"; + $output .= &Apache::lonhtmlcommon::echo_form_input(['command','origin','subject','message','recipient','sender'],); $output .= ''; $r->print($output); return; @@ -596,25 +703,25 @@ ENDONE sub print_request_receipt { - my ($r,$dom,$tablecolor,$bodytag,$html,$ltext) =@_; + my ($r,$formname,$dom,$tablecolor,$bodytag,$html,$ltext) =@_; 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 = <'/adm/notify?command=pick_target', + ({href=>"javascript:goBack('pick_target')", text=>"Select audience"}); &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'javascript:showCompose()', + ({href=>"javascript:goBack('compose')", text=>"Compose Message"}); &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'); @@ -622,19 +729,20 @@ ENDSCRIPT $html LON-CAPA Notification E-mail - $bodytag $breadcrumbs
-
+ ENDONE $output .= &Apache::lonhtmlcommon::start_pick_box(); my @deliveries = (); &broadcast_email(\@recipients,$subject,$from,$message,\@deliveries); if (@deliveries > 0) { + &store_mail($subject,$message,$dom,\@deliveries); $output .= ' @@ -646,8 +754,8 @@ ENDONE - - + +
Sent'.$subject.''.$message.''.&cr_to_br($subject).''.&cr_to_br($message).' '; foreach my $person (@deliveries) { my ($username,$email) = split(/:/,$person); @@ -664,7 +772,9 @@ ENDONE } $output .= &Apache::lonhtmlcommon::end_pick_box(); $output .= '
Send another message?'."\n"; - $output .= &echo_form_input(); + $output .= ''."\n". + ''."\n"; + $output .= &Apache::lonhtmlcommon::echo_form_input(['command','origin']); $output .= ' @@ -675,7 +785,7 @@ ENDONE sub broadcast_email { my ($recipients,$subject,$from,$message,$deliveries,$ltext)=@_; -# find some way to spread out delivery for large numbers of recipients. +# Should implement staggered delivery for large numbers of recipients?. foreach my $user (@{$recipients}) { my $msg = new Mail::Send; my ($username,$to) = split(/:/,$user); @@ -693,7 +803,7 @@ 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); @@ -712,7 +822,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}; } } @@ -730,7 +840,7 @@ sub form_elements { %{$authtypes} = ( krb4 => 'Kerberos 4', krb5 => 'Kerberos 5', - int => 'Internal (LON-CAPA)', + internal => 'Internal (LON-CAPA)', unix => 'Filesystem (UNIX)', local => 'Local/Customized', ); @@ -739,16 +849,15 @@ sub form_elements { sub store_mail { my ($subject,$message,$domain,$recipients,$attachmenturl,$ltext) = @_; - my %status = (); 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)) { -# FIXME This needs to be via a subroutine in lonnet - $status{$server} = &Apache::lonnet::critical( - 'dcmailput:'.$domain.':'.&Apache::lonnet::escape($msgid).'='. - &Apache::lonnet::escape($servers{$server}),$server); + unless (&Apache::lonnet::dcmailput($domain,$msgid,\%servers,$server) eq 'ok') { + &Apache::lonnet::logthis('Storage of dc mail failed for domain'.$domain.' for server: '. + $server.'. Message ID was '.$msgid); + } } } @@ -836,23 +945,10 @@ sub unpackagemail { 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(\n); - } - } else { - $output .= qq(\n); - } - } - } - } - return $output; +sub cr_to_br { + my $incoming = shift; + $incoming =~ s/\n/\
/g; + return $incoming; } 1;