--- loncom/interface/lonnotify.pm 2005/08/02 05:03:10 1.1
+++ loncom/interface/lonnotify.pm 2008/09/16 03:30:30 1.28
@@ -1,3 +1,7 @@
+# The LearningOnline Network with CAPA
+# Sending messages
+#
+# $Id: lonnotify.pm,v 1.28 2008/09/16 03:30:30 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -27,10 +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) = @_;
@@ -40,31 +49,319 @@ sub handler {
if ($r->header_only) {
return OK;
}
-# my $codedom = $env{'request.role.domain'};
- my $cdom = 'northwood5';
- unless (&Apache::lonnet::allowed('psa',$env{'request.role.domain'})) {
+ my $cdom = $env{'request.role.domain'};
+ unless (&Apache::lonnet::allowed('psa',$cdom)) {
# Not allowed to broadcast e-mail system-wide
$env{'user.error.msg'}="/adm/notify:psa:0:0:Cannot broadcast e-mail systemwide";
return HTTP_NOT_ACCEPTABLE;
}
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['command']);
my $command = $env{'form.command'};
+ my $origin = $env{'form.origin'};
+
&Apache::lonhtmlcommon::clear_breadcrumbs();
+
&Apache::lonhtmlcommon::add_breadcrumb
({href=>'/adm/notify',
- text=>"Broadcast e-mail"});
+ text=>"Broadcast E-mail"});
if ($command eq 'process') {
- &print_request_receipt($r,$cdom);
+ &print_request_receipt($r,$command,$cdom);
} elsif ($command eq 'compose') {
- &print_composition_form($r,$cdom);
+ &print_composition_form($r,$command,$cdom);
+ } elsif ($command eq 'pick_target') {
+ &print_selection_form($r,$command,$cdom);
+ } elsif ($command eq 'pick_display') {
+ &print_display_option_form($r,$command,$cdom);
+ } elsif ($command eq 'display') {
+ &print_display($r,$command,$cdom);
} else {
- &print_selection_form($r,$cdom);
+ &print_front_page($r,'front',$cdom);
}
return OK;
}
+sub add_script {
+ my ($js) = @_;
+ return '';
+}
+
+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
+
+
'.&Apache::loncommon::end_page();
+}
+
+sub print_front_page {
+ my ($r,$formname,$cdom) = @_;
+
+ my $jscript = qq|
+function next_page(caller) {
+ if (caller == 'view') {
+ document.front.command.value="pick_display"
+ }
+ else {
+ document.front.command.value="pick_target"
+ }
+ document.front.submit()
+}
+ |;
+
+ my $output = &start_page(&add_script($jscript),
+ 'Broadcast e-mail to Domain', $formname);
+
+ $output .= '';
+ $output .= '';
+ $output .= &end_page();
+
+ $r->print($output);
+ return;
+}
+
+sub print_display_option_form {
+ my ($r,$formname,$cdom) = @_;
+ &Apache::lonhtmlcommon::add_breadcrumb({text=>"Display options"});
+
+ my $cmd = 'display';
+ my $submit_text = 'Display e-mail';
+ my @roles = ('dc');
+ my $now = time;
+
+ my $startdateform = &Apache::lonhtmlcommon::date_setter($formname,
+ 'startdate',
+ $now);
+ my $enddateform = &Apache::lonhtmlcommon::date_setter($formname,
+ 'enddate',
+ $now);
+ 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 .= ''.&mt('Earliest to display:').' | '.
+ $startdateform.' |
';
+ $output .= ''.&mt('Latest to display:').' | '.$enddateform.
+ ' |
';
+ $output .= &Apache::lonhtmlcommon::row_closure();
+ $output .= &Apache::lonhtmlcommon::row_title(&mt('Choose sender(s)'));
+ my %personnel = &Apache::lonnet::get_domain_roles($cdom,\@roles);
+ 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 .= &Apache::lonhtmlcommon::row_closure();
+ $output .= &Apache::lonhtmlcommon::submit_row(&mt('Submit'),$cmd,$submit_text);
+ $output .= &Apache::lonhtmlcommon::end_pick_box();
+ $output .= qq(\n).
+ &end_page();
+ $r->print($output);
+ return;
+}
+
+sub print_display {
+ my ($r,$formname,$cdom) = @_;
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"javascript:goBack('pick_display')",
+ text=>"Display options"},
+ {text=>"E-mail display"});
+
+ my $msgcount = 0;
+ 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 %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();
+}
+function goBack(target) {
+ document.$formname.command.value = target;
+ document.$formname.submit();
+}
+
+ENDSCRIPT
+
+ 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 {
+ $dcmail{$msgid}{$item} = $content{$item};
+ }
+ }
+ }
+ $output .= &Apache::loncommon::start_data_table();
+ if ($msgcount > 0) {
+ $output .= &Apache::loncommon::start_data_table_header_row().
+ 'Date | '.
+ 'Subject | '.
+ 'Sender | '.
+ 'Message | '.
+ 'Recipients | '.
+ &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))) {
+ my $recipients = '';
+ my ($date,undef,$sname,$sdom) =
+ &Apache::lonmsg::unpackmsgid($msgid,undef,1);
+ $date = &Apache::lonlocal::locallocaltime($date);
+ foreach my $user (sort(keys(%{$dcmail{$msgid}{recipient}}))) {
+ $recipients .= $dcmail{$msgid}{recipient}{$user}.', ';
+ }
+ $recipients =~ s/,\s$//;
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$date.' | '.
+ ''.&cr_to_br($dcmail{$msgid}{subject}).' | '.
+ ''.$sname.':'.$sdom.' | '.&cr_to_br($dcmail{$msgid}{message}).' | '.
+ ''.$recipients.' | '."\n".
+ &Apache::loncommon::end_data_table_row();
+ }
+ } else {
+ foreach my $msgid (sort(keys(%dcmail))) {
+ 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}{recipient}}))) {
+ $recipients .= $dcmail{$msgid}{recipient}{$user}.', ';
+ }
+ $recipients =~ s/,\s$//;
+ push @{$Sortby{$recipients}},$msgid;
+ } elsif ($env{'form.sortby'} eq 'sender') {
+ if (@senders > 1) {
+ push @{$Sortby{$sname.':'.$sdom}},$msgid;
+ }
+ }
+ }
+ foreach my $key (sort(keys(%Sortby))) {
+ foreach my $msgid (@{$Sortby{$key}}) {
+ my $recipients = '';
+ if ($env{'form.sortby'} eq 'recipients') {
+ $recipients = $key;
+ } else {
+ foreach my $user (sort(keys(%{$dcmail{$msgid}{recipient}}))) {
+ $recipients .= $dcmail{$msgid}{recipient}{$user}.', ';
+ }
+ $recipients =~ s/,\s$//;
+ }
+ my ($date,undef,$sname,$sdom) =
+ &Apache::lonmsg::unpackmsgid($msgid,undef,1);
+ $date = &Apache::lonlocal::locallocaltime($date);
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$date.' | '.
+ ''.&cr_to_br($dcmail{$msgid}{subject}).' | '.
+ ''.$sname.':'.$sdom.' | '.
+ ''.&cr_to_br($dcmail{$msgid}{message}).' | '.
+ ''.$recipients.' | '."\n".
+ &Apache::loncommon::end_data_table_row();
+ }
+ }
+ }
+ } else {
+ $output .= &Apache::loncommon::start_data_table_empty_row().
+ 'No mail sent matching supplied criteria | '.
+ &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 .= qq(\n);
+ $output .= qq(\n);
+ $output .= qq(\n);
+ $output .= &end_page();
+ $r->print($output);
+ return;
+}
+
sub print_selection_form {
- my ($r,$cdom) = @_;
+ my ($r,$formname,$cdom) = @_;
my %coursecodes = ();
my %codes = ();
my @codetitles = ();
@@ -77,421 +374,439 @@ sub print_selection_form {
my $totcodes = 0;
my $format_reply;
my $jscript = '';
- my $loaditems = qq|
-function initialize_codes() {
- return;
-}
- |;
- $totcodes = &Apache::lonsupportreq::retrieve_instcodes(\%coursecodes,$cdom,$totcodes);
+ my %lt=&Apache::lonlocal::texthash(
+ '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'
+ );
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({text=>"Select Audience"});
+
+ $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($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 $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();
- my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs
- (undef,'Broadcast e-mail to users','Broadcast_system_email');
- $r->print(<
- LON-CAPA Notification E-mail
-
-
-$bodytag
-$breadcrumbs
-
-
-