--- loncom/interface/loncoursequeueadmin.pm	2011/11/30 12:31:00	1.29
+++ loncom/interface/loncoursequeueadmin.pm	2012/08/14 15:45:06	1.30
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Utilities to administer domain course requests and course self-enroll requests
 #
-# $Id: loncoursequeueadmin.pm,v 1.29 2011/11/30 12:31:00 goltermann Exp $
+# $Id: loncoursequeueadmin.pm,v 1.30 2012/08/14 15:45:06 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -96,13 +96,22 @@ sub send_selfserve_notification {
         $rawsubj = 'Self-enrollment requests processed';
         push(@rawmsg,{
                       mt => 'Enrollment requests in the following course: [_1] have been processed.',
-                      args => ["\n  $contextdesc"],
+                      args => ["\n$contextdesc"],
                      });
     } elsif ($context eq 'domainmanagers') {
         $rawsubj = 'Course/Community requests reviewed';
         push(@rawmsg,{
                       mt  => 'Course/Community creation requests in the following domain: [_1] have been reviewed.',
-                      args => ["\n  $contextdesc"],
+                      args => ["\n$contextdesc"],
+                     });
+        if (ref($textstr) eq 'ARRAY') {
+            push(@rawmsg,@{$textstr});
+        }
+    } elsif ($context eq 'authormanagers') {
+        $rawsubj = 'Authoring space requests reviewed';
+        push(@rawmsg,{
+                      mt  => 'Authoring requests in the following domain: [_1] have been reviewed.',
+                      args => ["\n$contextdesc"],
                      });
         if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});
@@ -185,7 +194,28 @@ sub send_selfserve_notification {
                       mt   => $directions,
                       args => ["  \n\n","\n"],
                      });
+    } elsif ($context eq 'authorreq') {
+        $rawsubj = 'Authoring space request to review';
+        $msgtxt = 'Assignment of an author role in the [_1] domain[_2] was requested by [_3] on [_4].';
+        push(@rawmsg,{
+                      mt  => $msgtxt,
+                      args => [$contextdesc,"\n",$textstr,$timestamp],
+                     },
+                     {
+                      mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Create users or modify the roles and privileges of users -> Authoring space reqests[_3]to display a list of pending requests, which you can either approve or reject.',
+                      args => ["\n","\n\n  ","\n\n"],
+                     });
 
+    } elsif ($context eq 'requestauthor') {
+        $rawsubj = 'Authoring space request';
+        $msgtxt = 'Your request for an authoring space requested on [_1]has been reviewed by a Domain Coordinator.';
+        push(@rawmsg,{
+                      mt  => $msgtxt,
+                      args => [$timestamp."\n"],
+                     });
+        if (ref($textstr) eq 'ARRAY') {
+            push(@rawmsg,@{$textstr});
+        }
     }
     my @to_notify = split(/,/,$notifylist);
     my $numsent = 0;
@@ -250,6 +280,13 @@ sub send_selfserve_notification {
             if ($rejectedlist) {
                 $message .= "\n\n".&Apache::lonlocal::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;
+            }
+            if ($rejectedlist) {
+                $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected author role requests:')."\n".$rejectedlist;
+            }
         }
         $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,\%sentmessage,undef,undef,undef,1,$recipid).',';
     }
@@ -265,6 +302,11 @@ sub display_queued_requests {
         $namespace = 'selfenrollrequests';
         %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);
         $nextelement = '<input type="hidden" name="state" value="done" />';
+    } elsif ($context eq 'requestauthor') {
+        $formaction = '/adm/createuser';
+        $namespace = 'requestauthorqueue';
+        %requesthash = &Apache::lonnet::dump_dom($namespace,$dom);
+        $nextelement = '<input type="hidden" name="state" value="done" />';
     } else {
         $formaction = '/adm/createcourse';
         $namespace = 'courserequestqueue';
@@ -287,6 +329,9 @@ sub display_queued_requests {
             if ($context eq 'course') {
                 ($timestamp, my $usec) = split(/:/,$requesthash{$item});
                 $entry = $item.':'.$usec;
+            } elsif ($context eq 'requestauthor') {
+                $timestamp = $requesthash{$item};
+                ($entry) = ($item =~ /^($match_username)_approval$/);
             } else {
                 $timestamp = $requesthash{$item}{'timestamp'};
                 if (ref($requesthash{$item}) eq 'HASH') {
@@ -316,8 +361,10 @@ sub display_queued_requests {
                 $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>';
+            } elsif ($context eq 'requestauthor') {
+                $output .= '<h3>'.&mt('Requests for authoring space queued pending approval by a Domain Coordinator').'</h3>';
             } else {
-                $output .=  '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';
+                $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" />';
@@ -327,6 +374,8 @@ sub display_queued_requests {
                 $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 'requestauthor') {
+                $output .= &mt('There are currently no requests for authoring space awaiting approval.');
             } elsif ($context eq 'domain') {
                 $output .= &mt('There are currently no course or community requests awaiting approval.');
             }
@@ -367,6 +416,8 @@ sub build_queue_display {
     if ($context eq 'course') {
         $output .= '<th>'.&mt('Section').'</th>'.
                    '<th>'.&mt('Date requested').'</th>';
+    } elsif ($context eq 'requestauthor') {
+        $output .= '<th>'.&mt('Date requested').'</th>';
     } elsif ($context eq 'pending' || $context eq 'stillpending') {
         $output .= '<th>'.&mt('Institutional code').'</th>'.
                    '<th>'.&mt('Date requested').'</th>'.
@@ -401,6 +452,14 @@ sub build_queue_display {
                     $namelink = &Apache::loncommon::aboutmewrapper(
                                 &Apache::loncommon::plainname($puname,$pudom),
                                 $puname,$pudom);
+                } elsif ($context eq 'requestauthor') {
+                    if (&Apache::lonnet::homeserver($request,$dom) ne 'no_host') {
+                        $approve = $count.':'.$request;
+                        $reject = $request; 
+                        $namelink = &Apache::loncommon::aboutmewrapper(
+                                    &Apache::loncommon::plainname($request,$dom),
+                                    $request,$dom);
+                    }
                 } else {
                     my ($cnum,$ownername,$ownerdom,$type,$cdesc);
                     my $queue = 'approval'; 
@@ -424,9 +483,10 @@ sub build_queue_display {
                 }
                 unless ($context eq 'pending') {
                     $row = '<td><span class="LC_nobreak"><label>'.
-                           '<input type="radio" value="'.$approve.'" name="'.$count.'radioreq" />'.&mt('Approve').'</label></span>'.
-                           '<span class="LC_nobreak"><label>'.
-                           '<input type="radio" value="'.$reject.'" name="'.$count.'radioreq" />'.&mt('Reject').'</label></span>'.
+                           '<input type="radio" value="'.$approve.'" name="'.$count.'radioreq" />'.&mt('Approve').'</label>'.
+                           '<label>'.('&nbsp;'x2).
+                           '<input type="radio" value="'.$reject.'" name="'.$count.'radioreq" />'.&mt('Reject').'</label>'.
+                           '<label>'.('&nbsp;'x2).
                            '<input type="radio" value="'."later:".$reject.'" name="'.$count.'radioreq" checked />'.&mt('Decide Later').
                            '</label></span><br /></td>';
                 }
@@ -434,6 +494,8 @@ sub build_queue_display {
                 if ($context eq 'course') {
                     $row .= '<td>'.$showsec.'</td>'."\n".
                             '<td>'.$showtime.'</td>'."\n";
+                } elsif ($context eq 'requestauthor') {
+                    $row .= '<td>'.$showtime.'</td>'."\n";
                 } else { 
                     if ($context eq 'pending' || $context eq 'stillpending') {
                         $row .= '<td>'.$instcode.'</td>'."\n";
@@ -461,8 +523,9 @@ sub update_request_queue {
         $sender,$approvedmsg,$rejectedmsg,$beneficiary,
         @existing,@missingreq,@invalidusers,@limitexceeded,@completed,
         @processing_errors,@warn_approves,@warn_rejects,@approvals,@warn_dels,
-        @rejections,@rejectionerrors,@nopermissions,%courseroles,
-        %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,$firsturl);
+        @rejections,@rejectionerrors,@nopermissions,%courseroles,@toremove,
+        %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,
+        $firsturl);
     my $count=0;
     while (my @course = &Apache::loncommon::get_env_multiple('form.'.$count.'radioreq')) {
         if (@course[0] =~ /^\d+:.*/) {
@@ -474,7 +537,6 @@ sub update_request_queue {
         }
         $count+=1;
     }
-    
 
     $now = time;
     $sender = $env{'user.name'}.':'.$env{'user.domain'};
@@ -501,6 +563,29 @@ sub update_request_queue {
         $rejectedmsg =  [{
                             mt => 'Your request for enrollment has not been approved.',
                         }];
+    } elsif ($context eq 'requestauthor') {
+        $namespace = 'requestauthorqueue';
+        $beneficiary = 'requestauthor';
+        %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom);
+        my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
+        if (ref($domdefs{'requestauthor'}) eq 'HASH') {
+            if (ref($domdefs{'requestauthor'}{'notify'}) eq 'HASH') {
+                $notifylist = $domdefs{'requestauthor'}{'notify'}{'approval'};
+            }
+        }
+        my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
+        $firsturl = &course_portal_url($domconfiguser,$cdom);
+        $approvedmsg = [{
+                            mt => 'Your request for authoring space has been approved.',
+                        },
+                        {
+                            mt   => 'Visit [_1] to log-in and select your author role',
+                            args => [$firsturl],
+                        }];
+        $rejectedmsg =  [{
+                            mt => 'Your request for authoring space has not been approved.',
+                        }];
+        $domdesc = &Apache::lonnet::domain($cdom);
     } else {
         $domdesc = &Apache::lonnet::domain($cdom);
         $namespace = 'courserequestqueue';
@@ -551,7 +636,6 @@ sub update_request_queue {
         foreach my $role (@roles) {
             $communityroles{$role}=&Apache::lonnet::plaintext($role,'Community');
         }
-
     }
     foreach my $item (sort {$a <=> $b} @approvals) {
         if ($context eq 'course') {
@@ -613,6 +697,50 @@ sub update_request_queue {
             } else {
                 push(@invalidusers,$uname.':'.$udom);
             }
+        } elsif ($context eq 'requestauthor') {
+            my ($num,$uname) = split(/:/,$item);
+            my $uhome = &Apache::lonnet::homeserver($uname,$cdom);
+            if ($uhome ne 'no_host') {
+                my ($user_is_adv,$user_is_author) = &Apache::lonnet::is_advanced_user($cdom,$uname);
+                if ($user_is_author) {
+                    push(@existing,$uname);
+                } elsif (&Apache::lonnet::usertools_access($uname,$cdom,'requestauthor',
+                                                           undef,'requestauthor')) {
+                    if (&Apache::lonnet::allowed('cau',$cdom)) {
+                        if (&Apache::lonnet::assignrole($cdom,$uname,'/'.$cdom.'/','au',undef,time,undef,undef,'requestauthor') eq 'ok') {
+                            push(@completed,$uname);
+                            unless (&Apache::lonnet::del_dom($namespace,[$uname.'_approval'],$cdom) eq 'ok') {
+                                push(@warn_dels,$uname);
+                            }
+                            &send_selfserve_notification($uname.':'.$cdom,
+                                                         $approvedmsg,undef,undef,$now,
+                                                         $beneficiary,$sender);
+                            my %userrequest = (
+                                author => {
+                                          timestamp   => $now,
+                                          adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
+                                          status      => 'approved',
+                                        },
+                                author_status => 'approved',
+                            );
+                            my $userresult =
+                                &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$uname);
+                            if ($userresult ne 'ok') {
+                                push(@warn_approves,$item);
+                            }
+                        } else {
+                            push(@processing_errors,$uname);
+                        }
+                    } else {
+                        push(@nopermissions,$uname);
+                    }
+                } else {
+                    push(@nopermissions,$uname);
+                }
+            } else {
+                push(@invalidusers,$uname.':'.$cdom);
+            }
+            push(@toremove,(@invalidusers,@nopermissions));
         } else {
             my ($num,$cnum) = split(':',$item);
             if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {
@@ -717,26 +845,40 @@ sub update_request_queue {
     my @changes = (@completed,@rejections);
     if ($context eq 'domain') {
         @changes = map {$_.'_'.$queue} (@changes);
+    } elsif ($context eq 'requestauthor') {
+        @changes = map {$_.'_approval'} (@changes);
     }
     if (@rejections) {
         foreach my $item (@rejections) {
-            if ($context eq 'course') {
-                my $user = $item;
+            if (($context eq 'course') || ($context eq 'requestauthor')) {
+                my ($user,$uname,$udom,%userrequest,$key);
+                if ($context eq 'requestauthor') {
+                    $uname = $item;
+                    $udom = $cdom;
+                    $user = $uname.':'.$udom;
+                    $key = 'author';
+                } else {
+                    $user = $item;
+                    ($uname,$udom) = split(/:/,$user);
+                    $key = $cdom.'_'.$cnum;
+                }
                 &send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,
                                              $now,$beneficiary,$sender,undef,undef,
                                              $crstype);
-                my ($uname,$udom) = split(/:/,$user);
-                my %userrequest = (
-                    $cdom.'_'.$cnum => {
+                %userrequest = (
+                    $key => {
                         timestamp   => $now,
                         adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
-                        status      => 'rejected',
+                        status      => 'rejection',
                     }
                 );
+                if ($context eq 'requestauthor') {
+                    $userrequest{'author_status'} = 'rejection';  
+                }
                 my $userresult =
-                    &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);
+                    &Apache::lonnet::put('requestauthor',\%userrequest,$udom,$uname);
                 if ($userresult ne 'ok') {
-                    push(@warn_rejects,$user);
+                    push(@warn_rejects,$item);
                 }
             } else {
                 my $cnum = $item;
@@ -799,6 +941,21 @@ sub update_request_queue {
             }
         }
     }
+    if (@toremove) {
+        foreach my $item (@toremove) {
+            my %userrequest = (
+                author => {
+                            timestamp   => $now,
+                            adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
+                            status      => 'deleted',
+                          },
+                          author_status => 'deleted',
+            );
+            &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$item);
+        }
+        @toremove = map {$_.'_approval'} (@toremove);
+        my $delresult = &Apache::lonnet::del_dom($namespace,\@toremove,$cdom);
+    }
     if (@changes) {
         my $delresult;
         if ($context eq 'course') {
@@ -840,6 +997,34 @@ sub update_request_queue {
                                                  $now,'coursemanagers',$sender,
                                                  $approvedlist,$rejectedlist,$crstype);
                 }
+            } elsif ($context eq 'requestauthor') {
+                $chgmsg = "'Action was taken on the following authoring space requests by [_1].',$namelink";
+                if (@completed) {
+                    $approvedlist = join("\n",@completed);
+                    $output .= '<p>'.&mt('The following requests were approved:').'<ul>';
+                    foreach my $uname (@completed) {
+                        my $userlink =
+                            &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+                        $output .= '<li>'.$userlink.'</li>';
+                        
+                    }
+                    $output .= '</ul></p>';
+                }
+                if (@rejections) {
+                    $rejectedlist = join("\n",@rejections);
+                    $output .= '<p>'.&mt('The following requests were rejected:').'<ul>';
+                    foreach my $uname (@rejections) {
+                        my $userlink =
+                            &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+                        $output .= '<li>'.$userlink.'</li>';
+                    }
+                    $output .= '</ul></p>';
+                }
+                if ($notifylist ne '') {
+                    &send_selfserve_notification($notifylist,$chgmsg,undef,$domdesc,
+                                                 $now,'authormanagers',$sender,
+                                                 $approvedlist,$rejectedlist);
+                }
             } else {
                 $chgmsg = "'Action was taken on the following course and community requests by [_1].',$namelink";
                 if (@completed) {
@@ -887,6 +1072,14 @@ sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';
             }
             $output .= '</ul></p>';
+        } elsif ($context eq 'requestauthor') {
+            $output .= '<p>'.&mt('Authoring space requests from the following users were deleted because one already exists:').'<ul>';
+            foreach my $uname (@existing) {
+                my $userlink =
+                    &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+                $output .= '<li>'.$userlink.'</li>';
+            }
+            $output .= '</ul></p>';
         } else {
             $output .= '<p>'.&mt('The following course/community creation requests were deleted because the course or community has already been created:').'<ul>';
             foreach my $cnum (@existing) {
@@ -909,13 +1102,20 @@ sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';
             }
             $output .= '</ul></p>';
+        } elsif ($context eq 'requestauthor') {
+            $output .= '<p>'.&mt('The following requests were ignored because the request is no longer in the queue:').'<ul>';
+            foreach my $uname (@missingreq) {
+                my $userlink =
+                    &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+                $output .= '<li>'.$userlink.'</li>';
+            }
+            $output .= '</ul></p>';
         } else {
             $output .= '<p>'.&mt('The following course/community creation requests were ignored because the request is no longer in the queue:').'<ul>';
             foreach my $cnum (@missingreq) {
                 $output .= '<li>'.$cnum.'</li>';
             }
             $output .= '</ul></p>';
-
         }
     }
     if (@invalidusers) {
@@ -925,6 +1125,14 @@ sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';
             }
             $output .= '</ul></p>';
+        } elsif ($context eq 'requestauthor') {
+            $output .= '<p>'.&mt('The following authoring space requests were deleted because the requestor does not have a LON-CAPA account:').'<ul>';
+            foreach my $uname (@invalidusers) {
+                my $userlink =
+                    &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+                $output .= '<li>'.$userlink.'</li>';
+            }
+            $output .= '</ul></p>';
         }
     }
     if (@limitexceeded) {
@@ -937,17 +1145,27 @@ sub update_request_queue {
         }
     }
     if (@nopermissions) {
-        $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.'_'.$queue})) {
-                $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
-            } else {
-                $showcourse = $cnum;
+        if ($context eq 'course') {
+            $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.'_'.$queue})) {
+                    $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
+                } else {
+                    $showcourse = $cnum;
+                }
+                $output .= '<li>'.$showcourse.'</li>';
             }
-            $output .= '<li>'.$showcourse.'</li>';
+            $output .= '</ul></p>';
+        } elsif ($context eq 'requestauthor') {
+            $output .= '<p>'.&mt('The following requests could not be processed because the requestor does not have rights to request an authoring space:').'<ul>';
+            foreach my $uname (@nopermissions) {
+                my $userlink =
+                    &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+                $output .= '<li>'.$userlink.'</li>';
+            }
+            $output .= '</ul></p>';
         }
-        $output .= '</ul></p>';
     }
     if (@processing_errors) {
         if ($context eq 'course') {
@@ -956,6 +1174,14 @@ sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';
             }
             $output .= '</ul></p>';
+        } elsif ($context eq 'requestauthor') {
+            $output .= '<p>'.&mt('The following requests could not be processed because an error occurred:').'<ul>';
+            foreach my $uname (@processing_errors) {
+                my $userlink =
+                    &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+                $output .= '<li>'.$userlink.'</li>';
+            }
+            $output .= '</ul></p>';
         } else {
             $output .= '<p>'.&mt('The following course/community creation requests could not be processed because an error occurred:').'<ul>';
             foreach my $cnum (@processing_errors) {
@@ -990,6 +1216,14 @@ sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';
             }
             $output .= '</ul></p>';
+        } elsif ($context eq 'requestauthor') {
+            $output .= '<p>'.&mt("For the following users, an error occurred when updating the user's own author request record:").'<ul>';
+            foreach my $uname (@warn_approves,@warn_rejects) {
+                my $userlink =
+                    &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+                $output .= '<li>'.$userlink.'</li>';
+            }
+            $output .= '</ul></p>';
         } else {
             $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) {
@@ -1005,17 +1239,27 @@ sub update_request_queue {
         }
     }
     if (@warn_dels) {
-        $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.'_'.$queue})) {
-                $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
-            } else {
-                $showcourse = $cnum;
+        if ($context eq 'requestauthor') {
+            $output .= '<p>'.&mt("For the following requests an error occurred when removing the request from the queue:").'<ul>';
+            foreach my $uname (@warn_dels) {
+                my $userlink =
+                    &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+                $output .= '<li>'.$userlink.'</li>';
             }
-            $output .= '<li>'.$showcourse.'</li>';
+            $output .= '</ul></p>';
+        } else {
+            $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.'_'.$queue})) {
+                    $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
+                } else {
+                    $showcourse = $cnum;
+                }
+                $output .= '<li>'.$showcourse.'</li>';
+            }
+            $output .= '</ul></p>';
         }
-        $output .= '</ul></p>';
     }
     return $output;
 }
@@ -1186,70 +1430,82 @@ sub can_clone_course {
 }
 
 sub get_processtype {
-    my ($uname,$udom,$isadv,$dom,$crstype,$inststatuses,$domconfig) = @_;
+    my ($context,$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) {
+    my (%userenv,%settings,$val,@options,$envkey);
+    if ($context eq 'course') {
+        @options = ('autolimit','validate','approval');
+        $envkey = 'requestcourses.'.$crstype;
+        if (ref($domconfig->{'requestcourses'}) eq 'HASH') {
+            if (ref($domconfig->{'requestcourses'}->{$crstype}) eq 'HASH') {
+                %settings = %{$domconfig->{'requestcourses'}->{$crstype}};
+            }
+        }
+    } else {
+        @options = ('automatic','approval');
+        $envkey = 'requestauthor';
+        if (ref($domconfig->{'requestauthor'}) eq 'HASH') { 
+            %settings = %{$domconfig->{'requestauthor'}};
+        }
+    }
+    if (($dom eq $udom) || ($context eq 'requestauthor')) {
         %userenv =
-            &Apache::lonnet::userenvironment($udom,$uname,'requestcourses.'.$crstype,'inststatus');
-        if ($userenv{'requestcourses.'.$crstype}) {
-            $val = $userenv{'requestcourses.'.$crstype};
+            &Apache::lonnet::userenvironment($udom,$uname,$envkey,'inststatus');
+        if ($userenv{$envkey}) {
+            $val = $userenv{$envkey};
             @{$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 %alltasks;
+            if (($isadv) && ($settings{'_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{$status})) {
+                        my $value = $settings{$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;
-                                }
+                    }
+                }
+                my $maxlimit = 0;
+                if ($context eq 'course') {
+                    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 (($context eq 'requestauthor') || (!$val)) {
+                    if ($context eq 'course' && $maxlimit) {
+                        $val = 'autolimit='.$maxlimit;
+                    } else {
+                        foreach my $option (@options) {
+                            if ($alltasks{$option}) {
+                                $val = $option;
+                                last;
                             }
                         }
                     }