--- loncom/interface/loncoursequeueadmin.pm 2021/12/09 18:14:44 1.52.2.5 +++ loncom/interface/loncoursequeueadmin.pm 2023/09/04 17:10:13 1.52.2.5.2.3 @@ -1,7 +1,7 @@ # The LearningOnline Network # Utilities to administer domain course requests and course self-enroll requests # -# $Id: loncoursequeueadmin.pm,v 1.52.2.5 2021/12/09 18:14:44 raeburn Exp $ +# $Id: loncoursequeueadmin.pm,v 1.52.2.5.2.3 2023/09/04 17:10:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -304,11 +304,11 @@ sub send_selfserve_notification { my $stamp = time; my $msgcount = &Apache::lonmsg::get_uniq(); my $sender_lh = &Apache::loncommon::user_lang($uname,$udom,$cid); - $subject = &Apache::lonlocal::mt_user($sender_lh,$rawsubj); + $subject = &mt_user($sender_lh,$rawsubj); $message = ''; foreach my $item (@rawmsg) { if (ref($item) eq 'HASH') { - $message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n"; + $message .= &mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n"; } } &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$uname,$udom,$msgcount,$cid,$$,$message, @@ -322,41 +322,41 @@ sub send_selfserve_notification { foreach my $recip (sort(keys(%{$msgcc}))) { my ($ccname,$ccdom) = split(/:/,$recip); my $recip_lh = &Apache::loncommon::user_lang($ccname,$ccdom,$cid); - my $subject = &Apache::lonlocal::mt_user($sender_lh,$rawsubj); + my $subject = &mt_user($sender_lh,$rawsubj); my $message = ''; foreach my $item (@rawmsg) { if (ref($item) eq 'HASH') { - $message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt}, - @{$item->{args}})."\n"; + $message .= &mt_user($sender_lh,$item->{mt}, + @{$item->{args}})."\n"; } } if ($context eq 'coursemanagers') { if ($approvedlist) { - $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved enrollments:')."\n".$approvedlist; + $message .= "\n\n".&mt_user($sender_lh,'Approved enrollments:')."\n".$approvedlist; } if ($rejectedlist) { - $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected enrollments:')."\n".$rejectedlist; + $message .= "\n\n".&mt_user($sender_lh,'Rejected enrollments:')."\n".$rejectedlist; } } elsif ($context eq 'domainmanagers') { if ($approvedlist) { - $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved course requests:')."\n".$approvedlist; + $message .= "\n\n".&mt_user($sender_lh,'Approved course requests:')."\n".$approvedlist; } if ($rejectedlist) { - $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected course requests:')."\n".$rejectedlist; + $message .= "\n\n".&mt_user($sender_lh,'Rejected course requests:')."\n".$rejectedlist; } } elsif ($context eq 'authormanagers') { if ($approvedlist) { - $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved author role requests:')."\n".$approvedlist; + $message .= "\n\n".&mt_user($sender_lh,'Approved author role requests:')."\n".$approvedlist; } if ($rejectedlist) { - $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected author role requests:')."\n".$rejectedlist; + $message .= "\n\n".&mt_user($sender_lh,'Rejected author role requests:')."\n".$rejectedlist; } } elsif ($context eq 'usernamemanagers') { if ($approvedlist) { - $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved LON-CAPA account requests:')."\n".$approvedlist; + $message .= "\n\n".&mt_user($sender_lh,'Approved LON-CAPA account requests:')."\n".$approvedlist; } if ($rejectedlist) { - $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected LON-CAPA account requests:')."\n".$rejectedlist; + $message .= "\n\n".&mt_user($sender_lh,'Rejected LON-CAPA account requests:')."\n".$rejectedlist; } } $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1, @@ -656,7 +656,7 @@ sub update_request_queue { $beneficiary = 'enroller'; $cid = $env{'request.course.id'}; $crstype = lc(&Apache::loncommon::course_type()); - $firsturl = &course_portal_url($cnum,$cdom); + $firsturl = &Apache::lonnet::course_portal_url($cnum,$cdom); %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum); $access_start = $env{'course.'.$cid.'.internal.selfenroll_start_access'}; $access_end = $env{'course.'.$cid.'.internal.selfenroll_end_access'}; @@ -685,7 +685,7 @@ sub update_request_queue { } } my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom); - $firsturl = &course_portal_url($domconfiguser,$cdom); + $firsturl = &Apache::lonnet::course_portal_url($domconfiguser,$cdom); $approvedmsg = [{ mt => 'Your request for Authoring Space has been approved.', }, @@ -710,7 +710,7 @@ sub update_request_queue { } } my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom); - $firsturl = &course_portal_url($domconfiguser,$cdom); + $firsturl = &Apache::lonnet::course_portal_url($domconfiguser,$cdom); $approvedmsg = [{ mt => 'Your request for a LON-CAPA account has been approved.', }, @@ -981,7 +981,9 @@ sub update_request_queue { $ownerdom,$ownername); if ((ref($history{'details'}) eq 'HASH') && ($history{'disposition'} eq $queue)) { - my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,$code,%customitems); + my ($logmsg,$newusermsg,$addresult,$enrollcount,$response, + $keysmsg,$code,%customitems); + my $clonemsg = []; my $fullname = ''; my $inprocess = &Apache::lonnet::auto_crsreq_update($cdom,$cnum,$crstype,'process',$ownername, $ownerdom,$fullname,$coursedesc); @@ -995,8 +997,8 @@ sub update_request_queue { if ($history{'details'}{'clonecrs'}) { $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'}; } - my ($result,$postprocess) = &course_creation($cdom,$cnum,$context,$history{'details'},\$logmsg, - \$newusermsg,\$addresult,\$enrollcount, + my ($result,$postprocess) = &course_creation($cdom,$cnum,$context,$history{'details'}, + \$logmsg,$clonemsg,\$newusermsg,\$addresult,\$enrollcount, \$response,\$keysmsg,\%domdefs,$longroles,\$code,\%customitems); if ($result eq 'created') { if ($crstype eq 'community') { @@ -1004,11 +1006,14 @@ sub update_request_queue { } else { $approvedmsg = $approvalmsg{'course'}; } - my $firsturl = &course_portal_url($cnum,$cdom); + my $firsturl = &Apache::lonnet::course_portal_url($cnum,$cdom); if (ref($approvedmsg) eq 'ARRAY') { if (ref($approvedmsg->[1]) eq 'HASH') { $approvedmsg->[1]->{'args'} = [$firsturl]; } + if ((ref($clonemsg) eq 'ARRAY') && (@{$clonemsg})) { + push(@{$approvedmsg},@{$clonemsg}); + } if ($code) { push(@{$approvedmsg}, { @@ -1588,22 +1593,6 @@ sub update_request_queue { return $output; } -sub course_portal_url { - my ($cnum,$cdom) = @_; - my $chome = &Apache::lonnet::homeserver($cnum,$cdom); - my $hostname = &Apache::lonnet::hostname($chome); - my $protocol = $Apache::lonnet::protocol{$chome}; - $protocol = 'http' if ($protocol ne 'https'); - my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); - my $firsturl; - if ($domdefaults{'portal_def'}) { - $firsturl = $domdefaults{'portal_def'}; - } else { - $firsturl = $protocol.'://'.$hostname; - } - return $firsturl; -} - sub get_student_counts { my ($cdom,$cnum) = @_; my (%idx,%stucounts); @@ -1623,18 +1612,19 @@ sub get_student_counts { } sub course_creation { - my ($dom,$cnum,$context,$details,$logmsg,$newusermsg,$addresult,$enrollcount,$output, - $keysmsg,$domdefs,$longroles,$coderef,$customhash) = @_; + my ($dom,$cnum,$context,$details,$logmsg,$clonemsg,$newusermsg,$addresult, + $enrollcount,$output,$keysmsg,$domdefs,$longroles,$coderef,$customhash, + $callercontext,$user_lh) = @_; unless ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH') && (ref($longroles) eq 'HASH')) { return ('error: Invalid request'); } - my ($result,$ownername,$ownerdom); + my ($result,$ownername,$ownerdom,$autocoowner); my $crstype = $details->{'crstype'}; my $coursedesc = $details->{'cdescr'}; my $accessstart = $details->{'accessstart'}; my $accessend = $details->{'accessend'}; - my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom); + my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses','autoenroll'],$dom); if (ref($domconfig{'requestcourses'}) eq 'HASH') { if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') { if ($domconfig{'requestcourses'}{'uniquecode'}{$crstype}) { @@ -1642,6 +1632,9 @@ sub course_creation { } } } + if (ref($domconfig{'autoenroll'}) eq 'HASH') { + $autocoowner = $domconfig{'autoenroll'}{'co-owners'}; + } if ($context eq 'domain') { $ownername = $details->{'owner'}; $ownerdom = $details->{'domain'}; @@ -1658,8 +1651,9 @@ sub course_creation { } my %reqdetails = &build_batchcreatehash($dom,$cnum,$context,$details,$owneremail,$domdefs); my $cid = &LONCAPA::batchcreatecourse::build_course($dom,$cnum,'requestcourses', - \%reqdetails,$longroles,$logmsg,$newusermsg,$addresult, - $enrollcount,$output,$keysmsg,$ownerdom,$ownername,$cnum,$crstype,$coderef); + \%reqdetails,$longroles,$logmsg,$clonemsg,$newusermsg,$addresult, + $enrollcount,$output,$keysmsg,$ownerdom,$ownername,$cnum,$crstype, + $coderef,$callercontext,$user_lh); my $postprocess; if ($cid eq "/$dom/$cnum") { $result = 'created'; @@ -1670,6 +1664,66 @@ sub course_creation { $postprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$result,$ownername, $ownerdom,$fullname,$coursedesc,$code, $accessstart,$accessend,$customhash); + if ($autocoowner) { + my $instcode = $details->{'instcode'}; + if (($instcode ne '') && (ref($reqdetails{'users'}) eq 'HASH')) { + my @posscoowners; + my $now = time; + foreach my $person (keys(%{$reqdetails{'users'}})) { + my ($uname,$udom) = split(/:/,$person); + next if (($udom ne $dom) || (($uname eq $ownername) && ($udom eq $ownerdom))); + if ((&Apache::lonnet::homeserver($uname,$udom,1) ne 'no_host') && + (ref($reqdetails{'users'}{$person}) eq 'HASH')) { + if ((grep(/^cc$/,keys(%{$reqdetails{'users'}{$person}}))) && + (ref($reqdetails{'users'}{$person}{'cc'}) eq 'HASH')) { + my $start = $reqdetails{'users'}{$person}{'cc'}{'start'}; + my $end = $reqdetails{'users'}{$person}{'cc'}{'end'}; + if ((($start eq '') || ($start <= $now)) && + (($end eq '') || ($end >= $now))) { + push(@posscoowners,$person); + } + } + } + } + my @coowners; + if (@posscoowners) { + foreach my $user (@posscoowners) { + my ($checkcc,$desc) = + &Apache::lonnet::auto_validate_instcode($cnum,$dom,$instcode,$user); + unless ($checkcc eq 'valid') { + if (ref($reqdetails{'crosslists'}) eq 'HASH') { + foreach my $key (keys(%{$reqdetails{'crosslists'}})) { + if (ref($reqdetails{'crosslists'}{$key}) eq 'HASH') { + my $inst_crosslist = $reqdetails{'crosslists'}{$key}{'inst'}; + if ($inst_crosslist ne '') { + $checkcc = + &Apache::lonnet::auto_validate_inst_crosslist($cnum,$dom,$instcode, + $inst_crosslist,$user); + last if ($checkcc eq 'valid'); + } + } + } + } + } + if ($checkcc eq 'valid') { + if (@coowners > 0) { + unless (grep(/^\Q$user\E$/,@coowners)) { + push(@coowners,$user); + } + } else { + push(@coowners,$user); + } + } + } + } + if (@coowners > 0) { + my $chome = &Apache::lonnet::homeserver($cnum,$dom); + unless ($chome eq 'no_host') { + &Apache::lonnet::store_coowners($dom,$cnum,$chome,'',@coowners); + } + } + } + } } else { $result = 'error: '.$cid; } @@ -1679,7 +1733,7 @@ sub course_creation { sub build_batchcreatehash { my ($dom,$cnum,$context,$details,$owneremail,$domdefs) = @_; my %batchhash; - my @items = qw{owner domain coursehome clonecrs clonedom datemode dateshift enrollstart enrollend accessstart accessend sections users uniquecode}; + my @items = qw{owner domain coursehome clonecrs clonedom datemode dateshift tinyurls enrollstart enrollend accessstart accessend sections users uniquecode}; if ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH')) { my $emailenc = &escape($owneremail); my $owner = $details->{'owner'}.':'.$details->{'domain'}; @@ -1719,6 +1773,8 @@ sub build_batchcreatehash { my %clonedfrom = &Apache::lonnet::coursedescription($details->{'clonedom'}.'_'.$details->{'clonecrs'}); $batchhash{'textbook'} = $clonedfrom{'description'}; } + } elsif ($details->{'crstype'} eq 'lti') { + $batchhash{'lti'} = 1; } $batchhash{'crstype'} = 'Course'; } @@ -2045,9 +2101,10 @@ sub process_official_reqs { $longroles{$role}=&Apache::lonnet::plaintext($role); } my %domdefs = &Apache::lonnet::get_domain_defaults($dom); - my ($output,$linefeed); + my ($output,$linefeed,$user_lh); if ($context eq 'auto') { $linefeed = "\n"; + $user_lh = &Apache::loncommon::user_lang($dcname,$dcdom); } else { $linefeed = '
'."\n"; } @@ -2109,6 +2166,7 @@ sub process_official_reqs { $reqstatus = $disposition; if ($disposition eq 'process') { my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,$code); + my $clonemsg = []; my %customitems; my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom); my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$ownername, @@ -2124,15 +2182,16 @@ sub process_official_reqs { $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'}; } my ($result,$postprocess) = - &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,\$newusermsg,\$addresult, - \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,\$code,\%customitems); + &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,$clonemsg,\$newusermsg, + \$addresult,\$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles, + \$code,\%customitems,$context,$user_lh); if ($result eq 'created') { $disposition = 'created'; $reqstatus = 'created'; my $cid = $dom.'_'.$cnum; push(@{$newcids{$instcode}},$cid); if ($dcname && $dcdom) { - my $firsturl = &course_portal_url($cnum,$dom); + my $firsturl = &Apache::lonnet::course_portal_url($cnum,$dom); my $beneficiary = 'pendingrequestor'; my $now = time; my $owner = $ownername.':'.$ownerdom; @@ -2140,14 +2199,20 @@ sub process_official_reqs { [{ mt => 'Your requested course: [_1], (queued pending validation) has now been created.', args => [$cdescr], - }, + }]; + if ((ref($clonemsg) eq 'ARRAY') && (@{$clonemsg})) { + push(@{$approvedmsg},@{$clonemsg}); + } + push(@{$approvedmsg}, { mt => 'Visit [_1] to log-in and access the course.', args => [$firsturl], }, { - mt => 'If currently logged-in to LON-CAPA, log-out and log-in again to select your new course role.' - }]; + mt => 'If currently logged-in to LON-CAPA, log-out and log-in again to select your new course role.', + args => [], + } + ); my $sender = $dcname.':'.$dcdom; if (ref($postprocess) eq 'HASH') { if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') { @@ -2253,7 +2318,7 @@ sub postprocess_crsenv { my %needcrsidput = ( 'internal.selfenroll_types' => 1, 'internal.selfenroll_start_date' => 1, - 'internal. selfenroll_end_date' => 1, + 'internal.selfenroll_end_date' => 1, ); my (@needupdate,%newcrsenv); foreach my $key (keys(%{$postprocessenv})) {