--- loncom/interface/lonrequestcourse.pm 2022/06/08 01:00:57 1.115 +++ loncom/interface/lonrequestcourse.pm 2025/01/10 22:45:55 1.118 @@ -1,7 +1,7 @@ # The LearningOnline Network # Request a course # -# $Id: lonrequestcourse.pm,v 1.115 2022/06/08 01:00:57 raeburn Exp $ +# $Id: lonrequestcourse.pm,v 1.118 2025/01/10 22:45:55 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -337,8 +337,6 @@ sub handler { $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored); if ($state eq 'courseinfo') { $jscript .= &cloning_javascript(); - } elsif ($state eq 'process') { - $jscript .= &processing_javascript(); } } } @@ -2728,7 +2726,7 @@ sub requestlog_display_filter { my $nolink = 1; my $output = ''; my $startform = @@ -3691,6 +3689,19 @@ sub print_request_outcome { } } } + if ($env{'form.chome'} eq 'default') { + my %servers = &Apache::lonnet::get_servers($dom,'library'); + my $numlib = keys(%servers); + if ($numlib) { + my $loadm=10000000; + my $chome; + foreach my $tryserver (keys(%servers)) { + ($chome,$loadm) = + &Apache::lonnet::compare_server_load($tryserver,$chome,$loadm); + } + $env{'form.chome'} = $chome; + } + } my $details = { owner => $env{'user.name'}, domain => $env{'user.domain'}, @@ -3908,7 +3919,7 @@ ENDCLOSE if (($code) || ((ref($postprocess) eq 'HASH') && (($postprocess->{'createdweb'}) || ($postprocess->{'createdmsg'})))) { $output .= ¬ification_information($disposition,$env{'user.name'}.':'.$env{'user.domain'}, - $dom,$cnum,$now,$code,$postprocess); + $dom,$cnum,$now,$code,$postprocess,$crstype); } if ($code) { $reqhash{'code'} = $code; @@ -4021,7 +4032,7 @@ ENDCLOSE unless ($disposition eq 'pending') { $output .= '
'. ¬ification_information($disposition,$req_notifylist, - $dom,$cnum,$now); + $dom,$cnum,$now,'','',$crstype); } } else { $reqstatus = 'domainerror'; @@ -4054,13 +4065,13 @@ ENDCLOSE $output .= '

'.&mt('Your course request has been updated').'

'; } if ($disposition eq 'approval') { - $output .= ¬ification_information($disposition,$req_notifylist,$dom,$cnum,$now); + $output .= ¬ification_information($disposition,$req_notifylist,$dom,$cnum,$now,'','',$crstype); } } if ($disposition eq 'approval') { if ((ref($postprocess) eq 'HASH') && ((ref($postprocess->{'queuedmsg'}) eq 'HASH') || ($postprocess->{'queuedweb'}))) { - ¬ification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess); + ¬ification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess,$crstype); $customized = $postprocess->{'createdcustomized'}; } } elsif ($disposition eq 'pending') { @@ -4072,7 +4083,7 @@ ENDCLOSE if ($pendingform) { $output .= $pendingform; } else { - $output .= ¬ification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess); + $output .= ¬ification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess,$crstype); } if (ref($postprocess) eq 'HASH') { $customized = $postprocess->{'createdcustomized'}; @@ -4270,7 +4281,7 @@ sub update_requestors_roles { } sub notification_information { - my ($disposition,$req_notifylist,$dom,$cnum,$now,$code,$postprocess) = @_; + my ($disposition,$req_notifylist,$dom,$cnum,$now,$code,$postprocess,$crstype) = @_; my %emails = &Apache::loncommon::getemails(); my $address; if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) { @@ -4286,12 +4297,46 @@ sub notification_information { if ($address ne '') { $output.= &mt('An e-mail will also be sent to: [_1] when this occurs.',$address).'
'; } + my %possemails; + my $fullname = &Apache::loncommon::plainname($env{'user.name'}, + $env{'user.domain'}); + my $emailto = &Apache::loncommon::build_recipient_list(undef,'requestsmail',$dom); + if ($emailto) { + map { $possemails{$_} = 1; } (split(/,/,$emailto)); + } if ($req_notifylist) { - my $fullname = &Apache::loncommon::plainname($env{'user.name'}, - $env{'user.domain'}); + if ($emailto) { + foreach my $recip (split(/,/,$req_notifylist)) { + my ($uname,$udom) = split(/:/,$recip); + my %emails = &Apache::loncommon::getemails($uname,$udom); + foreach my $type ('permanentemail','notification') { + if ((exists($emails{$type})) && ($emails{$type} ne '')) { + my @to = split(/,/,$emails{$type}); + foreach my $addr (@to) { + if (($addr ne '') && ($addr =~ m/\@/)) { + if (exists($possemails{$addr})) { + delete($possemails{$addr}); + } + } + } + } + } + } + } my $sender = $env{'user.name'}.':'.$env{'user.domain'}; &Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})", - 'undef',$env{'form.cdescr'},$now,'coursereq',$sender); + undef,$env{'form.cdescr'},$now,'coursereq',$sender,'','',$crstype); + } +# +# If domain configuration for "E-mail addresses and helpform" has values set +# for "E-mail from course requests requiring approval", send email to those +# addresse(es) when a course request is queued, pending approval, unless +# the email address will already receive a notification email, because of +# values set for "Receive notification of course requests requiring approval" +# in "Request creation of courses" configuration item. +# + if ($emailto && keys(%possemails)) { + ¬ify_admin($dom,$crstype,$env{'form.cdescr'},"$fullname ($env{'user.name'}:$env{'user.domain'})",$now,\%possemails); } if (ref($postprocess) eq 'HASH') { if (ref($postprocess->{'queuedmsg'}) eq 'ARRAY') { @@ -4372,7 +4417,7 @@ sub notification_information { $type = 'uniquecode'; } &Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,$dom.'_'.$cnum,$env{'form.cdescr'}, - $now,$type,$sender); + $now,$type,$sender,'','',$crstype); } } } else { @@ -4383,6 +4428,52 @@ sub notification_information { return $output; } +sub notify_admin { + my ($dom,$crstype,$contextdesc,$textstr,$timestamp,$emailsref) = @_; + if ((ref($emailsref) eq 'HASH') && (keys(%{$emailsref}))) { + my $emailto = join(',',sort(keys(%{$emailsref}))); + my (@rawmsg,$rawsubj,$msgtxt); + if ($crstype eq 'community') { + $rawsubj = 'Community request to review'; + $msgtxt = 'Creation of the following community: [_1]was requested by [_2] on [_3].'; + } else { + $rawsubj = 'Course request to review'; + $msgtxt = 'Creation of the following course: [_1]was requested by [_2] on [_3].'; + } + $timestamp =&Apache::lonlocal::locallocaltime($timestamp); + push(@rawmsg,{ + mt => $msgtxt, + args => ["\n $contextdesc\n",$textstr,$timestamp], + }, + { + mt =>'[_1]A Domain Coordinator will use: [_2]Main Menu -> Course and community creation -> Approve or reject requests[_3]to display a list of pending requests, which can either be approved or rejected.', + args => ["\n","\n\n","\n\n"], + }); + + my $sender_lh = &Apache::loncommon::user_lang($env{'user.name'},$env{'user.domain'}); + my $subject = &mt_user($sender_lh,$rawsubj); + my $message = ''; + foreach my $item (@rawmsg) { + if (ref($item) eq 'HASH') { + if (ref($item->{args}) eq 'ARRAY') { + $message .= &mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n"; + } else { + $message .= &mt_user($sender_lh,$item->{mt})."\n"; + } + } + } + my $chgmail = "To: $emailto\n". + "Subject: $subject\n". + "Content-type: text/plain\; charset=UTF-8\n". + "MIME-Version: 1.0\n\n". + "$message\n\n"; + if (open(my $mailh, "|/usr/lib/sendmail -oi -t -odb")) { + print $mailh $chgmail; + close($mailh); + } + } +} + sub pending_validation_form { my ($r,$cdom,$cnum,$crstype,$now,$token,$lonhost,$cdesc) = @_; my $output;
'. ''.&mt('Records/page:').'
'. - &Apache::lonmeta::selectbox('show',$curr->{'show'},undef, + &Apache::lonmeta::selectbox('show',$curr->{'show'},'',undef, (&mt('all'),5,10,20,50,100,1000,10000)). '