Diff for /loncom/interface/loncoursequeueadmin.pm between versions 1.55 and 1.69

version 1.55, 2016/08/25 22:33:03 version 1.69, 2023/08/19 23:32:13
Line 105  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\n"],
                      });                       });
     } elsif ($context eq 'domainmanagers') {      } elsif ($context eq 'domainmanagers') {
         $rawsubj = 'Course/Community requests reviewed';          $rawsubj = 'Course/Community requests reviewed';
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Course/Community creation requests in the following domain: "[_1]" have been reviewed.',                        mt  => 'Course/Community creation requests in the following domain: [_1] have been reviewed.',
                       args => ["\n$contextdesc"],                        args => ["\n$contextdesc\n"],
                      });                       });
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
Line 119  sub send_selfserve_notification { Line 119  sub send_selfserve_notification {
     } elsif ($context eq 'authormanagers') {      } elsif ($context eq 'authormanagers') {
         $rawsubj = 'Authoring Space requests reviewed';          $rawsubj = 'Authoring Space requests reviewed';
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Authoring requests in the following domain: "[_1]" have been reviewed.',                        mt  => 'Authoring requests in the following domain: [_1] have been reviewed.',
                       args => ["\n$contextdesc"],                        args => ["\n$contextdesc\n"],
                      });                       });
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
Line 128  sub send_selfserve_notification { Line 128  sub send_selfserve_notification {
     } elsif ($context eq 'usernamemanagers') {      } elsif ($context eq 'usernamemanagers') {
         $rawsubj = 'LON-CAPA account requests reviewed';          $rawsubj = 'LON-CAPA account requests reviewed';
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Account requests in the following domain: "[_1]" have been reviewed.',                        mt  => 'Account requests in the following domain: [_1] have been reviewed.',
                       args => ["\n$contextdesc"],                        args => ["\n$contextdesc\n"],
                      });                       });
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
Line 144  sub send_selfserve_notification { Line 144  sub send_selfserve_notification {
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => $msgtxt,                        mt  => $msgtxt,
                       args => ["\n  ".$contextdesc.",\n",$timestamp.",\n"],                        args => ["\n  ".$contextdesc.",\n",$timestamp.",\n"],
   
                      });                       });
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
Line 270  sub send_selfserve_notification { Line 269  sub send_selfserve_notification {
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
         }          }
       } elsif ($context eq 'othdomroleuser') {
           my $linktext = 'Roles';
           if ($notifylist =~ /^($match_username):($match_domain)$/) {
               if (&Apache::loncommon::show_course($2,$1)) {
                   $linktext = 'Courses';
               }
           }
           $rawsubj = 'Role Assignment Approval';
           push(@rawmsg,{
                         mt  => 'A domain different to your own LON-CAPA domain [_1]wants to assign you a role in their domain.',
                         args => ["\n$contextdesc\n"],
                        },
                        {
                         mt =>"[_1]Click $linktext at top right, then click 'Show pending' in the gray Functions bar ".
                              "to display a list of pending role assignments in other domain(s), which you can either accept or reject.",
                         args => ["\n\n"],
                        });
       } elsif ($context eq 'othdomroledc') {
           $rawsubj = 'Role Assignment Authorization';
           push(@rawmsg,{
                         mt  => 'Another LON-CAPA domain wants to assign a role in their domain to a user from your domain.',
                         args => [],
                        },
                        {
                         mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Create users or modify the roles and privileges of users
    -> Queued Role Assignments (this domain) [_3]to display a list of pending requests, which you can either approve or reject.',
                         args => ["\n","\n\n  ","\n\n"],
                        });
       } elsif (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
           $rawsubj = 'Status of Role Assignment Requests';
           if ($context eq 'othdombydc') {
               push(@rawmsg,{
                             mt =>'A Domain Coordinator in a domain different to your own LON-CAPA domain '.
                                  'has taken action on queued role assignment(s) in this domain for user(s) from that other domain [_1]',
                             args => ["\n$contextdesc\n"],
                             });
           } elsif ($context eq 'othdombyuser') {
               push(@rawmsg,{
                             mt => "Action has been taken by a user to whom you had assigned role(s) ".
                                   "which had been queued, pending acceptance of the role(s).",
                             args => [],
                            });
           }
           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 304  sub send_selfserve_notification { Line 349  sub send_selfserve_notification {
     my $stamp = time;      my $stamp = time;
     my $msgcount = &Apache::lonmsg::get_uniq();      my $msgcount = &Apache::lonmsg::get_uniq();
     my $sender_lh = &Apache::loncommon::user_lang($uname,$udom,$cid);      my $sender_lh = &Apache::loncommon::user_lang($uname,$udom,$cid);
     $subject = &Apache::lonlocal::mt_user($sender_lh,$rawsubj);      $subject = &mt_user($sender_lh,$rawsubj);
     $message = '';      $message = '';
     foreach my $item (@rawmsg) {      foreach my $item (@rawmsg) {
         if (ref($item) eq 'HASH') {          if (ref($item) eq 'HASH') {
             $message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n";              if (ref($item->{args}) eq 'ARRAY') {
                   $message .= &mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n";
               } else {
                   $message .= &mt_user($sender_lh,$item->{mt})."\n";
               }
         }          }
     }      }
     &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$uname,$udom,$msgcount,$cid,$$,$message,      &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$uname,$udom,$msgcount,$cid,$$,$message,
Line 322  sub send_selfserve_notification { Line 371  sub send_selfserve_notification {
     foreach my $recip (sort(keys(%{$msgcc}))) {      foreach my $recip (sort(keys(%{$msgcc}))) {
         my ($ccname,$ccdom) = split(/:/,$recip);          my ($ccname,$ccdom) = split(/:/,$recip);
         my $recip_lh = &Apache::loncommon::user_lang($ccname,$ccdom,$cid);          my $recip_lh = &Apache::loncommon::user_lang($ccname,$ccdom,$cid);
         my $subject = &Apache::lonlocal::mt_user($sender_lh,$rawsubj);          my $subject = &mt_user($sender_lh,$rawsubj);
         my $message = '';          my $message = '';
         foreach my $item (@rawmsg) {          foreach my $item (@rawmsg) {
             if (ref($item) eq 'HASH') {              if (ref($item) eq 'HASH') {
                 $message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt},                  $message .= &mt_user($sender_lh,$item->{mt},
                                                        @{$item->{args}})."\n";                                       @{$item->{args}})."\n";
             }              }
         }          }
         if ($context eq 'coursemanagers') {          if ($context eq 'coursemanagers') {
             if ($approvedlist) {              if ($approvedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved enrollments:')."\n".$approvedlist;                  $message .= "\n\n".&mt_user($sender_lh,'Approved enrollments:')."\n".$approvedlist;
             }              }
             if ($rejectedlist) {              if ($rejectedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected enrollments:')."\n".$rejectedlist;                  $message .= "\n\n".&mt_user($sender_lh,'Rejected enrollments:')."\n".$rejectedlist;
             }              }
         } elsif ($context eq 'domainmanagers') {          } elsif ($context eq 'domainmanagers') {
             if ($approvedlist) {              if ($approvedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved course requests:')."\n".$approvedlist;                  $message .= "\n\n".&mt_user($sender_lh,'Approved course requests:')."\n".$approvedlist;
             }              }
             if ($rejectedlist) {              if ($rejectedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected course requests:')."\n".$rejectedlist;                  $message .= "\n\n".&mt_user($sender_lh,'Rejected course requests:')."\n".$rejectedlist;
             }              }
         } elsif ($context eq 'authormanagers') {          } elsif ($context eq 'authormanagers') {
             if ($approvedlist) {              if ($approvedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved author role requests:')."\n".$approvedlist;                  $message .= "\n\n".&mt_user($sender_lh,'Approved author role requests:')."\n".$approvedlist;
             }              }
             if ($rejectedlist) {              if ($rejectedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected author role requests:')."\n".$rejectedlist;                  $message .= "\n\n".&mt_user($sender_lh,'Rejected author role requests:')."\n".$rejectedlist;
             }              }
         } elsif ($context eq 'usernamemanagers') {          } elsif ($context eq 'usernamemanagers') {
             if ($approvedlist) {              if ($approvedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved LON-CAPA account requests:')."\n".$approvedlist;                  $message .= "\n\n".&mt_user($sender_lh,'Approved LON-CAPA account requests:')."\n".$approvedlist;
             }              }
             if ($rejectedlist) {              if ($rejectedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected LON-CAPA account requests:')."\n".$rejectedlist;                  $message .= "\n\n".&mt_user($sender_lh,'Rejected LON-CAPA account requests:')."\n".$rejectedlist;
             }              }
         }          }
         $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,          $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,
Line 371  sub send_selfserve_notification { Line 420  sub send_selfserve_notification {
 }  }
   
 sub display_queued_requests {  sub display_queued_requests {
     my ($context,$dom,$cnum) = @_;      my ($context,$dom,$cnum,$secondary) = @_;
     my ($namespace,$formaction,$nextelement,%requesthash);      my ($namespace,$formaction,$nextelement,%requesthash,%reqstatus);
     if ($context eq 'course') {      if ($context eq 'course') {
         $formaction = '/adm/createuser';          $formaction = '/adm/createuser';
         $namespace = 'selfenrollrequests';          $namespace = 'selfenrollrequests';
Line 388  sub display_queued_requests { Line 437  sub display_queued_requests {
         $namespace = 'usernamequeue';          $namespace = 'usernamequeue';
         %requesthash = &Apache::lonnet::dump_dom($namespace,$dom);          %requesthash = &Apache::lonnet::dump_dom($namespace,$dom);
         $nextelement = '<input type="hidden" name="state" value="done" />';          $nextelement = '<input type="hidden" name="state" value="done" />';
       } elsif ($context eq 'othdomqueue') {
           $formaction = '/adm/createuser';
           $namespace = 'nohist_othdomqueued';
           if ($secondary eq 'domain') {
               %requesthash = &Apache::lonnet::dump_dom($namespace,$dom);
               foreach my $key (keys(%requesthash)) {
                   delete($requesthash{$key}) if ($key =~ /:(ca|aa)$/);
               }
           } elsif ($secondary eq 'author') {
               %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);
               if ($cnum eq &Apache::lonnet::get_domainconfiguser($dom)) {
                   foreach my $key (keys(%requesthash)) {
                       delete($requesthash{$key}) if ($key !~ /:(ca|aa)$/);
                   }
               }
           } else {
               %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);
           }
       } elsif ($context eq 'othdomaction') {
           $namespace = 'nohist_queuedrolereqs';
           if ($secondary eq 'domain') {
               $formaction = '/adm/createuser';
               my $confname = &Apache::lonnet::get_domainconfiguser($dom);
               %requesthash = &Apache::lonnet::dump($namespace,$dom,$confname);
           } else {
               $formaction = '/adm/roles';
               %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);
           }
           $nextelement = '<input type="hidden" name="state" value="done" />';
     } else {      } else {
         $formaction = '/adm/createcourse';          $formaction = '/adm/createcourse';
         $namespace = 'courserequestqueue';          $namespace = 'courserequestqueue';
Line 396  sub display_queued_requests { Line 474  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.'" />';
     }      }
     my ($output,%queue_by_date);      my ($output,%queue_by_date);
     if (keys(%requesthash) > 0) {      if (keys(%requesthash) > 0) {
         $output = '<form method="post" name="changequeue" action="'.$formaction.'" />'."\n".  
                   '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".  
                   $nextelement."\n";  
         foreach my $item (keys(%requesthash)) {          foreach my $item (keys(%requesthash)) {
             my ($timestamp,$entry,$pending);              my ($timestamp,$entry,$pending);
             if ($context eq 'course') {              if ($context eq 'course') {
Line 416  sub display_queued_requests { Line 493  sub display_queued_requests {
             } elsif ($context eq 'requestusername') {              } elsif ($context eq 'requestusername') {
                 $timestamp = $requesthash{$item};                  $timestamp = $requesthash{$item};
                 ($entry) = (&unescape($item) =~ /^($match_username)_approval$/);                  ($entry) = (&unescape($item) =~ /^($match_username)_approval$/);
               } elsif ($context eq 'othdomqueue') {
                   if (ref($requesthash{$item}) eq 'HASH') {
                       my ($puname,$pudom,$prole,$psec) = split(/:/,$item);
                       $timestamp = $requesthash{$item}{'timestamp'};
                       my $adj = $requesthash{$item}{'adj'};
                       $entry = join(':',$puname,$pudom,$prole,$adj,
                                         &escape($requesthash{$item}{'requester'}),
                                         $psec);
                   } elsif ($item =~ /^status&/) {
                       my ($dummy,$key) = split(/&/,$item,2);
                       $reqstatus{$key} = $requesthash{$item};
                   }
               } elsif ($context eq 'othdomaction') {
                  next unless ($item =~ /^pending:/);
                  if (ref($requesthash{$item}) eq 'HASH') {
                      $timestamp = $requesthash{$item}{'timestamp'};
                      $entry = &escape($item).':'.&escape($requesthash{$item}{'requester'});
                  }
             } else {              } else {
                 $timestamp = $requesthash{$item}{'timestamp'};  
                 if (ref($requesthash{$item}) eq 'HASH') {                  if (ref($requesthash{$item}) eq 'HASH') {
                       $timestamp = $requesthash{$item}{'timestamp'};
                     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 438  sub display_queued_requests { Line 533  sub display_queued_requests {
                 }                  }
             }              }
         }          }
         if (keys(%queue_by_date) > 0) {      }
             if ($context eq 'course') {      if (keys(%queue_by_date) > 0) {
                 $output .=  '<h3>'.&mt('Self-enrollment requests queued pending approval by a Coordinator').'</h3>';          $output = '<form method="post" name="changequeue" action="'.$formaction.'" />'."\n".
             } elsif ($context eq 'pending') {                    '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".
                 $output .= '<h3>'.&mt('Requests for official courses queued pending validation').'</h3>'.                    $nextelement."\n";
                            '<p>'.&mt('Requests are validated against institutional data to confirm that the requestor is an instructor of record.').'<br />'.          if ($context eq 'course') {
                            &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>';              $output .=  '<h3>'.&mt('Self-enrollment requests queued pending approval by a Coordinator').'</h3>';
             } elsif ($context eq 'requestauthor') {          } elsif (($context eq 'pending') || ($context eq 'displaypending')) {
                 $output .= '<h3>'.&mt('Requests for Authoring Space queued pending approval by a Domain Coordinator').'</h3>';              $output .= '<h3>'.&mt('Requests for official courses queued pending validation').'</h3>'.
             } elsif ($context eq 'requestusername') {                         '<p>'.&mt('Requests are validated against institutional data to confirm that the requestor is an instructor of record.').'<br />'.
                 $output .= '<h3>'.&mt('Requests for LON-CAPA accounts queued pending approval by a Domain Coordinator').'</h3>';                         &mt('Validation is attempted when the request is submitted.').' '.
             } else {                         &mt('If unvalidated, the request will be held in a queue.').' '.
                 $output .= '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';                         &mt('Validation of pending requests is automatically repeated daily.').'</p>';
             }           } elsif ($context eq 'requestauthor') {
             $output .= &build_queue_display($dom,$context,\%queue_by_date).              $output .= '<h3>'.&mt('Requests for Authoring Space queued pending approval by a Domain Coordinator').'</h3>';
                        '<input type="hidden" name="queue" value="approval" />';          } elsif ($context eq 'requestusername') {
               $output .= '<h3>'.&mt('Requests for LON-CAPA accounts queued pending approval by a Domain Coordinator').'</h3>';
           } elsif ($context eq 'othdomqueue') {
               if ($secondary eq 'domain') {
                   $output .= '<h3>'.&mt('Domain role assignments for users from another domain which were/are queued for approval').'</h3>';
               } elsif ($secondary eq 'author') {
                   $output .= '<h3>'.&mt('Co-author role assignments for users from another domain which were/are queued for approval').'</h3>';
               } elsif ($secondary eq 'course') {
                   $output .= '<h3>'.&mt('Course role assignments for users from another domain which were/are queued for approval').'</h3>';
               } elsif ($secondary eq 'community') {
                   $output .= '<h3>'.&mt('Community role assignments for users from another domain which were/are queued for approval').'</h3>';
               }
           } elsif ($context eq 'othdomaction') {
               unless ($secondary eq 'user') {
                   $output .= '<h3>'.&mt('Role assignments in other domains, queued pending domain coordinator approval in this domain.').'</h3>';
               }
         } else {          } else {
             $output .= '<div class="LC_info">';              $output .= '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';
             if ($context eq 'course') {          }
                 $output .= &mt('There are currently no enrollment requests awaiting approval.');          if ($context eq 'othdomqueue') {
             } elsif ($context eq 'pending') {              $output .= &queued_role_display($secondary,\%queue_by_date,\%reqstatus);
                 $output .= &mt('There are currently no requests for official courses awaiting validation.');          } else {
             } elsif ($context eq 'requestauthor') {              $output .= &build_queue_display($dom,$context,\%queue_by_date,$secondary).
                 $output .= &mt('There are currently no requests for Authoring Space awaiting approval.');                         '<input type="hidden" name="queue" value="approval" />';
             } elsif ($context eq 'requestusername') {              if ($secondary eq 'user') {
                 $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');                  $output .= "\n".'<input type="hidden" name="approvals" value="show" />'."\n";
             } elsif ($context eq 'domain') {  
                 $output .= &mt('There are currently no course or community requests awaiting approval.');  
             }              }
             $output .= '</div>';   
         }          }
         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') && ($context ne 'othdomqueue')) {
             $output .= '<br /><input type="submit" name="processqueue" value="'.&mt('Save').'" />';              $output .= '<br /><input type="submit" name="processqueue" value="'.&mt('Save').'" />';
         }          }
         $output .= '</form>';          $output .= '</form>';
     } else {      } else {
         $output .= '<div class="LC_info">';          if (($context eq 'othdomaction') && ($secondary eq 'user')) { 
               $output .= '<span class="LC_info">';
           } else {
               $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') {          } elsif ($context eq 'requestauthor') {
             $output .= &mt('There are currently no requests for Authoring Space awaiting approval.');              $output .= &mt('There are currently no requests for Authoring Space awaiting approval.');
         } elsif ($context eq 'requestusername') {          } elsif ($context eq 'requestusername') {
             $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');              $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');
           } elsif ($context eq 'othdomqueue') {
               if ($secondary eq 'domain') {
                   $output .= &mt('There are currently no domain role assignment(s) for user(s) from another domain which were/are queued for approval');
               } elsif ($secondary eq 'author') {
                   $output .= &mt('There are currently no co-author role assignment(s) for user(s) from another domain which were/are queued for approval');
               } elsif ($secondary eq 'course') {
                   $output .= &mt('There are currently no course role assignment(s) for user(s) from another domain which were/are queued for approval');
               } elsif ($secondary eq 'community') {
                   $output .= &mt('There are currently no community role assignment(s) for user(s) from another domain which were/are queued for approval');
               }
           } elsif ($context eq 'othdomaction') {
               if ($secondary eq 'user') {
                   $output .= &mt('No role assignments for you in other domains currently awaiting your acceptance');
               } elsif ($secondary eq 'domain') {
                   $output .= &mt('No role assignments in other domains currently awaiting domain coordinator 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.');
         }          }
         $output .= '</div>';          if (($context eq 'othdomaction') && ($secondary eq 'user')) {
               $output .= '</span>';
           } else {
               $output .= '</div>';
           }
     }      }
     return $output;      return $output;
 }  }
   
 sub build_queue_display {  sub build_queue_display {
     my ($dom,$context,$queue) = @_;      my ($dom,$context,$queue,$secondary) = @_;
     return unless (ref($queue) eq 'HASH');      return unless (ref($queue) eq 'HASH');
     my %crstypes;      my (%crstypes,%roles_by_context,$output);
     my $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();
     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>';      unless (($context eq 'othdomaction') && ($secondary eq 'user')) {
           $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>';
Line 513  sub build_queue_display { Line 648  sub build_queue_display {
     } elsif ($context eq 'requestusername') {      } elsif ($context eq 'requestusername') {
         $output .= '<th>'.&mt('Date requested').'</th>'.          $output .= '<th>'.&mt('Date requested').'</th>'.
                    '<th>'.&mt('Details').'</th>';                     '<th>'.&mt('Details').'</th>';
     } elsif ($context eq 'pending' || $context eq 'stillpending') {      } elsif ($context eq 'othdomaction') {
           $output .= '<th>'.&mt('Date requested').'</th>'.
                      '<th>'.&mt('Role type').'</th>'.
                      '<th>'.&mt('Location').'</th>';
           if ($secondary eq 'domain') {
               $output .= '<th>'.&mt('Affected User').'</th>';
           }
           foreach my $type ('domain','course') {
               my @possroles = &Apache::lonuserutils::roles_by_context($type);
               $roles_by_context{$type} = \@possroles;
           }
       } 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 536  sub build_queue_display { Line 682  sub build_queue_display {
         if (ref($queue->{$item}) eq 'ARRAY') {          if (ref($queue->{$item}) eq 'ARRAY') {
             foreach my $request (sort(@{$queue->{$item}})) {              foreach my $request (sort(@{$queue->{$item}})) {
                 my ($row,$approve,$reject,$showtime,$showsec,$namelink,                  my ($row,$approve,$reject,$showtime,$showsec,$namelink,
                     $detailslink,$crstype,$instcode);                      $detailslink,$crstype,$instcode,$showrole,$adjudicator,
                       $location,$showrequester);
                 $showtime = &Apache::lonlocal::locallocaltime($item);                  $showtime = &Apache::lonlocal::locallocaltime($item);
                 if ($context eq 'course') {                  if ($context eq 'course') {
                     my ($puname,$pudom,$pusec) = split(/:/,$request);                      my ($puname,$pudom,$pusec) = split(/:/,$request);
Line 552  sub build_queue_display { Line 699  sub build_queue_display {
                 } elsif ($context eq 'requestauthor') {                  } elsif ($context eq 'requestauthor') {
                     if (&Apache::lonnet::homeserver($request,$dom) ne 'no_host') {                      if (&Apache::lonnet::homeserver($request,$dom) ne 'no_host') {
                         $approve = $count.':'.$request;                          $approve = $count.':'.$request;
                         $reject = $request;                           $reject = $request;
                         $namelink = &Apache::loncommon::aboutmewrapper(                          $namelink = &Apache::loncommon::aboutmewrapper(
                                     &Apache::loncommon::plainname($request,$dom),                                      &Apache::loncommon::plainname($request,$dom),
                                     $request,$dom);                                      $request,$dom);
Line 566  sub build_queue_display { Line 713  sub build_queue_display {
                                      "'$dom','$request','$queued'".');">'.$request.'</a>';                                       "'$dom','$request','$queued'".');">'.$request.'</a>';
                         $namelink = $request;                          $namelink = $request;
                     }                      }
                   } elsif ($context eq 'othdomaction') {
                       my ($status,$extent,$role,$crstype);
                       my ($info,$requester) = map { &unescape($_); } split(/:/,$request);
                       if ($secondary eq 'user') {
                           ($status,$extent,$role) = split(/:/,$info);
                           $approve = $count.':'.$extent.':'.$role;
                           $reject = $extent.':'.$role;
                       } elsif ($secondary eq 'domain') {
                           ($status,my $uname,$extent,$role) = split(/:/,$info);
                           $approve = $count.':'.$extent.':'.$role.':'.$uname.':'.$dom;
                           $reject = $extent.':'.$role.':'.$uname.':'.$dom;
                           unless (&Apache::lonnet::homeserver($uname,$dom) eq 'no_host') {
                               $namelink = &Apache::loncommon::plainname($uname,$dom);
                               unless ($namelink eq $uname.':'.$dom) {
                                   $namelink .= ' ('.$uname.':'.$dom.')';
                               }
                           }
                       }
                       if (($role eq 'ca') || ($role eq 'aa')) {
                           my ($audom,$auname) = ($extent =~ m{^/($match_domain)/($match_username)$});
                           $location = &mt('Domain').': '.&Apache::lonnet::domain($audom,'description').'<br />'.
                                       &mt('Author').': '.&Apache::loncommon::plainname($auname,$audom);
                       } elsif ($role eq 'co') {
                           my ($cdom,$cnum)  = ($extent =~ m{^/($match_domain)/($match_courseid)});
                           if (&Apache::lonnet::is_course($cdom,$cnum)) {
                               my %info = &Apache::lonnet::coursedescription("$cdom/$cnum",{'one_time' => 1});
                               $crstype = $info{'type'};
                               $location = &mt('Domain').': '.&Apache::lonnet::domain($cdom,'description').'<br />'.
                                           &mt('Community').': '.$info{'description'};
                               $showrole = &Apache::lonnet::plaintext($role,'Community');
                           }
                       } elsif ($role =~ m{^cr/}) {
                           $showrole = &Apache::lonnet::plaintext($role,$crstype);
                           my ($cdom,$cnum,$csec)  = ($extent =~ m{^/($match_domain)/($match_courseid)(?:|/(\w+))$});
                           if (&Apache::lonnet::is_course($cdom,$cnum)) {
                               my %info = &Apache::lonnet::coursedescription("$cdom/$cnum",{'one_time' => 1});
                               $crstype = $info{'type'};
                               $location = &mt('Domain').': '.&Apache::lonnet::domain($cdom,'description').'<br />'. 
                                           &mt($crstype).': '.$info{'description'};
                               if ($csec ne '') {
                                   $location .= '<br />'.&mt('Section').': '.$csec;
                               }
                           }
                       } else {
                           foreach my $type ('course','domain') {
                               if (grep(/^\Q$role\E$/,@{$roles_by_context{$type}})) {
                                   if ($type eq 'course') {
                                       my ($cdom,$cnum,$csec) = ($extent =~ m{^/($match_domain)/($match_courseid)(?:|/(\w+))$});
                                       if (&Apache::lonnet::is_course($cdom,$cnum)) {
                                           my %info = &Apache::lonnet::coursedescription("$cdom/$cnum",{'one_time' => 1});
                                           $crstype = $info{'type'};
                                           $location = &mt('Domain').': '.&Apache::lonnet::domain($cdom,'description').'<br />'.
                                                       &mt($crstype).': '.$info{'description'};
                                           if ($csec ne '') {
                                               $location .= '<br />'.&mt('Section').': '.$csec;
                                           }
                                       }
                                   } else {
                                       my ($domain)  = ($extent =~ m{^/($match_domain)/$});
                                       $location = &mt('Domain').': '.&Apache::lonnet::domain($domain,'description');
                                   }
                                   last;
                               }
                           }
                       }
                       if ($role =~ m{^cr/($match_domain)/($match_username)/(\w+)$}) {
                           my ($crudom,$cruname,$rolename) = ($1,$2,$3);
                           my $creator = &Apache::loncommon::plainname($cruname,$crudom);
                           unless ($creator eq $cruname.':'.$crudom) {
                               $creator .= ' ('.$cruname.':'.$crudom.')';
                           }
                           $showrole = &mt('Custom role').': '.$rolename.'<br />'.
                                       &mt('Created by').' '.$creator;
                       } else {
                           $showrole = &Apache::lonnet::plaintext($role,$crstype);
                       }
                       my ($requname,$requdom) = split(/:/,$requester);
                       $showrequester = &Apache::loncommon::plainname($requname,$requdom);
                       unless ($showrequester eq $requname.':'.$requdom) {
                           $showrequester .= ' ('.$requname.':'.$requdom.')';
                       }
                 } else {                  } else {
                     my ($cnum,$ownername,$ownerdom,$type,$cdesc);                      my ($cnum,$ownername,$ownerdom,$type,$cdesc);
                     my $queued = '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);
                         $queued = 'pending';                                                  $queued = 'pending';                        
                     } else {                      } else {
Line 587  sub build_queue_display { Line 815  sub build_queue_display {
                                 &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="radio" value="'.$approve.'" name="'.$count.'radioreq" />'.&mt('Approve').'</label>'.                             '<input type="radio" value="'.$approve.'" name="'.$count.'radioreq" />'.&mt('Approve').'</label>'.
                            '<label>'.('&nbsp;'x2).                             '<label>'.('&nbsp;'x2).
Line 596  sub build_queue_display { Line 825  sub build_queue_display {
                            '<input type="radio" value="'."later:".$reject.'" name="'.$count.'radioreq" checked />'.&mt('Decide Later').                             '<input type="radio" value="'."later:".$reject.'" name="'.$count.'radioreq" checked />'.&mt('Decide Later').
                            '</label></span><br /></td>';                             '</label></span><br /></td>';
                 }                  }
                 $row .= '<td>'.$namelink.'</td>'."\n";                  unless ($context eq 'othdomaction') {
                       $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";
Line 605  sub build_queue_display { Line 836  sub build_queue_display {
                 } elsif ($context eq 'requestusername') {                  } elsif ($context eq 'requestusername') {
                     $row .= '<td>'.$showtime.'</td>'."\n".                      $row .= '<td>'.$showtime.'</td>'."\n".
                             '<td>'.$detailslink.'</td>'."\n";                              '<td>'.$detailslink.'</td>'."\n";
                 } else {                   } elsif ($context eq 'othdomaction') {
                     if ($context eq 'pending' || $context eq 'stillpending') {                      if ($secondary eq 'domain') {
                           $row .= '<td>'.$showrequester.'</td>'."\n";
                       }
                       $row .= '<td>'.$showtime.'</td>'."\n".
                               '<td>'.$showrole.'</td>'."\n".
                               '<td>'.$location.'</td>'."\n";
                       if ($secondary eq 'domain') {
                           $row .= '<td>'.$namelink.'</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 625  sub build_queue_display { Line 866  sub build_queue_display {
     return $output;      return $output;
 }  }
   
   sub queued_role_display {
       my ($context,$queue,$status) = @_;
       return unless ((ref($queue) eq 'HASH') && (ref($status) eq 'HASH'));
       my (%curr,$minshown,$maxshown,$more_records,$crstype,$viewablesec,$output);
       my $formname = 'changequeue';
       if ($context eq 'course') {
           $crstype = &Apache::loncommon::course_type();
           my ($permission,$allowed) =
               &Apache::lonuserutils::get_permission($context,$crstype);
           $viewablesec = &Apache::lonuserutils::viewable_section($permission);
           my %saveable_parameters = ('show' => 'scalar',);
           &Apache::loncommon::store_course_settings('roles_req',
                                                     \%saveable_parameters);
           &Apache::loncommon::restore_course_settings('roles_req',
                                                       \%saveable_parameters);
       }
   
   # Create navigation javascript
       my $jsnav = &queued_log_js($formname);
   
       $output = (<<ENDSCRIPT);
   <script type="text/javascript">
   // <![CDATA[
   $jsnav
   // ]]>
   </script>
   ENDSCRIPT
   
       my $now = time();
       my $defstart = $now - (7*24*3600); #7 days ago
       my %defaults = (
                        page               => '1',
                        show               => '10',
                        role               => 'any',
                        chgstatus          => 'any',
                        chgadj             => 'any',
                        rolereq_start_date => $defstart,
                        rolereq_end_date   => $now,
                      );
       $more_records = 0;
       my %lt = &othdomrole_contexts();
   
       foreach my $item ('show','page','role','chgstatus','chgadj') {
           $curr{$item} = $env{'form.'.$item};
       }
       ($curr{'rolereq_start_date'},$curr{'rolereq_end_date'}) =
           &Apache::lonuserutils::get_dates_from_form('rolereq_start_date','rolereq_end_date');
       foreach my $key (keys(%defaults)) {
           if ($curr{$key} eq '') {
               $curr{$key} = $defaults{$key};
           }
       }
       $minshown = 1;
       my $count = 0;
       if ($curr{'show'} =~ /\D/) {
           $curr{'page'} = 1;
       } else {
           $maxshown = $curr{'page'} * $curr{'show'};
           if ($curr{'page'} > 1) {
               $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
           }
       }
       $output .= &print_filter_menu($context,'changequeue',\%curr,$crstype);
   
       my $showntableheader = 0;
   
       # Table Header
       my $tableheader =
                 &Apache::loncommon::start_data_table().
                 &Apache::loncommon::start_data_table_header_row().
                 '<th>'.&mt('Date requested').'</th>'.
                 '<th>'.&mt('Role').'</th>';
       if ($context eq 'course') {
           $tableheader .= '<th>'.&mt('Section').'</th>';
       }
       $tableheader .= '<th>'.&mt('Requested for').'</th>'.
                       '<th>'.&mt('Request status').'</th>'.
                       '<th>'.&mt('Adjudicator').'</th>'.
                       &Apache::loncommon::end_data_table_header_row();
   
       my @sortedtimes = sort {$a <=> $b} (keys(%{$queue}));
       my $count = 0;
       foreach my $item (@sortedtimes) {
           next if (($item < $curr{'rolereq_start_date'}) ||
                    ($item > $curr{'rolereq_end_date'}));
           if (ref($queue->{$item}) eq 'ARRAY') {
               foreach my $request (sort(@{$queue->{$item}})) {
                   if ($curr{'show'} !~ /\D/) {
                       if ($count >= $curr{'page'} * $curr{'show'}) {
                           $more_records = 1;
                           last;
                       }
                   }
                   my ($showtime,$showsec,$namelink,$showrole,$showadj,
                       $showstatus,$id);
                   $showtime = &Apache::lonlocal::locallocaltime($item);
                   my ($uname,$udom,$role,$adj,$requester,$sec) = split(/:/,$request);
                   $id = join(':',($uname,$udom,$role));
                   if ($context eq 'course') {
                       $id .= ':'.$sec;
                   }
                   if ($curr{'role'} ne 'any') {
                       if ($curr{'role'} eq 'cr') {
                           next unless ($role =~ m{^cr/});
                       } else {
                           next unless ($role eq $curr{'role'});
                       }
                   }
                   if ($curr{'chgstatus'} ne 'any') {
                       next if ($status->{$id} ne $curr{'chgstatus'});
                   }
                   if ($curr{'chgadj'} ne 'any') {
                       next if ($adj ne $curr{'chgadj'});
                   }
                   if (($context eq 'course') && ($viewablesec ne '')) {
                       next if ($sec ne $viewablesec);
                   }
                   $count ++;
                   next if ($count < $minshown);
                   unless ($showntableheader) {
                       $output .= $tableheader;
                       $showntableheader = 1;
                   }
                   $showrole = &Apache::lonnet::plaintext($role,$crstype);
                   $showstatus = $lt{$status->{$id}};
                   $showadj = $lt{$adj};
                   unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                       $namelink = &Apache::loncommon::plainname($uname,$udom)." ($uname:$udom)";
                   }
                   if ($context eq 'course') {
                       $showsec = $sec;
                       if ($showsec eq '') {
                           $showsec = &mt('none');
                       }
                   }
                   $output .= &Apache::loncommon::start_data_table_row()."\n".
                             '<td>'.$showtime.'</td>'."\n".
                             '<td>'.$showrole.'</td>'."\n";
                   if ($context eq 'course') {
                       $output .= '<td>'.$showsec.'</td>'."\n";
                   }
                   $output .= '<td>'.$namelink.'</td>'."\n".
                              '<td>'.$showstatus.'</td>'."\n".
                              '<td>'.$showadj.'</td>'."\n".
                              &Apache::loncommon::end_data_table_row()."\n";
               }
           }
       }
   
       if ($showntableheader) { # Table footer, if content displayed above
           $output .= &Apache::loncommon::end_data_table().
                      &queued_role_navlinks(\%curr,$more_records);
       } else { # No content displayed above
           $output .= '<p class="LC_info">'.
                      &mt('There are no records to display.').
                      '</p>';
       }
       $output .= '<input type="hidden" name="page" value="'.$curr{'page'}.'" />';
       return $output;
   }
   
   sub queued_log_js {
       my ($formname) = @_;
       return <<"ENDSCRIPT";
   
   function chgPage(caller) {
       if (caller == 'previous') {
           document.$formname.page.value --;
       }
       if (caller == 'next') {
           document.$formname.page.value ++;
       }
       document.$formname.submit();
       return;
   }
   ENDSCRIPT
   }
   
   sub queued_role_navlinks {
       my ($curr,$more_records) = @_;
       return unless(ref($curr) eq 'HASH');
       # Navigation Buttons
       my $nav_links;
       if (($curr->{'page'} > 1) || ($more_records)) {
           $nav_links = '<p>';
           if (($curr->{'page'} > 1) && ($curr->{'show'} !~ /\D/)) {
               $nav_links .= '<input type="button"'
                            .' onclick="javascript:chgPage('."'previous'".');"'
                            .' value="'.&mt('Previous [_1] changes',$curr->{'show'})
                            .'" /> ';
           }
           if ($more_records) {
               $nav_links .= '<input type="button"'
                            .' onclick="javascript:chgPage('."'next'".');"'
                            .' value="'.&mt('Next [_1] changes',$curr->{'show'})
                            .'" />';
           }
           $nav_links .= '</p>';
       }
       return $nav_links;
   }
   
   sub print_filter_menu {
       my ($context,$formname,$curr,$crstype) = @_;
   
       my $nolink = 1;
       my $output = '<table><tr><td valign="top">'.
                    '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b></span><br />'.
                    &Apache::lonmeta::selectbox('show',$curr->{'show'},'',undef,
                                                 (&mt('all'),5,10,20,50,100,1000,10000)).
                    '</td><td>&nbsp;&nbsp;</td>';
       my $startform =
           &Apache::lonhtmlcommon::date_setter($formname,'rolereq_start_date',
                                               $curr->{'rolereq_start_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my $endform =
           &Apache::lonhtmlcommon::date_setter($formname,'rolereq_end_date',
                                               $curr->{'rolereq_end_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my %lt = &othdomrole_contexts();
       $output .= '<td valign="top"><b>'.&mt('Time window in which role was requested').':</b><br />'.
                  '<table><tr><td>'.&mt('After:').
                  '</td><td>'.$startform.'</td></tr>'.
                  '<tr><td>'.&mt('Before:').'</td>'.
                  '<td>'.$endform.'</td></tr></table>'.
                  '</td>'.
                  '<td>&nbsp;&nbsp;</td>'.
                  '<td valign="top"><b>'.&mt('Requested role').':</b><br />'.
                  '<select name="role"><option value="any"';
       if ($curr->{'role'} eq 'any') {
           $output .= ' selected="selected"';
       }
       $output .= '>'.&mt('Any').'</option>'."\n";
       my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype);
       foreach my $role (@roles) {
           my $plrole;
           if ($role eq 'cr') {
               $plrole = &mt('Custom Role');
           } else {
               $plrole=&Apache::lonnet::plaintext($role,$crstype);
           }
           my $selstr = '';
           if ($role eq $curr->{'role'}) {
               $selstr = ' selected="selected"';
           }
           $output .= '  <option value="'.$role.'"'.$selstr.'>'.$plrole.'</option>';
       }
       $output .= '</select></td>'.
                  '<td>&nbsp;&nbsp;</td>'.
                  '<td valign="top"><b>'.
                  &mt('Request status').':</b><br />'.
                  '<select name="chgstatus">'.
                  '<option value="any"';
       if ($curr->{'chgstatus'} eq 'any') {
           $output .= ' selected="selected"';
       }
       $output .= '>'.&mt('Any').'</option>'."\n";
       my @possstatus = ('pending','approved','rejected');
       foreach my $statustype (@possstatus) {
           my $selstr = '';
           if ($curr->{'chgstatus'} eq $statustype) {
               $selstr = ' selected="selected"';
           }
           $output .= '<option value="'.$statustype.'"'.$selstr.'>'.$lt{$statustype}.'</option>'."\n";
       }
       $output .= '</select></td>'.
                  '<td>&nbsp;&nbsp;</td>'.
                  '<td valign="top"><b>'.
                  &mt('Adjudicator').':</b><br />'.
                  '<select name="chgadj">'.
                  '<option value="any"';
       if ($curr->{'adj'} eq 'any') {
           $output .= ' selected="selected"';
       }
       $output .= '>'.&mt('Any').'</option>'."\n";
       my @possadj = ('domain','user');
       foreach my $adjtype (@possadj) {
           my $selstr = '';
           if ($curr->{'chgadj'} eq $adjtype) {
               $selstr = ' selected="selected"';
           }
           $output .= '<option value="'.$adjtype.'"'.$selstr.'>'.$lt{$adjtype}.'</option>'."\n";
       }
       $output .= '</select></td>'
                 .'</tr></table>';
   
       # Update Display button
       $output .= '<p>'.
                  '<input type="submit" value="'.&mt('Update Display').'" />'.
                  '</p>'.
                  '<hr />';
       return $output;
   }
   
   sub othdomrole_contexts {
       my %lt = &Apache::lonlocal::texthash(
           pending  => 'Queued',
           approved => 'Approved',
           rejected => 'Rejected',
           user     => 'User who acquires role',
       );
       $lt{'domain'} = &mt("[_1] in user's domain",
                           &Apache::lonnet::plaintext('dc'));
       return %lt;
   }
   
 sub update_request_queue {  sub update_request_queue {
     my ($context,$cdom,$cnum,$coursedesc) = @_;      my ($context,$cdom,$cnum,$coursedesc) = @_;
     my ($output,$access_start,$access_end,$limit,$cap,$notifylist,$namespace,      my ($output,$access_start,$access_end,$limit,$cap,$notifylist,$namespace,
Line 634  sub update_request_queue { Line 1181  sub update_request_queue {
         @processing_errors,@warn_approves,@warn_rejects,@approvals,@warn_dels,          @processing_errors,@warn_approves,@warn_rejects,@approvals,@warn_dels,
         @rejections,@rejectionerrors,@nopermissions,%courseroles,@toremove,          @rejections,@rejectionerrors,@nopermissions,%courseroles,@toremove,
         %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,          %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,
         $firsturl,$uniquecode,%codes);          $firsturl,$uniquecode,%codes,%roles_by_context,%requesteractive,
           %gotroles,$confname,%requestedby,@rejectedreqs,$dbname);
     my $count=0;      my $count=0;
     while (my $item = $env{'form.'.$count.'radioreq'}) {      while (my $item = $env{'form.'.$count.'radioreq'}) {
         if ($item =~ /^\d+:/) {          if ($item =~ /^\d+:/) {
Line 644  sub update_request_queue { Line 1192  sub update_request_queue {
         }          }
         $count ++;          $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 718  sub update_request_queue { Line 1265  sub update_request_queue {
                             mt => 'Your request for a LON-CAPA account has not been approved.',                              mt => 'Your request for a LON-CAPA account has not been approved.',
                         }];                          }];
         $domdesc = &Apache::lonnet::domain($cdom);          $domdesc = &Apache::lonnet::domain($cdom);
           $dbname = 'nohist_requestedusernames';
       } elsif (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
           $namespace = 'nohist_queuedrolereqs';
           foreach my $type ('domain','course') {
               my @possroles = &Apache::lonuserutils::roles_by_context($type);
               $roles_by_context{$type} = \@possroles;
           }
           if ($context eq 'othdombydc') {
               $confname = &Apache::lonnet::get_domainconfiguser($cdom);
               %requesthash = &Apache::lonnet::dump($namespace,$cdom,$confname);
           } elsif ($context eq 'othdombyuser') {
               %requesthash = &Apache::lonnet::dump($namespace);
           }
           $domdesc = &Apache::lonnet::domain($cdom);
           $dbname = 'nohist_othdomqueued';
     } else {      } else {
         $domdesc = &Apache::lonnet::domain($cdom);          $domdesc = &Apache::lonnet::domain($cdom);
         $namespace = 'courserequestqueue';          $namespace = 'courserequestqueue';
Line 872  sub update_request_queue { Line 1434  sub update_request_queue {
             push(@toremove,(@invalidusers,@nopermissions));              push(@toremove,(@invalidusers,@nopermissions));
         } elsif ($context eq 'requestusername') {          } elsif ($context eq 'requestusername') {
             my ($num,$uname) = split(/:/,$item);              my ($num,$uname) = split(/:/,$item);
             my $dbname = 'nohist_requestedusernames';  
             my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);              my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
             my %curr = &Apache::lonnet::get($dbname,[$uname],$cdom,$domconfiguser);              my %curr = &Apache::lonnet::get($dbname,[$uname],$cdom,$domconfiguser);
               
             if (ref($curr{$uname}) eq 'HASH') {              if (ref($curr{$uname}) eq 'HASH') {
                 my ($username,$logtoken,$serverid,$encpass,$courseid,$id,$firstname,                  my ($logtoken,$serverid,$encpass,$courseid,$id,$firstname,
                     $middlename,$lastname,$generation,$inststatus);                      $middlename,$lastname,$generation,$inststatus,$email);
                 $curr{$uname}{'timestamp'} = $now;                  $curr{$uname}{'timestamp'} = $now;
                 $curr{$uname}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};                  $curr{$uname}{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
                 $courseid   = $curr{$uname}{'courseid'};                  $courseid   = $curr{$uname}{'courseid'};
Line 889  sub update_request_queue { Line 1450  sub update_request_queue {
                 $generation = $curr{$uname}{'generation'};                  $generation = $curr{$uname}{'generation'};
                 $inststatus = $curr{$uname}{'inststatus'};                  $inststatus = $curr{$uname}{'inststatus'};
   
                 my ($key,$caller)=split(/&/,$curr{$uname}{'tmpinfo'});                  if ($curr{$uname}{'email'} ne '') {
                 if ($caller eq 'createaccount') {                      $email = $curr{$uname}{'email'};
                     my $upass = &Apache::loncommon::des_decrypt($key,$curr{$uname}{'upass'});                  } elsif ($uname =~ /^[^\@]+\@[^\@]+$/) {
                       $email = $uname;
                   }
   
                   my $upass;
                   if ($curr{$uname}{'tmpinfo'}) {
                       my ($key,$caller)=split(/&/,$curr{$uname}{'tmpinfo'});
                       if ($caller eq 'createaccount') {
                           if ($curr{$uname}{'upass'} eq '') {
                               $upass = $curr{$uname}{'upass'};
                           } else {
                               $upass = &Apache::loncommon::des_decrypt($key,$curr{$uname}{'upass'});
                           }
                       } else {
                           push(@processing_errors,$uname);
                       }
                   } else {
                       $upass = $curr{$uname}{'upass'};
                   }
                   if ($upass eq '') {
                       push(@processing_errors,$uname);
                   } else {
                     undef($curr{$uname}{'upass'});                      undef($curr{$uname}{'upass'});
                     my $result =                      my $result =
                         &Apache::lonnet::modifyuser($cdom,$uname,$id,'internal',$upass,                          &Apache::lonnet::modifyuser($cdom,$uname,$id,'internal',$upass,
                                                     $firstname,$middlename,$lastname,                                                      $firstname,$middlename,$lastname,
                                                     $generation,undef,undef,$uname);                                                      $generation,undef,undef,$email);
                     if ($result eq 'ok') {                      if ($result eq 'ok') {
                         $curr{$uname}{'status'} = 'created';                          $curr{$uname}{'status'} = 'created';
                         push(@completed,$uname);                           push(@completed,$uname); 
Line 917  sub update_request_queue { Line 1499  sub update_request_queue {
                     } else {                      } else {
                         push(@processing_errors,$uname);                          push(@processing_errors,$uname);
                     }                      }
                 } else {  
                     push(@processing_errors,$uname);  
                 }                  }
             } else {              } else {
                 push(@invalidusers,$uname);                  push(@invalidusers,$uname);
             }              }
             push(@toremove,@invalidusers);              push(@toremove,@invalidusers);
           } elsif (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
               my ($num,$extent,$role,$uname,$udom,$key,$logmsg,$result);
               if ($context eq 'othdombydc') {
                   ($num,$extent,$role,$uname,$udom) = split(/:/,$item);
                   if ($udom eq $cdom) {
                       $key = 'pending:'.$uname.':'.$extent.':'.$role;
                   }
               } elsif ($context eq 'othdombyuser') {
                   ($num,$extent,$role) = split(/:/,$item);
                   $key = 'pending:'.$extent.':'.$role;
                   $uname = $env{'user.name'};
                   $udom = $env{'user.domain'};
               }
               if (($key) && (exists($requesthash{$key}))) {
                   if (ref($requesthash{$key}) eq 'HASH') {
                       my $requester = $requesthash{$key}->{'requester'};
                       my ($requname,$requdom) = split(/:/,$requester);
                       my $start = $requesthash{$key}->{'start'};
                       my $end = $requesthash{$key}->{'end'};
                       my $credits = $requesthash{$key}->{'credits'};
                       my $reqcontext = $requesthash{$key}->{'context'};
                       if ((($context eq 'othdombydc') &&
                           (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host')) ||
                           ($context eq 'othdombyuser')) {
                           if (&Apache::lonnet::homeserver($requname,$requdom) ne 'no_host') {
                               if (($role eq 'ca') || ($role eq 'aa')) {
                                   my ($audom,$auname) = ($extent =~ m{^/($match_domain)/($match_username)$});
                                   if (&Apache::lonnet::homeserver($auname,$audom) ne 'no_host') {
                                       if ($requester eq $auname.':'.$audom) {
                                           unless ($gotroles{$requester}) {
                                               &requester_roles($auname,$audom,\%requesteractive);
                                               $gotroles{$requester} = 1;
                                           }
                                           if (ref($requesteractive{$requester}) eq 'HASH') {
                                               if ($requesteractive{$requester}{':'.$audom.':au'}) {
                                                   $result = &Apache::lonnet::assignrole($udom,$uname,$extent,$role,
                                                                                         $end,$start,'','',$reqcontext,
                                                                                         $context,$requester);
                                               }
                                           }
                                       }
                                   }
                               } elsif (($role eq 'co') || ($role eq 'cc')) {
                                   my ($crsdom,$crsnum)  = ($extent =~ m{^/($match_domain)/($match_courseid)});
                                   if (&Apache::lonnet::is_course($crsdom,$crsnum)) {
                                       my %info = &Apache::lonnet::coursedescription("$crsdom/$crsnum",{'one_time' => 1});
                                       if ((($role eq 'co') && ($info{'type'} eq 'Community')) ||
                                           (($role eq 'cc') && ($info{'type'} ne 'Community'))) {
                                           if ($info{'internal.courseowner'} eq $requester) {
                                               unless ($gotroles{$requester}) {
                                                   &requester_roles($requname,$requdom,\%requesteractive);
                                                   $gotroles{$requester} = 1;
                                               }
                                               if (ref($requesteractive{$requester}) eq 'HASH') {
                                                   if ($requesteractive{$requester}{"$crsnum:$crsdom:$role"}) {
                                                       ($logmsg,$result) =
                                                           &Apache::loncommon::commit_standardrole($udom,$uname,$extent,$role,$start,
                                                                                                   $end,$crsdom,$crsnum,'',
                                                                                                   $reqcontext,'',$context,
                                                                                                   $requester);
                                                   }
                                               }
                                           }
                                       }
                                   }
                               } elsif ($role =~ m{^(cr)/($match_domain)/($match_username)/(\w+)$}) {
                                   my ($mrole,$crudom,$cruname,$rolename) = ($1,$2,$3,$4);
                                   my ($crsdom,$crsnum,$csec) =
                                       ($extent =~ m{^/($match_domain)/($match_courseid)(?:|/(\w+))$});
                                   if (&Apache::lonnet::is_course($crsdom,$crsnum)) {
                                       my ($rdummy,$roledef) =
                                           &Apache::lonnet::get('roles',["rolesdef_$rolename"],$crudom,$cruname);
                                       if (($rdummy ne 'con_lost') && ($roledef ne '')) {
                                           unless ($gotroles{$requester}) {
                                               &requester_roles($requname,$requdom,\%requesteractive);
                                               $gotroles{$requester} = 1;
                                           }
                                           if (ref($requesteractive{$requester}) eq 'HASH') {
                                               if (&requester_has_perm($crsdom,$crsnum,$mrole,$requesteractive{$requester})) {
                                                   ($logmsg,$result) =
                                                       &Apache::loncommon::commit_customrole($udom,$uname,$extent,$crudom,$cruname,
                                                                                             $rolename,$start,$end,$reqcontext,
                                                                                             $context,$requester);
                                               }
                                           }
                                       }
                                   }
                               } else {
                                   my $process;
                                   foreach my $type ('course','domain') {
                                       if (grep(/^\Q$role\E$/,@{$roles_by_context{$type}})) {
                                           if ($type eq 'course') {
                                               my ($crsdom,$crsnum,$csec) = ($extent =~ m{^/($match_domain)/($match_courseid)(?:|/(\w+))$});
                                               if (&Apache::lonnet::is_course($crsdom,$crsnum)) {
                                                   my $typeok;
                                                   if ($role eq 'cc') {
                                                       my %info = &Apache::lonnet::coursedescription("$crsdom/$crsnum",{'one_time' => 1});
                                                       if ($info{'type'} eq 'Course') {
                                                           $typeok = 1;
                                                       }
                                                   } else {
                                                       $typeok = 1;
                                                   }
                                                   if ($typeok) {
                                                       unless ($gotroles{$requester}) {
                                                           &requester_roles($requname,$requdom,\%requesteractive);
                                                           $gotroles{$requester} = 1;
                                                       }
                                                       if (ref($requesteractive{$requester}) eq 'HASH') {
                                                           if (&requester_has_perm($crsdom,$crsnum,$role,$requesteractive{$requester})) {
                                                               ($logmsg,$result) =
                                                                   &Apache::loncommon::commit_standardrole($udom,$uname,$extent,$role,$start,
                                                                                                           $end,$crsdom,$crsnum,$csec,
                                                                                                           $reqcontext,$credits,$context,
                                                                                                           $requester);
                                                           }
                                                       }
                                                   }
                                               }
                                           } else {
                                               my ($domain) = ($extent =~ m{^/($match_domain)/});
                                               if (&Apache::lonnet::domain($domain) ne '') {
                                                   unless ($gotroles{$requester}) {
                                                       &requester_roles($requname,$requdom,\%requesteractive);
                                                       $gotroles{$requester} = 1;
                                                   }
                                                   if (&requester_has_perm($domain,'',$role,$requesteractive{$requester})) {
                                                       $result = &Apache::lonnet::assignrole($udom,$uname,$extent,$role,
                                                                                             $end,$start,'','',$reqcontext,
                                                                                             $context,$requester);
                                                   }
                                               }
                                           }
                                           last;
                                       }
                                   }
                               }
                               if ($result eq 'ok') {
                                   $requestedby{$item} = $requester;
                                   my $statusres;
                                   my $id = $uname.':'.$udom.':'.$role;
                                   if (($role eq 'ca') || ($role eq 'aa')) {
                                       my ($audom,$auname) = ($extent =~ m{^/($match_domain)/($match_username)$});
                                       $statusres = &Apache::lonnet::put($dbname,{'status&'.$id => 'approved'},$audom,$auname);
                                   } elsif ($extent =~ m{^/($match_domain)/$}) {
                                       my $domain = $1;
                                       my $configuser = &Apache::lonnet::get_domainconfiguser($domain);
                                       $statusres = &Apache::lonnet::put($dbname,{'status&'.$id => 'approved'},$domain,$configuser);
                                   } else {
                                       my ($crsdom,$crsnum,$csec) = ($extent =~ m{^/($match_domain)/($match_courseid)(?:|/([^/]+))$});
                                       $id .= ':'.$csec;
                                       $statusres = &Apache::lonnet::put($dbname,{'status&'.$id => 'approved'},$crsdom,$crsnum);
                                   }
                                   if ($statusres eq 'ok') {
                                       my $newkey;
                                       if ($context eq 'othdombydc') {
                                           $newkey = 'approved:'.$uname.':'.$extent.':'.$role;
                                       } elsif ($context eq 'othdombyuser') {
                                           $newkey = 'approved:'.$extent.':'.$role;
                                       }
                                       $requesthash{$newkey} = $requesthash{$key};
                                       delete($requesthash{$key});
                                       push(@toremove,$key);
                                       push(@completed,$item);
                                   }
                               } else {
                                   push(@warn_approves,$key);
                               }
                           }
                       }
                   }
               }
         } 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 958  sub update_request_queue { Line 1710  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,$code,%customitems);                              my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,
                                   $keysmsg,$code,%customitems);
                               my $clonemsg = [];
                             my $fullname = '';                              my $fullname = '';
                             my $inprocess = &Apache::lonnet::auto_crsreq_update($cdom,$cnum,$crstype,'process',$ownername,                              my $inprocess = &Apache::lonnet::auto_crsreq_update($cdom,$cnum,$crstype,'process',$ownername,
                                                                                 $ownerdom,$fullname,$coursedesc);                                                                                  $ownerdom,$fullname,$coursedesc);
Line 972  sub update_request_queue { Line 1726  sub update_request_queue {
                             if ($history{'details'}{'clonecrs'}) {                              if ($history{'details'}{'clonecrs'}) {
                                 $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'};                                  $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'};
                             }                              }
                             my ($result,$postprocess) = &course_creation($cdom,$cnum,$context,$history{'details'},\$logmsg,                              my ($result,$postprocess) = &course_creation($cdom,$cnum,$context,$history{'details'},
                                                         \$newusermsg,\$addresult,\$enrollcount,                                                          \$logmsg,$clonemsg,\$newusermsg,\$addresult,\$enrollcount,
                                                         \$response,\$keysmsg,\%domdefs,$longroles,\$code,\%customitems);                                                          \$response,\$keysmsg,\%domdefs,$longroles,\$code,\%customitems);
                             if ($result eq 'created') {                              if ($result eq 'created') {
                                 if ($crstype eq 'community') {                                  if ($crstype eq 'community') {
Line 986  sub update_request_queue { Line 1740  sub update_request_queue {
                                     if (ref($approvedmsg->[1]) eq 'HASH') {                                      if (ref($approvedmsg->[1]) eq 'HASH') {
                                         $approvedmsg->[1]->{'args'} = [$firsturl];                                          $approvedmsg->[1]->{'args'} = [$firsturl];
                                     }                                      }
                                       if ((ref($clonemsg) eq 'ARRAY') && (@{$clonemsg})) {
                                           push(@{$approvedmsg},@{$clonemsg});
                                       }
                                     if ($code) {                                      if ($code) {
                                         push(@{$approvedmsg},                                          push(@{$approvedmsg},
                                             {                                              {
Line 1118  sub update_request_queue { Line 1875  sub update_request_queue {
                 if ($userresult ne 'ok') {                  if ($userresult ne 'ok') {
                     push(@warn_rejects,$uname);                      push(@warn_rejects,$uname);
                 }                  }
               } elsif (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
                   my ($extent,$role,$uname,$udom,$oldkey,$newkey);
                   my $dbname = 'nohist_othdomqueued';
                   if ($context eq 'othdombydc') {
                       ($extent,$role,$uname,$udom) = split(/:/,$item);
                       $oldkey = 'pending:'.$uname.':'.$extent.':'.$role;
                       $newkey = 'rejected:'.$uname.':'.$extent.':'.$role;
                   } elsif ($context eq 'othdombyuser') {
                       ($extent,$role) = split(/:/,$item);
                       $oldkey = 'pending:'.$extent.':'.$role;
                       $newkey = 'rejected:'.$extent.':'.$role;
                       $uname = $env{'user.name'};
                       $udom = $env{'user.domain'};
                   }
                   if (exists($requesthash{$oldkey})) {
                       if (ref($requesthash{$oldkey}) eq 'HASH') {
                           my $statusres;
                           my $id = $uname.':'.$udom.':'.$role;
                           if (($role eq 'ca') || ($role eq 'aa')) {
                               my ($audom,$auname) = ($extent =~ m{^/($match_domain)/($match_username)$});
                               $statusres = &Apache::lonnet::put($dbname,{'status&'.$id => 'rejected'},$audom,$auname);
                           } elsif ($extent =~ m{^/($match_domain)/\Q$role\E$}) {
                               my $domain = $1;
                               my $configuser = &Apache::lonnet::get_domainconfiguser($domain);
                               $statusres = &Apache::lonnet::put($dbname,{'status&'.$id => 'rejected'},$domain,$configuser);
                           } else {
                               my ($crsdom,$crsnum,$csec) = ($extent =~ m{^/($match_domain)/($match_courseid)(?:|/([^/]+))$});
                               $id .= ':'.$csec;
                               $statusres = &Apache::lonnet::put($dbname,{'status&'.$id => 'rejected'},$crsdom,$crsnum);
                           }
                           if ($statusres eq 'ok') {
                               $requesthash{$newkey} = $requesthash{$oldkey};
                               delete($requesthash{$oldkey});
                               push(@toremove,$oldkey);
                               $requesthash{$newkey}->{'timestamp'} = $now;
                               $requesthash{$newkey}->{'adjudicator'} = $env{'user.name'}.':'.$env{'user.domain'};
                               $requestedby{$item} = $requesthash{$newkey}->{'requester'};
                               push(@rejectedreqs,$item);
                           } else {
                               push(@warn_rejects,$oldkey);
                           }
                       }
                   }
             } else {              } else {
                 my $cnum = $item;                  my $cnum = $item;
                 if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {                  if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {
Line 1204  sub update_request_queue { Line 2004  sub update_request_queue {
                 }                  }
             }              }
         }          }
         @toremove = map {$_.'_approval'} (@toremove);          unless (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
         my $delresult = &Apache::lonnet::del_dom($namespace,\@toremove,$cdom);              @toremove = map {$_.'_approval'} (@toremove);
           }
           if (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
               my $delresult;
               if ($context eq 'othdombyuser') {
                   $delresult = &Apache::lonnet::del($namespace,\@toremove,$env{'user.domain'},$env{'user.name'});
               } else {
                   $delresult = &Apache::lonnet::del_dom($namespace,\@toremove,$cdom);
               }
               unless ($delresult eq 'ok') {
                   push(@warn_dels,@toremove);
               }
           }
     }      }
     if (@changes) {      if (@changes) {
         my $delresult;          my $delresult;
         if ($context eq 'course') {          if ($context eq 'course') {
             $delresult = &Apache::lonnet::del($namespace,\@changes,$cdom,$cnum);              $delresult = &Apache::lonnet::del($namespace,\@changes,$cdom,$cnum);
           } elsif (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
               if ($context eq 'othdombydc') {
                   $delresult = &Apache::lonnet::put($namespace,\%requesthash,$cdom,$confname);
               } elsif ($context eq 'othdombyuser') {
                   $delresult = &Apache::lonnet::put($namespace,\%requesthash,$env{'user.domain'},$env{'user.name'});
               } 
         } else {          } else {
             $delresult = &Apache::lonnet::del_dom($namespace,\@changes,$cdom);              $delresult = &Apache::lonnet::del_dom($namespace,\@changes,$cdom);
         }          }
Line 1257  sub update_request_queue { Line 2075  sub update_request_queue {
                         my $userlink =                          my $userlink =
                             &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);                              &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                         $output .= '<li>'.$userlink.'</li>';                          $output .= '<li>'.$userlink.'</li>';
                           
                     }                      }
                     $output .= '</ul></p>';                      $output .= '</ul></p>';
                 }                  }
Line 1300  sub update_request_queue { Line 2117  sub update_request_queue {
                                                  $now,'usernamemanagers',$sender,                                                   $now,'usernamemanagers',$sender,
                                                  $approvedlist,$rejectedlist);                                                   $approvedlist,$rejectedlist);
                 }                  }
               } elsif (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
                   my @chgmsgs = ({ mt => 'Action was taken by [_1].',
                                    args => [$namelink] });
                   my (%approvals_by_requester,%rejections_by_requester,%for_requester);
                   my $sender = $env{'user.name'}.':'.$env{'user.domain'};
                   if (@completed) {
                       my $msg;
                       if ($context eq 'othdombydc') {
                           $msg = &mt('The following roles in other domain(s) were assigned for user(s) in this domain:');
                       } elsif ($context eq 'othdombyuser') {
                           $msg = &mt('The following roles in other domain(s) were assigned:');
                       }
                       $output .= '<p>'.$msg.'<ul>'.
                                  &get_othdomby_results($context,'approved',\@completed,\%approvals_by_requester,\%requestedby,\%for_requester).
                                  '</ul></p>';
                   }
                   if (@rejectedreqs) {
                       my $msg;
                       if ($context eq 'othdombydc') {
                           $msg = &mt('The following role assignments in other domain(s) for user(s) in this domain were rejected:');
                       } elsif ($context eq 'othdombyuser') {
                           $msg = &mt('The following role assignments in other domain(s) were rejected:');
                       }
                       $output .= '<p>'.$msg.'<ul>'.
                                  &get_othdomby_results($context,'rejected',\@rejectedreqs,\%rejections_by_requester,\%requestedby,\%for_requester).
                                  '</ul></p>';
                   }
                   foreach my $key (sort(keys(%for_requester))) {
                       if (ref($approvals_by_requester{$key}) eq 'ARRAY') {
                           if (@{$approvals_by_requester{$key}} > 0) {
                               if ($context eq 'othdombydc') {
                                   push(@chgmsgs,{ mt => '[_1]The following roles in other domain(s) were assigned:',
                                                   args => ["\n"]});
                               } elsif ($context eq 'othdombyuser') {
                                   push(@chgmsgs,{ mt => '[_1]The following roles in other domain(s) were accepted:',
                                                   args => ["\n"]});
                               }
                               push(@chgmsgs,@{$approvals_by_requester{$key}});
                               $approvedlist = $key;
                           }
                       }
                       if (ref($rejections_by_requester{$key}) eq 'ARRAY') {
                           if (@{$rejections_by_requester{$key}} > 0) {
                               if ($context eq 'othdombydc') {
                                   push(@chgmsgs,{ mt => '[_1]The following roles in other domain(s) were rejected:',
                                                   args => ["\n"]});
                               } elsif ($context eq 'othdombyuser') {
                                   push(@chgmsgs,{ mt => '[_1]The following roles in other domain(s) were declined:',
                                                   args => ["\n"]});
                               }
                               push(@chgmsgs,@{$rejections_by_requester{$key}});
                               $rejectedlist = $key;
                           }
                       }
                       if (($approvedlist ne '') || ($rejectedlist ne '')) {
                           &send_selfserve_notification($key,\@chgmsgs,'',$domdesc,$now,
                                                        $context,$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 1342  sub update_request_queue { Line 2219  sub update_request_queue {
                 }                  }
             }              }
         } else {          } else {
             if (($context eq 'requestauthor') || ($context eq 'requestusername')) {              if (($context eq 'requestauthor') || ($context eq 'requestusername') || 
                   ($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
                 push(@warn_dels,@changes);                  push(@warn_dels,@changes);
             }              }
         }          }
Line 1518  sub update_request_queue { Line 2396  sub update_request_queue {
                 $output .= '<li>'.$uname.'</li>';                  $output .= '<li>'.$uname.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
               my $msg;
               if ($context eq 'othdombydc') {
                   $msg = &mt("For the following assignments of roles in other domain(s) for users from this domain, an error occurred when updating status in the pending queue");  
               } elsif ($context eq 'othdombyuser') {
                   $msg = &mt("For the following assignments of roles in other domain(s), an error occurred when updating status in the pending queue");
               }
               $output .= '<p>'.$msg.'<ul>';
               if (@warn_approves) {
                   $output .= &get_othdomby_results($context,'dequeue_error',\@warn_approves);
               }
               if (@warn_rejects) {
                   $output .= &get_othdomby_results($context,'dequeue_error',\@warn_rejects);
               }
               $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 1547  sub update_request_queue { Line 2440  sub update_request_queue {
                 my ($escuname) = split(/_/,$item);                  my ($escuname) = split(/_/,$item);
                 $output .= '<li>'.&unescape($escuname).'</li>';                  $output .= '<li>'.&unescape($escuname).'</li>';
             }              }
             $output .= '</ul></p>';                          $output .= '</ul></p>';
           } elsif (($context eq 'othdombydc') || ($context eq 'othdombyuser')) {
               my $msg; 
               if ($context eq 'othdombydc') {
                   $msg = &mt("For the following queued role assignments an error occurred when removing the item from the queue:");    
               } elsif ($context eq 'othdombyuser') {
                   $msg = &mt("For the following role assignments pending approval an error occurred when removing the item from the queue:");
               }
               $output .= '<p>'.$msg.
                          '<ul>'.&get_othdomby_results($context,'dequeue_error',\@warn_dels).'</ul>'.
                          '</p>';
         } else {          } else {
             $output .= '<p>'.&mt("For the following course/community requests an error occurred when removing requests from the pending queue:").'<ul>';              $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) {              foreach my $cnum (@warn_dels) {
Line 1565  sub update_request_queue { Line 2468  sub update_request_queue {
     return $output;      return $output;
 }  }
   
   sub get_othdomby_results {
       my ($context,$action,$items,$results,$requestedby,$for_requester) = @_;
       return unless (ref($items) eq 'ARRAY');
       unless ($action eq 'dequeue_error') {
           return unless ((ref($results) eq 'HASH') && (ref($requestedby) eq 'HASH') &&
                          (ref($for_requester) eq 'HASH'));
       }
       my $output;
       foreach my $item (@{$items}) {
           my ($extent,$role,$uname,$udom);
           if ($action eq 'approved') {
               if ($context eq 'othdombydc') {
                   (my $num,$extent,$role,$uname,$udom) = split(/:/,$item);
               } elsif ($context eq 'othdombyuser') {
                   (my $num,$extent,$role) = split(/:/,$item);
               }
           } elsif ($action eq 'rejected') {
               if ($context eq 'othdombydc') {
                   ($extent,$role,$uname,$udom) = split(/:/,$item);
               } elsif ($context eq 'othdombyuser') {
                   ($extent,$role) = split(/:/,$item);
               }
           } elsif ($action eq 'dequeue_error') {
               if ($context eq 'othdombydc') {
                   if ($item =~ /^\d+:/) {
                      (my $num,$extent,$role,$uname,$udom) = split(/:/,$item);
                   } elsif ($item =~ /^pending:/) {
                       (my $oldstatus,$uname,$extent,$role) = split(/:/,$item);
                       $udom = $env{'request.role.domain'};
                   } else {
                       ($extent,$role,$uname,$udom) = split(/:/,$item);
                   }
               } elsif ($context eq 'othdombyuser') {
                   if ($item =~ /^\d+:/) {
                       (my $num,$extent,$role) = split(/:/,$item);
                   } elsif ($item =~ /^pending:/) {
                       (my $oldstatus,$extent,$role) = split(/:/,$item);
                   } else {
                       ($extent,$role) = split(/:/,$item);
                   }
               }
           }
           if ($context eq 'othdombyuser') {
               $uname = $env{'user.name'};
               $udom = $env{'user.domain'};
           }
           my (@text,@msgs);
           if ($context eq 'othdombydc') {
               push(@text,&mt('User: [_1]',$uname));
               push(@msgs,{ mt => '[_1]User: [_2]',
                            args => ["\n",$uname]});
           }
           if (($role eq 'ca') || ($role eq 'aa')) {
               my $plainrole = &Apache::lonnet::plaintext($role);
               my ($audom,$auname) = ($extent =~ m{^/($match_domain)/($match_username)$});
               my $title = &Apache::loncommon::plainname($auname,$audom);
               my $domdesc = &Apache::lonnet::domain($audom);
               push(@text,(&mt('Role: [_1]',$plainrole),
                           &mt('Domain: [_1]',$domdesc),
                           &mt('Authoring Space belonging to: [_1]',$title)));
               push(@msgs,{ mt => 'Role: [_1]',
                            args => [$plainrole],
                          },
                          { mt => 'Domain: [_1]',
                            args => [$domdesc],
                          },
                          { mt => 'Authoring Space belonging to: [_1]',
                            args => ["$title\n"],
                          });
           } elsif ($extent =~ m{^/($match_domain)/$}) {
               my $domain = $1;
               my $domdesc = &Apache::lonnet::domain($domain);
               my $plainrole = &Apache::lonnet::plaintext($role);
               if ($domdesc ne '') {
                   push(@text,(&mt('Role: [_1]',$plainrole),
                               &mt('Domain: [_1]',$domdesc)));
                   push(@msgs,{ mt => 'Role: [_1]',
                                args => [$plainrole],
                              },
                              { mt => 'Domain: [_1]',
                                args => ["$domdesc\n"],
                              });
               }
           } else {
               my ($crsdom,$crsnum,$csec) = ($extent =~ m{^/($match_domain)/($match_courseid)(?:|/([^/]+)$)});
               if (($crsdom ne '') && ($crsnum ne '')) {
                   my %info = &Apache::lonnet::coursedescription("$crsdom/$crsnum");
                   my $plainrole = &Apache::lonnet::plaintext($role,$info{'type'});
                   my $domdesc = &Apache::lonnet::domain($crsdom);
                   push(@text,(&mt('Role: [_1]',$plainrole),
                               &mt('Domain: [_1]',$domdesc),
                               &mt("$info{'type'}: [_1]",$info{'description'})));
                   push(@msgs,{ mt => 'Role: [_1]',
                                args => [$plainrole],
                              },
                              { mt => 'Domain: [_1]',
                                args => [$domdesc],
                              });
                   if ($csec ne '') {
                       push(@text,&mt('Section: [_1]',$csec));
                       push(@msgs,{ mt => "$info{'type'}: [_1]",
                                    args => [$info{'description'}],
                                  },
                                  { mt => 'Section: [_1]',
                                    args => ["$info{'description'}\n"],
                                  });
                   } else {
                       push(@msgs,{ mt => "$info{'type'}: [_1]",
                                    args => ["$info{'description'}\n"],
                                  });
                   }
               }
           }
           $output .= '<li><ul><li>'.join('</li><li>',@text).'</li></ul></li>';
           unless ($action eq 'dequeue_error') {
               push(@{$results->{$requestedby->{$item}}},@msgs);
               $for_requester->{$requestedby->{$item}} = 1;
           }
       }
       return $output;
   }
   
   sub requester_roles {
       my ($requname,$requdom,$activeroles) = @_;
       if (ref($activeroles) eq 'HASH') {
           my %roleshash = &Apache::lonnet::get_my_roles($requname,$requdom,'userroles');
           $activeroles->{$requname.':'.$requdom} = \%roleshash;
       }
       return;
   }
   
   sub requester_has_perm {
       my ($crsdom,$crsnum,$mrole,$requesterroles) = @_;
       return unless (ref($requesterroles) eq 'HASH');
       my $has_perm;
       foreach my $key (keys(%{$requesterroles})) {
           if ($crsnum eq '') {
               next unless ($key =~ /^\Q:$crsdom:\E/);
           } else {
               next unless (($key =~ /^\Q$crsnum:$crsdom:\E/) || ($key =~ /^\Q:$crsdom:\E/));
           }
           my ($keycrs,$keydom,$keyrole) = split(/:/,$key);
           if (($keycrs ne '') && ($crsnum ne '')) {
               if ($keycrs eq $crsnum) {
                   if ($Apache::lonnet::pr{$keyrole.':c'} =~ /(^|:)c\Q$mrole\E(&|:)/) {
                       $has_perm = 1;
                       last;
                   }
               }
           } else {
               if ($Apache::lonnet::pr{$keyrole.':d'} =~ /(^|:)c\Q$mrole\E(&|:)/) {
                   $has_perm = 1;
                   last;
               }
           }
       }
       return $has_perm;
   }
   
 sub get_student_counts {  sub get_student_counts {
     my ($cdom,$cnum) = @_;      my ($cdom,$cnum) = @_;
     my (%idx,%stucounts);      my (%idx,%stucounts);
Line 1584  sub get_student_counts { Line 2646  sub get_student_counts {
 }  }
   
 sub course_creation {  sub course_creation {
     my ($dom,$cnum,$context,$details,$logmsg,$newusermsg,$addresult,$enrollcount,$output,      my ($dom,$cnum,$context,$details,$logmsg,$clonemsg,$newusermsg,$addresult,
         $keysmsg,$domdefs,$longroles,$coderef,$customhash) =  @_;          $enrollcount,$output,$keysmsg,$domdefs,$longroles,$coderef,$customhash,
           $callercontext,$user_lh) = @_;
     unless ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH') &&       unless ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH') && 
             (ref($longroles) eq 'HASH')) {              (ref($longroles) eq 'HASH')) {
         return ('error: Invalid request');          return ('error: Invalid request');
     }      }
     my ($result,$ownername,$ownerdom);      my ($result,$ownername,$ownerdom,$autocoowner);
     my $crstype = $details->{'crstype'};      my $crstype = $details->{'crstype'};
     my $coursedesc = $details->{'cdescr'};      my $coursedesc = $details->{'cdescr'};
     my $accessstart = $details->{'accessstart'};      my $accessstart = $details->{'accessstart'};
     my $accessend = $details->{'accessend'};      my $accessend = $details->{'accessend'};
     my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);      my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses','autoenroll'],$dom);
     if (ref($domconfig{'requestcourses'}) eq 'HASH') {      if (ref($domconfig{'requestcourses'}) eq 'HASH') {
         if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {          if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {
             if ($domconfig{'requestcourses'}{'uniquecode'}{$crstype}) {              if ($domconfig{'requestcourses'}{'uniquecode'}{$crstype}) {
Line 1603  sub course_creation { Line 2666  sub course_creation {
             }              }
         }          }
     }      }
       if (ref($domconfig{'autoenroll'}) eq 'HASH') {
           $autocoowner = $domconfig{'autoenroll'}{'co-owners'};
       }
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $ownername = $details->{'owner'};          $ownername = $details->{'owner'};
         $ownerdom  = $details->{'domain'};          $ownerdom  = $details->{'domain'};
Line 1617  sub course_creation { Line 2683  sub course_creation {
         $owneremail = $emails{$email};          $owneremail = $emails{$email};
         last if ($owneremail ne '');          last if ($owneremail ne '');
     }      }
     my %reqdetails = &build_batchcreatehash($dom,$context,$details,$owneremail,$domdefs);      my %reqdetails = &build_batchcreatehash($dom,$cnum,$context,$details,$owneremail,$domdefs);
     my $cid = &LONCAPA::batchcreatecourse::build_course($dom,$cnum,'requestcourses',      my $cid = &LONCAPA::batchcreatecourse::build_course($dom,$cnum,'requestcourses',
                   \%reqdetails,$longroles,$logmsg,$newusermsg,$addresult,                    \%reqdetails,$longroles,$logmsg,$clonemsg,$newusermsg,$addresult,
                   $enrollcount,$output,$keysmsg,$ownerdom,$ownername,$cnum,$crstype,$coderef);                    $enrollcount,$output,$keysmsg,$ownerdom,$ownername,$cnum,$crstype,
                     $coderef,$callercontext,$user_lh);
     my $postprocess;      my $postprocess;
     if ($cid eq "/$dom/$cnum") {      if ($cid eq "/$dom/$cnum") {
         $result = 'created';          $result = 'created';
Line 1631  sub course_creation { Line 2698  sub course_creation {
         $postprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$result,$ownername,          $postprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$result,$ownername,
                                                            $ownerdom,$fullname,$coursedesc,$code,                                                             $ownerdom,$fullname,$coursedesc,$code,
                                                            $accessstart,$accessend,$customhash);                                                             $accessstart,$accessend,$customhash);
           if ($autocoowner) {
               my $instcode = $details->{'instcode'};
               if (($instcode ne '') && (ref($reqdetails{'users'}) eq 'HASH')) {
                   my @posscoowners;
                   my $now = time;
                   foreach my $person (keys(%{$reqdetails{'users'}})) {
                       my ($uname,$udom) = split(/:/,$person);
                       next if (($udom ne $dom) || (($uname eq $ownername) && ($udom eq $ownerdom)));
                       if ((&Apache::lonnet::homeserver($uname,$udom,1) ne 'no_host') &&
                           (ref($reqdetails{'users'}{$person}) eq 'HASH')) {
                           if ((grep(/^cc$/,keys(%{$reqdetails{'users'}{$person}}))) &&
                               (ref($reqdetails{'users'}{$person}{'cc'}) eq 'HASH')) {
                               my $start = $reqdetails{'users'}{$person}{'cc'}{'start'};
                               my $end = $reqdetails{'users'}{$person}{'cc'}{'end'};
                               if ((($start eq '') || ($start <= $now)) &&
                                   (($end eq '') || ($end >= $now))) {
                                   push(@posscoowners,$person);
                               }
                           }
                       }
                   }
                   my @coowners;
                   if (@posscoowners) {
                       foreach my $user (@posscoowners) {
                           my ($checkcc,$desc) =
                               &Apache::lonnet::auto_validate_instcode($cnum,$dom,$instcode,$user);
                           unless ($checkcc eq 'valid') {
                               if (ref($reqdetails{'crosslists'}) eq 'HASH') {
                                   foreach my $key (keys(%{$reqdetails{'crosslists'}})) {
                                       if (ref($reqdetails{'crosslists'}{$key}) eq 'HASH') {
                                           my $inst_crosslist = $reqdetails{'crosslists'}{$key}{'inst'};
                                           if ($inst_crosslist ne '') {
                                               $checkcc =
                                                   &Apache::lonnet::auto_validate_inst_crosslist($cnum,$dom,$instcode,
                                                                                                 $inst_crosslist,$user);
                                               last if ($checkcc eq 'valid');
                                           }
                                       }
                                   }
                               }
                           }
                           if ($checkcc eq 'valid') {
                               if (@coowners > 0) {
                                   unless (grep(/^\Q$user\E$/,@coowners)) {
                                       push(@coowners,$user);
                                   }
                               } else {
                                   push(@coowners,$user);
                               }
                           }
                       }
                   }
                   if (@coowners > 0) {
                       my $chome = &Apache::lonnet::homeserver($cnum,$dom);
                       unless ($chome eq 'no_host') {
                           &Apache::lonnet::store_coowners($dom,$cnum,$chome,'',@coowners);
                       }
                   }
               }
           }
     } else {      } else {
         $result = 'error: '.$cid;          $result = 'error: '.$cid;
     }      }
Line 1638  sub course_creation { Line 2765  sub course_creation {
 }  }
   
 sub build_batchcreatehash {  sub build_batchcreatehash {
     my ($dom,$context,$details,$owneremail,$domdefs) = @_;      my ($dom,$cnum,$context,$details,$owneremail,$domdefs) = @_;
     my %batchhash;      my %batchhash;
     my @items = qw{owner domain coursehome clonecrs clonedom datemode dateshift enrollstart enrollend accessstart accessend sections crosslists users uniquecode};      my @items = qw{owner domain coursehome clonecrs clonedom datemode dateshift tinyurls enrollstart enrollend accessstart accessend sections 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'};
         foreach my $item (@items) {          foreach my $item (@items) {
             $batchhash{$item} = $details->{$item};              $batchhash{$item} = $details->{$item};
         }          }
           if (ref($details->{'crosslists'}) eq 'HASH') {
               foreach my $key (keys(%{$details->{'crosslists'}})) {
                   if (ref($details->{'crosslists'}->{$key}) eq 'HASH') {
                       my $instsec = $details->{crosslists}->{$key}->{instsec};
                       $batchhash{'crosslists'}{$key}{'inst'} = $details->{crosslists}->{$key}->{instcode};
                       my $crskey = $cnum.':'.$batchhash{'crosslists'}{$key}{'inst'};
                       my %formatted = &Apache::lonnet::auto_instsec_reformat($dom,'clutter',
                                                                              {$crskey => [$instsec]});
                       if (ref($formatted{$crskey}) eq 'ARRAY') {
                           $batchhash{'crosslists'}{$key}{'inst'} .= $formatted{$crskey}->[0];
                       }
                       $batchhash{'crosslists'}{$key}{'loncapa'} = $details->{crosslists}->{$key}->{loncapa};
                   }
               }
           }
         $batchhash{'title'} = $details->{'cdescr'};          $batchhash{'title'} = $details->{'cdescr'};
         $batchhash{'coursecode'} = $details->{'instcode'};          $batchhash{'coursecode'} = $details->{'instcode'};
         if ($domdefs->{'officialcredits'} || $domdefs->{'unofficialcredits'}) {          if ($domdefs->{'officialcredits'} || $domdefs->{'unofficialcredits'}) {
Line 1667  sub build_batchcreatehash { Line 2809  sub build_batchcreatehash {
                     my %clonedfrom = &Apache::lonnet::coursedescription($details->{'clonedom'}.'_'.$details->{'clonecrs'});                      my %clonedfrom = &Apache::lonnet::coursedescription($details->{'clonedom'}.'_'.$details->{'clonecrs'});
                     $batchhash{'textbook'} = $clonedfrom{'description'};                      $batchhash{'textbook'} = $clonedfrom{'description'};
                 }                  }
               } elsif ($details->{'crstype'} eq 'lti') {
                   $batchhash{'lti'} = 1;
             }              }
             $batchhash{'crstype'} = 'Course';              $batchhash{'crstype'} = 'Course';
         }          }
Line 1993  sub process_official_reqs { Line 3137  sub process_official_reqs {
         $longroles{$role}=&Apache::lonnet::plaintext($role);          $longroles{$role}=&Apache::lonnet::plaintext($role);
     }      }
     my %domdefs = &Apache::lonnet::get_domain_defaults($dom);      my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
     my ($output,$linefeed);      my ($output,$linefeed,$user_lh);
     if ($context eq 'auto') {      if ($context eq 'auto') {
         $linefeed = "\n";          $linefeed = "\n";
           $user_lh = &Apache::loncommon::user_lang($dcname,$dcdom);
     } else {      } else {
         $linefeed = '<br />'."\n";          $linefeed = '<br />'."\n";
     }      }
Line 2057  sub process_official_reqs { Line 3202  sub process_official_reqs {
                 $reqstatus = $disposition;                  $reqstatus = $disposition;
                 if ($disposition eq 'process') {                  if ($disposition eq 'process') {
                     my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,$code);                      my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,$code);
                       my $clonemsg = [];
                     my %customitems;                      my %customitems;
                     my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom);                      my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom);
                     my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$ownername,                      my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$ownername,
Line 2072  sub process_official_reqs { Line 3218  sub process_official_reqs {
                         $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'};                          $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'};
                     }                      }
                     my ($result,$postprocess) =                       my ($result,$postprocess) = 
                         &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,\$newusermsg,\$addresult,                          &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,$clonemsg,\$newusermsg,
                                          \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,\$code,\%customitems);                                           \$addresult,\$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,
                                            \$code,\%customitems,$context,$user_lh);
                     if ($result eq 'created') {                      if ($result eq 'created') {
                         $disposition = 'created';                          $disposition = 'created';
                         $reqstatus = 'created';                          $reqstatus = 'created';
Line 2088  sub process_official_reqs { Line 3235  sub process_official_reqs {
                                 [{                                  [{
                                     mt => 'Your requested course: [_1], (queued pending validation) has now been created.',                                      mt => 'Your requested course: [_1], (queued pending validation) has now been created.',
                                     args => [$cdescr],                                      args => [$cdescr],
                                  },                                   }];
                               if ((ref($clonemsg) eq 'ARRAY') && (@{$clonemsg})) {
                                   push(@{$approvedmsg},@{$clonemsg});
                               }
                               push(@{$approvedmsg},
                                  {                                   {
                                     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.'                                      mt => 'If currently logged-in to LON-CAPA, log-out and log-in again to select your new course role.',
                                  }];                                      args => [],
                                    }
                               );
                             my $sender = $dcname.':'.$dcdom;                              my $sender = $dcname.':'.$dcdom;
                             if (ref($postprocess) eq 'HASH') {                              if (ref($postprocess) eq 'HASH') {
                                 if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') {                                  if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') {
Line 2201  sub postprocess_crsenv { Line 3354  sub postprocess_crsenv {
         my %needcrsidput = (          my %needcrsidput = (
                               'internal.selfenroll_types'      => 1,                                'internal.selfenroll_types'      => 1,
                               'internal.selfenroll_start_date' => 1,                                'internal.selfenroll_start_date' => 1,
                               'internal. selfenroll_end_date'  => 1,                                'internal.selfenroll_end_date'   => 1,
                            );                             );
         my (@needupdate,%newcrsenv);          my (@needupdate,%newcrsenv);
         foreach my $key (keys(%{$postprocessenv})) {           foreach my $key (keys(%{$postprocessenv})) { 

Removed from v.1.55  
changed lines
  Added in v.1.69


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.