Diff for /loncom/interface/loncoursequeueadmin.pm between versions 1.12.2.3 and 1.52.2.3.2.4

version 1.12.2.3, 2009/12/20 02:05:57 version 1.52.2.3.2.4, 2021/06/20 18:37:35
Line 1 Line 1
 # The LearningOnline Network  # The LearningOnline Network
 # Utilities to administer domain course requests and course self-enroll requests   # Utilities to administer domain course requests and course self-enroll requests
 #  #
 # $Id$  # $Id$
 #  #
Line 27 Line 27
 #  #
 ###  ###
   
   =pod
   
 =head1 NAME  =head1 NAME
   
 Apache::loncoursequeueadmin.pm  Apache::loncoursequeueadmin.pm
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 Adminitsration utilities used by domain coordinators for queued course creation requests, and by course coordinators for queued self-enrollment requests.  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.  
   
 This is part of the LearningOnline Network with CAPA project  This is part of the LearningOnline Network with CAPA project
 described at http://www.lon-capa.org.  described at http://www.lon-capa.org.
Line 46  described at http://www.lon-capa.org. Line 50  described at http://www.lon-capa.org.
   
 =item display_queued_requests()  =item display_queued_requests()
   
   =item build_queue_display()
   
 =item update_request_queue()  =item update_request_queue()
   
 =item get_student_counts()  =item get_student_counts()
   
   =item course_creation()
   
   =item build_batchcreatehash()
    
   =item can_clone_course()
   
   =item get_processtype()
   
   =item queued_selfenrollment()
   
   =item update_coursereq_status()
   
   =item process_official_reqs()
   
   =item is_active_author()
   
   =item author_prompt()
   
   =item reqauthor_check()
   
   =item process_reqauthor()
   
 =back  =back
   
 =cut  =cut
Line 57  described at http://www.lon-capa.org. Line 85  described at http://www.lon-capa.org.
 package Apache::loncoursequeueadmin;  package Apache::loncoursequeueadmin;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonmsg;  use Apache::lonmsg;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonuserutils;  use Apache::lonuserutils;
 use LONCAPA;  use LONCAPA::batchcreatecourse;
   use LONCAPA qw(:DEFAULT :match);
   
 sub send_selfserve_notification {  sub send_selfserve_notification {
     my ($notifylist,$textstr,$cid,$contextdesc,$timestamp,$context,$sender,      my ($notifylist,$textstr,$cid,$contextdesc,$timestamp,$context,$sender,
Line 71  sub send_selfserve_notification { Line 99  sub send_selfserve_notification {
 # FIXME locallocaltime needs to be able to take $sender_lh as an argument  # FIXME locallocaltime needs to be able to take $sender_lh as an argument
 #       so this can be localized to the recipients date display format/time zone  #       so this can be localized to the recipients date display format/time zone
     $timestamp =&Apache::lonlocal::locallocaltime($timestamp);      $timestamp =&Apache::lonlocal::locallocaltime($timestamp);
     my $msgcc;      my ($msgcc,$rawsubj,@rawmsg,$subject,$message,$reviewer,$msgtxt);
     my ($rawsubj,@rawmsg,$subject,$message,$reviewer,$msgtxt);      my ($senderuname,$senderudom) = split(':',$sender);
     if ($context eq 'coursemanagers') {      if ($context eq 'coursemanagers') {
         $rawsubj = 'Self-enrollment requests processed';          $rawsubj = 'Self-enrollment requests processed';
         push(@rawmsg,{          push(@rawmsg,{
                       mt => 'Enrollment requests in the following course: [_1] have been processed.',                        mt => 'Enrollment requests in the following course: [_1] have been processed.',
                       args => ["\n  $contextdesc"],                        args => ["\n$contextdesc\n"],
                      });                       });
     } elsif ($context eq 'domainmanagers') {      } elsif ($context eq 'domainmanagers') {
         $rawsubj = 'Course/Community requests reviewed';          $rawsubj = 'Course/Community requests reviewed';
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Course/Community creation requests in the following domain: [_1] have been reviewed.',                        mt  => 'Course/Community creation requests in the following domain: [_1] have been reviewed.',
                       args => ["\n  $contextdesc"],                        args => ["\n$contextdesc\n"],
                        });
           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\n"],
                        });
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'usernamemanagers') {
           $rawsubj = 'LON-CAPA account requests reviewed';
           push(@rawmsg,{
                         mt  => 'Account requests in the following domain: [_1] have been reviewed.',
                         args => ["\n$contextdesc\n"],
                      });                       });
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
Line 119  sub send_selfserve_notification { Line 165  sub send_selfserve_notification {
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
         }          }
       } elsif ($context eq 'pendingrequestor') {
           if ($crstype eq 'Community') {
               $rawsubj = 'Community request';
           } else {
               $rawsubj = 'Processed course request';
           }
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
     } elsif ($context eq 'coursereq') {      } elsif ($context eq 'coursereq') {
         if ($crstype eq 'community') {          if ($crstype eq 'community') {
             $rawsubj = 'Community request to review';              $rawsubj = 'Community request to review';
Line 133  sub send_selfserve_notification { Line 188  sub send_selfserve_notification {
                      },                       },
                      {                       {
                       mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Course and community creation -> Approve or reject requests[_3]to display a list of pending requests, which you can either approve or reject.',                        mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Course and community creation -> Approve or reject requests[_3]to display a list of pending requests, which you can either approve or reject.',
                       args => ["\n","\n\n  ","\n\n"],                        args => ["\n","\n\n","\n\n"],
                      });                       });
     } elsif ($context eq 'selfenrollreq') {      } elsif ($context eq 'selfenrollreq') {
         $rawsubj = 'Self-enrollment request';          $rawsubj = 'Self-enrollment request';
         if ($crstype eq 'community') {          if ($crstype eq 'community') {
             $msgtxt = 'Enrollment in the following community: [_1] was requested by [_2] on [_3].'              $msgtxt = 'Enrollment in the following community: [_1]was requested by [_2] on [_3].'
         } else {          } else {
             $msgtxt = 'Enrollment in the following course: [_1] was requested by [_2] on [_3].'              $msgtxt = 'Enrollment in the following course: [_1]was requested by [_2] on [_3].'
         }          }
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => $msgtxt,                        mt  => $msgtxt,
Line 157  sub send_selfserve_notification { Line 212  sub send_selfserve_notification {
                       mt   => $directions,                        mt   => $directions,
                       args => ["  \n\n","\n"],                        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 requests[_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});
           }
       } elsif ($context eq 'usernamereq') {
           $rawsubj = 'LON-CAPA account request';
           $msgtxt = 'Creation of a LON-CAPA account 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
    -> LON-CAPA account requests[_3]to display a list of pending requests, which you can either approve or reject.',
                         args => ["\n","\n\n  ","\n\n"],
                        });
       } elsif ($context eq 'requestusername') {
           $rawsubj = 'LON-CAPA account request';
           $msgtxt = 'Your request for a LON-CAPA account 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});
           }
       } elsif ($context eq 'uniquecode') {
           $rawsubj = 'Course Identifier';
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'queuedcrsreq') {
           $rawsubj = 'Course Request Queued';
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'createdcrsreq') {
           $rawsubj = 'Course Creation Information';
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
     }      }
     my @to_notify = split(/,/,$notifylist);      my @to_notify = split(/,/,$notifylist);
     my $numsent = 0;      my $numsent = 0;
Line 175  sub send_selfserve_notification { Line 287  sub send_selfserve_notification {
     my %reciphash = (      my %reciphash = (
                      cc => $msgcc,                       cc => $msgcc,
     );      );
     my ($uname,$udom);      my ($uname,$udom,$need_temp_env);
     if ($sender =~ /:/) {      if ($sender =~ /:/) {
         ($uname,$udom) = split(/:/,$sender);          ($uname,$udom) = split(/:/,$sender);
           if ($context eq 'usernamereq') {
               unless ($env{'user.name'} && $env{'user.domain'}) {
                   $need_temp_env = 1;
               }
           }
     } elsif ($context eq 'course') {      } elsif ($context eq 'course') {
         $uname = $sender;          $uname = $sender;
         my %courseinfo = &Apache::lonnet::coursedescription($cid);          my %courseinfo = &Apache::lonnet::coursedescription($cid);
Line 187  sub send_selfserve_notification { Line 304  sub send_selfserve_notification {
     my $stamp = time;      my $stamp = time;
     my $msgcount = &Apache::lonmsg::get_uniq();      my $msgcount = &Apache::lonmsg::get_uniq();
     my $sender_lh = &Apache::loncommon::user_lang($uname,$udom,$cid);      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 = '';      $message = '';
     foreach my $item (@rawmsg) {      foreach my $item (@rawmsg) {
         if (ref($item) eq 'HASH') {          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,\@recusers,\@recudoms);      &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$uname,$udom,$msgcount,$cid,$$,$message,
                                          \@recusers,\@recudoms,undef,undef,undef,undef,$senderuname,$senderudom);
     my ($recipid,$recipstatus) = &Apache::lonmsg::store_recipients($subject,$uname,$udom,\%reciphash);      my ($recipid,$recipstatus) = &Apache::lonmsg::store_recipients($subject,$uname,$udom,\%reciphash);
     my $status;      my $status;
       if ($need_temp_env) {
           $env{'user.name'} = $uname;
           $env{'user.domain'} = $udom;
       }
     foreach my $recip (sort(keys(%{$msgcc}))) {      foreach my $recip (sort(keys(%{$msgcc}))) {
         my ($ccname,$ccdom) = split(/:/,$recip);          my ($ccname,$ccdom) = split(/:/,$recip);
         my $recip_lh = &Apache::loncommon::user_lang($ccname,$ccdom,$cid);          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 = '';          my $message = '';
         foreach my $item (@rawmsg) {          foreach my $item (@rawmsg) {
             if (ref($item) eq 'HASH') {              if (ref($item) eq 'HASH') {
                 $message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt},                  $message .= &mt_user($sender_lh,$item->{mt},
                                                        @{$item->{args}})."\n";                                       @{$item->{args}})."\n";
             }              }
         }          }
         if ($context eq 'coursemanagers') {          if ($context eq 'coursemanagers') {
             if ($approvedlist) {              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) {              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') {          } elsif ($context eq 'domainmanagers') {
             if ($approvedlist) {              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) {              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".&mt_user($sender_lh,'Approved author role requests:')."\n".$approvedlist;
               }
               if ($rejectedlist) {
                   $message .= "\n\n".&mt_user($sender_lh,'Rejected author role requests:')."\n".$rejectedlist;
               }
           } elsif ($context eq 'usernamemanagers') {
               if ($approvedlist) {
                   $message .= "\n\n".&mt_user($sender_lh,'Approved LON-CAPA account requests:')."\n".$approvedlist;
               }
               if ($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,\%sentmessage,undef,undef,undef,1,$recipid).',';          $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,
                                                       \%sentmessage,undef,undef,undef,1,$recipid).',';
     }      }
     $status =~ s/,$//;      $status =~ s/,$//;
       if ($need_temp_env) {
           undef($env{'user.name'});
           undef($env{'user.domain'});
       }
     return ($recipstatus,$status);      return ($recipstatus,$status);
 }  }
   
Line 237  sub display_queued_requests { Line 378  sub display_queued_requests {
         $namespace = 'selfenrollrequests';          $namespace = 'selfenrollrequests';
         %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);          %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);
         $nextelement = '<input type="hidden" name="state" value="done" />';          $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" />';
       } elsif ($context eq 'requestusername') {
           $formaction = '/adm/createuser';
           $namespace = 'usernamequeue';
           %requesthash = &Apache::lonnet::dump_dom($namespace,$dom);
           $nextelement = '<input type="hidden" name="state" value="done" />';
     } else {      } else {
         $formaction = '/adm/createcourse';          $formaction = '/adm/createcourse';
         $namespace = 'courserequestqueue';          $namespace = 'courserequestqueue';
         %requesthash = &Apache::lonnet::dump_dom($namespace,$dom,'_approval');          my $disposition = 'approval';
         $nextelement = '<input type="hidden" name="phase" value="requestchange" />';          my $nextphase = 'requestchange';
           if ($context eq 'pending') {
               $disposition = 'pending';
               $nextphase = 'requestvalidation';
           } elsif ($context eq 'displaypending') {
               $disposition = 'pending';
           }
           %requesthash = &Apache::lonnet::dump_dom($namespace,$dom,'_'.$disposition);
           $nextelement = '<input type="hidden" name="phase" value="'.$nextphase.'" />';
     }      }
     my ($output,%queue_by_date,%crstypes);      my ($output,%queue_by_date);
     if (keys(%requesthash) > 0) {      if (keys(%requesthash) > 0) {
         $output = '<form method="post" name="changequeue" action="'.$formaction.'" />'."\n".          $output = '<form method="post" name="changequeue" action="'.$formaction.'" />'."\n".
                   '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".                    '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".
                   $nextelement."\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();  
         foreach my $item (keys(%requesthash)) {          foreach my $item (keys(%requesthash)) {
             my ($timestamp,$entry);              my ($timestamp,$entry,$pending);
             if ($context eq 'course') {              if ($context eq 'course') {
                 ($timestamp, my $usec) = split(/:/,$requesthash{$item});                  ($timestamp, my $usec) = split(/:/,$requesthash{$item});
                 $entry = $item.':'.$usec;                  $entry = $item.':'.$usec;
               } elsif ($context eq 'requestauthor') {
                   $timestamp = $requesthash{$item};
                   ($entry) = ($item =~ /^($match_username)_approval$/);
               } elsif ($context eq 'requestusername') {
                   $timestamp = $requesthash{$item};
                   ($entry) = (&unescape($item) =~ /^($match_username)_approval$/);
             } else {              } else {
                 $timestamp = $requesthash{$item}{'timestamp'};                  $timestamp = $requesthash{$item}{'timestamp'};
                 if (ref($requesthash{$item}) eq 'HASH') {                  if (ref($requesthash{$item}) eq 'HASH') {
                     my ($cnum,$disposition) = split('_',$item);                      my ($cnum,$disposition) = split('_',$item);
                     $entry = $cnum.':'.$requesthash{$item}{'ownername'}.':'.                      $entry = $cnum.':'.$requesthash{$item}{'ownername'}.':'.
                              $requesthash{$item}{'ownerdom'}.':'.                               $requesthash{$item}{'ownerdom'}.':';
                              $requesthash{$item}{'crstype'}.':'.                      if (($context eq 'pending') || ($context eq 'displaypending')) {
                              $requesthash{$item}{'description'};                          $entry .= $requesthash{$item}{'instcode'};
                       } else {
                           $entry .= $requesthash{$item}{'crstype'};
                       }
                       $entry .= ':'.$requesthash{$item}{'description'};
                 }                  }
             }              }
             if ($entry ne '') {              if ($entry ne '') {
                 if (exists($queue_by_date{$timestamp})) {                  if (ref($queue_by_date{$timestamp}) eq 'ARRAY') {
                     if (ref($queue_by_date{$timestamp}) eq 'ARRAY') {                      push(@{$queue_by_date{$timestamp}},$entry);
                         push(@{$queue_by_date{$timestamp}},$entry);  
                     }  
                 } else {                  } else {
                     @{$queue_by_date{$timestamp}} = ($entry);                      $queue_by_date{$timestamp} = [$entry];
                 }                  }
             }              }
         }          }
         my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));          if (keys(%queue_by_date) > 0) {
         my $count = 0;              if ($context eq 'course') {
         foreach my $item (@sortedtimes) {                  $output .=  '<h3>'.&mt('Self-enrollment requests queued pending approval by a Coordinator').'</h3>';
             if (ref($queue_by_date{$item}) eq 'ARRAY') {              } elsif (($context eq 'pending') || ($context eq 'displaypending')) {
                 foreach my $request (sort(@{$queue_by_date{$item}})) {                  $output .= '<h3>'.&mt('Requests for official courses queued pending validation').'</h3>'.
                     my ($row,$approve,$reject,$showtime,$showsec,$namelink,                             '<p>'.&mt('Requests are validated against institutional data to confirm that the requestor is an instructor of record.').'<br />'.
                         $detailslink,$crstype);                             &mt('Validation is attempted when the request is submitted.').' '.
                     $showtime = &Apache::lonlocal::locallocaltime($item);                             &mt('If unvalidated, the request will be held in a queue.').' '.
                     if ($context eq 'course') {                             &mt('Validation of pending requests is automatically repeated daily.').'</p>';
                         my ($puname,$pudom,$pusec) = split(/:/,$request);              } elsif ($context eq 'requestauthor') {
                         $approve = $count.':'.$puname.':'.$pudom.':'.$pusec;                  $output .= '<h3>'.&mt('Requests for Authoring Space queued pending approval by a Domain Coordinator').'</h3>';
                         $reject = $puname.':'.$pudom;              } elsif ($context eq 'requestusername') {
                         $showsec = $pusec;                  $output .= '<h3>'.&mt('Requests for LON-CAPA accounts queued pending approval by a Domain Coordinator').'</h3>';
                         if ($showsec eq '') {              } else {
                             $showsec = &mt('none');                  $output .= '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';
                         }              } 
                         $namelink = &Apache::loncommon::aboutmewrapper(              $output .= &build_queue_display($dom,$context,\%queue_by_date).
                                     &Apache::loncommon::plainname($puname,$pudom),                         '<input type="hidden" name="queue" value="approval" />';
                                     $puname,$pudom);          } 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 'requestauthor') {
                   $output .= &mt('There are currently no requests for Authoring Space awaiting approval.');
               } elsif ($context eq 'requestusername') {
                   $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');
               } 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="submit" name="validationcheck" value="'.
                          &mt('Validate').'" /><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>';
           } elsif (($context ne 'helpdesk') && ($context ne 'displaypending')) {
               $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') || ($context eq 'displaypending')) {
               $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 'requestusername') {
               $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');
           } 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') || ($context eq 'displaypending') || ($context eq 'helpdesk')) {
           $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 'requestauthor') {
           $output .= '<th>'.&mt('Date requested').'</th>';
       } elsif ($context eq 'requestusername') {
           $output .= '<th>'.&mt('Date requested').'</th>'.
                      '<th>'.&mt('Details').'</th>';
       } elsif ($context eq 'pending' || $context eq 'displaypending' || $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',
                           textbook   => 'Textbook course',
                       );
           $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);
                   } 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);
                       }
                   } elsif ($context eq 'requestusername') {
                       if (&Apache::lonnet::homeserver($request,$dom) eq 'no_host') {
                           my $queued = 'approval';
                           $approve = $count.':'.$request;
                           $reject = $request;
                           $detailslink='<a href="javascript:openusernamereqdisplay('.
                                        "'$dom','$request','$queued'".');">'.$request.'</a>';
                           $namelink = $request;
                       }
                   } else {
                       my ($cnum,$ownername,$ownerdom,$type,$cdesc);
                       my $queued = 'approval'; 
                       if ($context eq 'pending' || $context eq 'displaypending' || $context eq 'stillpending') {
                           ($cnum,$ownername,$ownerdom,$instcode,$cdesc)=split(/:/,$request,5);
                           $queued = 'pending';                        
                     } else {                      } else {
                         my ($cnum,$ownername,$ownerdom,$type,$cdesc)=split(/:/,$request,5);                          ($cnum,$ownername,$ownerdom,$type,$cdesc)=split(/:/,$request,5);
                         $detailslink='<a href="javascript:opencoursereqdisplay('.  
                                       "'$dom','$cnum'".');">'.$cdesc.'</a>';  
                         $crstype = $type;                          $crstype = $type;
                         if (defined($crstypes{$type})) {                          if (defined($crstypes{$type})) {
                             $crstype = $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','$queued'".');">'.$cdesc.'</a>';
                       $approve = $count.':'.$cnum;
                       $reject = $cnum;
                       $namelink = &Apache::loncommon::aboutmewrapper(
                                   &Apache::loncommon::plainname($ownername,$ownerdom),
                                   $ownername,$ownerdom);
                   }
                   unless (($context eq 'pending') || ($context eq 'displaypending') || ($context eq 'helpdesk')) {
                     $row = '<td><span class="LC_nobreak"><label>'.                      $row = '<td><span class="LC_nobreak"><label>'.
                            '<input type="checkbox" value="'.$approve.'" name="approvereq" />'.&mt('Approve').'</label></span><br />'.                             '<input type="radio" value="'.$approve.'" name="'.$count.'radioreq" />'.&mt('Approve').'</label>'.
                            '<span class="LC_nobreak"><label>'.                             '<label>'.('&nbsp;'x2).
                            '<input type="checkbox" value="'.$reject.'" name="rejectreq" />'.&mt('Reject').'</label></span><br /></td>'.                             '<input type="radio" value="'.$reject.'" name="'.$count.'radioreq" />'.&mt('Reject').'</label>'.
                            '<td>'.$namelink.'</td>'."\n";                             '<label>'.('&nbsp;'x2).
                     if ($context eq 'course') {                             '<input type="radio" value="'."later:".$reject.'" name="'.$count.'radioreq" checked />'.&mt('Decide Later').
                         $row .= '<td>'.$showsec.'</td>'."\n".                             '</label></span><br /></td>';
                                 '<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 ++;  
                 }                  }
                   $row .= '<td>'.$namelink.'</td>'."\n";
                   if ($context eq 'course') {
                       $row .= '<td>'.$showsec.'</td>'."\n".
                               '<td>'.$showtime.'</td>'."\n";
                   } elsif ($context eq 'requestauthor') {
                       $row .= '<td>'.$showtime.'</td>'."\n";
                   } elsif ($context eq 'requestusername') {
                       $row .= '<td>'.$showtime.'</td>'."\n".
                               '<td>'.$detailslink.'</td>'."\n";
                   } else {
                       if ($context eq 'pending' || $context eq 'displaypending' || $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;      return $output;
 }  }
   
 sub update_request_queue {  sub update_request_queue {
     my ($context,$cdom,$cnum,$coursedesc) = @_;      my ($context,$cdom,$cnum,$coursedesc) = @_;
     my ($output,$access_start,$access_end,$limit,$cap,$notifylist,$namespace,      my ($output,$access_start,$access_end,$limit,$cap,$notifylist,$namespace,
         $stucounts,$idx,$classlist,%requesthash,$cid,$hostname,$protocol,          $stucounts,$idx,$classlist,%requesthash,$cid,$domdesc,$now,
         $domdesc,$now,$sender,$approvedmsg,$rejectedmsg,$beneficiary,          $sender,$approvedmsg,$rejectedmsg,$beneficiary,
         @existing,@missingreq,@invalidusers,@limitexceeded,@completed,          @existing,@missingreq,@invalidusers,@limitexceeded,@completed,
         @processing_errors,@warn_approves,@warn_rejects,@approvals,          @processing_errors,@warn_approves,@warn_rejects,@approvals,@warn_dels,
         @rejections,@rejectionerrors,@nopermissions,%courseroles,          @rejections,@rejectionerrors,@nopermissions,%courseroles,@toremove,
         %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,          %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,
         @warn_coursereqs);          $firsturl,$uniquecode,%codes);
     @approvals = &Apache::loncommon::get_env_multiple('form.approvereq');      my $count=0;
     @rejections = &Apache::loncommon::get_env_multiple('form.rejectreq');      while (my $item = $env{'form.'.$count.'radioreq'}) {
           if ($item =~ /^\d+:/) {
               push(@approvals,$item);
           } elsif ($item !~ /^later:/) {
               push(@rejections,$item);
           }
           $count ++;
       }
   
     $now = time;      $now = time;
     $sender = $env{'user.name'}.':'.$env{'user.domain'};      $sender = $env{'user.name'}.':'.$env{'user.domain'};
     if ($context eq 'course') {      if ($context eq 'course') {
Line 377  sub update_request_queue { Line 656  sub update_request_queue {
         $beneficiary = 'enroller';          $beneficiary = 'enroller';
         $cid = $env{'request.course.id'};          $cid = $env{'request.course.id'};
         $crstype = lc(&Apache::loncommon::course_type());          $crstype = lc(&Apache::loncommon::course_type());
         my $chome = &Apache::lonnet::homeserver($cnum,$cdom);          $firsturl = &Apache::lonnet::course_portal_url($cnum,$cdom);
         $hostname = &Apache::lonnet::hostname($chome);  
         $protocol = $Apache::lonnet::protocol{$chome};  
         $protocol = 'http' if ($protocol ne 'https');  
         %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum);          %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum);
         $access_start =  $env{'course.'.$cid.'.internal.selfenroll_start_access'};          $access_start =  $env{'course.'.$cid.'.internal.selfenroll_start_access'};
         $access_end =  $env{'course.'.$cid.'.internal.selfenroll_end_access'};          $access_end =  $env{'course.'.$cid.'.internal.selfenroll_end_access'};
Line 392  sub update_request_queue { Line 668  sub update_request_queue {
                             mt => 'Your request for enrollment has been approved.',                              mt => 'Your request for enrollment has been approved.',
                         },                          },
                         {                          {
                             mt   => 'Visit [_1], to log-in and access the course',                              mt   => 'Visit [_1] to log-in and access the course',
                             args => [$protocol.'://'.$hostname],                              args => [$firsturl],
                         }];                          }];
         $rejectedmsg =  [{          $rejectedmsg =  [{
                             mt => 'Your request for enrollment has not been approved.',                              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 = &Apache::lonnet::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);
       } elsif ($context eq 'requestusername') {
           $namespace = 'usernamequeue';
           $beneficiary = 'requestusername';
           %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom);
           my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$cdom);
           if (ref($domconfig{'usercreation'}) eq 'HASH') {
               if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {
                   if (ref($domconfig{'usercreation'}{'cancreate'}{'notify'}) eq 'HASH') {
                       $notifylist = $domconfig{'usercreation'}{'cancreate'}{'notify'}{'approval'};
                   }
               }
           }
           my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
           $firsturl = &Apache::lonnet::course_portal_url($domconfiguser,$cdom);
           $approvedmsg = [{
                               mt => 'Your request for a LON-CAPA account has been approved.',
                           },
                           {
                               mt   => 'Visit [_1] to log-in.',
                               args => [$firsturl],
                           }];
           $rejectedmsg =  [{
                               mt => 'Your request for a LON-CAPA account has not been approved.',
                           }];
           $domdesc = &Apache::lonnet::domain($cdom);
     } else {      } else {
         $domdesc = &Apache::lonnet::domain($cdom);          $domdesc = &Apache::lonnet::domain($cdom);
         $namespace = 'courserequestqueue';          $namespace = 'courserequestqueue';
         $beneficiary = 'courserequestor';          $beneficiary = 'courserequestor';
         %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom,'_approval');          $queue = 'approval';
         my $chome = &Apache::lonnet::domain($cdom,'primary');          if ($env{'form.queue'} eq 'pending') {
         $hostname = &Apache::lonnet::hostname($chome);              $queue = 'pending';
         $protocol = $Apache::lonnet::protocol{$chome};          }
         $protocol = 'http' if ($protocol ne 'https');          %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom,'_'.$queue);
         my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);          my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);
         if (ref($domconfig{'requestcourses'}) eq 'HASH') {          if (ref($domconfig{'requestcourses'}) eq 'HASH') {
             if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') {               if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') { 
Line 418  sub update_request_queue { Line 742  sub update_request_queue {
                             mt => 'Your course request has been approved.',                              mt => 'Your course request has been approved.',
                         },                          },
                         {                          {
                             mt   => 'Visit [_1], to log-in and access the course',                              mt   => 'Visit [_1] to log-in and access the course',
                             args => [$protocol.'://'.$hostname],                              args => [],
                         }];                          }];
         $rejectionmsg{'course'} =          $rejectionmsg{'course'} =
                         [{                          [{
Line 431  sub update_request_queue { Line 755  sub update_request_queue {
                             mt => 'Your community request has been approved.',                              mt => 'Your community request has been approved.',
                         },                          },
                         {                          {
                             mt   => 'Visit [_1], to log-in and access the community',                              mt   => 'Visit [_1] to log-in and access the community',
                             args => [$protocol.'://'.$hostname],                              args => [],
                         }];                          }];
   
         $rejectionmsg{'community'} =           $rejectionmsg{'community'} = 
Line 448  sub update_request_queue { Line 772  sub update_request_queue {
         foreach my $role (@roles) {          foreach my $role (@roles) {
             $communityroles{$role}=&Apache::lonnet::plaintext($role,'Community');              $communityroles{$role}=&Apache::lonnet::plaintext($role,'Community');
         }          }
   
     }      }
     foreach my $item (sort {$a <=> $b} @approvals) {      foreach my $item (sort {$a <=> $b} @approvals) {
         if ($context eq 'course') {          if ($context eq 'course') {
Line 456  sub update_request_queue { Line 779  sub update_request_queue {
             my $uhome = &Apache::lonnet::homeserver($uname,$udom);              my $uhome = &Apache::lonnet::homeserver($uname,$udom);
             if ($uhome ne 'no_host') {              if ($uhome ne 'no_host') {
                 if (exists($requesthash{$uname.':'.$udom})) {                  if (exists($requesthash{$uname.':'.$udom})) {
                     if ($cdom eq 'gci' && $cnum eq '9615072b469884921gcil1') {  
                         my $enresult = &enable_gci_submission($uname,$udom,  
                                                    $access_start,$access_end);  
                     }  
                     if (exists($classlist->{$uname.':'.$udom})) {                      if (exists($classlist->{$uname.':'.$udom})) {
                         if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') {                          if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') {
                             if (($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Active') ||                              if (($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Active') ||
Line 492  sub update_request_queue { Line 811  sub update_request_queue {
                         $stucounts->{'allstudents'} ++;                          $stucounts->{'allstudents'} ++;
                         $stucounts->{'selfenrolled'} ++;                          $stucounts->{'selfenrolled'} ++;
                         &send_selfserve_notification($uname.':'.$udom,$approvedmsg,                          &send_selfserve_notification($uname.':'.$udom,$approvedmsg,
                                        $cid,$coursedesc,$now,$beneficiary,$sender,undef,undef,$crstype);                                         $cid,$coursedesc,$now,$beneficiary,$sender,
                                          undef,undef,$crstype);
                         my %userrequest = (                          my %userrequest = (
                             $cdom.'_'.$cnum => {                              $cdom.'_'.$cnum => {
                                 timestamp   => $now,                                  timestamp   => $now,
Line 505  sub update_request_queue { Line 825  sub update_request_queue {
                             &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);                              &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);
                         if ($userresult ne 'ok') {                          if ($userresult ne 'ok') {
                             push(@warn_approves,$uname.':'.$udom);                              push(@warn_approves,$uname.':'.$udom);
                         } elsif ($udom eq 'gci') {  
                             my %changehash = (  
                                 'reqcrsotherdom.unofficial' => 'gcitest:autolimit=',  
                             );  
                             my $reqresult = &Apache::lonnet::put('environment',\%changehash,  
                                                                  $udom,$uname);  
                             if ($reqresult ne 'ok') {  
                                 push(@warn_coursereqs,$uname.':'.$udom);  
                             }  
                         }                          }
                     } else {                      } else {
                         push(@processing_errors,$uname.':'.$udom);                          push(@processing_errors,$uname.':'.$udom);
Line 522  sub update_request_queue { Line 833  sub update_request_queue {
             } else {              } else {
                 push(@invalidusers,$uname.':'.$udom);                  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);
                               &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,$uname.':'.$cdom);
                               }
                           } else {
                               push(@processing_errors,$uname);
                           }
                       } else {
                           push(@nopermissions,$uname);
                       }
                   } else {
                       push(@nopermissions,$uname);
                   }
               } else {
                   push(@invalidusers,$uname.':'.$cdom);
               }
               push(@toremove,(@invalidusers,@nopermissions));
           } elsif ($context eq 'requestusername') {
               my ($num,$uname) = split(/:/,$item);
               my $dbname = 'nohist_requestedusernames';
               my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
               my %curr = &Apache::lonnet::get($dbname,[$uname],$cdom,$domconfiguser);
   
               if (ref($curr{$uname}) eq 'HASH') {
                   my ($logtoken,$serverid,$encpass,$courseid,$id,$firstname,
                       $middlename,$lastname,$generation,$inststatus,$email);
                   $curr{$uname}{'timestamp'} = $now;
                   $curr{$uname}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
                   $courseid   = $curr{$uname}{'courseid'};
                   $id         = $curr{$uname}{'id'};
                   $firstname  = $curr{$uname}{'firstname'};
                   $middlename = $curr{$uname}{'middlename'};
                   $lastname   = $curr{$uname}{'lastname'};
                   $generation = $curr{$uname}{'generation'};
                   $inststatus = $curr{$uname}{'inststatus'};
   
                   if ($curr{$uname}{'email'} ne '') {
                       $email = $curr{$uname}{'email'};
                   } elsif ($uname =~ /^[^\@]+\@[^\@]+$/) {
                       $email = $uname;
                   }
   
                   my $upass;
                   if ($curr{$uname}{'tmpinfo'}) {
                       my ($key,$caller)=split(/&/,$curr{$uname}{'tmpinfo'});
                       if ($caller eq 'createaccount') {
                           if ($curr{$uname}{'upass'} eq '') {
                               $upass = $curr{$uname}{'upass'};
                           } else {
                               $upass = &Apache::loncommon::des_decrypt($key,$curr{$uname}{'upass'});
                           }
                       } else {
                           push(@processing_errors,$uname);
                       }
                   } else {
                       $upass = $curr{$uname}{'upass'};
                   }
                   if ($upass eq '') {
                       push(@processing_errors,$uname);
                   } else {
                       undef($curr{$uname}{'upass'});
                       my $result =
                           &Apache::lonnet::modifyuser($cdom,$uname,$id,'internal',$upass,
                                                       $firstname,$middlename,$lastname,
                                                       $generation,undef,undef,$email);
                       if ($result eq 'ok') {
                           $curr{$uname}{'status'} = 'created';
                           push(@completed,$uname); 
                           my $uhome = &Apache::lonnet::homeserver($uname,$cdom);
                           if ($uhome eq 'no_host') {
                               push(@warn_approves,$uname);
                           } else {
                               unless (($inststatus eq 'default') || ($inststatus eq '')) {
                                   &Apache::lonnet::put('environment',{inststatus => $inststatus},$cdom,$uname);
                               }
                               &send_selfserve_notification($uname.':'.$cdom,
                                                            $approvedmsg,undef,undef,$now,
                                                            $beneficiary,$sender);
                               if (&Apache::lonnet::put($dbname,\%curr,$cdom,$domconfiguser) ne 'ok') {
                                   push(@warn_approves,$uname);
                               }
                           }
                       } else {
                           push(@processing_errors,$uname);
                       }
                   }
               } else {
                   push(@invalidusers,$uname);
               }
               push(@toremove,@invalidusers);
         } else {          } else {
             my ($num,$cnum) = split(':',$item);              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') {                  if (&Apache::lonnet::homeserver($cnum,$cdom) eq 'no_host') {
                     my $ownername = $requesthash{$cnum.'_approval'}{'ownername'};                      my $ownername = $requesthash{$cnum.'_'.$queue}{'ownername'};
                     my $ownerdom = $requesthash{$cnum.'_approval'}{'ownerdom'};                      my $ownerdom = $requesthash{$cnum.'_'.$queue}{'ownerdom'};
                     $crstype = $requesthash{$cnum.'_approval'}{'crstype'};                      $crstype = $requesthash{$cnum.'_'.$queue}{'crstype'};
                     my $coursedesc = $requesthash{$cnum.'_approval'}{'description'};                      my $coursedesc = $requesthash{$cnum.'_'.$queue}{'description'};
                     my $longroles = \%courseroles;                      my $longroles = \%courseroles;
                     if ($crstype eq 'community') {                      if ($crstype eq 'community') {
                         $longroles = \%communityroles;                          $longroles = \%communityroles;
Line 555  sub update_request_queue { Line 980  sub update_request_queue {
                             &Apache::lonnet::restore($requestkey,'courserequests',                              &Apache::lonnet::restore($requestkey,'courserequests',
                                                      $ownerdom,$ownername);                                                       $ownerdom,$ownername);
                         if ((ref($history{'details'}) eq 'HASH') &&                           if ((ref($history{'details'}) eq 'HASH') && 
                             ($history{'disposition'} eq 'approval')) {                              ($history{'disposition'} eq $queue)) {
                             my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg);                              my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,
                             my $result = &course_creation($cdom,$cnum,$context,$history{'details'},\$logmsg,                                  $keysmsg,$code,%customitems);
                                                       \$newusermsg,\$addresult,\$enrollcount,                              my $clonemsg = [];
                                                       \$response,\$keysmsg,\%domdefs,$longroles);                              my $fullname = '';
                               my $inprocess = &Apache::lonnet::auto_crsreq_update($cdom,$cnum,$crstype,'process',$ownername,
                                                                                   $ownerdom,$fullname,$coursedesc);
                               if (ref($inprocess) eq 'HASH') {
                                   foreach my $key (keys(%{$inprocess})) {
                                       if (exists($history{'details'}{$key})) { 
                                           $customitems{$key} = $history{'details'}{$key};
                                       }
                                   }
                               }
                               if ($history{'details'}{'clonecrs'}) {
                                   $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'};
                               }
                               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 ($result eq 'created') {
                                 if ($crstype eq 'community') {                                  if ($crstype eq 'community') {
                                     $approvedmsg = $approvalmsg{'community'};                                      $approvedmsg = $approvalmsg{'community'};
                                 } else {                                  } else {
                                     $approvedmsg = $approvalmsg{'course'};                                      $approvedmsg = $approvalmsg{'course'};
                                 }                                  }
                                   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},
                                               {
                                                 mt   => 'Students can automatically select your course by entering this code: [_1]',
                                                 args => [$code],
                                               });
                                           $codes{$cnum} = $code;
                                       }
                                       if (ref($postprocess) eq 'HASH') {
                                           if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') {
                                               foreach my $item (@{$postprocess->{'createdmsg'}}) {
                                                   if (ref($item) eq 'HASH') {
                                                       if ($item->{'mt'} ne '') {
                                                           push(@{$approvedmsg},$item);
                                                       }
                                                   }
                                               }
                                           }
                                       }
                                   }
                                 push(@completed,$cnum);                                  push(@completed,$cnum);
                                 &send_selfserve_notification($ownername.':'.$ownerdom,$approvedmsg,                                  
                                               $cid,$coursedesc,$now,$beneficiary,$sender,undef,undef,$crstype);                                  unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_'.$queue],$cdom) eq 'ok') {
                                       push(@warn_dels,$cnum);
                                   }
                                   &send_selfserve_notification($ownername.':'.$ownerdom,
                                                 $approvedmsg,$cid,$coursedesc,$now,
                                                 $beneficiary,$sender,undef,undef,$crstype);
                                 my %reqhash = (                                  my %reqhash = (
                                                 reqtime     => $history{'reqtime'},                                                  reqtime     => $history{'reqtime'},
                                                 crstype     => $history{'crstype'},                                                  crstype     => $history{'crstype'},
Line 614  sub update_request_queue { Line 1087  sub update_request_queue {
     }      }
     my @changes = (@completed,@rejections);      my @changes = (@completed,@rejections);
     if ($context eq 'domain') {      if ($context eq 'domain') {
           @changes = map {$_.'_'.$queue} (@changes);
       } elsif ($context eq 'requestauthor') {
         @changes = map {$_.'_approval'} (@changes);          @changes = map {$_.'_approval'} (@changes);
       } elsif ($context eq 'requestusername') {
           @changes = map {&escape($_).'_approval'} (@changes);
     }      }
     if (@rejections) {      if (@rejections) {
         foreach my $item (@rejections) {          foreach my $item (@rejections) {
             if ($context eq 'course') {              if (($context eq 'course') || ($context eq 'requestauthor')) {
                 my $user = $item;                  my ($user,$uname,$udom,%userrequest,$key,$dbname);
                   if ($context eq 'requestauthor') {
                       $uname = $item;
                       $udom = $cdom;
                       $user = $uname.':'.$udom;
                       $key = 'author';
                       $dbname = 'requestauthor';
                   } else {
                       $user = $item;
                       ($uname,$udom) = split(/:/,$user);
                       $key = $cdom.'_'.$cnum;
                       $dbname = $namespace;
                   }
                 &send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,                  &send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,
                                              $now,$beneficiary,$sender,undef,undef,$crstype);                                               $now,$beneficiary,$sender,undef,undef,
                 my ($uname,$udom) = split(/:/,$user);                                               $crstype);
                 my %userrequest = (                  %userrequest = (
                     $cdom.'_'.$cnum => {                      $key => {
                         timestamp   => $now,                          timestamp   => $now,
                         adjudicator => $env{'user.name'}.':'.$env{'user.domain'},                          adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                         status      => 'rejected',                          status      => 'rejection',
                     }                      }
                 );                  );
                   if ($context eq 'requestauthor') {
                       $userrequest{'author_status'} = 'rejection';  
                   }
                 my $userresult =                  my $userresult =
                     &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);                      &Apache::lonnet::put($dbname,\%userrequest,$udom,$uname);
                 if ($userresult ne 'ok') {                  if ($userresult ne 'ok') {
                     push(@warn_rejects,$user);                      push(@warn_rejects,$item);
                   }
               } elsif ($context eq 'requestusername') {
                   my ($uname,$udom,$dbname);
                   $uname = $item;
                   $udom = $cdom;
                   $dbname = 'nohist_requestedusernames';
                   my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
                   my %curr = &Apache::lonnet::get($dbname,[$uname],$cdom,$domconfiguser);
                   if (ref($curr{$uname}) eq 'HASH') {
                        $curr{$uname}{'status'} = 'rejected';
                        $curr{$uname}{'timestamp'} = $now;
                        $curr{$uname}{'adjudicator'} =  $env{'user.name'}.':'.$env{'user.domain'};
                        undef($curr{$uname}{'tmpinfo'});
                        undef($curr{$uname}{'upass'}); 
                   }
                   my $userresult =
                       &Apache::lonnet::put($dbname,\%curr,$cdom,$domconfiguser);
                   if ($userresult ne 'ok') {
                       push(@warn_rejects,$uname);
                 }                  }
             } else {              } else {
                 my $cnum = $item;                  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') {                      if (&Apache::lonnet::homeserver($cnum,$cdom) eq 'no_host') {
                         my $requestkey = $cdom.'_'.$cnum;                          my $requestkey = $cdom.'_'.$cnum;
                         my $ownername = $requesthash{$cnum.'_approval'}{'ownername'};                          my $ownername = $requesthash{$cnum.'_'.$queue}{'ownername'};
                         my $ownerdom = $requesthash{$cnum.'_approval'}{'ownerdom'};                          my $ownerdom = $requesthash{$cnum.'_'.$queue}{'ownerdom'};
                         my $coursedesc = $requesthash{$cnum.'_approval'}{'description'};                          my $coursedesc = $requesthash{$cnum.'_'.$queue}{'description'};
                         $crstype = $requesthash{$cnum.'_approval'}{'crstype'};                          $crstype = $requesthash{$cnum.'_'.$queue}{'crstype'};
                         if ($crstype eq 'community') {                          if ($crstype eq 'community') {
                             $rejectedmsg = $rejectionmsg{'community'};                              $rejectedmsg = $rejectionmsg{'community'};
                         } else {                          } else {
Line 656  sub update_request_queue { Line 1167  sub update_request_queue {
                             &Apache::lonnet::restore($requestkey,'courserequests',                              &Apache::lonnet::restore($requestkey,'courserequests',
                                                      $ownerdom,$ownername);                                                       $ownerdom,$ownername);
                         if ((ref($history{'details'}) eq 'HASH') &&                          if ((ref($history{'details'}) eq 'HASH') &&
                             ($history{'disposition'} eq 'approval')) {                              ($history{'disposition'} eq $queue)) {
                             my %reqhash = (                              my %reqhash = (
                                             reqtime     => $history{'reqtime'},                                              reqtime     => $history{'reqtime'},
                                             crstype     => $history{'crstype'},                                              crstype     => $history{'crstype'},
Line 681  sub update_request_queue { Line 1192  sub update_request_queue {
                             } else {                              } else {
                                 push(@warn_rejects,$cnum);                                  push(@warn_rejects,$cnum);
                             }                              }
                               unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_'.$queue],$cdom) eq 'ok') {
                                   push(@warn_dels,$cnum);
                               }
                         } else {                          } else {
                             push(@warn_rejects,$cnum);                              push(@warn_rejects,$cnum);
                         }                          }
Line 693  sub update_request_queue { Line 1207  sub update_request_queue {
             }              }
         }          }
     }      }
       if (@toremove) {
           my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
           foreach my $item (@toremove) {
               if ($context eq 'requestauthor') {
                   my %userrequest = (
                       author => {
                                   timestamp   => $now,
                                   adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                                   status      => 'deleted',
                                 },
                                 author_status => 'deleted',
                   );
                   &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$item);
               } elsif ($context eq 'requestusername') {
                   my $dbname = 'nohist_requestedusernames';
                   my %curr = &Apache::lonnet::get($dbname,[$item],$cdom,$domconfiguser);
                   if (ref($curr{$item}) eq 'HASH') {
                       $curr{$item}{'status'} = 'deleted';
                       $curr{$item}{'timestamp'} = $now;
                       $curr{$item}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
                       undef($curr{$item}{'upass'});
                       undef($curr{$item}{'tmpinfo'}); 
                   }
               }
           }
           @toremove = map {$_.'_approval'} (@toremove);
           my $delresult = &Apache::lonnet::del_dom($namespace,\@toremove,$cdom);
       }
     if (@changes) {      if (@changes) {
         my $delresult;          my $delresult;
         if ($context eq 'course') {          if ($context eq 'course') {
Line 734  sub update_request_queue { Line 1276  sub update_request_queue {
                                                  $now,'coursemanagers',$sender,                                                   $now,'coursemanagers',$sender,
                                                  $approvedlist,$rejectedlist,$crstype);                                                   $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);
                   }
               } elsif ($context eq 'requestusername') {
                   $chgmsg = "'Action was taken on the following LON-CAPA account requests by [_1].',$namelink";
                   if (@completed) {
                       $approvedlist = join("\n",@completed);
                       $output .= '<p>'.&mt('The following requests were approved:').'<ul>';
                       foreach my $uname (@completed) {
                           $output .= '<li>'.$uname.'</li>';
   
                       }
                       $output .= '</ul></p>';
                   }
                   if (@rejections) {
                       $rejectedlist = join("\n",@rejections);
                       $output .= '<p>'.&mt('The following requests were rejected:').'<ul>';
                       foreach my $uname (@rejections) {
                           $output .= '<li>'.$uname.'</li>';
                       }
                       $output .= '</ul></p>';
                   }
                   if ($notifylist ne '') {
                       &send_selfserve_notification($notifylist,$chgmsg,undef,$domdesc,
                                                    $now,'usernamemanagers',$sender,
                                                    $approvedlist,$rejectedlist);
                   }
             } else {              } else {
                 $chgmsg = "'Action was taken on the following course and community requests by [_1].',$namelink";                  $chgmsg = "'Action was taken on the following course and community requests by [_1].',$namelink";
                 if (@completed) {                  if (@completed) {
Line 741  sub update_request_queue { Line 1335  sub update_request_queue {
                     $output .= '<p>'.&mt('The following courses/communities were created:').'<ul>';                      $output .= '<p>'.&mt('The following courses/communities were created:').'<ul>';
                     foreach my $cnum (@completed) {                      foreach my $cnum (@completed) {
                         my $showcourse;                          my $showcourse;
                         if (ref($requesthash{$cnum.'_approval'})) {                          if (ref($requesthash{$cnum.'_'.$queue})) {
                             $showcourse = $requesthash{$cnum.'_approval'}{'description'};                              $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                         } else {                          } else {
                             $showcourse = $cnum;                              $showcourse = $cnum;
                         }                          }
                         my $syllabuslink =                          my $syllabuslink =
                             &Apache::loncommon::syllabuswrapper($showcourse,$cnum,$cdom);                              &Apache::loncommon::syllabuswrapper($showcourse,$cnum,$cdom);
                           if ($codes{$cnum}) {
                               $syllabuslink .= ' '.&mt('Unique code: [_1]',$codes{$cnum});
                           }
                         $output .= '<li>'.$syllabuslink.'</li>';                          $output .= '<li>'.$syllabuslink.'</li>';
                     }                      }
                     $output .= '</ul></p>';                      $output .= '</ul></p>';
Line 757  sub update_request_queue { Line 1354  sub update_request_queue {
                     $output .= '<p>'.&mt('The following requests were rejected:').'<ul>';                      $output .= '<p>'.&mt('The following requests were rejected:').'<ul>';
                     foreach my $cnum (@rejections) {                      foreach my $cnum (@rejections) {
                         my $showcourse;                          my $showcourse;
                         if (ref($requesthash{$cnum.'_approval'})) {                          if (ref($requesthash{$cnum.'_'.$queue})) {
                             $showcourse = $requesthash{$cnum.'_approval'}{'description'};                              $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                         } else {                          } else {
                             $showcourse = $cnum;                              $showcourse = $cnum;
                         }                          }
Line 772  sub update_request_queue { Line 1369  sub update_request_queue {
                                                  $approvedlist,$rejectedlist,$crstype);                                                   $approvedlist,$rejectedlist,$crstype);
                 }                  }
             }              }
           } else {
               if (($context eq 'requestauthor') || ($context eq 'requestusername')) {
                   push(@warn_dels,@changes);
               }
         }          }
     }      }
     if (@existing) {      if (@existing) {
Line 781  sub update_request_queue { Line 1382  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $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 {          } else {
             $output .= '<p>'.&mt('The following course/community creation requests were deleted because the course or community has already been created:').'<ul>';              $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) {              foreach my $cnum (@existing) {
Line 803  sub update_request_queue { Line 1412  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $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 {          } else {
             $output .= '<p>'.&mt('The following course/community creation requests were ignored because the request is no longer in the queue:').'<ul>';              $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) {              foreach my $cnum (@missingreq) {
                 $output .= '<li>'.$cnum.'</li>';                  $output .= '<li>'.$cnum.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
   
         }          }
     }      }
     if (@invalidusers) {      if (@invalidusers) {
Line 819  sub update_request_queue { Line 1435  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $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) {      if (@limitexceeded) {
Line 831  sub update_request_queue { Line 1455  sub update_request_queue {
         }          }
     }      }
     if (@nopermissions) {      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>';          if ($context eq 'course') {
         foreach my $cnum (@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>';
             my $showcourse;              foreach my $cnum (@nopermissions) {
             if (ref($requesthash{$cnum.'_approval'})) {                  my $showcourse;
                 $showcourse = $requesthash{$cnum.'_approval'}{'description'};                  if (ref($requesthash{$cnum.'_'.$queue})) {
             } else {                      $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                 $showcourse = $cnum;                  } 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 (@processing_errors) {
         if ($context eq 'course') {          if ($context eq 'course') {
Line 850  sub update_request_queue { Line 1484  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $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>';
           } elsif ($context eq 'requestusername') {
               $output .= '<p>'.&mt('The following requests could not be processed because an error occurred:').'<ul>';
               foreach my $uname (@processing_errors) {
                   $output .= '<li>'.$uname.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt('The following course/community creation requests could not be processed because an error occurred:').'<ul>';              $output .= '<p>'.&mt('The following course/community creation requests could not be processed because an error occurred:').'<ul>';
             foreach my $cnum (@processing_errors) {              foreach my $cnum (@processing_errors) {
                 my $showcourse;                  my $showcourse;
                 if (ref($requesthash{$cnum.'_approval'})) {                  if (ref($requesthash{$cnum.'_'.$queue})) {
                     $showcourse = $requesthash{$cnum.'_approval'}{'description'};                      $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                 } else {                  } else {
                     $showcourse = $cnum;                      $showcourse = $cnum;
                 }                  }
Line 868  sub update_request_queue { Line 1516  sub update_request_queue {
         $output .= '<p>'.&mt('The following course/community creation request rejections could not be fully processed because an error occurred:').'<ul>';          $output .= '<p>'.&mt('The following course/community creation request rejections could not be fully processed because an error occurred:').'<ul>';
         foreach my $cnum (@rejectionerrors) {          foreach my $cnum (@rejectionerrors) {
             my $showcourse;              my $showcourse;
             if (ref($requesthash{$cnum.'_approval'})) {              if (ref($requesthash{$cnum.'_'.$queue})) {
                 $showcourse = $requesthash{$cnum.'_approval'}{'description'};                  $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
             } else {              } else {
                 $showcourse = $cnum;                  $showcourse = $cnum;
             }              }
Line 884  sub update_request_queue { Line 1532  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $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>';
           } elsif ($context eq 'requestusername') {
               $output .= '<p>'.&mt("For the following users, an error occurred when updating the account request record for the user:").'<ul>';
               foreach my $uname (@warn_approves,@warn_rejects) {
                   $output .= '<li>'.$uname.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt("For the following course/community requests an error occurred when updating the requestor's own requests record:").'<ul>';              $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) {              foreach my $cnum (@warn_approves,@warn_rejects) {
                 my $showcourse;                  my $showcourse;
                 if (ref($requesthash{$cnum.'_approval'})) {                  if (ref($requesthash{$cnum.'_'.$queue})) {
                     $showcourse = $requesthash{$cnum.'_approval'}{'description'};                      $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                 } else {                  } else {
                     $showcourse = $cnum;                      $showcourse = $cnum;
                 }                  }
Line 898  sub update_request_queue { Line 1560  sub update_request_queue {
             $output .= '</ul></p>';              $output .= '</ul></p>';
         }          }
     }      }
     if (@warn_coursereqs) {      if (@warn_dels) {
         $output .= '<p>'..&mt("For the following users, an error occurred when setting rights to request creation of Concept Test courses:").'<ul>';          if ($context eq 'requestauthor') {
             foreach my $user (@warn_coursereqs) {              $output .= '<p>'.&mt("For the following requests an error occurred when removing the request from the queue:").'<ul>';
                 $output .= '<li>'.$user.'</li>';              foreach my $uname (@warn_dels) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
     }          } elsif ($context eq 'requestusername') {
     return $output;              $output .= '<p>'.&mt("For the following requests an error occurred when removing the request from the queue:").'<ul>';
 }              foreach my $item (@warn_dels) {
                   my ($escuname) = split(/_/,$item);
 sub enable_gci_submission {                  $output .= '<li>'.&unescape($escuname).'</li>';
     my ($udom,$uname,$access_end,$access_start) = @_;              }
     my $cdom = 'gci';              $output .= '</ul></p>';            
     my $cnum = '1H96711d710194bfegcil1';          } else {
     my ($stucounts,$idx,$classlist) = &get_student_counts($cdom,$cnum);              $output .= '<p>'.&mt("For the following course/community requests an error occurred when removing requests from the pending queue:").'<ul>';
     if (exists($classlist->{$uname.':'.$udom})) {              foreach my $cnum (@warn_dels) {
         if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') {                  my $showcourse;
             if (($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Active') ||                  if (ref($requesthash{$cnum.'_'.$queue})) {
                 ($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Future')) {                      $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                 return;                  } else {
                       $showcourse = $cnum;
                   }
                   $output .= '<li>'.$showcourse.'</li>';
             }              }
               $output .= '</ul></p>';
         }          }
     }      }
     return      return $output;
         &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 {  sub get_student_counts {
Line 944  sub get_student_counts { Line 1612  sub get_student_counts {
 }  }
   
 sub course_creation {  sub course_creation {
     my ($dom,$cnum,$context,$details,$logmsg,$newusermsg,$addresult,$enrollcount,$output,      my ($dom,$cnum,$context,$details,$logmsg,$clonemsg,$newusermsg,$addresult,
         $keysmsg,$domdefs,$longroles) =  @_;          $enrollcount,$output,$keysmsg,$domdefs,$longroles,$coderef,$customhash,
           $callercontext,$user_lh) = @_;
     unless ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH') &&       unless ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH') && 
             (ref($longroles) eq 'HASH')) {              (ref($longroles) eq 'HASH')) {
         return 'error: Invalid request';          return ('error: Invalid request');
     }      }
     my ($result,$ownername,$ownerdom);      my ($result,$ownername,$ownerdom);
     my $crstype = $details->{'crstype'};      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);
       if (ref($domconfig{'requestcourses'}) eq 'HASH') {
           if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {
               if ($domconfig{'requestcourses'}{'uniquecode'}{$crstype}) {
                   $details->{'uniquecode'} = 1;
               }
           }
       }
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $ownername = $details->{'owner'};          $ownername = $details->{'owner'};
         $ownerdom  = $details->{'domain'};          $ownerdom  = $details->{'domain'};
Line 959  sub course_creation { Line 1639  sub course_creation {
         $ownername = $env{'user.name'};          $ownername = $env{'user.name'};
         $ownerdom  = $env{'user.domain'};          $ownerdom  = $env{'user.domain'};
     }      }
       my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom);
     my $owneremail;      my $owneremail;
     my %emails = &Apache::loncommon::getemails($ownername,$ownerdom);      my %emails = &Apache::loncommon::getemails($ownername,$ownerdom);
     foreach my $email ('permanentemail','critnotification','notification') {      foreach my $email ('permanentemail','critnotification','notification') {
         $owneremail = $emails{$email};          $owneremail = $emails{$email};
         last if ($owneremail ne '');          last if ($owneremail ne '');
     }      }
     my %reqdetails = &build_batchcreatehash($dom,$context,$details,$owneremail,$domdefs);      my %reqdetails = &build_batchcreatehash($dom,$cnum,$context,$details,$owneremail,$domdefs);
     my $cid = &LONCAPA::batchcreatecourse::build_course($dom,$cnum,'requestcourses',      my $cid = &LONCAPA::batchcreatecourse::build_course($dom,$cnum,'requestcourses',
                   \%reqdetails,$longroles,\$logmsg,\$newusermsg,\$addresult,                    \%reqdetails,$longroles,$logmsg,$clonemsg,$newusermsg,$addresult,
                   \$enrollcount,\$output,\$keysmsg,$ownerdom,$ownername,$cnum,$crstype);                    $enrollcount,$output,$keysmsg,$ownerdom,$ownername,$cnum,$crstype,
                     $coderef,$callercontext,$user_lh);
       my $postprocess;
     if ($cid eq "/$dom/$cnum") {      if ($cid eq "/$dom/$cnum") {
         $result = 'created';          $result = 'created';
           my $code;
           if (ref($coderef)) {
               $code = $$coderef;
           }
           $postprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$result,$ownername,
                                                              $ownerdom,$fullname,$coursedesc,$code,
                                                              $accessstart,$accessend,$customhash);
     } else {      } else {
         $result = 'error: '.$cid;          $result = 'error: '.$cid;
     }      }
     return $result;      return ($result,$postprocess);
 }  }
   
 sub build_batchcreatehash {  sub build_batchcreatehash {
     my ($dom,$context,$details,$owneremail,$domdefs) = @_;      my ($dom,$cnum,$context,$details,$owneremail,$domdefs) = @_;
     my %batchhash;      my %batchhash;
     my @items = qw{owner domain coursehome clonecrs clonedom datemode dateshift enrollstart enrollend accessstart accessend sections crosslists users};      my @items = qw{owner domain coursehome clonecrs clonedom datemode dateshift tinyurls enrollstart enrollend accessstart accessend sections users uniquecode};
     if ($dom eq 'gcitest') {  
         push(@items,'firstres');  
     }  
     if ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH')) {      if ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH')) {
         my $emailenc = &Apache::lonnet::escape($owneremail);          my $emailenc = &escape($owneremail);
         my $owner = $details->{'owner'}.':'.$details->{'domain'};          my $owner = $details->{'owner'}.':'.$details->{'domain'};
         foreach my $item (@items) {          foreach my $item (@items) {
             $batchhash{$item} = $details->{$item};              $batchhash{$item} = $details->{$item};
         }          }
           if (ref($details->{'crosslists'}) eq 'HASH') {
               foreach my $key (keys(%{$details->{'crosslists'}})) {
                   if (ref($details->{'crosslists'}->{$key}) eq 'HASH') {
                       my $instsec = $details->{crosslists}->{$key}->{instsec};
                       $batchhash{'crosslists'}{$key}{'inst'} = $details->{crosslists}->{$key}->{instcode};
                       my $crskey = $cnum.':'.$batchhash{'crosslists'}{$key}{'inst'};
                       my %formatted = &Apache::lonnet::auto_instsec_reformat($dom,'clutter',
                                                                              {$crskey => [$instsec]});
                       if (ref($formatted{$crskey}) eq 'ARRAY') {
                           $batchhash{'crosslists'}{$key}{'inst'} .= $formatted{$crskey}->[0];
                       }
                       $batchhash{'crosslists'}{$key}{'loncapa'} = $details->{crosslists}->{$key}->{loncapa};
                   }
               }
           }
         $batchhash{'title'} = $details->{'cdescr'};          $batchhash{'title'} = $details->{'cdescr'};
         $batchhash{'coursecode'} = $details->{'instcode'};          $batchhash{'coursecode'} = $details->{'instcode'};
           if ($domdefs->{'officialcredits'} || $domdefs->{'unofficialcredits'}) {
               $batchhash{'defaultcredits'} = $details->{'defaultcredits'};
           }
         $batchhash{'emailenc'} = $emailenc;          $batchhash{'emailenc'} = $emailenc;
         $batchhash{'adds'} = $details->{'autoadds'};          $batchhash{'adds'} = $details->{'autoadds'};
         $batchhash{'drops'} = $details->{'autodrops'};          $batchhash{'drops'} = $details->{'autodrops'};
Line 1000  sub build_batchcreatehash { Line 1705  sub build_batchcreatehash {
         if ($details->{'crstype'} eq 'community') {          if ($details->{'crstype'} eq 'community') {
             $batchhash{'crstype'} = 'Community';              $batchhash{'crstype'} = 'Community';
         } else {          } else {
               if ($details->{'crstype'} eq 'textbook') {
                   if ($details->{'clonecrs'} && $details->{'clonedom'}) {
                       my %clonedfrom = &Apache::lonnet::coursedescription($details->{'clonedom'}.'_'.$details->{'clonecrs'});
                       $batchhash{'textbook'} = $clonedfrom{'description'};
                   }
               }
             $batchhash{'crstype'} = 'Course';              $batchhash{'crstype'} = 'Course';
         }          }
         my ($owner_firstname,$owner_lastname);          my ($owner_firstname,$owner_lastname);
Line 1038  sub build_batchcreatehash { Line 1749  sub build_batchcreatehash {
         $batchhash{'users'}{$owner}{lastname} = $owner_lastname;          $batchhash{'users'}{$owner}{lastname} = $owner_lastname;
         $batchhash{'users'}{$owner}{emailenc} = $emailenc;          $batchhash{'users'}{$owner}{emailenc} = $emailenc;
         $batchhash{'users'}{$owner}{owneremail} = $owneremail;          $batchhash{'users'}{$owner}{owneremail} = $owneremail;
           $batchhash{'setcomment'} = 1;
     }      }
     return %batchhash;      return %batchhash;
 }  }
   
 sub can_clone_course {  sub can_clone_course {
     my ($uname,$udom,$clonecrs,$clonedom,$crstype) = @_;      my ($uname,$udom,$clonecrs,$clonedom,$crstype,$dom,$instcode) = @_;
     my $canclone;      my $canclone;
     my $ccrole = 'cc';      my $ccrole = 'cc';
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
Line 1054  sub can_clone_course { Line 1766  sub can_clone_course {
     if (exists($roleshash{$clonecrs.':'.$clonedom.':'.$ccrole})) {      if (exists($roleshash{$clonecrs.':'.$clonedom.':'.$ccrole})) {
         $canclone = 1;          $canclone = 1;
     } else {      } else {
         my %courseenv = &Apache::lonnet::userenvironment($clonedom,$clonecrs,('cloners'));          my %courseenv = &Apache::lonnet::userenvironment($clonedom,$clonecrs,
                                                            ('cloners','internal.coursecode'));
         my $cloners = $courseenv{'cloners'};          my $cloners = $courseenv{'cloners'};
           my $clonefromcode = $courseenv{'internal.coursecode'};
         if ($cloners ne '') {          if ($cloners ne '') {
             my @cloneable = split(',',$cloners);              my @cloneable = split(',',$cloners);
             if (grep(/^\*$/,@cloneable)) {              if (grep(/^\*$/,@cloneable)) {
                 $canclone = 1;                  $canclone = 1;
             }              } elsif (grep(/^\*:\Q$udom\E$/,@cloneable)) {
             if (grep(/^\*:\Q$udom\E$/,@cloneable)) {                  $canclone = 1;
               } elsif (grep(/^\Q$uname\E:\Q$udom\E$/,@cloneable)) {
                 $canclone = 1;                  $canclone = 1;
             }              }
             if (grep(/^\Q$uname\E:\Q$udom\E$/,@cloneable)) {              unless ($canclone) {
                   if (($clonefromcode) && ($instcode) && ($clonedom eq $dom)) {
                       my (%gotdomdefaults,%gotcodedefaults);
                       foreach my $cloner (@cloneable) {
                           if (($cloner ne '*') && ($cloner !~ /^\*\:$match_domain$/) &&
                               ($cloner !~ /^$match_username\:$match_domain$/) && ($cloner ne '')) {
                               if ($cloner =~ /\=/) {
                                   my (%codedefaults,@code_order);
                                   if (ref($gotcodedefaults{$clonedom}) eq 'HASH') {
                                       if (ref($gotcodedefaults{$clonedom}{'defaults'}) eq 'HASH') {
                                           %codedefaults = %{$gotcodedefaults{$clonedom}{'defaults'}};
                                       }
                                       if (ref($gotcodedefaults{$clonedom}{'order'}) eq 'ARRAY') {
                                           @code_order = @{$gotcodedefaults{$dom}{'order'}};
                                       }
                                   } else {
                                       &Apache::lonnet::auto_instcode_defaults($clonedom,
                                                                               \%codedefaults,
                                                                               \@code_order);
                                       $gotcodedefaults{$clonedom}{'defaults'} = \%codedefaults;
                                       $gotcodedefaults{$clonedom}{'order'} = \@code_order;
                                   }
                                   if (@code_order > 0) {
                                       if (&Apache::lonnet::check_instcode_cloning(\%codedefaults,\@code_order,
                                                                                   $cloner,$clonefromcode,$instcode)) {
                                           $canclone = 1;
                                           last; 
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
           } else {
               my %domdefs = &Apache::lonnet::get_domain_defaults($clonedom);
               if ($domdefs{'canclone'}) {
                   unless ($domdefs{'canclone'} eq 'none') {
                       if ($domdefs{'canclone'} eq 'domain') {
                           if ($udom eq $clonedom) {
                               $canclone = 1;
                           }
                       } elsif (($clonefromcode) && ($instcode) &&
                                ($clonedom eq $dom)) {
                           if (&Apache::lonnet::default_instcode_cloning($clonedom,$domdefs{'canclone'},
                                                                         $clonefromcode,$instcode)) {
                               $canclone = 1;
                           }
                       }
                   }
               }
           }
           unless ($canclone) {
               if (&Apache::lonnet::is_course_owner($clonedom,$clonecrs,$uname,$udom)) {
                 $canclone = 1;                  $canclone = 1;
             }              }
         }          }
Line 1072  sub can_clone_course { Line 1840  sub can_clone_course {
     return $canclone;      return $canclone;
 }  }
   
   sub get_processtype {
       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,@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,$envkey,'inststatus');
           if ($userenv{$envkey}) {
               $val = $userenv{$envkey};
               @{$inststatuses} = ('_custom_');
           } else {
               my %alltasks;
               if (($isadv) && ($settings{'_LC_adv'} ne '')) {
                   $val = $settings{'_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;
                   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 (($context eq 'requestauthor') || (!$val)) {
                       if ($context eq 'course' && $maxlimit) {
                           $val = 'autolimit='.$maxlimit;
                       } else {
                           foreach my $option (@options) {
                               if ($alltasks{$option}) {
                                   $val = $option;
                                   last;
                               }
                           }
                       }
                   }
               }
           }
       } 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;
                       }
                       last;
                   }
               }
               @{$inststatuses} = ('_external_');
           }
       }
       return $val;
   }
   
   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);
                   }
               }
           }
       }
       if (keys(%reqs_by_date)) {
           unless ($notitle) {
               $output .= '<br /><b>'.&mt('Enrollment requests pending Course Coordinator approval').'</b><br />';
           }
           $output .= &Apache::loncommon::start_data_table().
                      &Apache::loncommon::start_data_table_header_row().
                      '<th>'.&mt('Date requested').'</th><th>'.&mt('Course title').'</th>'.
                      '<th>'.&mt('User role').'</th><th>'.&mt('Section').'</th>'.
                      &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');
                       }
                       $output .= &Apache::loncommon::start_data_table_row().
                                  '<td>'.&Apache::lonlocal::locallocaltime($item).'</td>'.
                                  '<td>'.$courseinfo{'description'}.'</td>'.
                                  '<td>'.$rolename.'</td><td>'.$usec.'</td>'.
                                  &Apache::loncommon::end_data_table_row();
                   }
               }
           }
           $output .= &Apache::loncommon::end_data_table();
       }
       return $output;
   }
   
   sub update_coursereq_status {
       my ($reqhash,$dom,$cnum,$reqstatus,$context,$udom,$uname) = @_;
       my ($storeresult,$statusresult,$output);
       my $requestkey = $dom.'_'.$cnum;
       if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {
           $storeresult = &Apache::lonnet::store_userdata($reqhash,$requestkey,
                                                          'courserequests',$udom,$uname);
           if ($storeresult eq 'ok') {
               my %status = (
                                'status:'.$dom.':'.$cnum => $reqstatus,
                            );
               $statusresult = &Apache::lonnet::put('courserequests',\%status,$udom,$uname);
           }
       } else {
           $storeresult = 'error: invalid requestkey format';
       }
       if ($storeresult ne 'ok') {
           $output = &mt('An error occurred saving a record of the details of your request: [_1].',$storeresult);
           if ($context eq 'domain') {
               $output .= "\n";  
           } else {
               $output =  '<span class="LC_warning">'.$output.'</span><br />';
           }
           &Apache::lonnet::logthis("Error saving course request - $requestkey for $uname:$udom - $storeresult");
       } elsif ($statusresult ne 'ok') {
           $output = &mt('An error occurred saving a record of the status of your request: [_1].',$statusresult);
           if ($context eq 'domain') {
               $output .= "\n";
           } else {
               $output = '<span class="LC_warning">'.$output.'</span><br />';
           }
           &Apache::lonnet::logthis("Error saving course request status for $requestkey (for $uname:$udom) - $statusresult");
       }
       return ($storeresult,$output);
   }
   
   sub process_official_reqs {
       my ($context,$dom,$dcname,$dcdom) = @_;
       my $reqsnamespace = 'courserequestqueue';
       my %requesthash =
           &Apache::lonnet::dump_dom($reqsnamespace,$dom,'_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,$user_lh);
       if ($context eq 'auto') {
           $linefeed = "\n";
           $user_lh = &Apache::loncommon::user_lang($dcname,$dcdom);
       } 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,$code);
                       my $clonemsg = [];
                       my %customitems;
                       my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom);
                       my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$ownername,
                                                                           $ownerdom,$fullname,$cdescr);
                       if (ref($inprocess) eq 'HASH') {
                           foreach my $key (keys(%{$inprocess})) {
                               if (exists($history{'details'}{$key})) {
                                   $customitems{$key} = $history{'details'}{$key};
                               }
                           }
                       }
                       if ($history{'details'}{'clonecrs'}) {
                           $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'};
                       }
                       my ($result,$postprocess) = 
                           &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 = &Apache::lonnet::course_portal_url($cnum,$dom);
                               my $beneficiary = 'pendingrequestor';
                               my $now = time;
                               my $owner = $ownername.':'.$ownerdom;
                               my $approvedmsg =
                                   [{
                                       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.',
                                       args => [],
                                    }
                               );
                               my $sender = $dcname.':'.$dcdom;
                               if (ref($postprocess) eq 'HASH') {
                                   if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') {
                                       foreach my $item (@{$postprocess->{'createdmsg'}}) {
                                           if (ref($item) eq 'HASH') {
                                                if ($item->{'mt'} ne '') {
                                                    push(@{$approvedmsg},$item);
                                                }
                                           }
                                       }
                                   }
                                   if (ref($postprocess->{'createdactions'}) eq 'HASH') {
                                       if (ref($postprocess->{'createdactions'}{'environment'}) eq 'HASH') {
                                           &postprocess_crsenv($dom,$cnum,$postprocess->{'createdactions'}{'environment'});
                                       }
                                   }
                               }
                               &send_selfserve_notification($owner,$approvedmsg,
                                                            $cid,$cdescr,$now,
                                                            $beneficiary,$sender,
                                                            undef,undef,$crstype);
                           }
                       }
                   } 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',$ownerdom,
                                                    $ownername);
                       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;
   }
   
   sub postprocess_crsenv {
       my ($dom,$cnum,$postprocessenv) = @_;
       if (ref($postprocessenv) eq 'HASH') {    
           my $cid = $dom.'_'.$cnum;
           my %settablecrsenv = (
                                 'internal.selfenroll_types'        => 1,
                                 'internal.selfenroll_registered'   => 1,
                                 'internal.selfenroll_section'      => 1,
                                 'internal.selfenroll_start_access' => 1,
                                 'internal.selfenroll_end_access'   => 1,
                                 'internal.selfenroll_limit'        => 1,
                                 'internal.selfenroll_cap'          => 1,
                                 'internal.selfenroll_approval'     => 1,
                                 'internal.selfenroll_notifylist'   => 1,
                                );
           my %needcrsidput = (
                                 'internal.selfenroll_types'      => 1,
                                 'internal.selfenroll_start_date' => 1,
                                 'internal. selfenroll_end_date'  => 1,
                              );
           my (@needupdate,%newcrsenv);
           foreach my $key (keys(%{$postprocessenv})) { 
               if ($settablecrsenv{$key}) {
                   $newcrsenv{$key} = $postprocessenv->{$key};
                   if ($needcrsidput{$key}) {
                       push(@needupdate,$key); 
                   }
               }
               if (keys(%newcrsenv)) {
                   my $putresult = &Apache::lonnet::put('environment',\%newcrsenv,$dom,$cnum);
                   if ($putresult eq 'ok') {
                       if (@needupdate) {
                           my %crsinfo =
                               &Apache::lonnet::courseiddump($dom,'.',1,'.','.',$cnum,undef,undef,'.');
                           if (ref($crsinfo{$cid}) eq 'HASH') {
                               foreach my $key (@needupdate) {
                                   $crsinfo{$cid}{$key} = $newcrsenv{$key};
                               }
                               my $chome = &Apache::lonnet::homeserver($cnum,$dom);
                               &Apache::lonnet::courseidput($dom,\%crsinfo,$chome,'notime');
                           }
                       }
                   }
               }
           }
       }
       return;
   }
   
   
   sub requestcourses_validation_types {
       my @items = ('url','fields','button','markup');
       my %names =  &Apache::lonlocal::texthash (
               url      => 'Web address of validation server/script',
               fields   => 'Form fields to send to validator',
               button   => 'Text for validation button',
               markup   => 'Validation description (HTML)',
       );
       my @fields = ('owner','course','coursetype','description');
       return (\@items,\%names,\@fields);
   }
   
   sub is_active_author {
       if ($env{'user.role.au./'.$env{'user.domain'}.'/'} =~ /^(\d*)\.(\d*)$/) {
           if ((!$1 || $1 < time) &&
               (!$2 || $2 > time)) {
               return 1;
           }
       }
   }
   
   sub author_prompt {
       my ($is_active_author,$offer_author);
       if ($env{'environment.canrequest.author'}) {
           unless (&is_active_author()) {
               unless (&reqauthor_check() =~ /^approval:\d+$/) {
                   $offer_author = 1;
               }
           }
       }
       return $offer_author;
   }
   
   sub reqauthor_check {
       my $queued = $env{'environment.requestauthorqueued'};
       my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'],
                                            $env{'user.domain'},$env{'user.name'});
       my $reqstatus = $reqauthor{'author_status'};
       if (($reqstatus eq '' && $queued ne '') ||
           ($env{'environment.requestauthorqueued'} !~ /^\Q$reqstatus\E/)) {
           if (ref($reqauthor{'author'}) eq 'HASH') {
               $queued = $reqstatus.':'.$reqauthor{'author'}{'timestamp'};
           } else {
               undef($queued);
           }
           &Apache::lonnet::appenv({'environment.requestauthorqueued' => $queued});
       }
       return $queued;
   }
   
   sub process_reqauthor {
       my ($dispositionref,$updateref) = @_;
       if (&is_active_author()) {
           return '<span class="LC_warning">'.
                   &mt('An Authoring Space has already been assigned to you.').'<br />'.
                   &mt('Please select the Author role from your [_1]roles page[_2].','<a href="/adm/roles">',
                   '</a>').'</span>';
       }
       unless ($env{'environment.canrequest.author'}) {
           return '<span class="LC_warning">'.
                   &mt('You do not currently have rights to request an Authoring Space.').'<br />'.
                   &mt('Please contact the [_1]helpdesk[_2] for assistance.','<a href="/adm/helpdesk">',
                   '</a>').'</span>';
       }
       my $queued = &reqauthor_check();
       if ($queued =~ /^approval:(\d+)$/) {
           my $timestamp = $1;
           return '<span class="LC_info">'.
                  &mt('A request for Authoring Space submitted on [_1] is awaiting approval',
                  &Apache::lonlocal::locallocaltime($timestamp)).
                  '</span>';
       } elsif ($queued =~ /^approved:(\d+)$/) {
           my $timestamp = $1;   
           my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                         ['active'],['au'],[$env{'user.domain'}]);
           if (keys(%roleshash) > 0) {
               return '<span class="LC_info">'.
                      &mt('A request for Authoring Space submitted on [_1] has been approved.',
                      &Apache::lonlocal::locallocaltime($timestamp)).
                      '</span>';
           }
       }
       my ($output,@inststatuses,%domconfig);
       %domconfig = &Apache::lonnet::get_dom('configuration',['requestauthor'],
                                             $env{'user.domain'});
       my $val = &get_processtype('requestauthor',$env{'user.name'},$env{'user.domain'},
                                  $env{'user.adv'},$env{'user.domain'},undef,
                                  \@inststatuses,\%domconfig);
       my $now = time;
       if ($val eq 'automatic') {
           my $start = $now-1;
           if (&Apache::lonnet::assignrole($env{'user.domain'},$env{'user.name'},'/'.$env{'user.domain'}.'/',
                                           'au',undef,$start,undef,undef,'requestauthor') eq 'ok') {
               $output = '<span class="LC_info">'.
                         &mt('Access to Authoring Space has been activated').'</span><br />';
                         &Apache::lonroles::update_session_roles();
               &Apache::lonnet::appenv({'user.update.time'  => $now});
               if (ref($updateref)) {
                   $$updateref = $now;
               }
               if (ref($dispositionref)) {
                   $$dispositionref = 'created';
               }
           } else {
               $output = '<span class="LC_info">'.
                         &mt('An error occurred while activating your access to Authoring Space');
           }
       } elsif ($val eq 'approval') {
           my $domconfiguser = &Apache::lonnet::get_domainconfiguser($env{'user.domain'});
           if (&Apache::lonnet::put('requestauthorqueue',{ $env{'user.name'}.'_'.$val => $now },
                                    $env{'user.domain'},$domconfiguser) eq 'ok') {
               my %userrequest = (
                   author => {
                               timestamp   => $now,
                               status      => $val,
                             },
                   author_status => $val,
               );
               my $req_notifylist;
               if (ref($domconfig{'requestauthor'}) eq 'HASH') {
                   if (ref($domconfig{'requestauthor'}{'notify'}) eq 'HASH') {
                       my $req_notifylist = $domconfig{'requestauthor'}{'notify'}{'approval'};
                       if ($req_notifylist) {
                           my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                        $env{'user.domain'});
                           my $sender = $env{'user.name'}.':'.$env{'user.domain'};
                           my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
                           &send_selfserve_notification($req_notifylist,
                                                        "$fullname ($env{'user.name'}:$env{'user.domain'})",
                                                        undef,$domdesc,$now,'authorreq',$sender);
                       }
                   }
               }
               my $userresult =
                   &Apache::lonnet::put('requestauthor',\%userrequest,$env{'user.domain'},$env{'user.name'});
               $output = '<span class="LC_info">'.
                         &mt('Your request for Authoring Space has been submitted for approval.').
                         '</span>';
               &Apache::lonnet::appenv({'environment.requestauthorqueued' => $val.':'.$now});
           } else {
               $output = '<span class="LC_info">'.
                         &mt('An error occurred saving your request for Authoring Space.').
                         '</span>';
           }
       }
       return $output;
   }
   
 1;  1;

Removed from v.1.12.2.3  
changed lines
  Added in v.1.52.2.3.2.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.