--- loncom/interface/loncoursequeueadmin.pm 2010/12/08 03:49:34 1.12.2.12 +++ loncom/interface/loncoursequeueadmin.pm 2010/01/14 20:08:13 1.13 @@ -1,7 +1,7 @@ # The LearningOnline Network # Utilities to administer domain course requests and course self-enroll requests # -# $Id: loncoursequeueadmin.pm,v 1.12.2.12 2010/12/08 03:49:34 raeburn Exp $ +# $Id: loncoursequeueadmin.pm,v 1.13 2010/01/14 20:08:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,9 +33,7 @@ Apache::loncoursequeueadmin.pm =head1 SYNOPSIS -Utilities used by domain coordinators to administer queued course creation requests, -and by course coordinators for queued self-enrollment requests, and by general -users to display their queued self-enrollment requests. +Administration utilities used by domain coordinators for queued course creation requests, and by course coordinators for queued self-enrollment requests. This is part of the LearningOnline Network with CAPA project described at http://www.lon-capa.org. @@ -55,10 +53,10 @@ described at http://www.lon-capa.org. =item course_creation() =item build_batchcreatehash() - + =item can_clone_course() -=item queued_selfenrollment() +=item get_processtype() =back @@ -67,6 +65,7 @@ described at http://www.lon-capa.org. package Apache::loncoursequeueadmin; use strict; +use Apache::Constants qw(:common :http); use Apache::lonnet; use Apache::loncommon; use Apache::lonmsg; @@ -375,8 +374,7 @@ sub update_request_queue { @existing,@missingreq,@invalidusers,@limitexceeded,@completed, @processing_errors,@warn_approves,@warn_rejects,@approvals, @rejections,@rejectionerrors,@nopermissions,%courseroles, - %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype, - @warn_coursereqs,$firsturl); + %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype); @approvals = &Apache::loncommon::get_env_multiple('form.approvereq'); @rejections = &Apache::loncommon::get_env_multiple('form.rejectreq'); $now = time; @@ -390,12 +388,6 @@ sub update_request_queue { $hostname = &Apache::lonnet::hostname($chome); $protocol = $Apache::lonnet::protocol{$chome}; $protocol = 'http' if ($protocol ne 'https'); - my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); - if ($domdefaults{'portal_def'}) { - $firsturl = $domdefaults{'portal_def'}; - } else { - $firsturl = $protocol.'://'.$hostname; - } %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'}; @@ -408,7 +400,7 @@ sub update_request_queue { }, { mt => 'Visit [_1], to log-in and access the course', - args => [$firsturl], + args => [$protocol.'://'.$hostname], }]; $rejectedmsg = [{ mt => 'Your request for enrollment has not been approved.', @@ -422,12 +414,6 @@ sub update_request_queue { $hostname = &Apache::lonnet::hostname($chome); $protocol = $Apache::lonnet::protocol{$chome}; $protocol = 'http' if ($protocol ne 'https'); - my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); - if ($domdefaults{'portal_def'}) { - $firsturl = $domdefaults{'portal_def'}; - } else { - $firsturl = $protocol.'://'.$hostname; - } my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom); if (ref($domconfig{'requestcourses'}) eq 'HASH') { if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') { @@ -440,7 +426,7 @@ sub update_request_queue { }, { mt => 'Visit [_1], to log-in and access the course', - args => [$firsturl], + args => [$protocol.'://'.$hostname], }]; $rejectionmsg{'course'} = [{ @@ -453,7 +439,7 @@ sub update_request_queue { }, { mt => 'Visit [_1], to log-in and access the community', - args => [$firsturl], + args => [$protocol.'://'.$hostname], }]; $rejectionmsg{'community'} = @@ -471,30 +457,13 @@ sub update_request_queue { } } - my %allnums = &Apache::loncommon::get_faculty_cnums(); foreach my $item (sort {$a <=> $b} @approvals) { if ($context eq 'course') { my ($num,$uname,$udom,$usec) = split(/:/,$item); my $uhome = &Apache::lonnet::homeserver($uname,$udom); if ($uhome ne 'no_host') { if (exists($requesthash{$uname.':'.$udom})) { - if (($cdom ne '') && (ref($allnums{$cdom}) eq 'HASH')) { - my ($addothers,@others); - foreach my $key (%{$allnums{$cdom}}) { - if ($key eq $cnum) { - $addothers = 1; - } else { - push(@others,$key); - } - } - if ($addothers) { - foreach my $crs (@others) { - my $enresult = - &enable_additional_roles($cdom,$crs,$udom,$uname, - $access_end,$access_start); - } - } - } + if (exists($classlist->{$uname.':'.$udom})) { if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') { if (($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Active') || @@ -540,15 +509,6 @@ sub update_request_queue { &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname); if ($userresult ne 'ok') { push(@warn_approves,$uname.':'.$udom); - } elsif (ref($allnums{$udom}) eq 'HASH') { - my %changehash = ( - 'reqcrsotherdom.unofficial' => $udom.'test:autolimit=', - ); - my $reqresult = &Apache::lonnet::put('environment',\%changehash, - $udom,$uname); - if ($reqresult ne 'ok') { - push(@warn_coursereqs,$uname.':'.$udom); - } } } else { push(@processing_errors,$uname.':'.$udom); @@ -933,31 +893,9 @@ sub update_request_queue { $output .= '

'; } } - if (@warn_coursereqs) { - $output .= '

'..&mt("For the following users, an error occurred when setting rights to request creation of Concept Test courses:").'

'; - } return $output; } -sub enable_additional_roles { - my ($cdom,$cnum,$udom,$uname,$access_end,$access_start) = @_; - my ($stucounts,$idx,$classlist) = &get_student_counts($cdom,$cnum); - if (exists($classlist->{$uname.':'.$udom})) { - if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') { - if (($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Active') || - ($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Future')) { - return; - } - } - } - return - &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$access_end,$access_start,'selfenroll',undef,$cdom.'_'.$cnum,1); -} - sub get_student_counts { my ($cdom,$cnum) = @_; my (%idx,%stucounts); @@ -1000,8 +938,8 @@ sub course_creation { } my %reqdetails = &build_batchcreatehash($dom,$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); + \%reqdetails,$longroles,\$logmsg,\$newusermsg,\$addresult, + \$enrollcount,\$output,\$keysmsg,$ownerdom,$ownername,$cnum,$crstype); if ($cid eq "/$dom/$cnum") { $result = 'created'; } else { @@ -1013,12 +951,9 @@ sub course_creation { sub build_batchcreatehash { my ($dom,$context,$details,$owneremail,$domdefs) = @_; my %batchhash; - my @items = qw{owner domain coursehome clonecrs clonedom cloneroster datemode dateshift enrollstart enrollend accessstart accessend sections crosslists users}; - if ($dom =~ /^\w+citest$/) { - push(@items,'firstres'); - } + my @items = qw{owner domain coursehome clonecrs clonedom datemode dateshift enrollstart enrollend accessstart accessend sections crosslists users}; if ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH')) { - my $emailenc = &escape($owneremail); + my $emailenc = &Apache::lonnet::escape($owneremail); my $owner = $details->{'owner'}.':'.$details->{'domain'}; foreach my $item (@items) { $batchhash{$item} = $details->{$item}; @@ -1101,59 +1036,99 @@ sub can_clone_course { $canclone = 1; } } - unless ($canclone) { - if (&Apache::lonnet::is_course_owner($clonedom,$clonecrs,$uname,$udom)) { - $canclone = 1; - } - } } return $canclone; } -sub queued_selfenrollment { - my ($notitle) = @_; - my $output; - my %selfenrollrequests = &Apache::lonnet::dump('selfenrollrequests'); - my %reqs_by_date; - foreach my $item (keys(%selfenrollrequests)) { - if (ref($selfenrollrequests{$item}) eq 'HASH') { - if ($selfenrollrequests{$item}{'status'} eq 'request') { - if ($selfenrollrequests{$item}{'timestamp'}) { - push(@{$reqs_by_date{$selfenrollrequests{$item}{'timestamp'}}},$item); +sub get_processtype { + my ($uname,$udom,$isadv,$dom,$crstype,$inststatuses,$domconfig) = @_; + return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH')); + if ($uname eq '' || $udom eq '') { + $uname = $env{'user.name'}; + $udom = $env{'user.domain'}; + $isadv = $env{'user.adv'}; + } + my (%userenv,%settings,$val); + my @options = ('autolimit','validate','approval'); + if ($dom eq $udom) { + %userenv = + &Apache::lonnet::userenvironment($udom,$uname,'requestcourses.'.$crstype,'inststatus'); + if ($userenv{'requestcourses.'.$crstype}) { + $val = $userenv{'requestcourses.'.$crstype}; + @{$inststatuses} = ('_custom_'); + } else { + my ($task,%alltasks); + if (ref($domconfig->{'requestcourses'}) eq 'HASH') { + %settings = %{$domconfig->{'requestcourses'}}; + if (ref($settings{$crstype}) eq 'HASH') { + if (($isadv) && ($settings{$crstype}{'_LC_adv'} ne '')) { + $val = $settings{$crstype}{'_LC_adv'}; + @{$inststatuses} = ('_LC_adv_'); + } else { + if ($userenv{'inststatus'} ne '') { + @{$inststatuses} = split(',',$userenv{'inststatus'}); + } else { + @{$inststatuses} = ('default'); + } + foreach my $status (@{$inststatuses}) { + if (exists($settings{$crstype}{$status})) { + my $value = $settings{$crstype}{$status}; + next unless ($value); + unless (exists($alltasks{$value})) { + if (ref($alltasks{$value}) eq 'ARRAY') { + unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) { + push(@{$alltasks{$value}},$status); + } + } else { + @{$alltasks{$value}} = ($status); + } + } + } + } + my $maxlimit = 0; + + foreach my $key (sort(keys(%alltasks))) { + if ($key =~ /^autolimit=(\d*)$/) { + if ($1 eq '') { + $val ='autolimit='; + last; + } elsif ($1 > $maxlimit) { + $maxlimit = $1; + } + } + } + if ($maxlimit) { + $val = 'autolimit='.$maxlimit; + } else { + foreach my $option (@options) { + if ($alltasks{$option}) { + $val = $option; + last; + } + } + } + } } } } - } - if (keys(%reqs_by_date)) { - unless ($notitle) { - $output .= ''.&mt('Enrollment requests pending Course Coordinator approval').'
'; - } - $output .= &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(). - ''.&mt('Date requested').''.&mt('Course title').''. - ''.&mt('User role').''.&mt('Section').''. - &Apache::loncommon::end_data_table_header_row(); - my @sorted = sort { $a <=> $b } (keys(%reqs_by_date)); - foreach my $item (@sorted) { - if (ref($reqs_by_date{$item}) eq 'ARRAY') { - foreach my $crs (@{$reqs_by_date{$item}}) { - my %courseinfo = &Apache::lonnet::coursedescription($crs); - my $usec = $selfenrollrequests{$crs}{'section'}; - my $rolename = &Apache::lonnet::plaintext('st',$courseinfo{'type'},$crs); - if ($usec eq '') { - $usec = &mt('No section'); + } else { + %userenv = &Apache::lonnet::userenvironment($udom,$uname,'reqcrsotherdom.'.$crstype); + if ($userenv{'reqcrsotherdom.'.$crstype}) { + my @doms = split(',',$userenv{'reqcrsotherdom.'.$crstype}); + my $optregex = join('|',@options); + foreach my $item (@doms) { + my ($extdom,$extopt) = split(':',$item); + if ($extdom eq $dom) { + if ($extopt =~ /^($optregex)(=?\d*)$/) { + $val = $1.$2; } - $output .= &Apache::loncommon::start_data_table_row(). - ''.&Apache::lonlocal::locallocaltime($item).''. - ''.$courseinfo{'description'}.''. - ''.$rolename.''.$usec.''. - &Apache::loncommon::end_data_table_row(); + last; } } + @{$inststatuses} = ('_external_'); } - $output .= &Apache::loncommon::end_data_table(); } - return $output; + return $val; } 1;