Diff for /loncom/interface/loncoursequeueadmin.pm between versions 1.26 and 1.52.2.2.6.1

version 1.26, 2011/03/06 21:17:15 version 1.52.2.2.6.1, 2020/04/06 22:32:32
Line 70  described at http://www.lon-capa.org. Line 70  described at http://www.lon-capa.org.
   
 =item process_official_reqs()  =item process_official_reqs()
   
   =item is_active_author()
   
   =item author_prompt()
   
   =item reqauthor_check()
   
   =item process_reqauthor()
   
 =back  =back
   
 =cut  =cut
Line 82  use Apache::loncommon; Line 90  use Apache::loncommon;
 use Apache::lonmsg;  use Apache::lonmsg;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonuserutils;  use Apache::lonuserutils;
   use LONCAPA::batchcreatecourse;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 sub send_selfserve_notification {  sub send_selfserve_notification {
Line 96  sub send_selfserve_notification { Line 105  sub send_selfserve_notification {
         $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/Community requests reviewed';          $rawsubj = 'Course/Community requests reviewed';
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Course/Community creation requests in the following domain: [_1] have been reviewed.',                        mt  => 'Course/Community creation requests in the following domain: "[_1]" have been reviewed.',
                       args => ["\n  $contextdesc"],                        args => ["\n$contextdesc"],
                        });
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'authormanagers') {
           $rawsubj = 'Authoring Space requests reviewed';
           push(@rawmsg,{
                         mt  => 'Authoring requests in the following domain: "[_1]" have been reviewed.',
                         args => ["\n$contextdesc"],
                        });
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'usernamemanagers') {
           $rawsubj = 'LON-CAPA account requests reviewed';
           push(@rawmsg,{
                         mt  => 'Account requests in the following domain: "[_1]" have been reviewed.',
                         args => ["\n$contextdesc"],
                      });                       });
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
Line 161  sub send_selfserve_notification { Line 188  sub send_selfserve_notification {
                      },                       },
                      {                       {
                       mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Course and community creation -> Approve or reject requests[_3]to display a list of pending requests, which you can either approve or reject.',                        mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Course and community creation -> Approve or reject requests[_3]to display a list of pending requests, which you can either approve or reject.',
                       args => ["\n","\n\n  ","\n\n"],                        args => ["\n","\n\n","\n\n"],
                      });                       });
     } elsif ($context eq 'selfenrollreq') {      } elsif ($context eq 'selfenrollreq') {
         $rawsubj = 'Self-enrollment request';          $rawsubj = 'Self-enrollment request';
         if ($crstype eq 'community') {          if ($crstype eq 'community') {
             $msgtxt = 'Enrollment in the following community: [_1] was requested by [_2] on [_3].'              $msgtxt = 'Enrollment in the following community: [_1]was requested by [_2] on [_3].'
         } else {          } else {
             $msgtxt = 'Enrollment in the following course: [_1] was requested by [_2] on [_3].'              $msgtxt = 'Enrollment in the following course: [_1]was requested by [_2] on [_3].'
         }          }
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => $msgtxt,                        mt  => $msgtxt,
Line 185  sub send_selfserve_notification { Line 212  sub send_selfserve_notification {
                       mt   => $directions,                        mt   => $directions,
                       args => ["  \n\n","\n"],                        args => ["  \n\n","\n"],
                      });                       });
       } elsif ($context eq 'authorreq') {
           $rawsubj = 'Authoring Space request to review';
           $msgtxt = 'Assignment of an author role in the [_1] domain[_2]was requested by [_3] on [_4].';
           push(@rawmsg,{
                         mt  => $msgtxt,
                         args => [$contextdesc,"\n",$textstr,$timestamp],
                        },
                        {
                         mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Create users or modify the roles and privileges of users -> Authoring Space requests[_3]to display a list of pending requests, which you can either approve or reject.',
                         args => ["\n","\n\n  ","\n\n"],
                        });
       } elsif ($context eq 'requestauthor') {
           $rawsubj = 'Authoring Space request';
           $msgtxt = 'Your request for an Authoring Space requested on [_1]has been reviewed by a Domain Coordinator.';
           push(@rawmsg,{
                         mt  => $msgtxt,
                         args => [$timestamp."\n"],
                        });
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'usernamereq') {
           $rawsubj = 'LON-CAPA account request';
           $msgtxt = 'Creation of a LON-CAPA account in the [_1] domain[_2]was requested by [_3] on [_4].';
           push(@rawmsg,{
                         mt  => $msgtxt,
                         args => [$contextdesc,"\n",$textstr,$timestamp],
                        },
                        {
                         mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Create users or modify the roles and privileges of users
    -> LON-CAPA account requests[_3]to display a list of pending requests, which you can either approve or reject.',
                         args => ["\n","\n\n  ","\n\n"],
                        });
       } elsif ($context eq 'requestusername') {
           $rawsubj = 'LON-CAPA account request';
           $msgtxt = 'Your request for a LON-CAPA account requested on [_1]has been reviewed by a Domain Coordinator.';
           push(@rawmsg,{
                         mt  => $msgtxt,
                         args => [$timestamp."\n"],
                        });
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'uniquecode') {
           $rawsubj = 'Course Identifier';
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'queuedcrsreq') {
           $rawsubj = 'Course Request Queued';
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'createdcrsreq') {
           $rawsubj = 'Course Creation Information';
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
     }      }
     my @to_notify = split(/,/,$notifylist);      my @to_notify = split(/,/,$notifylist);
     my $numsent = 0;      my $numsent = 0;
Line 203  sub send_selfserve_notification { Line 287  sub send_selfserve_notification {
     my %reciphash = (      my %reciphash = (
                      cc => $msgcc,                       cc => $msgcc,
     );      );
     my ($uname,$udom);      my ($uname,$udom,$need_temp_env);
     if ($sender =~ /:/) {      if ($sender =~ /:/) {
         ($uname,$udom) = split(/:/,$sender);          ($uname,$udom) = split(/:/,$sender);
           if ($context eq 'usernamereq') {
               unless ($env{'user.name'} && $env{'user.domain'}) {
                   $need_temp_env = 1;
               }
           }
     } elsif ($context eq 'course') {      } elsif ($context eq 'course') {
         $uname = $sender;          $uname = $sender;
         my %courseinfo = &Apache::lonnet::coursedescription($cid);          my %courseinfo = &Apache::lonnet::coursedescription($cid);
Line 222  sub send_selfserve_notification { Line 311  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,undef,undef,undef,undef,$senderuname,$senderudom);      &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$uname,$udom,$msgcount,$cid,$$,$message,
                                          \@recusers,\@recudoms,undef,undef,undef,undef,$senderuname,$senderudom);
     my ($recipid,$recipstatus) = &Apache::lonmsg::store_recipients($subject,$uname,$udom,\%reciphash);      my ($recipid,$recipstatus) = &Apache::lonmsg::store_recipients($subject,$uname,$udom,\%reciphash);
     my $status;      my $status;
       if ($need_temp_env) {
           $env{'user.name'} = $uname;
           $env{'user.domain'} = $udom;
       }
     foreach my $recip (sort(keys(%{$msgcc}))) {      foreach my $recip (sort(keys(%{$msgcc}))) {
         my ($ccname,$ccdom) = split(/:/,$recip);          my ($ccname,$ccdom) = split(/:/,$recip);
         my $recip_lh = &Apache::loncommon::user_lang($ccname,$ccdom,$cid);          my $recip_lh = &Apache::loncommon::user_lang($ccname,$ccdom,$cid);
Line 250  sub send_selfserve_notification { Line 344  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;
               }
           } elsif ($context eq 'usernamemanagers') {
               if ($approvedlist) {
                   $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved LON-CAPA account requests:')."\n".$approvedlist;
               }
               if ($rejectedlist) {
                   $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected LON-CAPA account requests:')."\n".$rejectedlist;
               }
         }          }
         $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,\%sentmessage,undef,undef,undef,1,$recipid).',';          $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,
                                                       \%sentmessage,undef,undef,undef,1,$recipid).',';
     }      }
     $status =~ s/,$//;      $status =~ s/,$//;
       if ($need_temp_env) {
           undef($env{'user.name'});
           undef($env{'user.domain'});
       }
     return ($recipstatus,$status);      return ($recipstatus,$status);
 }  }
   
Line 265  sub display_queued_requests { Line 378  sub display_queued_requests {
         $namespace = 'selfenrollrequests';          $namespace = 'selfenrollrequests';
         %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);          %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);
         $nextelement = '<input type="hidden" name="state" value="done" />';          $nextelement = '<input type="hidden" name="state" value="done" />';
       } elsif ($context eq 'requestauthor') {
           $formaction = '/adm/createuser';
           $namespace = 'requestauthorqueue';
           %requesthash = &Apache::lonnet::dump_dom($namespace,$dom);
           $nextelement = '<input type="hidden" name="state" value="done" />';
       } elsif ($context eq 'requestusername') {
           $formaction = '/adm/createuser';
           $namespace = 'usernamequeue';
           %requesthash = &Apache::lonnet::dump_dom($namespace,$dom);
           $nextelement = '<input type="hidden" name="state" value="done" />';
     } else {      } else {
         $formaction = '/adm/createcourse';          $formaction = '/adm/createcourse';
         $namespace = 'courserequestqueue';          $namespace = 'courserequestqueue';
Line 273  sub display_queued_requests { Line 396  sub display_queued_requests {
         if ($context eq 'pending') {          if ($context eq 'pending') {
             $disposition = 'pending';              $disposition = 'pending';
             $nextphase = 'requestvalidation';              $nextphase = 'requestvalidation';
           } elsif ($context eq 'displaypending') {
               $disposition = 'pending';
         }          }
         %requesthash = &Apache::lonnet::dump_dom($namespace,$dom,'_'.$disposition);          %requesthash = &Apache::lonnet::dump_dom($namespace,$dom,'_'.$disposition);
         $nextelement = '<input type="hidden" name="phase" value="'.$nextphase.'" />';          $nextelement = '<input type="hidden" name="phase" value="'.$nextphase.'" />';
Line 287  sub display_queued_requests { Line 412  sub display_queued_requests {
             if ($context eq 'course') {              if ($context eq 'course') {
                 ($timestamp, my $usec) = split(/:/,$requesthash{$item});                  ($timestamp, my $usec) = split(/:/,$requesthash{$item});
                 $entry = $item.':'.$usec;                  $entry = $item.':'.$usec;
               } elsif ($context eq 'requestauthor') {
                   $timestamp = $requesthash{$item};
                   ($entry) = ($item =~ /^($match_username)_approval$/);
               } elsif ($context eq 'requestusername') {
                   $timestamp = $requesthash{$item};
                   ($entry) = (&unescape($item) =~ /^($match_username)_approval$/);
             } else {              } else {
                 $timestamp = $requesthash{$item}{'timestamp'};                  $timestamp = $requesthash{$item}{'timestamp'};
                 if (ref($requesthash{$item}) eq 'HASH') {                  if (ref($requesthash{$item}) eq 'HASH') {
                     my ($cnum,$disposition) = split('_',$item);                      my ($cnum,$disposition) = split('_',$item);
                     $entry = $cnum.':'.$requesthash{$item}{'ownername'}.':'.                      $entry = $cnum.':'.$requesthash{$item}{'ownername'}.':'.
                              $requesthash{$item}{'ownerdom'}.':';                               $requesthash{$item}{'ownerdom'}.':';
                     if ($context eq 'pending') {                      if (($context eq 'pending') || ($context eq 'displaypending')) {
                         $entry .= $requesthash{$item}{'instcode'};                          $entry .= $requesthash{$item}{'instcode'};
                     } else {                      } else {
                         $entry .= $requesthash{$item}{'crstype'};                          $entry .= $requesthash{$item}{'crstype'};
Line 312  sub display_queued_requests { Line 443  sub display_queued_requests {
         if (keys(%queue_by_date) > 0) {          if (keys(%queue_by_date) > 0) {
             if ($context eq 'course') {              if ($context eq 'course') {
                 $output .=  '<h3>'.&mt('Self-enrollment requests queued pending approval by a Coordinator').'</h3>';                  $output .=  '<h3>'.&mt('Self-enrollment requests queued pending approval by a Coordinator').'</h3>';
             } elsif ($context eq 'pending') {              } elsif (($context eq 'pending') || ($context eq 'displaypending')) {
                 $output .= '<h3>'.&mt('Requests for official courses queued pending validation').'</h3>'.                  $output .= '<h3>'.&mt('Requests for official courses queued pending validation').'</h3>'.
                            '<p>'.&mt('Requests are validated against institutional data to confirm that the requestor is an instructor of record.').'<br />'.                             '<p>'.&mt('Requests are validated against institutional data to confirm that the requestor is an instructor of record.').'<br />'.
                            &mt('Validation is attempted when the request is submitted.').' '.&mt('If unvalidated, the request will be held in a queue.').' '.&mt('Validation of pending requests is automatically repeated daily.').'</p>';                             &mt('Validation is attempted when the request is submitted.').' '.
                              &mt('If unvalidated, the request will be held in a queue.').' '.
                              &mt('Validation of pending requests is automatically repeated daily.').'</p>';
               } elsif ($context eq 'requestauthor') {
                   $output .= '<h3>'.&mt('Requests for Authoring Space queued pending approval by a Domain Coordinator').'</h3>';
               } elsif ($context eq 'requestusername') {
                   $output .= '<h3>'.&mt('Requests for LON-CAPA accounts queued pending approval by a Domain Coordinator').'</h3>';
             } else {              } else {
                 $output .=  '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';                  $output .= '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';
             }               } 
             $output .= &build_queue_display($dom,$context,\%queue_by_date).              $output .= &build_queue_display($dom,$context,\%queue_by_date).
                        '<input type="hidden" name="queue" value="approval" />';                         '<input type="hidden" name="queue" value="approval" />';
Line 327  sub display_queued_requests { Line 464  sub display_queued_requests {
                 $output .= &mt('There are currently no enrollment requests awaiting approval.');                  $output .= &mt('There are currently no enrollment requests awaiting approval.');
             } elsif ($context eq 'pending') {              } elsif ($context eq 'pending') {
                 $output .= &mt('There are currently no requests for official courses awaiting validation.');                  $output .= &mt('There are currently no requests for official courses awaiting validation.');
               } elsif ($context eq 'requestauthor') {
                   $output .= &mt('There are currently no requests for Authoring Space awaiting approval.');
               } elsif ($context eq 'requestusername') {
                   $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');
             } elsif ($context eq 'domain') {              } elsif ($context eq 'domain') {
                 $output .= &mt('There are currently no course or community requests awaiting approval.');                  $output .= &mt('There are currently no course or community requests awaiting approval.');
             }              }
Line 335  sub display_queued_requests { Line 476  sub display_queued_requests {
         if ($context eq 'pending') {          if ($context eq 'pending') {
             $output .= '<br /><input type="submit" name="validationcheck" value="'.              $output .= '<br /><input type="submit" name="validationcheck" value="'.
                        &mt('Validate').'" /><br />'."\n".                         &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>';                         '<p>'.&mt('Any course/community requests which are successfully validated will be created immediately.').' '.
         } else {                               &mt('Unvalidated requests will be listed for manual approval/rejection.').'</p>';
           } elsif (($context ne 'helpdesk') && ($context ne 'displaypending')) {
             $output .= '<br /><input type="submit" name="processqueue" value="'.&mt('Save').'" />';              $output .= '<br /><input type="submit" name="processqueue" value="'.&mt('Save').'" />';
         }          }
         $output .= '</form>';          $output .= '</form>';
Line 344  sub display_queued_requests { Line 486  sub display_queued_requests {
         $output .= '<div class="LC_info">';          $output .= '<div class="LC_info">';
         if ($context eq 'course') {          if ($context eq 'course') {
             $output .= &mt('There are currently no enrollment requests awaiting approval.');              $output .= &mt('There are currently no enrollment requests awaiting approval.');
         } elsif ($context eq 'pending') {          } elsif (($context eq 'pending') || ($context eq 'displaypending')) {
             $output .= &mt('There are currently no requests for official courses awaiting validation.');              $output .= &mt('There are currently no requests for official courses awaiting validation.');
           } elsif ($context eq 'requestauthor') {
               $output .= &mt('There are currently no requests for Authoring Space awaiting approval.');
           } elsif ($context eq 'requestusername') {
               $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');
         } else {          } else {
             $output .= &mt('There are currently no course or community requests awaiting approval.');              $output .= &mt('There are currently no course or community requests awaiting approval.');
         }          }
Line 360  sub build_queue_display { Line 506  sub build_queue_display {
     my %crstypes;      my %crstypes;
     my $output =  &Apache::loncommon::start_data_table().      my $output =  &Apache::loncommon::start_data_table().
                   &Apache::loncommon::start_data_table_header_row();                    &Apache::loncommon::start_data_table_header_row();
     unless ($context eq 'pending') {       unless (($context eq 'pending') || ($context eq 'displaypending') || ($context eq 'helpdesk')) {
         $output .= '<th>'.&mt('Action').'</th>';          $output .= '<th>'.&mt('Action').'</th>';
     }      }
     $output .= '<th>'.&mt('Requestor').'</th>';      $output .= '<th>'.&mt('Requestor').'</th>';
     if ($context eq 'course') {      if ($context eq 'course') {
         $output .= '<th>'.&mt('Section').'</th>'.          $output .= '<th>'.&mt('Section').'</th>'.
                    '<th>'.&mt('Date requested').'</th>';                     '<th>'.&mt('Date requested').'</th>';
     } elsif ($context eq 'pending' || $context eq 'stillpending') {      } elsif ($context eq 'requestauthor') {
           $output .= '<th>'.&mt('Date requested').'</th>';
       } elsif ($context eq 'requestusername') {
           $output .= '<th>'.&mt('Date requested').'</th>'.
                      '<th>'.&mt('Details').'</th>';
       } elsif ($context eq 'pending' || $context eq 'displaypending' || $context eq 'stillpending') {
         $output .= '<th>'.&mt('Institutional code').'</th>'.          $output .= '<th>'.&mt('Institutional code').'</th>'.
                    '<th>'.&mt('Date requested').'</th>'.                     '<th>'.&mt('Date requested').'</th>'.
                    '<th>'.&mt('Details').'</th>';                     '<th>'.&mt('Details').'</th>';
Line 376  sub build_queue_display { Line 527  sub build_queue_display {
                         official   => 'Official course',                          official   => 'Official course',
                         unofficial => 'Unofficial course',                          unofficial => 'Unofficial course',
                         community  => 'Community',                          community  => 'Community',
                           textbook   => 'Textbook course',
                     );                      );
         $output .= '<th>'.&mt('Type').'</th>'.          $output .= '<th>'.&mt('Type').'</th>'.
                    '<th>'.&mt('Date requested').'</th>'.                     '<th>'.&mt('Date requested').'</th>'.
Line 401  sub build_queue_display { Line 553  sub build_queue_display {
                     $namelink = &Apache::loncommon::aboutmewrapper(                      $namelink = &Apache::loncommon::aboutmewrapper(
                                 &Apache::loncommon::plainname($puname,$pudom),                                  &Apache::loncommon::plainname($puname,$pudom),
                                 $puname,$pudom);                                  $puname,$pudom);
                   } elsif ($context eq 'requestauthor') {
                       if (&Apache::lonnet::homeserver($request,$dom) ne 'no_host') {
                           $approve = $count.':'.$request;
                           $reject = $request; 
                           $namelink = &Apache::loncommon::aboutmewrapper(
                                       &Apache::loncommon::plainname($request,$dom),
                                       $request,$dom);
                       }
                   } elsif ($context eq 'requestusername') {
                       if (&Apache::lonnet::homeserver($request,$dom) eq 'no_host') {
                           my $queued = 'approval';
                           $approve = $count.':'.$request;
                           $reject = $request;
                           $detailslink='<a href="javascript:openusernamereqdisplay('.
                                        "'$dom','$request','$queued'".');">'.$request.'</a>';
                           $namelink = $request;
                       }
                 } else {                  } else {
                     my ($cnum,$ownername,$ownerdom,$type,$cdesc);                      my ($cnum,$ownername,$ownerdom,$type,$cdesc);
                     my $queue = 'approval';                       my $queued = 'approval'; 
                     if ($context eq 'pending' || $context eq 'stillpending') {                      if ($context eq 'pending' || $context eq 'displaypending' || $context eq 'stillpending') {
                         ($cnum,$ownername,$ownerdom,$instcode,$cdesc)=split(/:/,$request,5);                          ($cnum,$ownername,$ownerdom,$instcode,$cdesc)=split(/:/,$request,5);
                         $queue = 'pending';                                                  $queued = 'pending';                        
                     } else {                      } else {
                         ($cnum,$ownername,$ownerdom,$type,$cdesc)=split(/:/,$request,5);                          ($cnum,$ownername,$ownerdom,$type,$cdesc)=split(/:/,$request,5);
                         $crstype = $type;                          $crstype = $type;
Line 415  sub build_queue_display { Line 584  sub build_queue_display {
                         }                          }
                     }                      }
                     $detailslink='<a href="javascript:opencoursereqdisplay('.                      $detailslink='<a href="javascript:opencoursereqdisplay('.
                                   "'$dom','$cnum','$queue'".');">'.$cdesc.'</a>';                                    "'$dom','$cnum','$queued'".');">'.$cdesc.'</a>';
                     $approve = $count.':'.$cnum;                      $approve = $count.':'.$cnum;
                     $reject = $cnum;                      $reject = $cnum;
                     $namelink = &Apache::loncommon::aboutmewrapper(                      $namelink = &Apache::loncommon::aboutmewrapper(
                                 &Apache::loncommon::plainname($ownername,$ownerdom),                                  &Apache::loncommon::plainname($ownername,$ownerdom),
                                 $ownername,$ownerdom);                                  $ownername,$ownerdom);
                 }                  }
                 unless ($context eq 'pending') {                  unless (($context eq 'pending') || ($context eq 'displaypending') || ($context eq 'helpdesk')) {
                     $row = '<td><span class="LC_nobreak"><label>'.                      $row = '<td><span class="LC_nobreak"><label>'.
                            '<input type="checkbox" value="'.$approve.'" name="approvereq" />'.&mt('Approve').'</label></span><br />'.                             '<input type="radio" value="'.$approve.'" name="'.$count.'radioreq" />'.&mt('Approve').'</label>'.
                            '<span class="LC_nobreak"><label>'.                             '<label>'.('&nbsp;'x2).
                            '<input type="checkbox" value="'.$reject.'" name="rejectreq" />'.&mt('Reject').'</label></span><br /></td>';                             '<input type="radio" value="'.$reject.'" name="'.$count.'radioreq" />'.&mt('Reject').'</label>'.
                              '<label>'.('&nbsp;'x2).
                              '<input type="radio" value="'."later:".$reject.'" name="'.$count.'radioreq" checked />'.&mt('Decide Later').
                              '</label></span><br /></td>';
                 }                  }
                 $row .= '<td>'.$namelink.'</td>'."\n";                  $row .= '<td>'.$namelink.'</td>'."\n";
                 if ($context eq 'course') {                  if ($context eq 'course') {
                     $row .= '<td>'.$showsec.'</td>'."\n".                      $row .= '<td>'.$showsec.'</td>'."\n".
                             '<td>'.$showtime.'</td>'."\n";                              '<td>'.$showtime.'</td>'."\n";
                 } else {                   } elsif ($context eq 'requestauthor') {
                     if ($context eq 'pending' || $context eq 'stillpending') {                      $row .= '<td>'.$showtime.'</td>'."\n";
                   } elsif ($context eq 'requestusername') {
                       $row .= '<td>'.$showtime.'</td>'."\n".
                               '<td>'.$detailslink.'</td>'."\n";
                   } else {
                       if ($context eq 'pending' || $context eq 'displaypending' || $context eq 'stillpending') {
                         $row .= '<td>'.$instcode.'</td>'."\n";                          $row .= '<td>'.$instcode.'</td>'."\n";
                     } else {                      } else {
                         $row .= '<td>'.$crstype.'</td>'."\n";                          $row .= '<td>'.$crstype.'</td>'."\n";
Line 459  sub update_request_queue { Line 636  sub update_request_queue {
         $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,@warn_dels,          @processing_errors,@warn_approves,@warn_rejects,@approvals,@warn_dels,
         @rejections,@rejectionerrors,@nopermissions,%courseroles,          @rejections,@rejectionerrors,@nopermissions,%courseroles,@toremove,
         %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,$firsturl);          %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 $item = $env{'form.'.$count.'radioreq'}) {
           if ($item =~ /^\d+:/) {
               push(@approvals,$item);
           } elsif ($item !~ /^later:/) {
               push(@rejections,$item);
           }
           $count ++;
       }
   
     $now = time;      $now = time;
     $sender = $env{'user.name'}.':'.$env{'user.domain'};      $sender = $env{'user.name'}.':'.$env{'user.domain'};
     if ($context eq 'course') {      if ($context eq 'course') {
Line 470  sub update_request_queue { Line 656  sub update_request_queue {
         $beneficiary = 'enroller';          $beneficiary = 'enroller';
         $cid = $env{'request.course.id'};          $cid = $env{'request.course.id'};
         $crstype = lc(&Apache::loncommon::course_type());          $crstype = lc(&Apache::loncommon::course_type());
         $firsturl = &course_portal_url($cnum,$cdom);          $firsturl = &Apache::lonnet::course_portal_url($cnum,$cdom);
         %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 482  sub update_request_queue { Line 668  sub update_request_queue {
                             mt => 'Your request for enrollment has been approved.',                              mt => 'Your request for enrollment has been approved.',
                         },                          },
                         {                          {
                             mt   => 'Visit [_1], to log-in and access the course',                              mt   => 'Visit [_1] to log-in and access the course',
                             args => [$firsturl],                              args => [$firsturl],
                         }];                          }];
         $rejectedmsg =  [{          $rejectedmsg =  [{
                             mt => 'Your request for enrollment has not been approved.',                              mt => 'Your request for enrollment has not been approved.',
                         }];                          }];
       } elsif ($context eq 'requestauthor') {
           $namespace = 'requestauthorqueue';
           $beneficiary = 'requestauthor';
           %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom);
           my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
           if (ref($domdefs{'requestauthor'}) eq 'HASH') {
               if (ref($domdefs{'requestauthor'}{'notify'}) eq 'HASH') {
                   $notifylist = $domdefs{'requestauthor'}{'notify'}{'approval'};
               }
           }
           my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
           $firsturl = &Apache::lonnet::course_portal_url($domconfiguser,$cdom);
           $approvedmsg = [{
                               mt => 'Your request for Authoring Space has been approved.',
                           },
                           {
                               mt   => 'Visit [_1] to log-in and select your author role',
                               args => [$firsturl],
                           }];
           $rejectedmsg =  [{
                               mt => 'Your request for Authoring Space has not been approved.',
                           }];
           $domdesc = &Apache::lonnet::domain($cdom);
       } elsif ($context eq 'requestusername') {
           $namespace = 'usernamequeue';
           $beneficiary = 'requestusername';
           %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom);
           my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$cdom);
           if (ref($domconfig{'usercreation'}) eq 'HASH') {
               if (ref($domconfig{'usercreation'}{'cancreate'}) eq 'HASH') {
                   if (ref($domconfig{'usercreation'}{'cancreate'}{'notify'}) eq 'HASH') {
                       $notifylist = $domconfig{'usercreation'}{'cancreate'}{'notify'}{'approval'};
                   }
               }
           }
           my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
           $firsturl = &Apache::lonnet::course_portal_url($domconfiguser,$cdom);
           $approvedmsg = [{
                               mt => 'Your request for a LON-CAPA account has been approved.',
                           },
                           {
                               mt   => 'Visit [_1] to log-in.',
                               args => [$firsturl],
                           }];
           $rejectedmsg =  [{
                               mt => 'Your request for a LON-CAPA account has not been approved.',
                           }];
           $domdesc = &Apache::lonnet::domain($cdom);
     } else {      } else {
         $domdesc = &Apache::lonnet::domain($cdom);          $domdesc = &Apache::lonnet::domain($cdom);
         $namespace = 'courserequestqueue';          $namespace = 'courserequestqueue';
Line 497  sub update_request_queue { Line 731  sub update_request_queue {
             $queue = 'pending';              $queue = 'pending';
         }          }
         %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom,'_'.$queue);          %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom,'_'.$queue);
         $firsturl= &course_portal_url($cnum,$cdom);  
         my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);          my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);
         if (ref($domconfig{'requestcourses'}) eq 'HASH') {          if (ref($domconfig{'requestcourses'}) eq 'HASH') {
             if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') {               if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') { 
Line 509  sub update_request_queue { Line 742  sub update_request_queue {
                             mt => 'Your course request has been approved.',                              mt => 'Your course request has been approved.',
                         },                          },
                         {                          {
                             mt   => 'Visit [_1], to log-in and access the course',                              mt   => 'Visit [_1] to log-in and access the course',
                             args => [$firsturl],                              args => [],
                         }];                          }];
         $rejectionmsg{'course'} =          $rejectionmsg{'course'} =
                         [{                          [{
Line 522  sub update_request_queue { Line 755  sub update_request_queue {
                             mt => 'Your community request has been approved.',                              mt => 'Your community request has been approved.',
                         },                          },
                         {                          {
                             mt   => 'Visit [_1], to log-in and access the community',                              mt   => 'Visit [_1] to log-in and access the community',
                             args => [$firsturl],                              args => [],
                         }];                          }];
   
         $rejectionmsg{'community'} =           $rejectionmsg{'community'} = 
Line 539  sub update_request_queue { Line 772  sub update_request_queue {
         foreach my $role (@roles) {          foreach my $role (@roles) {
             $communityroles{$role}=&Apache::lonnet::plaintext($role,'Community');              $communityroles{$role}=&Apache::lonnet::plaintext($role,'Community');
         }          }
   
     }      }
     foreach my $item (sort {$a <=> $b} @approvals) {      foreach my $item (sort {$a <=> $b} @approvals) {
         if ($context eq 'course') {          if ($context eq 'course') {
Line 601  sub update_request_queue { Line 833  sub update_request_queue {
             } else {              } else {
                 push(@invalidusers,$uname.':'.$udom);                  push(@invalidusers,$uname.':'.$udom);
             }              }
           } elsif ($context eq 'requestauthor') {
               my ($num,$uname) = split(/:/,$item);
               my $uhome = &Apache::lonnet::homeserver($uname,$cdom);
               if ($uhome ne 'no_host') {
                   my ($user_is_adv,$user_is_author) = &Apache::lonnet::is_advanced_user($cdom,$uname);
                   if ($user_is_author) {
                       push(@existing,$uname);
                   } elsif (&Apache::lonnet::usertools_access($uname,$cdom,'requestauthor',
                                                              undef,'requestauthor')) {
                       if (&Apache::lonnet::allowed('cau',$cdom)) {
                           if (&Apache::lonnet::assignrole($cdom,$uname,'/'.$cdom.'/','au',undef,time,undef,undef,'requestauthor') eq 'ok') {
                               push(@completed,$uname);
                               &send_selfserve_notification($uname.':'.$cdom,
                                                            $approvedmsg,undef,undef,$now,
                                                            $beneficiary,$sender);
                               my %userrequest = (
                                   author => {
                                             timestamp   => $now,
                                             adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                                             status      => 'approved',
                                           },
                                   author_status => 'approved',
                               );
                               my $userresult =
                                   &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$uname);
                               if ($userresult ne 'ok') {
                                   push(@warn_approves,$uname.':'.$cdom);
                               }
                           } else {
                               push(@processing_errors,$uname);
                           }
                       } else {
                           push(@nopermissions,$uname);
                       }
                   } else {
                       push(@nopermissions,$uname);
                   }
               } else {
                   push(@invalidusers,$uname.':'.$cdom);
               }
               push(@toremove,(@invalidusers,@nopermissions));
           } elsif ($context eq 'requestusername') {
               my ($num,$uname) = split(/:/,$item);
               my $dbname = 'nohist_requestedusernames';
               my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
               my %curr = &Apache::lonnet::get($dbname,[$uname],$cdom,$domconfiguser);
               
               if (ref($curr{$uname}) eq 'HASH') {
                   my ($username,$logtoken,$serverid,$encpass,$courseid,$id,$firstname,
                       $middlename,$lastname,$generation,$inststatus);
                   $curr{$uname}{'timestamp'} = $now;
                   $curr{$uname}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
                   $courseid   = $curr{$uname}{'courseid'};
                   $id         = $curr{$uname}{'id'};
                   $firstname  = $curr{$uname}{'firstname'};
                   $middlename = $curr{$uname}{'middlename'};
                   $lastname   = $curr{$uname}{'lastname'};
                   $generation = $curr{$uname}{'generation'};
                   $inststatus = $curr{$uname}{'inststatus'};
   
                   my ($key,$caller)=split(/&/,$curr{$uname}{'tmpinfo'});
                   if ($caller eq 'createaccount') {
                       my $upass = &Apache::loncommon::des_decrypt($key,$curr{$uname}{'upass'});
                       undef($curr{$uname}{'upass'});
                       my $result =
                           &Apache::lonnet::modifyuser($cdom,$uname,$id,'internal',$upass,
                                                       $firstname,$middlename,$lastname,
                                                       $generation,undef,undef,$uname);
                       if ($result eq 'ok') {
                           $curr{$uname}{'status'} = 'created';
                           push(@completed,$uname); 
                           my $uhome = &Apache::lonnet::homeserver($uname,$cdom);
                           if ($uhome eq 'no_host') {
                               push(@warn_approves,$uname);
                           } else {
                               unless (($inststatus eq 'default') || ($inststatus eq '')) {
                                   &Apache::lonnet::put('environment',{inststatus => $inststatus},$cdom,$uname);
                               }
                               &send_selfserve_notification($uname.':'.$cdom,
                                                            $approvedmsg,undef,undef,$now,
                                                            $beneficiary,$sender);
                               if (&Apache::lonnet::put($dbname,\%curr,$cdom,$domconfiguser) ne 'ok') {
                                   push(@warn_approves,$uname);
                               }
                           }
                       } else {
                           push(@processing_errors,$uname);
                       }
                   } else {
                       push(@processing_errors,$uname);
                   }
               } else {
                   push(@invalidusers,$uname);
               }
               push(@toremove,@invalidusers);
         } else {          } else {
             my ($num,$cnum) = split(':',$item);              my ($num,$cnum) = split(':',$item);
             if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {              if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {
Line 635  sub update_request_queue { Line 962  sub update_request_queue {
                                                      $ownerdom,$ownername);                                                       $ownerdom,$ownername);
                         if ((ref($history{'details'}) eq 'HASH') &&                           if ((ref($history{'details'}) eq 'HASH') && 
                             ($history{'disposition'} eq $queue)) {                              ($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};
                                       }
                                   }
                               }
                               if ($history{'details'}{'clonecrs'}) {
                                   $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'};
                               }
                               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') {                                  if ($crstype eq 'community') {
                                     $approvedmsg = $approvalmsg{'community'};                                      $approvedmsg = $approvalmsg{'community'};
                                 } else {                                  } else {
                                     $approvedmsg = $approvalmsg{'course'};                                      $approvedmsg = $approvalmsg{'course'};
                                 }                                  }
                                   my $firsturl = &Apache::lonnet::course_portal_url($cnum,$cdom);
                                   if (ref($approvedmsg) eq 'ARRAY') {
                                       if (ref($approvedmsg->[1]) eq 'HASH') {
                                           $approvedmsg->[1]->{'args'} = [$firsturl];
                                       }
                                       if ($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);
                                                                   
                                 unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_'.$queue],$cdom) eq 'ok') {                                  unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_'.$queue],$cdom) eq 'ok') {
Line 699  sub update_request_queue { Line 1064  sub update_request_queue {
     my @changes = (@completed,@rejections);      my @changes = (@completed,@rejections);
     if ($context eq 'domain') {      if ($context eq 'domain') {
         @changes = map {$_.'_'.$queue} (@changes);          @changes = map {$_.'_'.$queue} (@changes);
       } elsif ($context eq 'requestauthor') {
           @changes = map {$_.'_approval'} (@changes);
       } elsif ($context eq 'requestusername') {
           @changes = map {&escape($_).'_approval'} (@changes);
     }      }
     if (@rejections) {      if (@rejections) {
         foreach my $item (@rejections) {          foreach my $item (@rejections) {
             if ($context eq 'course') {              if (($context eq 'course') || ($context eq 'requestauthor')) {
                 my $user = $item;                  my ($user,$uname,$udom,%userrequest,$key,$dbname);
                   if ($context eq 'requestauthor') {
                       $uname = $item;
                       $udom = $cdom;
                       $user = $uname.':'.$udom;
                       $key = 'author';
                       $dbname = 'requestauthor';
                   } else {
                       $user = $item;
                       ($uname,$udom) = split(/:/,$user);
                       $key = $cdom.'_'.$cnum;
                       $dbname = $namespace;
                   }
                 &send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,                  &send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,
                                              $now,$beneficiary,$sender,undef,undef,                                               $now,$beneficiary,$sender,undef,undef,
                                              $crstype);                                               $crstype);
                 my ($uname,$udom) = split(/:/,$user);                  %userrequest = (
                 my %userrequest = (                      $key => {
                     $cdom.'_'.$cnum => {  
                         timestamp   => $now,                          timestamp   => $now,
                         adjudicator => $env{'user.name'}.':'.$env{'user.domain'},                          adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                         status      => 'rejected',                          status      => 'rejection',
                     }                      }
                 );                  );
                   if ($context eq 'requestauthor') {
                       $userrequest{'author_status'} = 'rejection';  
                   }
                 my $userresult =                  my $userresult =
                     &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);                      &Apache::lonnet::put($dbname,\%userrequest,$udom,$uname);
                 if ($userresult ne 'ok') {                  if ($userresult ne 'ok') {
                     push(@warn_rejects,$user);                      push(@warn_rejects,$item);
                   }
               } elsif ($context eq 'requestusername') {
                   my ($uname,$udom,$dbname);
                   $uname = $item;
                   $udom = $cdom;
                   $dbname = 'nohist_requestedusernames';
                   my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
                   my %curr = &Apache::lonnet::get($dbname,[$uname],$cdom,$domconfiguser);
                   if (ref($curr{$uname}) eq 'HASH') {
                        $curr{$uname}{'status'} = 'rejected';
                        $curr{$uname}{'timestamp'} = $now;
                        $curr{$uname}{'adjudicator'} =  $env{'user.name'}.':'.$env{'user.domain'};
                        undef($curr{$uname}{'tmpinfo'});
                        undef($curr{$uname}{'upass'}); 
                   }
                   my $userresult =
                       &Apache::lonnet::put($dbname,\%curr,$cdom,$domconfiguser);
                   if ($userresult ne 'ok') {
                       push(@warn_rejects,$uname);
                 }                  }
             } else {              } else {
                 my $cnum = $item;                  my $cnum = $item;
Line 781  sub update_request_queue { Line 1183  sub update_request_queue {
             }              }
         }          }
     }      }
       if (@toremove) {
           my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
           foreach my $item (@toremove) {
               if ($context eq 'requestauthor') {
                   my %userrequest = (
                       author => {
                                   timestamp   => $now,
                                   adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                                   status      => 'deleted',
                                 },
                                 author_status => 'deleted',
                   );
                   &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$item);
               } elsif ($context eq 'requestusername') {
                   my $dbname = 'nohist_requestedusernames';
                   my %curr = &Apache::lonnet::get($dbname,[$item],$cdom,$domconfiguser);
                   if (ref($curr{$item}) eq 'HASH') {
                       $curr{$item}{'status'} = 'deleted';
                       $curr{$item}{'timestamp'} = $now;
                       $curr{$item}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
                       undef($curr{$item}{'upass'});
                       undef($curr{$item}{'tmpinfo'}); 
                   }
               }
           }
           @toremove = map {$_.'_approval'} (@toremove);
           my $delresult = &Apache::lonnet::del_dom($namespace,\@toremove,$cdom);
       }
     if (@changes) {      if (@changes) {
         my $delresult;          my $delresult;
         if ($context eq 'course') {          if ($context eq 'course') {
Line 822  sub update_request_queue { Line 1252  sub update_request_queue {
                                                  $now,'coursemanagers',$sender,                                                   $now,'coursemanagers',$sender,
                                                  $approvedlist,$rejectedlist,$crstype);                                                   $approvedlist,$rejectedlist,$crstype);
                 }                  }
               } elsif ($context eq 'requestauthor') {
                   $chgmsg = "'Action was taken on the following Authoring Space requests by [_1].',$namelink";
                   if (@completed) {
                       $approvedlist = join("\n",@completed);
                       $output .= '<p>'.&mt('The following requests were approved:').'<ul>';
                       foreach my $uname (@completed) {
                           my $userlink =
                               &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                           $output .= '<li>'.$userlink.'</li>';
                           
                       }
                       $output .= '</ul></p>';
                   }
                   if (@rejections) {
                       $rejectedlist = join("\n",@rejections);
                       $output .= '<p>'.&mt('The following requests were rejected:').'<ul>';
                       foreach my $uname (@rejections) {
                           my $userlink =
                               &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                           $output .= '<li>'.$userlink.'</li>';
                       }
                       $output .= '</ul></p>';
                   }
                   if ($notifylist ne '') {
                       &send_selfserve_notification($notifylist,$chgmsg,undef,$domdesc,
                                                    $now,'authormanagers',$sender,
                                                    $approvedlist,$rejectedlist);
                   }
               } elsif ($context eq 'requestusername') {
                   $chgmsg = "'Action was taken on the following LON-CAPA account requests by [_1].',$namelink";
                   if (@completed) {
                       $approvedlist = join("\n",@completed);
                       $output .= '<p>'.&mt('The following requests were approved:').'<ul>';
                       foreach my $uname (@completed) {
                           $output .= '<li>'.$uname.'</li>';
   
                       }
                       $output .= '</ul></p>';
                   }
                   if (@rejections) {
                       $rejectedlist = join("\n",@rejections);
                       $output .= '<p>'.&mt('The following requests were rejected:').'<ul>';
                       foreach my $uname (@rejections) {
                           $output .= '<li>'.$uname.'</li>';
                       }
                       $output .= '</ul></p>';
                   }
                   if ($notifylist ne '') {
                       &send_selfserve_notification($notifylist,$chgmsg,undef,$domdesc,
                                                    $now,'usernamemanagers',$sender,
                                                    $approvedlist,$rejectedlist);
                   }
             } else {              } else {
                 $chgmsg = "'Action was taken on the following course and community requests by [_1].',$namelink";                  $chgmsg = "'Action was taken on the following course and community requests by [_1].',$namelink";
                 if (@completed) {                  if (@completed) {
Line 836  sub update_request_queue { Line 1318  sub update_request_queue {
                         }                          }
                         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 860  sub update_request_queue { Line 1345  sub update_request_queue {
                                                  $approvedlist,$rejectedlist,$crstype);                                                   $approvedlist,$rejectedlist,$crstype);
                 }                  }
             }              }
           } else {
               if (($context eq 'requestauthor') || ($context eq 'requestusername')) {
                   push(@warn_dels,@changes);
               }
         }          }
     }      }
     if (@existing) {      if (@existing) {
Line 869  sub update_request_queue { Line 1358  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt('Authoring Space requests from the following users were deleted because one already exists:').'<ul>';
               foreach my $uname (@existing) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt('The following course/community creation requests were deleted because the course or community has already been created:').'<ul>';              $output .= '<p>'.&mt('The following course/community creation requests were deleted because the course or community has already been created:').'<ul>';
             foreach my $cnum (@existing) {              foreach my $cnum (@existing) {
Line 891  sub update_request_queue { Line 1388  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt('The following requests were ignored because the request is no longer in the queue:').'<ul>';
               foreach my $uname (@missingreq) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt('The following course/community creation requests were ignored because the request is no longer in the queue:').'<ul>';              $output .= '<p>'.&mt('The following course/community creation requests were ignored because the request is no longer in the queue:').'<ul>';
             foreach my $cnum (@missingreq) {              foreach my $cnum (@missingreq) {
                 $output .= '<li>'.$cnum.'</li>';                  $output .= '<li>'.$cnum.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
   
         }          }
     }      }
     if (@invalidusers) {      if (@invalidusers) {
Line 907  sub update_request_queue { Line 1411  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 919  sub update_request_queue { Line 1431  sub update_request_queue {
         }          }
     }      }
     if (@nopermissions) {      if (@nopermissions) {
         $output .= '<p>'.&mt('The following course/community creation requests could not be processed because the owner does not have rights to create this type of course:').'<ul>';          if ($context eq 'course') {
         foreach my $cnum (@nopermissions) {              $output .= '<p>'.&mt('The following course/community creation requests could not be processed because the owner does not have rights to create this type of course:').'<ul>';
             my $showcourse;              foreach my $cnum (@nopermissions) {
             if (ref($requesthash{$cnum.'_'.$queue})) {                  my $showcourse;
                 $showcourse = $requesthash{$cnum.'_'.$queue}{'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 938  sub update_request_queue { Line 1460  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt('The following requests could not be processed because an error occurred:').'<ul>';
               foreach my $uname (@processing_errors) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
           } elsif ($context eq 'requestusername') {
               $output .= '<p>'.&mt('The following requests could not be processed because an error occurred:').'<ul>';
               foreach my $uname (@processing_errors) {
                   $output .= '<li>'.$uname.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt('The following course/community creation requests could not be processed because an error occurred:').'<ul>';              $output .= '<p>'.&mt('The following course/community creation requests could not be processed because an error occurred:').'<ul>';
             foreach my $cnum (@processing_errors) {              foreach my $cnum (@processing_errors) {
Line 972  sub update_request_queue { Line 1508  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt("For the following users, an error occurred when updating the user's own author request record:").'<ul>';
               foreach my $uname (@warn_approves,@warn_rejects) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
           } elsif ($context eq 'requestusername') {
               $output .= '<p>'.&mt("For the following users, an error occurred when updating the account request record for the user:").'<ul>';
               foreach my $uname (@warn_approves,@warn_rejects) {
                   $output .= '<li>'.$uname.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt("For the following course/community requests an error occurred when updating the requestor's own requests record:").'<ul>';              $output .= '<p>'.&mt("For the following course/community requests an error occurred when updating the requestor's own requests record:").'<ul>';
             foreach my $cnum (@warn_approves,@warn_rejects) {              foreach my $cnum (@warn_approves,@warn_rejects) {
Line 987  sub update_request_queue { Line 1537  sub update_request_queue {
         }          }
     }      }
     if (@warn_dels) {      if (@warn_dels) {
         $output .= '<p>'.&mt("For the following course/community requests an error occurred when removing requests for the following from the pending queue:").'<ul>';          if ($context eq 'requestauthor') {
         foreach my $cnum (@warn_dels) {              $output .= '<p>'.&mt("For the following requests an error occurred when removing the request from the queue:").'<ul>';
             my $showcourse;              foreach my $uname (@warn_dels) {
             if (ref($requesthash{$cnum.'_'.$queue})) {                  my $userlink =
                 $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};                      &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
             } else {                  $output .= '<li>'.$userlink.'</li>';
                 $showcourse = $cnum;  
             }              }
             $output .= '<li>'.$showcourse.'</li>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestusername') {
               $output .= '<p>'.&mt("For the following requests an error occurred when removing the request from the queue:").'<ul>';
               foreach my $item (@warn_dels) {
                   my ($escuname) = split(/_/,$item);
                   $output .= '<li>'.&unescape($escuname).'</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 {
                       $showcourse = $cnum;
                   }
                   $output .= '<li>'.$showcourse.'</li>';
               }
               $output .= '</ul></p>';
         }          }
         $output .= '</ul></p>';  
     }      }
     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 1038  sub get_student_counts { Line 1589  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 $accessstart = $details->{'accessstart'};
       my $accessend = $details->{'accessend'};
       my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
       if (ref($domconfig{'requestcourses'}) eq 'HASH') {
           if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {
               if ($domconfig{'requestcourses'}{'uniquecode'}{$crstype}) {
                   $details->{'uniquecode'} = 1;
               }
           }
       }
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $ownername = $details->{'owner'};          $ownername = $details->{'owner'};
         $ownerdom  = $details->{'domain'};          $ownerdom  = $details->{'domain'};
Line 1052  sub course_creation { Line 1614  sub course_creation {
         $ownername = $env{'user.name'};          $ownername = $env{'user.name'};
         $ownerdom  = $env{'user.domain'};          $ownerdom  = $env{'user.domain'};
     }      }
       my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom);
     my $owneremail;      my $owneremail;
     my %emails = &Apache::loncommon::getemails($ownername,$ownerdom);      my %emails = &Apache::loncommon::getemails($ownername,$ownerdom);
     foreach my $email ('permanentemail','critnotification','notification') {      foreach my $email ('permanentemail','critnotification','notification') {
Line 1061  sub course_creation { Line 1624  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,
                                                              $accessstart,$accessend,$customhash);
     } else {      } else {
         $result = 'error: '.$cid;          $result = 'error: '.$cid;
     }      }
     return $result;      return ($result,$postprocess);
 }  }
   
 sub build_batchcreatehash {  sub build_batchcreatehash {
     my ($dom,$context,$details,$owneremail,$domdefs) = @_;      my ($dom,$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 = &escape($owneremail);          my $emailenc = &escape($owneremail);
         my $owner = $details->{'owner'}.':'.$details->{'domain'};          my $owner = $details->{'owner'}.':'.$details->{'domain'};
Line 1082  sub build_batchcreatehash { Line 1653  sub build_batchcreatehash {
         }          }
         $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 1090  sub build_batchcreatehash { Line 1664  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 1128  sub build_batchcreatehash { Line 1708  sub build_batchcreatehash {
         $batchhash{'users'}{$owner}{lastname} = $owner_lastname;          $batchhash{'users'}{$owner}{lastname} = $owner_lastname;
         $batchhash{'users'}{$owner}{emailenc} = $emailenc;          $batchhash{'users'}{$owner}{emailenc} = $emailenc;
         $batchhash{'users'}{$owner}{owneremail} = $owneremail;          $batchhash{'users'}{$owner}{owneremail} = $owneremail;
           $batchhash{'setcomment'} = 1;
     }      }
     return %batchhash;      return %batchhash;
 }  }
   
 sub can_clone_course {  sub can_clone_course {
     my ($uname,$udom,$clonecrs,$clonedom,$crstype) = @_;      my ($uname,$udom,$clonecrs,$clonedom,$crstype,$dom,$instcode) = @_;
     my $canclone;      my $canclone;
     my $ccrole = 'cc';      my $ccrole = 'cc';
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
Line 1144  sub can_clone_course { Line 1725  sub can_clone_course {
     if (exists($roleshash{$clonecrs.':'.$clonedom.':'.$ccrole})) {      if (exists($roleshash{$clonecrs.':'.$clonedom.':'.$ccrole})) {
         $canclone = 1;          $canclone = 1;
     } else {      } else {
         my %courseenv = &Apache::lonnet::userenvironment($clonedom,$clonecrs,('cloners'));          my %courseenv = &Apache::lonnet::userenvironment($clonedom,$clonecrs,
                                                            ('cloners','internal.coursecode'));
         my $cloners = $courseenv{'cloners'};          my $cloners = $courseenv{'cloners'};
           my $clonefromcode = $courseenv{'internal.coursecode'};
         if ($cloners ne '') {          if ($cloners ne '') {
             my @cloneable = split(',',$cloners);              my @cloneable = split(',',$cloners);
             if (grep(/^\*$/,@cloneable)) {              if (grep(/^\*$/,@cloneable)) {
                 $canclone = 1;                  $canclone = 1;
             }              } elsif (grep(/^\*:\Q$udom\E$/,@cloneable)) {
             if (grep(/^\*:\Q$udom\E$/,@cloneable)) {  
                 $canclone = 1;                  $canclone = 1;
             }              } elsif (grep(/^\Q$uname\E:\Q$udom\E$/,@cloneable)) {
             if (grep(/^\Q$uname\E:\Q$udom\E$/,@cloneable)) {  
                 $canclone = 1;                  $canclone = 1;
             }              }
               unless ($canclone) {
                   if (($clonefromcode) && ($instcode) && ($clonedom eq $dom)) {
                       my (%gotdomdefaults,%gotcodedefaults);
                       foreach my $cloner (@cloneable) {
                           if (($cloner ne '*') && ($cloner !~ /^\*\:$match_domain$/) &&
                               ($cloner !~ /^$match_username\:$match_domain$/) && ($cloner ne '')) {
                               if ($cloner =~ /\=/) {
                                   my (%codedefaults,@code_order);
                                   if (ref($gotcodedefaults{$clonedom}) eq 'HASH') {
                                       if (ref($gotcodedefaults{$clonedom}{'defaults'}) eq 'HASH') {
                                           %codedefaults = %{$gotcodedefaults{$clonedom}{'defaults'}};
                                       }
                                       if (ref($gotcodedefaults{$clonedom}{'order'}) eq 'ARRAY') {
                                           @code_order = @{$gotcodedefaults{$dom}{'order'}};
                                       }
                                   } else {
                                       &Apache::lonnet::auto_instcode_defaults($clonedom,
                                                                               \%codedefaults,
                                                                               \@code_order);
                                       $gotcodedefaults{$clonedom}{'defaults'} = \%codedefaults;
                                       $gotcodedefaults{$clonedom}{'order'} = \@code_order;
                                   }
                                   if (@code_order > 0) {
                                       if (&Apache::lonnet::check_instcode_cloning(\%codedefaults,\@code_order,
                                                                                   $cloner,$clonefromcode,$instcode)) {
                                           $canclone = 1;
                                           last; 
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
           } else {
               my %domdefs = &Apache::lonnet::get_domain_defaults($clonedom);
               if ($domdefs{'canclone'}) {
                   unless ($domdefs{'canclone'} eq 'none') {
                       if ($domdefs{'canclone'} eq 'domain') {
                           if ($udom eq $clonedom) {
                               $canclone = 1;
                           }
                       } elsif (($clonefromcode) && ($instcode) &&
                                ($clonedom eq $dom)) {
                           if (&Apache::lonnet::default_instcode_cloning($clonedom,$domdefs{'canclone'},
                                                                         $clonefromcode,$instcode)) {
                               $canclone = 1;
                           }
                       }
                   }
               }
         }          }
         unless ($canclone) {          unless ($canclone) {
             if (&Apache::lonnet::is_course_owner($clonedom,$clonecrs,$uname,$udom)) {              if (&Apache::lonnet::is_course_owner($clonedom,$clonecrs,$uname,$udom)) {
Line 1168  sub can_clone_course { Line 1800  sub can_clone_course {
 }  }
   
 sub get_processtype {  sub get_processtype {
     my ($uname,$udom,$isadv,$dom,$crstype,$inststatuses,$domconfig) = @_;      my ($context,$uname,$udom,$isadv,$dom,$crstype,$inststatuses,$domconfig) = @_;
     return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH'));      return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH'));
     if ($uname eq '' || $udom eq '') {      if ($uname eq '' || $udom eq '') {
         $uname = $env{'user.name'};          $uname = $env{'user.name'};
         $udom = $env{'user.domain'};          $udom = $env{'user.domain'};
         $isadv = $env{'user.adv'};          $isadv = $env{'user.adv'};
     }      }
     my (%userenv,%settings,$val);      my (%userenv,%settings,$val,@options,$envkey);
     my @options = ('autolimit','validate','approval');      if ($context eq 'course') {
     if ($dom eq $udom) {          @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 =          %userenv =
             &Apache::lonnet::userenvironment($udom,$uname,'requestcourses.'.$crstype,'inststatus');              &Apache::lonnet::userenvironment($udom,$uname,$envkey,'inststatus');
         if ($userenv{'requestcourses.'.$crstype}) {          if ($userenv{$envkey}) {
             $val = $userenv{'requestcourses.'.$crstype};              $val = $userenv{$envkey};
             @{$inststatuses} = ('_custom_');              @{$inststatuses} = ('_custom_');
         } else {          } else {
             my ($task,%alltasks);              my %alltasks;
             if (ref($domconfig->{'requestcourses'}) eq 'HASH') {              if (($isadv) && ($settings{'_LC_adv'} ne '')) {
                 %settings = %{$domconfig->{'requestcourses'}};                  $val = $settings{'_LC_adv'};
                 if (ref($settings{$crstype}) eq 'HASH') {                  @{$inststatuses} = ('_LC_adv_');
                     if (($isadv) && ($settings{$crstype}{'_LC_adv'} ne '')) {              } else {
                         $val = $settings{$crstype}{'_LC_adv'};                  if ($userenv{'inststatus'} ne '') {
                         @{$inststatuses} = ('_LC_adv_');                      @{$inststatuses} = split(',',$userenv{'inststatus'});
                     } else {                  } else {
                         if ($userenv{'inststatus'} ne '') {                      @{$inststatuses} = ('default');
                             @{$inststatuses} = split(',',$userenv{'inststatus'});                  }
                         } else {                  foreach my $status (@{$inststatuses}) {
                             @{$inststatuses} = ('default');                      if (exists($settings{$status})) {
                         }                          my $value = $settings{$status};
                         foreach my $status (@{$inststatuses}) {                          next unless ($value);
                             if (exists($settings{$crstype}{$status})) {                          unless (exists($alltasks{$value})) {
                                 my $value = $settings{$crstype}{$status};                              if (ref($alltasks{$value}) eq 'ARRAY') {
                                 next unless ($value);                                  unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) {
                                 unless (exists($alltasks{$value})) {                                      push(@{$alltasks{$value}},$status);
                                     if (ref($alltasks{$value}) eq 'ARRAY') {  
                                         unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) {  
                                             push(@{$alltasks{$value}},$status);  
                                         }  
                                     } else {  
                                         @{$alltasks{$value}} = ($status);  
                                     }  
                                 }                                  }
                               } else {
                                   @{$alltasks{$value}} = ($status);
                             }                              }
                         }                          }
                         my $maxlimit = 0;                      }
                   }
                         foreach my $key (sort(keys(%alltasks))) {                  my $maxlimit = 0;
                             if ($key =~ /^autolimit=(\d*)$/) {                  if ($context eq 'course') {
                                 if ($1 eq '') {                      foreach my $key (sort(keys(%alltasks))) {
                                     $val ='autolimit=';                          if ($key =~ /^autolimit=(\d*)$/) {
                                     last;                              if ($1 eq '') {
                                 } elsif ($1 > $maxlimit) {                                  $val ='autolimit=';
                                     $maxlimit = $1;                                  last;
                                 }                              } elsif ($1 > $maxlimit) {
                                   $maxlimit = $1;
                             }                              }
                         }                          }
                         if ($maxlimit) {                      }
                             $val = 'autolimit='.$maxlimit;                  }
                         } else {                  if (($context eq 'requestauthor') || (!$val)) {
                             foreach my $option (@options) {                      if ($context eq 'course' && $maxlimit) {
                                 if ($alltasks{$option}) {                          $val = 'autolimit='.$maxlimit;
                                     $val = $option;                      } else {
                                     last;                          foreach my $option (@options) {
                                 }                              if ($alltasks{$option}) {
                                   $val = $option;
                                   last;
                             }                              }
                         }                          }
                     }                      }
Line 1274  sub queued_selfenrollment { Line 1918  sub queued_selfenrollment {
     }      }
     if (keys(%reqs_by_date)) {      if (keys(%reqs_by_date)) {
         unless ($notitle) {          unless ($notitle) {
             $output .= '<b>'.&mt('Enrollment requests pending Course Coordinator approval').'</b><br />';              $output .= '<br /><b>'.&mt('Enrollment requests pending Course Coordinator approval').'</b><br />';
         }          }
         $output .= &Apache::loncommon::start_data_table().          $output .= &Apache::loncommon::start_data_table().
                    &Apache::loncommon::start_data_table_header_row().                     &Apache::loncommon::start_data_table_header_row().
Line 1414  sub process_official_reqs { Line 2058  sub process_official_reqs {
                 }                  }
                 $reqstatus = $disposition;                  $reqstatus = $disposition;
                 if ($disposition eq 'process') {                  if ($disposition eq 'process') {
                     my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg);                      my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,$code);
                     my $result = &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,\$newusermsg,\$addresult,\$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles);                      my %customitems;
                       my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom);
                       my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$ownername,
                                                                           $ownerdom,$fullname,$cdescr);
                       if (ref($inprocess) eq 'HASH') {
                           foreach my $key (keys(%{$inprocess})) {
                               if (exists($history{'details'}{$key})) {
                                   $customitems{$key} = $history{'details'}{$key};
                               }
                           }
                       }
                       if ($history{'details'}{'clonecrs'}) {
                           $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'};
                       }
                       my ($result,$postprocess) = 
                           &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,\$newusermsg,\$addresult,
                                            \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,\$code,\%customitems);
                     if ($result eq 'created') {                      if ($result eq 'created') {
                         $disposition = 'created';                          $disposition = 'created';
                         $reqstatus = 'created';                          $reqstatus = 'created';
                         my $cid = $dom.'_'.$cnum;                          my $cid = $dom.'_'.$cnum;
                         push(@{$newcids{$instcode}},$cid);                          push(@{$newcids{$instcode}},$cid);
                         if ($dcname && $dcdom) {                          if ($dcname && $dcdom) {
                             my $firsturl = &course_portal_url($cnum,$dom);                              my $firsturl = &Apache::lonnet::course_portal_url($cnum,$dom);
                             my $beneficiary = 'pendingrequestor';                              my $beneficiary = 'pendingrequestor';
                             my $now = time;                              my $now = time;
                             my $owner = $ownername.':'.$ownerdom;                              my $owner = $ownername.':'.$ownerdom;
                             my $approvedmsg =                              my $approvedmsg =
                                 [{                                  [{
                                     mt => 'Your request course, queued pending validation has now been created.',                                      mt => 'Your requested course: [_1], (queued pending validation) has now been created.',
                                       args => [$cdescr],
                                  },                                   },
                                  {                                   {
                                     mt   => 'Visit [_1], to log-in and access the course.',                                      mt   => 'Visit [_1] to log-in and access the course.',
                                     args => [$firsturl],                                      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;                              my $sender = $dcname.':'.$dcdom;
                               if (ref($postprocess) eq 'HASH') {
                                   if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') {
                                       foreach my $item (@{$postprocess->{'createdmsg'}}) {
                                           if (ref($item) eq 'HASH') {
                                                if ($item->{'mt'} ne '') {
                                                    push(@{$approvedmsg},$item);
                                                }
                                           }
                                       }
                                   }
                                   if (ref($postprocess->{'createdactions'}) eq 'HASH') {
                                       if (ref($postprocess->{'createdactions'}{'environment'}) eq 'HASH') {
                                           &postprocess_crsenv($dom,$cnum,$postprocess->{'createdactions'}{'environment'});
                                       }
                                   }
                               }
                             &send_selfserve_notification($owner,$approvedmsg,                              &send_selfserve_notification($owner,$approvedmsg,
                                                          $cid,$cdescr,$now,                                                           $cid,$cdescr,$now,
                                                          $beneficiary,$sender,                                                           $beneficiary,$sender,
Line 1503  sub process_official_reqs { Line 2183  sub process_official_reqs {
         }          }
     }      }
     return $output;      return $output;
   }
   
   sub postprocess_crsenv {
       my ($dom,$cnum,$postprocessenv) = @_;
       if (ref($postprocessenv) eq 'HASH') {    
           my $cid = $dom.'_'.$cnum;
           my %settablecrsenv = (
                                 'internal.selfenroll_types'        => 1,
                                 'internal.selfenroll_registered'   => 1,
                                 'internal.selfenroll_section'      => 1,
                                 'internal.selfenroll_start_access' => 1,
                                 'internal.selfenroll_end_access'   => 1,
                                 'internal.selfenroll_limit'        => 1,
                                 'internal.selfenroll_cap'          => 1,
                                 'internal.selfenroll_approval'     => 1,
                                 'internal.selfenroll_notifylist'   => 1,
                                );
           my %needcrsidput = (
                                 'internal.selfenroll_types'      => 1,
                                 'internal.selfenroll_start_date' => 1,
                                 'internal. selfenroll_end_date'  => 1,
                              );
           my (@needupdate,%newcrsenv);
           foreach my $key (keys(%{$postprocessenv})) { 
               if ($settablecrsenv{$key}) {
                   $newcrsenv{$key} = $postprocessenv->{$key};
                   if ($needcrsidput{$key}) {
                       push(@needupdate,$key); 
                   }
               }
               if (keys(%newcrsenv)) {
                   my $putresult = &Apache::lonnet::put('environment',\%newcrsenv,$dom,$cnum);
                   if ($putresult eq 'ok') {
                       if (@needupdate) {
                           my %crsinfo =
                               &Apache::lonnet::courseiddump($dom,'.',1,'.','.',$cnum,undef,undef,'.');
                           if (ref($crsinfo{$cid}) eq 'HASH') {
                               foreach my $key (@needupdate) {
                                   $crsinfo{$cid}{$key} = $newcrsenv{$key};
                               }
                               my $chome = &Apache::lonnet::homeserver($cnum,$dom);
                               &Apache::lonnet::courseidput($dom,\%crsinfo,$chome,'notime');
                           }
                       }
                   }
               }
           }
       }
       return;
   }
   
   
   sub requestcourses_validation_types {
       my @items = ('url','fields','button','markup');
       my %names =  &Apache::lonlocal::texthash (
               url      => 'Web address of validation server/script',
               fields   => 'Form fields to send to validator',
               button   => 'Text for validation button',
               markup   => 'Validation description (HTML)',
       );
       my @fields = ('owner','course','coursetype','description');
       return (\@items,\%names,\@fields);
   }
   
   sub is_active_author {
       if ($env{'user.role.au./'.$env{'user.domain'}.'/'} =~ /^(\d*)\.(\d*)$/) {
           if ((!$1 || $1 < time) &&
               (!$2 || $2 > time)) {
               return 1;
           }
       }
   }
   
   sub author_prompt {
       my ($is_active_author,$offer_author);
       if ($env{'environment.canrequest.author'}) {
           unless (&is_active_author()) {
               unless (&reqauthor_check() =~ /^approval:\d+$/) {
                   $offer_author = 1;
               }
           }
       }
       return $offer_author;
   }
   
   sub reqauthor_check {
       my $queued = $env{'environment.requestauthorqueued'};
       my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'],
                                            $env{'user.domain'},$env{'user.name'});
       my $reqstatus = $reqauthor{'author_status'};
       if (($reqstatus eq '' && $queued ne '') ||
           ($env{'environment.requestauthorqueued'} !~ /^\Q$reqstatus\E/)) {
           if (ref($reqauthor{'author'}) eq 'HASH') {
               $queued = $reqstatus.':'.$reqauthor{'author'}{'timestamp'};
           } else {
               undef($queued);
           }
           &Apache::lonnet::appenv({'environment.requestauthorqueued' => $queued});
       }
       return $queued;
   }
   
   sub process_reqauthor {
       my ($dispositionref,$updateref) = @_;
       if (&is_active_author()) {
           return '<span class="LC_warning">'.
                   &mt('An Authoring Space has already been assigned to you.').'<br />'.
                   &mt('Please select the Author role from your [_1]roles page[_2].','<a href="/adm/roles">',
                   '</a>').'</span>';
       }
       unless ($env{'environment.canrequest.author'}) {
           return '<span class="LC_warning">'.
                   &mt('You do not currently have rights to request an Authoring Space.').'<br />'.
                   &mt('Please contact the [_1]helpdesk[_2] for assistance.','<a href="/adm/helpdesk">',
                   '</a>').'</span>';
       }
       my $queued = &reqauthor_check();
       if ($queued =~ /^approval:(\d+)$/) {
           my $timestamp = $1;
           return '<span class="LC_info">'.
                  &mt('A request for Authoring Space submitted on [_1] is awaiting approval',
                  &Apache::lonlocal::locallocaltime($timestamp)).
                  '</span>';
       } elsif ($queued =~ /^approved:(\d+)$/) {
           my $timestamp = $1;   
           my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                         ['active'],['au'],[$env{'user.domain'}]);
           if (keys(%roleshash) > 0) {
               return '<span class="LC_info">'.
                      &mt('A request for Authoring Space submitted on [_1] has been approved.',
                      &Apache::lonlocal::locallocaltime($timestamp)).
                      '</span>';
           }
       }
       my ($output,@inststatuses,%domconfig);
       %domconfig = &Apache::lonnet::get_dom('configuration',['requestauthor'],
                                             $env{'user.domain'});
       my $val = &get_processtype('requestauthor',$env{'user.name'},$env{'user.domain'},
                                  $env{'user.adv'},$env{'user.domain'},undef,
                                  \@inststatuses,\%domconfig);
       my $now = time;
       if ($val eq 'automatic') {
           my $start = $now-1;
           if (&Apache::lonnet::assignrole($env{'user.domain'},$env{'user.name'},'/'.$env{'user.domain'}.'/',
                                           'au',undef,$start,undef,undef,'requestauthor') eq 'ok') {
               $output = '<span class="LC_info">'.
                         &mt('Access to Authoring Space has been activated').'</span><br />';
                         &Apache::lonroles::update_session_roles();
               &Apache::lonnet::appenv({'user.update.time'  => $now});
               if (ref($updateref)) {
                   $$updateref = $now;
               }
               if (ref($dispositionref)) {
                   $$dispositionref = 'created';
               }
           } else {
               $output = '<span class="LC_info">'.
                         &mt('An error occurred while activating your access to Authoring Space');
           }
       } elsif ($val eq 'approval') {
           my $domconfiguser = &Apache::lonnet::get_domainconfiguser($env{'user.domain'});
           if (&Apache::lonnet::put('requestauthorqueue',{ $env{'user.name'}.'_'.$val => $now },
                                    $env{'user.domain'},$domconfiguser) eq 'ok') {
               my %userrequest = (
                   author => {
                               timestamp   => $now,
                               status      => $val,
                             },
                   author_status => $val,
               );
               my $req_notifylist;
               if (ref($domconfig{'requestauthor'}) eq 'HASH') {
                   if (ref($domconfig{'requestauthor'}{'notify'}) eq 'HASH') {
                       my $req_notifylist = $domconfig{'requestauthor'}{'notify'}{'approval'};
                       if ($req_notifylist) {
                           my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                        $env{'user.domain'});
                           my $sender = $env{'user.name'}.':'.$env{'user.domain'};
                           my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
                           &send_selfserve_notification($req_notifylist,
                                                        "$fullname ($env{'user.name'}:$env{'user.domain'})",
                                                        undef,$domdesc,$now,'authorreq',$sender);
                       }
                   }
               }
               my $userresult =
                   &Apache::lonnet::put('requestauthor',\%userrequest,$env{'user.domain'},$env{'user.name'});
               $output = '<span class="LC_info">'.
                         &mt('Your request for Authoring Space has been submitted for approval.').
                         '</span>';
               &Apache::lonnet::appenv({'environment.requestauthorqueued' => $val.':'.$now});
           } else {
               $output = '<span class="LC_info">'.
                         &mt('An error occurred saving your request for Authoring Space.').
                         '</span>';
           }
       }
       return $output;
 }  }
   
 1;  1;

Removed from v.1.26  
changed lines
  Added in v.1.52.2.2.6.1


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.