Diff for /loncom/interface/loncoursequeueadmin.pm between versions 1.11 and 1.41

version 1.11, 2009/11/04 17:42:17 version 1.41, 2014/01/03 18:39:51
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 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,
         $approvedlist,$rejectedlist) = @_;          $approvedlist,$rejectedlist,$crstype) = @_;
 # 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);      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"],
                      });                       });
     } elsif ($context eq 'domainmanagers') {      } elsif ($context eq 'domainmanagers') {
         $rawsubj = 'Course requests reviewed';          $rawsubj = 'Course/Community requests reviewed';
           push(@rawmsg,{
                         mt  => 'Course/Community creation requests in the following domain: "[_1]" have been reviewed.',
                         args => ["\n$contextdesc"],
                        });
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'authormanagers') {
           $rawsubj = 'Authoring space requests reviewed';
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Course creation requests in the following domain: [_1] have been reviewed.',                        mt  => 'Authoring requests in the following domain: "[_1]" have been reviewed.',
                       args => ["\n  $contextdesc"],                        args => ["\n$contextdesc"],
                      });                       });
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
         }          }
     } elsif ($context eq 'enroller') {      } elsif ($context eq 'enroller') {
         $rawsubj = 'Enrollment request';          $rawsubj = 'Enrollment request';
           if ($crstype eq 'community') {
               $msgtxt = 'Your request for enrollment in the following community: [_1]requested on [_2]has been reviewed by a Coordinator.'
           } else {
               $msgtxt = 'Your request for enrollment in the following course: [_1]requested on [_2]has been reviewed by a Course Coordinator.';
           } 
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Your request for enrollment in the following course: [_1]requested on [_2]has been reviewed by a Course Coordinator.',                        mt  => $msgtxt,
                       args => ["\n  ".$contextdesc.",\n",$timestamp.",\n"],                        args => ["\n  ".$contextdesc.",\n",$timestamp.",\n"],
   
                      });                       });
Line 99  sub send_selfserve_notification { Line 140  sub send_selfserve_notification {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
         }          }
     } elsif ($context eq 'courserequestor') {      } elsif ($context eq 'courserequestor') {
         $rawsubj = 'Course request';          if ($crstype eq 'Community') {
               $rawsubj = 'Community request';
               $msgtxt = 'Your request for creation of the following community: [_1]requested on [_2]has been reviewed by a Domain Coordinator.';
           } else {
               $rawsubj = 'Course request';
               $msgtxt = 'Your request for creation of the following course: [_1]requested on [_2]has been reviewed by a Domain Coordinator.';
           }
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Your request for creation of the following course: [_1]requested on [_2]has been reviewed by a Domain Coordinator.',                        mt  => $msgtxt,
                       args => ["\n".$contextdesc.",\n",$timestamp.",\n"],                        args => ["\n".$contextdesc.",\n",$timestamp.",\n"],
   
                      });                       });
         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') {
         $rawsubj = 'Course request to review',           if ($crstype eq 'community') {
               $rawsubj = 'Community request to review';
               $msgtxt = 'Creation of the following community: [_1]was requested by [_2] on [_3].';
           } else {
               $rawsubj = 'Course request to review';
               $msgtxt = 'Creation of the following course: [_1]was requested by [_2] on [_3].';
           }
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Creation of the following course: [_1]was requested by [_2] on [_3].',                        mt  => $msgtxt,
                       args => ["\n  $contextdesc\n",$textstr,$timestamp],                        args => ["\n  $contextdesc\n",$textstr,$timestamp],
                      },                       },
                      {                       {
                       mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Create a new course -> Approve or reject course 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') {
               $msgtxt = 'Enrollment in the following community: [_1]was requested by [_2] on [_3].'
           } else {
               $msgtxt = 'Enrollment in the following course: [_1]was requested by [_2] on [_3].'
           }
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Enrollment in the following course: [_1] was requested by [_2] on [_3].',                        mt  => $msgtxt,
                       args => ["\n  $contextdesc\n",$textstr,$timestamp."\n"],                        args => ["\n  $contextdesc\n",$textstr,$timestamp."\n"],
                      });                       });
         if ($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Community') {          my $directions;  
             push(@rawmsg,          if ($crstype eq 'community') {
               $directions = 'As Coordinator, use: [_1]Main Menu -> Manage Community Users -> Enrollment Requests[_2]to display a list of pending enrollment requests, which you can either approve or reject.';
           } else {
               $directions = 'As Course Coordinator, use: [_1]Main Menu -> Manage Course Users -> Enrollment Requests[_2]to display a list of pending enrollment requests, which you can either approve or reject.';
           }
           push(@rawmsg,
                      {                       {
                       mt =>'As Coordinator, use: [_1]Main Menu -> Manage Course Users -> Enrollment Requests[_2]to display a list of pending enrollment requests, which you can either approve or reject.',                        mt   => $directions,
                       args => ["  \n\n","\n"],                        args => ["  \n\n","\n"],
                      });                       });
         } else {      } elsif ($context eq 'authorreq') {
             push(@rawmsg,          $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 =>'As Course Coordinator, use: [_1]Main Menu -> Manage Course Users -> Enrollment Requests[_2]to display a list of pending enrollment requests, which you can either approve or reject.',                        mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Create users or modify the roles and privileges of users -> Authoring space reqests[_3]to display a list of pending requests, which you can either approve or reject.',
                       args => ["  \n\n","\n"],                        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 '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);
Line 174  sub send_selfserve_notification { Line 274  sub send_selfserve_notification {
             $message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n";              $message .= &Apache::lonlocal::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;
     foreach my $recip (sort(keys(%{$msgcc}))) {      foreach my $recip (sort(keys(%{$msgcc}))) {
Line 202  sub send_selfserve_notification { Line 302  sub send_selfserve_notification {
             if ($rejectedlist) {              if ($rejectedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected course requests:')."\n".$rejectedlist;                  $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected course requests:')."\n".$rejectedlist;
             }              }
           } elsif ($context eq 'authormanagers') {
               if ($approvedlist) {
                   $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved author role requests:')."\n".$approvedlist;
               }
               if ($rejectedlist) {
                   $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected author role requests:')."\n".$rejectedlist;
               }
         }          }
         $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,\%sentmessage,undef,undef,undef,1,$recipid).',';          $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,\%sentmessage,undef,undef,undef,1,$recipid).',';
     }      }
Line 217  sub display_queued_requests { Line 324  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" />';
     } 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';
           }
           %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>';  
             %crstypes = &Apache::lonlocal::texthash (  
                             official   => 'Official course',  
                             unofficial => 'Unofficial course',  
                             community  => 'Community',  
                         );  
         } else {  
             $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$/);
             } 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') {
                              $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 {
                     }                      $queue_by_date{$timestamp} = [$entry];
                 } else {  
                     @{$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') {
                 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.').' '.&mt('If unvalidated, the request will be held in a queue.').' '.&mt('Validation of pending requests is automatically repeated daily.').'</p>';
                     $showtime = &Apache::lonlocal::locallocaltime($item);              } elsif ($context eq 'requestauthor') {
                     if ($context eq 'course') {                  $output .= '<h3>'.&mt('Requests for authoring space queued pending approval by a Domain Coordinator').'</h3>';
                         my ($puname,$pudom,$pusec) = split(/:/,$request);              } else {
                         $approve = $count.':'.$puname.':'.$pudom.':'.$pusec;                  $output .= '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';
                         $reject = $puname.':'.$pudom;              } 
                         $showsec = $pusec;              $output .= &build_queue_display($dom,$context,\%queue_by_date).
                         if ($showsec eq '') {                         '<input type="hidden" name="queue" value="approval" />';
                             $showsec = &mt('none');          } else {
                         }              $output .= '<div class="LC_info">';
                         $namelink = &Apache::loncommon::aboutmewrapper(              if ($context eq 'course') {
                                     &Apache::loncommon::plainname($puname,$pudom),                  $output .= &mt('There are currently no enrollment requests awaiting approval.');
                                     $puname,$pudom);              } elsif ($context eq 'pending') {
                   $output .= &mt('There are currently no requests for official courses awaiting validation.');
               } elsif ($context eq 'requestauthor') {
                   $output .= &mt('There are currently no requests for authoring space awaiting approval.');
               } elsif ($context eq 'domain') {
                   $output .= &mt('There are currently no course or community requests awaiting approval.');
               }
               $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>';
           } else {
               $output .= '<br /><input type="submit" name="processqueue" value="'.&mt('Save').'" />';
           }
           $output .= '</form>';
       } else {
           $output .= '<div class="LC_info">';
           if ($context eq 'course') {
               $output .= &mt('There are currently no enrollment requests awaiting approval.');
           } elsif ($context eq 'pending') {
               $output .= &mt('There are currently no requests for official courses awaiting validation.');
           } else {
               $output .= &mt('There are currently no course or community requests awaiting approval.');
           }
           $output .= '</div>';
       }
       return $output;
   }
   
   sub build_queue_display {
       my ($dom,$context,$queue) = @_;
       return unless (ref($queue) eq 'HASH');
       my %crstypes;
       my $output =  &Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row();
       unless ($context eq 'pending') { 
           $output .= '<th>'.&mt('Action').'</th>';
       }
       $output .= '<th>'.&mt('Requestor').'</th>';
       if ($context eq 'course') {
           $output .= '<th>'.&mt('Section').'</th>'.
                      '<th>'.&mt('Date requested').'</th>';
       } elsif ($context eq 'requestauthor') {
           $output .= '<th>'.&mt('Date requested').'</th>';
       } elsif ($context eq 'pending' || $context eq 'stillpending') {
           $output .= '<th>'.&mt('Institutional code').'</th>'.
                      '<th>'.&mt('Date requested').'</th>'.
                      '<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);
                       }
                   } else {
                       my ($cnum,$ownername,$ownerdom,$type,$cdesc);
                       my $queue = 'approval'; 
                       if ($context eq 'pending' || $context eq 'stillpending') {
                           ($cnum,$ownername,$ownerdom,$instcode,$cdesc)=split(/:/,$request,5);
                           $queue = 'pending';                        
                     } else {                      } 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','$queue'".');">'.$cdesc.'</a>';
                       $approve = $count.':'.$cnum;
                       $reject = $cnum;
                       $namelink = &Apache::loncommon::aboutmewrapper(
                                   &Apache::loncommon::plainname($ownername,$ownerdom),
                                   $ownername,$ownerdom);
                   }
                   unless ($context eq 'pending') {
                     $row = '<td><span class="LC_nobreak"><label>'.                      $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>'.$namelink.'</td>'."\n";
                         $row .= '<td>'.$crstype.'</td>'."\n".                  if ($context eq 'course') {
                                 '<td>'.$showtime.'</td>'."\n".                      $row .= '<td>'.$showsec.'</td>'."\n".
                                 '<td>'.$detailslink.'</td>'."\n";                              '<td>'.$showtime.'</td>'."\n";
                     }                  } elsif ($context eq 'requestauthor') {
                     $output .= &Apache::loncommon::start_data_table_row()."\n".                      $row .= '<td>'.$showtime.'</td>'."\n";
                                $row.                  } else { 
                                &Apache::loncommon::end_data_table_row()."\n";                      if ($context eq 'pending' || $context eq 'stillpending') {
                     $count ++;                          $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 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);          %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,
     @approvals = &Apache::loncommon::get_env_multiple('form.approvereq');          $firsturl,$uniquecode,%codes);
     @rejections = &Apache::loncommon::get_env_multiple('form.rejectreq');      my $count=0;
       while (my @course = &Apache::loncommon::get_env_multiple('form.'.$count.'radioreq')) {
           if ($course[0] =~ /^\d+:.*/) {
               push(@approvals,$course[0]);
           } elsif ($course[0] =~ /^later:.*/) {
               #decide later
           } else {
               push(@rejections,$course[0]);
           }
           $count+=1;
       }
   
     $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') {
         $namespace = 'selfenrollrequests';          $namespace = 'selfenrollrequests';
         $beneficiary = 'enroller';          $beneficiary = 'enroller';
         $cid = $env{'request.course.id'};          $cid = $env{'request.course.id'};
         my $chome = &Apache::lonnet::homeserver($cnum,$cdom);          $crstype = lc(&Apache::loncommon::course_type());
         $hostname = &Apache::lonnet::hostname($chome);          $firsturl = &course_portal_url($cnum,$cdom);
         $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 370  sub update_request_queue { Line 580  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 = &course_portal_url($domconfiguser,$cdom);
           $approvedmsg = [{
                               mt => 'Your request for authoring space has been approved.',
                           },
                           {
                               mt   => 'Visit [_1] to log-in and select your author role',
                               args => [$firsturl],
                           }];
           $rejectedmsg =  [{
                               mt => 'Your request for authoring space has not been approved.',
                           }];
           $domdesc = &Apache::lonnet::domain($cdom);
     } else {      } 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') { 
                 $notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'};                  $notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'};
             }              }
         }          }
         $approvedmsg = [{          $approvalmsg{'course'} = 
                           [{
                             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 => [],
                         }];                          }];
         $rejectedmsg =  [{          $rejectionmsg{'course'} =
                           [{
                             mt => 'Your course request has not been approved.',                              mt => 'Your course request has not been approved.',
                         }];                          }];
   
           $approvalmsg{'community'} = 
                           [{
                               mt => 'Your community request has been approved.',
                           },
                           {
                               mt   => 'Visit [_1] to log-in and access the community',
                               args => [],
                           }];
   
           $rejectionmsg{'community'} = 
                           [{
                               mt => 'Your community request has not been approved.',
                           }];
   
         %domdefs = &Apache::lonnet::get_domain_defaults($cdom);          %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
         my @roles = &Apache::lonuserutils::roles_by_context('course');          my @roles = &Apache::lonuserutils::roles_by_context('course');
         foreach my $role (@roles) {          foreach my $role (@roles) {
Line 409  sub update_request_queue { Line 659  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 417  sub update_request_queue { Line 666  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 (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 450  sub update_request_queue { Line 698  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);                                         $cid,$coursedesc,$now,$beneficiary,$sender,
                                          undef,undef,$crstype);
                         my %userrequest = (                          my %userrequest = (
                             $cdom.'_'.$cnum => {                              $cdom.'_'.$cnum => {
                                 timestamp   => $now,                                  timestamp   => $now,
Line 471  sub update_request_queue { Line 720  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);
                               unless (&Apache::lonnet::del_dom($namespace,[$uname.'_approval'],$cdom) eq 'ok') {
                                   push(@warn_dels,$uname);
                               }
                               &send_selfserve_notification($uname.':'.$cdom,
                                                            $approvedmsg,undef,undef,$now,
                                                            $beneficiary,$sender);
                               my %userrequest = (
                                   author => {
                                             timestamp   => $now,
                                             adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                                             status      => 'approved',
                                           },
                                   author_status => 'approved',
                               );
                               my $userresult =
                                   &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$uname);
                               if ($userresult ne 'ok') {
                                   push(@warn_approves,$item);
                               }
                           } else {
                               push(@processing_errors,$uname);
                           }
                       } else {
                           push(@nopermissions,$uname);
                       }
                   } else {
                       push(@nopermissions,$uname);
                   }
               } else {
                   push(@invalidusers,$uname.':'.$cdom);
               }
               push(@toremove,(@invalidusers,@nopermissions));
         } else {          } 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'};
                     my $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 504  sub update_request_queue { Line 797  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,$keysmsg,$code,%customitems);
                             my $result = &course_creation($cdom,$cnum,$context,$history{'details'},\$logmsg,                              my $fullname = '';
                                                       \$newusermsg,\$addresult,\$enrollcount,                              my $inprocess = &Apache::lonnet::auto_crsreq_update($cdom,$cnum,$crstype,'process',$ownername,
                                                       \$response,\$keysmsg,\%domdefs,$longroles);                                                                                  $ownerdom,$fullname,$coursedesc);
                               if (ref($inprocess) eq 'HASH') {
                                   foreach my $key (keys(%{$inprocess})) {
                                       if (exists($history{'details'}{$key})) { 
                                           $customitems{$key} = $history{'details'}{$key};
                                       }
                                   }
                               }
                               my ($result,$postprocess) = &course_creation($cdom,$cnum,$context,$history{'details'},\$logmsg,
                                                           \$newusermsg,\$addresult,\$enrollcount,
                                                           \$response,\$keysmsg,\%domdefs,$longroles,\$code,\%customitems);
                             if ($result eq 'created') {                              if ($result eq 'created') {
                                   if ($crstype eq 'community') {
                                       $approvedmsg = $approvalmsg{'community'};
                                   } else {
                                       $approvedmsg = $approvalmsg{'course'};
                                   }
                                   my $firsturl = &course_portal_url($cnum,$cdom);
                                   if (ref($approvedmsg) eq 'ARRAY') {
                                       if (ref($approvedmsg->[1]) eq 'HASH') {
                                           $approvedmsg->[1]->{'args'} = [$firsturl];
                                       }
                                       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);                                  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 558  sub update_request_queue { Line 896  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);
     }      }
     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);
                   if ($context eq 'requestauthor') {
                       $uname = $item;
                       $udom = $cdom;
                       $user = $uname.':'.$udom;
                       $key = 'author';
                   } else {
                       $user = $item;
                       ($uname,$udom) = split(/:/,$user);
                       $key = $cdom.'_'.$cnum;
                   }
                 &send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,                  &send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,
                                              $now,$beneficiary,$sender);                                               $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('requestauthor',\%userrequest,$udom,$uname);
                 if ($userresult ne 'ok') {                  if ($userresult ne 'ok') {
                     push(@warn_rejects,$user);                      push(@warn_rejects,$item);
                 }                  }
             } 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.'_'.$queue}{'crstype'};
                           if ($crstype eq 'community') {
                               $rejectedmsg = $rejectionmsg{'community'};
                           } else {
                               $rejectedmsg = $rejectionmsg{'course'};
                           }
                         &send_selfserve_notification($ownername.':'.$ownerdom,$rejectedmsg,                          &send_selfserve_notification($ownername.':'.$ownerdom,$rejectedmsg,
                                                      $cid,$coursedesc,$now,$beneficiary,                                                       $cid,$coursedesc,$now,$beneficiary,
                                                      $sender);                                                       $sender,undef,undef,$crstype);
                         my %history =                          my %history =
                             &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 619  sub update_request_queue { Line 978  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 631  sub update_request_queue { Line 993  sub update_request_queue {
             }              }
         }          }
     }      }
       if (@toremove) {
           foreach my $item (@toremove) {
               my %userrequest = (
                   author => {
                               timestamp   => $now,
                               adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                               status      => 'deleted',
                             },
                             author_status => 'deleted',
               );
               &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$item);
           }
           @toremove = map {$_.'_approval'} (@toremove);
           my $delresult = &Apache::lonnet::del_dom($namespace,\@toremove,$cdom);
       }
     if (@changes) {      if (@changes) {
         my $delresult;          my $delresult;
         if ($context eq 'course') {          if ($context eq 'course') {
Line 646  sub update_request_queue { Line 1023  sub update_request_queue {
                 $chgmsg = "'Action was taken on the following enrollment requests by [_1].',$namelink";                  $chgmsg = "'Action was taken on the following enrollment requests by [_1].',$namelink";
                 if (@completed) {                  if (@completed) {
                     $approvedlist = join("\n",@completed);                      $approvedlist = join("\n",@completed);
                     $output .= '<p>'.&mt('The following were enrolled in the course:').'<ul>';                      if ($crstype eq 'community') {
                           $output .= '<p>'.&mt('The following were enrolled in the community:').'<ul>';
                       } else {
                           $output .= '<p>'.&mt('The following were enrolled in the course:').'<ul>';
                       }
                     foreach my $user (@completed) {                      foreach my $user (@completed) {
                         my ($uname,$udom) = split(/:/,$user);                          my ($uname,$udom) = split(/:/,$user);
                         my $userlink =                          my $userlink =
Line 666  sub update_request_queue { Line 1047  sub update_request_queue {
                 if ($notifylist ne '') {                  if ($notifylist ne '') {
                     &send_selfserve_notification($notifylist,$chgmsg,$cid,$coursedesc,                      &send_selfserve_notification($notifylist,$chgmsg,$cid,$coursedesc,
                                                  $now,'coursemanagers',$sender,                                                   $now,'coursemanagers',$sender,
                                                    $approvedlist,$rejectedlist,$crstype);
                   }
               } elsif ($context eq 'requestauthor') {
                   $chgmsg = "'Action was taken on the following authoring space requests by [_1].',$namelink";
                   if (@completed) {
                       $approvedlist = join("\n",@completed);
                       $output .= '<p>'.&mt('The following requests were approved:').'<ul>';
                       foreach my $uname (@completed) {
                           my $userlink =
                               &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                           $output .= '<li>'.$userlink.'</li>';
                           
                       }
                       $output .= '</ul></p>';
                   }
                   if (@rejections) {
                       $rejectedlist = join("\n",@rejections);
                       $output .= '<p>'.&mt('The following requests were rejected:').'<ul>';
                       foreach my $uname (@rejections) {
                           my $userlink =
                               &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                           $output .= '<li>'.$userlink.'</li>';
                       }
                       $output .= '</ul></p>';
                   }
                   if ($notifylist ne '') {
                       &send_selfserve_notification($notifylist,$chgmsg,undef,$domdesc,
                                                    $now,'authormanagers',$sender,
                                                  $approvedlist,$rejectedlist);                                                   $approvedlist,$rejectedlist);
                 }                  }
             } else {              } else {
                 $chgmsg = "'Action was taken on the following course requests by [_1].',$namelink";                  $chgmsg = "'Action was taken on the following course and community requests by [_1].',$namelink";
                 if (@completed) {                  if (@completed) {
                     $approvedlist = join("\n",@completed);                      $approvedlist = join("\n",@completed);
                     $output .= '<p>'.&mt('The following courses 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 691  sub update_request_queue { Line 1103  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 703  sub update_request_queue { Line 1115  sub update_request_queue {
                 if ($notifylist ne '') {                  if ($notifylist ne '') {
                     &send_selfserve_notification($notifylist,$chgmsg,$cid,$domdesc,                      &send_selfserve_notification($notifylist,$chgmsg,$cid,$domdesc,
                                                  $now,'domainmanagers',$sender,                                                   $now,'domainmanagers',$sender,
                                                  $approvedlist,$rejectedlist);                                                   $approvedlist,$rejectedlist,$crstype);
                 }                  }
             }              }
         }          }
Line 715  sub update_request_queue { Line 1127  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 creation requests were deleted because the course 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) {
                 my $showcourse;                  my $showcourse;
                 my %coursehash = &Apache::lonnet::coursedescription($cdom.'/'.$cnum);                  my %coursehash = &Apache::lonnet::coursedescription($cdom.'/'.$cnum);
Line 737  sub update_request_queue { Line 1157  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 creation requests were ignored because the request is no longer in the course request 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 753  sub update_request_queue { Line 1180  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 765  sub update_request_queue { Line 1200  sub update_request_queue {
         }          }
     }      }
     if (@nopermissions) {      if (@nopermissions) {
         $output .= '<p>'.&mt('The following course creation requests could not be processed because the course owner does hot 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 784  sub update_request_queue { Line 1229  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>';
         } else {          } else {
             $output .= '<p>'.&mt('The following course 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 799  sub update_request_queue { Line 1252  sub update_request_queue {
         }          }
     }      }
     if (@rejectionerrors) {      if (@rejectionerrors) {
         $output .= '<p>'.&mt('The following course 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 818  sub update_request_queue { Line 1271  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>';
         } else {          } else {
             $output .= '<p>'.&mt("For the following course requests an error occurred when updating the requestor's own course 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 {
                       $showcourse = $cnum;
                   }
                   $output .= '<li>'.$showcourse.'</li>';
               }
               $output .= '</ul></p>';
           }
       }
       if (@warn_dels) {
           if ($context eq 'requestauthor') {
               $output .= '<p>'.&mt("For the following requests an error occurred when removing the request from the queue:").'<ul>';
               foreach my $uname (@warn_dels) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
           } else {
               $output .= '<p>'.&mt("For the following course/community requests an error occurred when removing requests from the pending queue:").'<ul>';
               foreach my $cnum (@warn_dels) {
                   my $showcourse;
                   if (ref($requesthash{$cnum.'_'.$queue})) {
                       $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                 } else {                  } else {
                     $showcourse = $cnum;                      $showcourse = $cnum;
                 }                  }
Line 835  sub update_request_queue { Line 1319  sub update_request_queue {
     return $output;      return $output;
 }  }
   
   sub course_portal_url {
       my ($cnum,$cdom) = @_;
       my $chome = &Apache::lonnet::homeserver($cnum,$cdom);
       my $hostname = &Apache::lonnet::hostname($chome);
       my $protocol = $Apache::lonnet::protocol{$chome};
       $protocol = 'http' if ($protocol ne 'https');
       my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
       my $firsturl;
       if ($domdefaults{'portal_def'}) {
           $firsturl = $domdefaults{'portal_def'};
       } else {
           $firsturl = $protocol.'://'.$hostname;
       }
       return $firsturl;
   }
   
 sub get_student_counts {  sub get_student_counts {
     my ($cdom,$cnum) = @_;      my ($cdom,$cnum) = @_;
     my (%idx,%stucounts);      my (%idx,%stucounts);
Line 855  sub get_student_counts { Line 1355  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,$newusermsg,$addresult,$enrollcount,$output,
         $keysmsg,$domdefs,$longroles) =  @_;          $keysmsg,$domdefs,$longroles,$coderef,$customhash) =  @_;
     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 %domconfig = &Apache::lonnet::get_dom('configuration',['requestauthor'],$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 869  sub course_creation { Line 1378  sub course_creation {
         $ownername = $env{'user.name'};          $ownername = $env{'user.name'};
         $ownerdom  = $env{'user.domain'};          $ownerdom  = $env{'user.domain'};
     }      }
     my $type = 'Course';      my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom);
     if ($crstype eq 'community') {  
         $type = 'Community';  
     }  
     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') {
Line 881  sub course_creation { Line 1387  sub course_creation {
     }      }
     my %reqdetails = &build_batchcreatehash($dom,$context,$details,$owneremail,$domdefs);      my %reqdetails = &build_batchcreatehash($dom,$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,$newusermsg,$addresult,
                   \$enrollcount,\$output,\$keysmsg,$ownerdom,$ownername,$cnum,$crstype);                    $enrollcount,$output,$keysmsg,$ownerdom,$ownername,$cnum,$crstype,$coderef);
       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,$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,$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 enrollstart enrollend accessstart accessend sections crosslists users uniquecode};
     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};
         }          }
         $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 911  sub build_batchcreatehash { Line 1427  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 957  sub can_clone_course { Line 1479  sub can_clone_course {
     my ($uname,$udom,$clonecrs,$clonedom,$crstype) = @_;      my ($uname,$udom,$clonecrs,$clonedom,$crstype) = @_;
     my $canclone;      my $canclone;
     my $ccrole = 'cc';      my $ccrole = 'cc';
     if ($crstype eq 'Community') {      if ($crstype eq 'community') {
         $ccrole = 'co';          $ccrole = 'co';
     }      }
     my %roleshash = &Apache::lonnet::get_my_roles($uname,$udom,'userroles',['active'],      my %roleshash = &Apache::lonnet::get_my_roles($uname,$udom,'userroles',['active'],
Line 979  sub can_clone_course { Line 1501  sub can_clone_course {
                 $canclone = 1;                  $canclone = 1;
             }              }
         }          }
           unless ($canclone) {
               if (&Apache::lonnet::is_course_owner($clonedom,$clonecrs,$uname,$udom)) {
                   $canclone = 1;
               }
           }
     }      }
     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);
       if ($context eq 'auto') {
           $linefeed = "\n";
       } else {
           $linefeed = '<br />'."\n";
       }
       foreach my $key (keys(%requesthash)) {
           my ($cnum,$status) = split('_',$key);
           next if (&Apache::lonnet::homeserver($cnum,$dom) ne 'no_host');
           if (ref($requesthash{$key}) eq 'HASH') {
               my $ownername = $requesthash{$key}{'ownername'};
               my $ownerdom = $requesthash{$key}{'ownerdom'};
               next if (&Apache::lonnet::homeserver($ownername,$ownerdom) eq 'no_host');
               my $inststatus;
               my %userenv =
                   &Apache::lonnet::get('environment',['inststatus'],
                                        $ownerdom,$ownername);
               my ($tmp) = keys(%userenv);
               if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
                   $inststatus = $userenv{'inststatus'};
               } else {
                   undef(%userenv);
               }
               my $reqkey = $dom.'_'.$cnum;
               my %history = &Apache::lonnet::restore($reqkey,'courserequests',
                                                      $ownerdom,$ownername);
               if (ref($history{'details'}) eq 'HASH') {
                   my $instcode = $history{'details'}{'instcode'};
                   my $crstype = $history{'details'}{'crstype'};
                   my $reqtime = $history{'details'}{'reqtime'};
                   my $cdescr = $history{'details'}{'cdescr'};
                   my @currsec;
                   my $sections = $history{'details'}{'sections'};
                   if (ref($sections) eq 'HASH') {
                       foreach my $i (sort(keys(%{$sections}))) {
                           if (ref($sections->{$i}) eq 'HASH') {
                               my $sec = $sections->{$i}{'inst'};
                               if (!grep(/^\Q$sec\E$/,@currsec)) {
                                   push(@currsec,$sec);
                               }
                           }
                       }
                   }
                   my $instseclist = join(',',@currsec);
                   my ($validationchk,$disposition,$reqstatus,$message,
                       $validation,$validationerror);
                   $validationchk =
                       &Apache::lonnet::auto_courserequest_validation($dom,
                           $ownername.':'.$ownerdom,$crstype,$inststatus,
                           $instcode,$instseclist);
                   if ($validationchk =~ /:/) {
                       ($validation,$message) = split(':',$validationchk);
                   } else {
                       $validation = $validationchk;
                   }
                   if ($validation =~ /^error(.*)$/) {
                       $disposition = 'approval';
                       $validationerror = $1;
                   } else {
                       $disposition = $validation;
                   }
                   $reqstatus = $disposition;
                   if ($disposition eq 'process') {
                       my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,$code);
                       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};
                               }
                           }
                       }
                       my ($result,$postprocess) = 
                           &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,\$newusermsg,\$addresult,
                                            \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,\$code,\%customitems);
                       if ($result eq 'created') {
                           $disposition = 'created';
                           $reqstatus = 'created';
                           my $cid = $dom.'_'.$cnum;
                           push(@{$newcids{$instcode}},$cid);
                           if ($dcname && $dcdom) {
                               my $firsturl = &course_portal_url($cnum,$dom);
                               my $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],
                                    },
                                    {
                                       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.'
                                    }];
                               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);
                                                }
                                           }
                                       }
                                   }
                               }
                               &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 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.11  
changed lines
  Added in v.1.41


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.