[LON-CAPA-cvs] cvs: loncom /interface loncoursequeueadmin.pm

raeburn raeburn@source.lon-capa.org
Tue, 30 Mar 2010 15:23:52 -0000


This is a MIME encoded message

--raeburn1269962632
Content-Type: text/plain

raeburn		Tue Mar 30 15:23:52 2010 EDT

  Modified files:              
    /loncom/interface	loncoursequeueadmin.pm 
  Log:
  - DC can display either requests queued pending validation of instructor,
    or queued pending approval.
  - Validation can be attempted for pending requests 
     - any validated will be created automatically.
     - unvalidated will be displayed with the option to approve/reject
  - &process_official_reqs() moved from Autocreate.pl to facilitate re-use.
  - New routine: &build_queue_display() created from code previously in
    &display_queued_requests() to facilitate re-use. 
  
  
--raeburn1269962632
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20100330152352.txt"

Index: loncom/interface/loncoursequeueadmin.pm
diff -u loncom/interface/loncoursequeueadmin.pm:1.22 loncom/interface/loncoursequeueadmin.pm:1.23
--- loncom/interface/loncoursequeueadmin.pm:1.22	Fri Feb 26 23:01:20 2010
+++ loncom/interface/loncoursequeueadmin.pm	Tue Mar 30 15:23:51 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Utilities to administer domain course requests and course self-enroll requests
 #
-# $Id: loncoursequeueadmin.pm,v 1.22 2010/02/26 23:01:20 raeburn Exp $
+# $Id: loncoursequeueadmin.pm,v 1.23 2010/03/30 15:23:51 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -27,6 +27,8 @@
 #
 ###
 
+=pod
+
 =head1 NAME
 
 Apache::loncoursequeueadmin.pm
@@ -48,6 +50,8 @@
 
 =item display_queued_requests()
 
+=item build_queue_display()
+
 =item update_request_queue()
 
 =item get_student_counts()
@@ -62,6 +66,10 @@
 
 =item queued_selfenrollment()
 
+=item update_coursereq_status()
+
+=item process_official_reqs()
+
 =back
 
 =cut
@@ -251,34 +259,20 @@
     } else {
         $formaction = '/adm/createcourse';
         $namespace = 'courserequestqueue';
-        %requesthash = &Apache::lonnet::dump_dom($namespace,$dom,'_approval');
+        my $disposition = 'approval';
+        if ($context eq 'pending') {
+            $disposition = 'pending';
+        }
+        %requesthash = &Apache::lonnet::dump_dom($namespace,$dom,'_'.$disposition);
         $nextelement = '<input type="hidden" name="phase" value="requestchange" />';
     }
-    my ($output,%queue_by_date,%crstypes);
+    my ($output,%queue_by_date);
     if (keys(%requesthash) > 0) {
         $output = '<form method="post" name="changequeue" action="'.$formaction.'" />'."\n".
                   '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".
-                  $nextelement."\n".
-                  &Apache::loncommon::start_data_table().
-                  &Apache::loncommon::start_data_table_header_row().
-                  '<th>'.&mt('Action').'</th>'.
-                  '<th>'.&mt('Requestor').'</th>';
-        if ($context eq 'course') {
-            $output .= '<th>'.&mt('Section').'</th>'.
-                       '<th>'.&mt('Date requested').'</th>';
-        } else {
-            %crstypes = &Apache::lonlocal::texthash (
-                            official   => 'Official course',
-                            unofficial => 'Unofficial course',
-                            community  => 'Community',
-                        );
-            $output .= '<th>'.&mt('Type').'</th>'.
-                       '<th>'.&mt('Date requested').'</th>'.
-                       '<th>'.&mt('Details').'</th>';
-        }
-        $output .= &Apache::loncommon::end_data_table_header_row();
+                  $nextelement."\n";
         foreach my $item (keys(%requesthash)) {
-            my ($timestamp,$entry);
+            my ($timestamp,$entry,$pending);
             if ($context eq 'course') {
                 ($timestamp, my $usec) = split(/:/,$requesthash{$item});
                 $entry = $item.':'.$usec;
@@ -287,85 +281,163 @@
                 if (ref($requesthash{$item}) eq 'HASH') {
                     my ($cnum,$disposition) = split('_',$item);
                     $entry = $cnum.':'.$requesthash{$item}{'ownername'}.':'.
-                             $requesthash{$item}{'ownerdom'}.':'.
-                             $requesthash{$item}{'crstype'}.':'.
-                             $requesthash{$item}{'description'};
+                             $requesthash{$item}{'ownerdom'}.':';
+                    if ($context eq 'pending') {
+                        $entry .= $requesthash{$item}{'instcode'};
+                    } else {
+                        $entry .= $requesthash{$item}{'crstype'};
+                    }
+                    $entry .= ':'.$requesthash{$item}{'description'};
                 }
             }
             if ($entry ne '') {
-                if (exists($queue_by_date{$timestamp})) {
-                    if (ref($queue_by_date{$timestamp}) eq 'ARRAY') {
-                        push(@{$queue_by_date{$timestamp}},$entry);
-                    }
+                if (ref($queue_by_date{$timestamp}) eq 'ARRAY') {
+                    push(@{$queue_by_date{$timestamp}},$entry);
                 } else {
-                    @{$queue_by_date{$timestamp}} = ($entry);
+                    $queue_by_date{$timestamp} = [$entry];
                 }
             }
         }
-        my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));
-        my $count = 0;
-        foreach my $item (@sortedtimes) {
-            if (ref($queue_by_date{$item}) eq 'ARRAY') {
-                foreach my $request (sort(@{$queue_by_date{$item}})) {
-                    my ($row,$approve,$reject,$showtime,$showsec,$namelink,
-                        $detailslink,$crstype);
-                    $showtime = &Apache::lonlocal::locallocaltime($item);
-                    if ($context eq 'course') {
-                        my ($puname,$pudom,$pusec) = split(/:/,$request);
-                        $approve = $count.':'.$puname.':'.$pudom.':'.$pusec;
-                        $reject = $puname.':'.$pudom;
-                        $showsec = $pusec;
-                        if ($showsec eq '') {
-                            $showsec = &mt('none');
-                        }
-                        $namelink = &Apache::loncommon::aboutmewrapper(
-                                    &Apache::loncommon::plainname($puname,$pudom),
-                                    $puname,$pudom);
+        if (keys(%queue_by_date) > 0) {
+            if ($context eq 'course') {
+                $output .=  '<h3>'.&mt('Self-enrollment requests queued pending approval by a Coordinator').'</h3>';
+            } elsif ($context eq 'pending') {
+                $output .= '<h3>'.&mt('Requests for official courses queued pending validation').'</h3>'.
+                           '<p>'.&mt('Requests are validated against institutional data to confirm that the requestor is an instructor of record.').'<br />'.
+                           &mt('Validation is attempted when the request is submitted.').' '.&mt('If unvalidated, the request will be held in a queue.').' '.&mt('Validation of pending requests is automatically repeated daily.').'</p>';
+            } else {
+                $output .=  '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';
+            } 
+            $output .= &build_queue_display($dom,$context,\%queue_by_date).
+                       '<input type="hidden" name="queue" value="approval" />';
+        } else {
+            $output .= '<div class="LC_info">';
+            if ($context eq 'course') {
+                $output .= &mt('There are currently no enrollment requests awaiting approval.');
+            } elsif ($context eq 'pending') {
+                $output .= &mt('There are currently no requests for official courses awaiting validation.');
+            } elsif ($context eq 'domain') {
+                $output .= &mt('There are currently no course or community requests awaiting approval.');
+            }
+            $output .= '</div>'; 
+        }
+        if ($context eq 'pending') {
+            $output .= '<br /><input type="button" name="validationcheck" value="'.
+                       &mt('Validate').'" onclick="javascript:runValidation();" /><br />'."\n".
+                       '<p>'.&mt('Any course/community requests which are successfully validated will be created immediately.').' '.&mt('Unvalidated requests will be listed for manual approval/rejection.').'</p>';
+        } else {
+            $output .= '<br /><input type="submit" name="processqueue" value="'.&mt('Save').'" />';
+        }
+        $output .= '</form>';
+    } else {
+        $output .= '<div class="LC_info">';
+        if ($context eq 'course') {
+            $output .= &mt('There are currently no enrollment requests awaiting approval.');
+        } elsif ($context eq 'pending') {
+            $output .= &mt('There are currently no requests for official courses awaiting validation.');
+        } else {
+            $output .= &mt('There are currently no course or community requests awaiting approval.');
+        }
+        $output .= '</div>';
+    }
+    return $output;
+}
 
+sub build_queue_display {
+    my ($dom,$context,$queue) = @_;
+    return unless (ref($queue) eq 'HASH');
+    my %crstypes;
+    my $output =  &Apache::loncommon::start_data_table().
+                  &Apache::loncommon::start_data_table_header_row();
+    unless ($context eq 'pending') { 
+        $output .= '<th>'.&mt('Action').'</th>';
+    }
+    $output .= '<th>'.&mt('Requestor').'</th>';
+    if ($context eq 'course') {
+        $output .= '<th>'.&mt('Section').'</th>'.
+                   '<th>'.&mt('Date requested').'</th>';
+    } elsif ($context eq 'pending' || $context eq 'stillpending') {
+        $output .= '<th>'.&mt('Institutional code').'</th>'.
+                   '<th>'.&mt('Date requested').'</th>'.
+                   '<th>'.&mt('Details').'</th>';
+    } else {
+        %crstypes = &Apache::lonlocal::texthash (
+                        official   => 'Official course',
+                        unofficial => 'Unofficial course',
+                        community  => 'Community',
+                    );
+        $output .= '<th>'.&mt('Type').'</th>'.
+                   '<th>'.&mt('Date requested').'</th>'.
+                   '<th>'.&mt('Details').'</th>';
+    }
+    $output .= &Apache::loncommon::end_data_table_header_row();
+    my @sortedtimes = sort {$a <=> $b} (keys(%{$queue}));
+    my $count = 0;
+    foreach my $item (@sortedtimes) {
+        if (ref($queue->{$item}) eq 'ARRAY') {
+            foreach my $request (sort(@{$queue->{$item}})) {
+                my ($row,$approve,$reject,$showtime,$showsec,$namelink,
+                    $detailslink,$crstype,$instcode);
+                $showtime = &Apache::lonlocal::locallocaltime($item);
+                if ($context eq 'course') {
+                    my ($puname,$pudom,$pusec) = split(/:/,$request);
+                    $approve = $count.':'.$puname.':'.$pudom.':'.$pusec;
+                    $reject = $puname.':'.$pudom;
+                    $showsec = $pusec;
+                    if ($showsec eq '') {
+                        $showsec = &mt('none');
+                    }
+                    $namelink = &Apache::loncommon::aboutmewrapper(
+                                &Apache::loncommon::plainname($puname,$pudom),
+                                $puname,$pudom);
+                } else {
+                    my ($cnum,$ownername,$ownerdom,$type,$cdesc);
+                    my $queue = 'approval'; 
+                    if ($context eq 'pending' || $context eq 'stillpending') {
+                        ($cnum,$ownername,$ownerdom,$instcode,$cdesc)=split(/:/,$request,5);
+                        $queue = 'pending';                        
                     } else {
-                        my ($cnum,$ownername,$ownerdom,$type,$cdesc)=split(/:/,$request,5);
-                        $detailslink='<a href="javascript:opencoursereqdisplay('.
-                                      "'$dom','$cnum'".');">'.$cdesc.'</a>';
+                        ($cnum,$ownername,$ownerdom,$type,$cdesc)=split(/:/,$request,5);
                         $crstype = $type;
                         if (defined($crstypes{$type})) {
                             $crstype = $crstypes{$type};
                         }
-                        $approve = $count.':'.$cnum;
-                        $reject = $cnum;
-                        $namelink = &Apache::loncommon::aboutmewrapper(
-                                    &Apache::loncommon::plainname($ownername,$ownerdom),
-                                    $ownername,$ownerdom);
                     }
+                    $detailslink='<a href="javascript:opencoursereqdisplay('.
+                                  "'$dom','$cnum','$queue'".');">'.$cdesc.'</a>';
+                    $approve = $count.':'.$cnum;
+                    $reject = $cnum;
+                    $namelink = &Apache::loncommon::aboutmewrapper(
+                                &Apache::loncommon::plainname($ownername,$ownerdom),
+                                $ownername,$ownerdom);
+                }
+                unless ($context eq 'pending') {
                     $row = '<td><span class="LC_nobreak"><label>'.
                            '<input type="checkbox" value="'.$approve.'" name="approvereq" />'.&mt('Approve').'</label></span><br />'.
                            '<span class="LC_nobreak"><label>'.
-                           '<input type="checkbox" value="'.$reject.'" name="rejectreq" />'.&mt('Reject').'</label></span><br /></td>'.
-                           '<td>'.$namelink.'</td>'."\n";
-                    if ($context eq 'course') {
-                        $row .= '<td>'.$showsec.'</td>'."\n".
-                                '<td>'.$showtime.'</td>'."\n";
-                    } else { 
-                        $row .= '<td>'.$crstype.'</td>'."\n".
-                                '<td>'.$showtime.'</td>'."\n".
-                                '<td>'.$detailslink.'</td>'."\n";
-                    }
-                    $output .= &Apache::loncommon::start_data_table_row()."\n".
-                               $row.
-                               &Apache::loncommon::end_data_table_row()."\n";
-                    $count ++;
+                           '<input type="checkbox" value="'.$reject.'" name="rejectreq" />'.&mt('Reject').'</label></span><br /></td>';
                 }
+                $row .= '<td>'.$namelink.'</td>'."\n";
+                if ($context eq 'course') {
+                    $row .= '<td>'.$showsec.'</td>'."\n".
+                            '<td>'.$showtime.'</td>'."\n";
+                } else { 
+                    if ($context eq 'pending' || $context eq 'stillpending') {
+                        $row .= '<td>'.$instcode.'</td>'."\n";
+                    } else {
+                        $row .= '<td>'.$crstype.'</td>'."\n";
+                    }
+                    $row .= '<td>'.$showtime.'</td>'."\n".
+                            '<td>'.$detailslink.'</td>'."\n";
+                }
+                $output .= &Apache::loncommon::start_data_table_row()."\n".
+                           $row.
+                           &Apache::loncommon::end_data_table_row()."\n";
+                $count ++;
             }
         }
-        $output .= &Apache::loncommon::end_data_table().
-                   '<input type="submit" name="processqueue" value="'.&mt('Save').
-                   '" /></form>';
-    } else {
-        if ($context eq 'course') {
-            $output .= &mt('There are currently no enrollment requests.');
-        } else {
-            $output .= &mt('There are currently no course or community requests awaiting approval.');
-        }
     }
+    $output .= &Apache::loncommon::end_data_table();
     return $output;
 }
 
@@ -377,7 +449,7 @@
         @existing,@missingreq,@invalidusers,@limitexceeded,@completed,
         @processing_errors,@warn_approves,@warn_rejects,@approvals,@warn_dels,
         @rejections,@rejectionerrors,@nopermissions,%courseroles,
-        %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype);
+        %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue);
     @approvals = &Apache::loncommon::get_env_multiple('form.approvereq');
     @rejections = &Apache::loncommon::get_env_multiple('form.rejectreq');
     $now = time;
@@ -412,7 +484,11 @@
         $domdesc = &Apache::lonnet::domain($cdom);
         $namespace = 'courserequestqueue';
         $beneficiary = 'courserequestor';
-        %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom,'_approval');
+        $queue = 'approval';
+        if ($env{'form.queue'} eq 'pending') {
+            $queue = 'pending';
+        }
+        %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom,'_'.$queue);
         my $chome = &Apache::lonnet::domain($cdom,'primary');
         $hostname = &Apache::lonnet::hostname($chome);
         $protocol = $Apache::lonnet::protocol{$chome};
@@ -521,12 +597,12 @@
             }
         } else {
             my ($num,$cnum) = split(':',$item);
-            if (ref($requesthash{$cnum.'_approval'}) eq 'HASH') {
+            if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {
                 if (&Apache::lonnet::homeserver($cnum,$cdom) eq 'no_host') {
-                    my $ownername = $requesthash{$cnum.'_approval'}{'ownername'};
-                    my $ownerdom = $requesthash{$cnum.'_approval'}{'ownerdom'};
-                    $crstype = $requesthash{$cnum.'_approval'}{'crstype'};
-                    my $coursedesc = $requesthash{$cnum.'_approval'}{'description'};
+                    my $ownername = $requesthash{$cnum.'_'.$queue}{'ownername'};
+                    my $ownerdom = $requesthash{$cnum.'_'.$queue}{'ownerdom'};
+                    $crstype = $requesthash{$cnum.'_'.$queue}{'crstype'};
+                    my $coursedesc = $requesthash{$cnum.'_'.$queue}{'description'};
                     my $longroles = \%courseroles;
                     if ($crstype eq 'community') {
                         $longroles = \%communityroles;
@@ -552,7 +628,7 @@
                             &Apache::lonnet::restore($requestkey,'courserequests',
                                                      $ownerdom,$ownername);
                         if ((ref($history{'details'}) eq 'HASH') && 
-                            ($history{'disposition'} eq 'approval')) {
+                            ($history{'disposition'} eq $queue)) {
                             my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg);
                             my $result = &course_creation($cdom,$cnum,$context,$history{'details'},\$logmsg,
                                                       \$newusermsg,\$addresult,\$enrollcount,
@@ -565,7 +641,7 @@
                                 }
                                 push(@completed,$cnum);
                                 
-                                unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_approval'],$cdom) eq 'ok') {
+                                unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_'.$queue],$cdom) eq 'ok') {
                                     push(@warn_dels,$cnum);
                                 }
                                 &send_selfserve_notification($ownername.':'.$ownerdom,$approvedmsg,
@@ -615,7 +691,7 @@
     }
     my @changes = (@completed,@rejections);
     if ($context eq 'domain') {
-        @changes = map {$_.'_approval'} (@changes);
+        @changes = map {$_.'_'.$queue} (@changes);
     }
     if (@rejections) {
         foreach my $item (@rejections) {
@@ -638,13 +714,13 @@
                 }
             } else {
                 my $cnum = $item;
-                if (ref($requesthash{$cnum.'_approval'}) eq 'HASH') {
+                if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {
                     if (&Apache::lonnet::homeserver($cnum,$cdom) eq 'no_host') {
                         my $requestkey = $cdom.'_'.$cnum;
-                        my $ownername = $requesthash{$cnum.'_approval'}{'ownername'};
-                        my $ownerdom = $requesthash{$cnum.'_approval'}{'ownerdom'};
-                        my $coursedesc = $requesthash{$cnum.'_approval'}{'description'};
-                        $crstype = $requesthash{$cnum.'_approval'}{'crstype'};
+                        my $ownername = $requesthash{$cnum.'_'.$queue}{'ownername'};
+                        my $ownerdom = $requesthash{$cnum.'_'.$queue}{'ownerdom'};
+                        my $coursedesc = $requesthash{$cnum.'_'.$queue}{'description'};
+                        $crstype = $requesthash{$cnum.'_'.$queue}{'crstype'};
                         if ($crstype eq 'community') {
                             $rejectedmsg = $rejectionmsg{'community'};
                         } else {
@@ -657,7 +733,7 @@
                             &Apache::lonnet::restore($requestkey,'courserequests',
                                                      $ownerdom,$ownername);
                         if ((ref($history{'details'}) eq 'HASH') &&
-                            ($history{'disposition'} eq 'approval')) {
+                            ($history{'disposition'} eq $queue)) {
                             my %reqhash = (
                                             reqtime     => $history{'reqtime'},
                                             crstype     => $history{'crstype'},
@@ -682,7 +758,7 @@
                             } else {
                                 push(@warn_rejects,$cnum);
                             }
-                            unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_approval'],$cdom) eq 'ok') {
+                            unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_'.$queue],$cdom) eq 'ok') {
                                 push(@warn_dels,$cnum);
                             }
                         } else {
@@ -745,8 +821,8 @@
                     $output .= '<p>'.&mt('The following courses/communities were created:').'<ul>';
                     foreach my $cnum (@completed) {
                         my $showcourse;
-                        if (ref($requesthash{$cnum.'_approval'})) {
-                            $showcourse = $requesthash{$cnum.'_approval'}{'description'};
+                        if (ref($requesthash{$cnum.'_'.$queue})) {
+                            $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                         } else {
                             $showcourse = $cnum;
                         }
@@ -761,8 +837,8 @@
                     $output .= '<p>'.&mt('The following requests were rejected:').'<ul>';
                     foreach my $cnum (@rejections) {
                         my $showcourse;
-                        if (ref($requesthash{$cnum.'_approval'})) {
-                            $showcourse = $requesthash{$cnum.'_approval'}{'description'};
+                        if (ref($requesthash{$cnum.'_'.$queue})) {
+                            $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                         } else {
                             $showcourse = $cnum;
                         }
@@ -838,8 +914,8 @@
         $output .= '<p>'.&mt('The following course/community creation requests could not be processed because the owner does not have rights to create this type of course:').'<ul>';
         foreach my $cnum (@nopermissions) {
             my $showcourse;
-            if (ref($requesthash{$cnum.'_approval'})) {
-                $showcourse = $requesthash{$cnum.'_approval'}{'description'};
+            if (ref($requesthash{$cnum.'_'.$queue})) {
+                $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
             } else {
                 $showcourse = $cnum;
             }
@@ -858,8 +934,8 @@
             $output .= '<p>'.&mt('The following course/community creation requests could not be processed because an error occurred:').'<ul>';
             foreach my $cnum (@processing_errors) {
                 my $showcourse;
-                if (ref($requesthash{$cnum.'_approval'})) {
-                    $showcourse = $requesthash{$cnum.'_approval'}{'description'};
+                if (ref($requesthash{$cnum.'_'.$queue})) {
+                    $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                 } else {
                     $showcourse = $cnum;
                 }
@@ -872,8 +948,8 @@
         $output .= '<p>'.&mt('The following course/community creation request rejections could not be fully processed because an error occurred:').'<ul>';
         foreach my $cnum (@rejectionerrors) {
             my $showcourse;
-            if (ref($requesthash{$cnum.'_approval'})) {
-                $showcourse = $requesthash{$cnum.'_approval'}{'description'};
+            if (ref($requesthash{$cnum.'_'.$queue})) {
+                $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
             } else {
                 $showcourse = $cnum;
             }
@@ -892,8 +968,8 @@
             $output .= '<p>'.&mt("For the following course/community requests an error occurred when updating the requestor's own requests record:").'<ul>';
             foreach my $cnum (@warn_approves,@warn_rejects) {
                 my $showcourse;
-                if (ref($requesthash{$cnum.'_approval'})) {
-                    $showcourse = $requesthash{$cnum.'_approval'}{'description'};
+                if (ref($requesthash{$cnum.'_'.$queue})) {
+                    $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                 } else {
                     $showcourse = $cnum;
                 }
@@ -906,8 +982,8 @@
         $output .= '<p>'.&mt("For the following course/community requests an error occurred when removing requests for the following from the pending queue:").'<ul>';
         foreach my $cnum (@warn_dels) {
             my $showcourse;
-            if (ref($requesthash{$cnum.'_approval'})) {
-                $showcourse = $requesthash{$cnum.'_approval'}{'description'};
+            if (ref($requesthash{$cnum.'_'.$queue})) {
+                $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
             } else {
                 $showcourse = $cnum;
             }
@@ -1240,4 +1316,148 @@
     return ($storeresult,$output);
 }
 
+sub process_official_reqs {
+    my ($context,$dom) = @_;
+    my $reqsnamespace = 'courserequestqueue';
+    my %requesthash =
+        &Apache::lonnet::dump_dom($reqsnamespace,$dom,undef,'_pending');
+    my (%newcids,%longroles,%stillpending);
+    my @courseroles = ('cc','in','ta','ep','ad','st');
+    foreach my $role (@courseroles) {
+        $longroles{$role}=&Apache::lonnet::plaintext($role);
+    }
+    my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
+    my ($output,$linefeed);
+    if ($context eq 'auto') {
+        $linefeed = "\n";
+    } else {
+        $linefeed = '<br />'."\n";
+    }
+    foreach my $key (keys(%requesthash)) {
+        my ($cnum,$status) = split('_',$key);
+        next if (&Apache::lonnet::homeserver($cnum,$dom) ne 'no_host');
+        if (ref($requesthash{$key}) eq 'HASH') {
+            my $ownername = $requesthash{$key}{'ownername'};
+            my $ownerdom = $requesthash{$key}{'ownerdom'};
+            next if (&Apache::lonnet::homeserver($ownername,$ownerdom) eq 'no_host');
+            my $inststatus;
+            my %userenv =
+                &Apache::lonnet::get('environment',['inststatus'],
+                                     $ownerdom,$ownername);
+            my ($tmp) = keys(%userenv);
+            if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
+                $inststatus = $userenv{'inststatus'};
+            } else {
+                undef(%userenv);
+            }
+            my $reqkey = $dom.'_'.$cnum;
+            my %history = &Apache::lonnet::restore($reqkey,'courserequests',
+                                                   $ownerdom,$ownername);
+            if (ref($history{'details'}) eq 'HASH') {
+                my $instcode = $history{'details'}{'instcode'};
+                my $crstype = $history{'details'}{'crstype'};
+                my $reqtime = $history{'details'}{'reqtime'};
+                my $cdescr = $history{'details'}{'cdescr'};
+                my @currsec;
+                my $sections = $history{'details'}{'sections'};
+                if (ref($sections) eq 'HASH') {
+                    foreach my $i (sort(keys(%{$sections}))) {
+                        if (ref($sections->{$i}) eq 'HASH') {
+                            my $sec = $sections->{$i}{'inst'};
+                            if (!grep(/^\Q$sec\E$/,@currsec)) {
+                                push(@currsec,$sec);
+                            }
+                        }
+                    }
+                }
+                my $instseclist = join(',',@currsec);
+                my ($validationchk,$disposition,$reqstatus,$message,
+                    $validation,$validationerror);
+                $validationchk =
+                    &Apache::lonnet::auto_courserequest_validation($dom,
+                        $ownername.':'.$ownerdom,$crstype,$inststatus,
+                        $instcode,$instseclist);
+                if ($validationchk =~ /:/) {
+                    ($validation,$message) = split(':',$validationchk);
+                } else {
+                    $validation = $validationchk;
+                }
+                if ($validation =~ /^error(.*)$/) {
+                    $disposition = 'approval';
+                    $validationerror = $1;
+                } else {
+                    $disposition = $validation;
+                }
+                $reqstatus = $disposition;
+                if ($disposition eq 'process') {
+                    my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg);
+                    my $result = &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,\$newusermsg,\$addresult,\$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles);
+                    if ($result eq 'created') {
+                        $disposition = 'created';
+                        $reqstatus = 'created';
+                        push(@{$newcids{$instcode}},$dom.'_'.$cnum);
+                    }
+                } elsif ($disposition eq 'rejected') {
+                    $output .= &mt('Queued course request for [_1] submitted by [_2] with status [_3] rejected when validating.',$instcode,$ownername.':'.$ownerdom,$inststatus).$linefeed;
+                } elsif ($disposition eq 'approval') {
+                    $output .= &mt('Queued course request for [_1] submitted by [_2] with status [_3] switched to "approval by DC" because of validation error: [_4].',$instcode,$ownername.':'.$ownerdom,$inststatus,$validationerror).$linefeed;
+
+                    my $requestid = $cnum.'_'.$disposition;
+                    my $request = {
+                            $requestid => {
+                                            timestamp   => $reqtime,
+                                            crstype     => $crstype,
+                                            ownername   => $ownername,
+                                            ownerdom    => $ownerdom,
+                                            description => $cdescr,
+                                          },
+                          };
+                    my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request,$dom);
+                    unless ($putresult eq 'ok') {
+                        $output .= &mt("An error occurred saving the modified course request for [_1] submitted by [_2] in the domain's courserequestqueue.db.",$instcode,$ownername.':'.$ownerdom).$linefeed;
+                    }
+                } elsif ($disposition eq 'pending') {
+                    my $instcode = $requesthash{$key}{'instcode'};
+                    my $description = $requesthash{$key}{'description'};
+                    my $timestamp = $requesthash{$key}{'timestamp'};
+                    my $entry = $cnum.':'.$ownername.':'.$ownerdom.':'.
+                                $instcode.':'.$description;
+                    if (ref($stillpending{$timestamp}) eq 'ARRAY') {
+                        push(@{$stillpending{$timestamp}},$entry);
+                    } else {
+                        $stillpending{$timestamp} = [$entry];
+                    }
+                }
+                unless ($disposition eq 'pending') {
+                    my ($statusresult,$output) =
+                        &update_coursereq_status(\%requesthash,$dom,$cnum,
+                                                 $reqstatus,'domain');
+                    unless (&Apache::lonnet::del_dom($reqsnamespace,[$cnum.'_pending'],$dom) eq 'ok') {
+                        $output .= &mt('An error occurred when removing the request for [_1] submitted by [_2] from the pending queue.',$instcode,$ownername.':'.$ownerdom).$linefeed;
+                    }
+                }
+            }
+        }
+    }
+    foreach my $key (sort(keys(%newcids))) {
+        if (ref($newcids{$key}) eq 'ARRAY') {
+            $output .= "created course from queued request: $key - ".join(', ',@{$newcids{$key}}).$linefeed;
+            my $newcourse = &LONCAPA::escape($key.':'.$newcids{$key});
+        }
+    }
+    unless ($context eq 'auto') {
+        if (keys(%stillpending) > 0) {
+            $output .= '<form method="post" name="changequeue" action="/adm/createcourse" />'."\n".
+                       '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".
+                       '<input type="hidden" name="phase" value="requestchange" />'.
+                       '<p>'.&mt('For the following requests, the requestor could [_1]not[_2] be validated as official course personnel, so the request remains in the pending queue.','<b>','</b>').'<br />'.&mt('Requests may be left in the queue, or you can manually approve or reject them.').'</p>'.
+                       &build_queue_display($dom,'stillpending',\%stillpending).
+                       '<br /><input type="hidden" name="queue" value="pending" />'."\n".
+                       '<input type="submit" name="processqueue" value="'.&mt('Save').'" />'.
+                       '</form>';
+        }
+    }
+    return $output;
+}
+
 1;

--raeburn1269962632--