Diff for /loncom/interface/loncoursequeueadmin.pm between versions 1.25 and 1.34

version 1.25, 2010/12/08 03:38:46 version 1.34, 2013/01/04 01:56:35
Line 70  described at http://www.lon-capa.org. Line 70  described at http://www.lon-capa.org.
   
 =item process_official_reqs()  =item process_official_reqs()
   
   =item is_active_author()
   
   =item author_prompt()
   
   =item reqauthor_check()
   
   =item process_reqauthor()
   
 =back  =back
   
 =cut  =cut
Line 90  sub send_selfserve_notification { Line 98  sub send_selfserve_notification {
 # FIXME locallocaltime needs to be able to take $sender_lh as an argument  # FIXME locallocaltime needs to be able to take $sender_lh as an argument
 #       so this can be localized to the recipients date display format/time zone  #       so this can be localized to the recipients date display format/time zone
     $timestamp =&Apache::lonlocal::locallocaltime($timestamp);      $timestamp =&Apache::lonlocal::locallocaltime($timestamp);
     my $msgcc;      my ($msgcc,$rawsubj,@rawmsg,$subject,$message,$reviewer,$msgtxt);
     my ($rawsubj,@rawmsg,$subject,$message,$reviewer,$msgtxt);      my ($senderuname,$senderudom) = split(':',$sender);
     if ($context eq 'coursemanagers') {      if ($context eq 'coursemanagers') {
         $rawsubj = 'Self-enrollment requests processed';          $rawsubj = 'Self-enrollment requests processed';
         push(@rawmsg,{          push(@rawmsg,{
                       mt => 'Enrollment requests in the following course: [_1] have been processed.',                        mt => 'Enrollment requests in the following course: [_1] have been processed.',
                       args => ["\n  $contextdesc"],                        args => ["\n$contextdesc"],
                      });                       });
     } elsif ($context eq 'domainmanagers') {      } elsif ($context eq 'domainmanagers') {
         $rawsubj = 'Course/Community requests reviewed';          $rawsubj = 'Course/Community requests reviewed';
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => 'Course/Community creation requests in the following domain: [_1] have been reviewed.',                        mt  => 'Course/Community creation requests in the following domain: "[_1]" have been reviewed.',
                       args => ["\n  $contextdesc"],                        args => ["\n$contextdesc"],
                        });
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
       } elsif ($context eq 'authormanagers') {
           $rawsubj = 'Authoring space requests reviewed';
           push(@rawmsg,{
                         mt  => 'Authoring requests in the following domain: "[_1]" have been reviewed.',
                         args => ["\n$contextdesc"],
                      });                       });
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
Line 138  sub send_selfserve_notification { Line 155  sub send_selfserve_notification {
         if (ref($textstr) eq 'ARRAY') {          if (ref($textstr) eq 'ARRAY') {
             push(@rawmsg,@{$textstr});              push(@rawmsg,@{$textstr});
         }          }
       } elsif ($context eq 'pendingrequestor') {
           if ($crstype eq 'Community') {
               $rawsubj = 'Community request';
           } else {
               $rawsubj = 'Processed course request';
           }
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
     } elsif ($context eq 'coursereq') {      } elsif ($context eq 'coursereq') {
         if ($crstype eq 'community') {          if ($crstype eq 'community') {
             $rawsubj = 'Community request to review';              $rawsubj = 'Community request to review';
Line 152  sub send_selfserve_notification { Line 178  sub send_selfserve_notification {
                      },                       },
                      {                       {
                       mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Course and community creation -> Approve or reject requests[_3]to display a list of pending requests, which you can either approve or reject.',                        mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Course and community creation -> Approve or reject requests[_3]to display a list of pending requests, which you can either approve or reject.',
                       args => ["\n","\n\n  ","\n\n"],                        args => ["\n","\n\n","\n\n"],
                      });                       });
     } elsif ($context eq 'selfenrollreq') {      } elsif ($context eq 'selfenrollreq') {
         $rawsubj = 'Self-enrollment request';          $rawsubj = 'Self-enrollment request';
         if ($crstype eq 'community') {          if ($crstype eq 'community') {
             $msgtxt = 'Enrollment in the following community: [_1] was requested by [_2] on [_3].'              $msgtxt = 'Enrollment in the following community: [_1]was requested by [_2] on [_3].'
         } else {          } else {
             $msgtxt = 'Enrollment in the following course: [_1] was requested by [_2] on [_3].'              $msgtxt = 'Enrollment in the following course: [_1]was requested by [_2] on [_3].'
         }          }
         push(@rawmsg,{          push(@rawmsg,{
                       mt  => $msgtxt,                        mt  => $msgtxt,
Line 176  sub send_selfserve_notification { Line 202  sub send_selfserve_notification {
                       mt   => $directions,                        mt   => $directions,
                       args => ["  \n\n","\n"],                        args => ["  \n\n","\n"],
                      });                       });
       } elsif ($context eq 'authorreq') {
           $rawsubj = 'Authoring space request to review';
           $msgtxt = 'Assignment of an author role in the [_1] domain[_2]was requested by [_3] on [_4].';
           push(@rawmsg,{
                         mt  => $msgtxt,
                         args => [$contextdesc,"\n",$textstr,$timestamp],
                        },
                        {
                         mt =>'[_1]As Domain Coordinator, use: [_2]Main Menu -> Create users or modify the roles and privileges of users -> Authoring space reqests[_3]to display a list of pending requests, which you can either approve or reject.',
                         args => ["\n","\n\n  ","\n\n"],
                        });
   
       } elsif ($context eq 'requestauthor') {
           $rawsubj = 'Authoring space request';
           $msgtxt = 'Your request for an authoring space requested on [_1]has been reviewed by a Domain Coordinator.';
           push(@rawmsg,{
                         mt  => $msgtxt,
                         args => [$timestamp."\n"],
                        });
           if (ref($textstr) eq 'ARRAY') {
               push(@rawmsg,@{$textstr});
           }
     }      }
     my @to_notify = split(/,/,$notifylist);      my @to_notify = split(/,/,$notifylist);
     my $numsent = 0;      my $numsent = 0;
Line 213  sub send_selfserve_notification { Line 260  sub send_selfserve_notification {
             $message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n";              $message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt},@{$item->{args}})."\n";
         }          }
     }      }
     &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$uname,$udom,$msgcount,$cid,$$,$message,\@recusers,\@recudoms);      &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$uname,$udom,$msgcount,$cid,$$,$message,\@recusers,\@recudoms,undef,undef,undef,undef,$senderuname,$senderudom);
     my ($recipid,$recipstatus) = &Apache::lonmsg::store_recipients($subject,$uname,$udom,\%reciphash);      my ($recipid,$recipstatus) = &Apache::lonmsg::store_recipients($subject,$uname,$udom,\%reciphash);
     my $status;      my $status;
     foreach my $recip (sort(keys(%{$msgcc}))) {      foreach my $recip (sort(keys(%{$msgcc}))) {
Line 241  sub send_selfserve_notification { Line 288  sub send_selfserve_notification {
             if ($rejectedlist) {              if ($rejectedlist) {
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected course requests:')."\n".$rejectedlist;                  $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected course requests:')."\n".$rejectedlist;
             }              }
           } elsif ($context eq 'authormanagers') {
               if ($approvedlist) {
                   $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved author role requests:')."\n".$approvedlist;
               }
               if ($rejectedlist) {
                   $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected author role requests:')."\n".$rejectedlist;
               }
         }          }
         $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,\%sentmessage,undef,undef,undef,1,$recipid).',';          $status .= &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,\%sentmessage,undef,undef,undef,1,$recipid).',';
     }      }
Line 256  sub display_queued_requests { Line 310  sub display_queued_requests {
         $namespace = 'selfenrollrequests';          $namespace = 'selfenrollrequests';
         %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);          %requesthash = &Apache::lonnet::dump($namespace,$dom,$cnum);
         $nextelement = '<input type="hidden" name="state" value="done" />';          $nextelement = '<input type="hidden" name="state" value="done" />';
       } elsif ($context eq 'requestauthor') {
           $formaction = '/adm/createuser';
           $namespace = 'requestauthorqueue';
           %requesthash = &Apache::lonnet::dump_dom($namespace,$dom);
           $nextelement = '<input type="hidden" name="state" value="done" />';
     } else {      } else {
         $formaction = '/adm/createcourse';          $formaction = '/adm/createcourse';
         $namespace = 'courserequestqueue';          $namespace = 'courserequestqueue';
Line 278  sub display_queued_requests { Line 337  sub display_queued_requests {
             if ($context eq 'course') {              if ($context eq 'course') {
                 ($timestamp, my $usec) = split(/:/,$requesthash{$item});                  ($timestamp, my $usec) = split(/:/,$requesthash{$item});
                 $entry = $item.':'.$usec;                  $entry = $item.':'.$usec;
               } elsif ($context eq 'requestauthor') {
                   $timestamp = $requesthash{$item};
                   ($entry) = ($item =~ /^($match_username)_approval$/);
             } else {              } else {
                 $timestamp = $requesthash{$item}{'timestamp'};                  $timestamp = $requesthash{$item}{'timestamp'};
                 if (ref($requesthash{$item}) eq 'HASH') {                  if (ref($requesthash{$item}) eq 'HASH') {
Line 307  sub display_queued_requests { Line 369  sub display_queued_requests {
                 $output .= '<h3>'.&mt('Requests for official courses queued pending validation').'</h3>'.                  $output .= '<h3>'.&mt('Requests for official courses queued pending validation').'</h3>'.
                            '<p>'.&mt('Requests are validated against institutional data to confirm that the requestor is an instructor of record.').'<br />'.                             '<p>'.&mt('Requests are validated against institutional data to confirm that the requestor is an instructor of record.').'<br />'.
                            &mt('Validation is attempted when the request is submitted.').' '.&mt('If unvalidated, the request will be held in a queue.').' '.&mt('Validation of pending requests is automatically repeated daily.').'</p>';                             &mt('Validation is attempted when the request is submitted.').' '.&mt('If unvalidated, the request will be held in a queue.').' '.&mt('Validation of pending requests is automatically repeated daily.').'</p>';
               } elsif ($context eq 'requestauthor') {
                   $output .= '<h3>'.&mt('Requests for authoring space queued pending approval by a Domain Coordinator').'</h3>';
             } else {              } else {
                 $output .=  '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';                  $output .= '<h3>'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'</h3>';
             }               } 
             $output .= &build_queue_display($dom,$context,\%queue_by_date).              $output .= &build_queue_display($dom,$context,\%queue_by_date).
                        '<input type="hidden" name="queue" value="approval" />';                         '<input type="hidden" name="queue" value="approval" />';
Line 318  sub display_queued_requests { Line 382  sub display_queued_requests {
                 $output .= &mt('There are currently no enrollment requests awaiting approval.');                  $output .= &mt('There are currently no enrollment requests awaiting approval.');
             } elsif ($context eq 'pending') {              } elsif ($context eq 'pending') {
                 $output .= &mt('There are currently no requests for official courses awaiting validation.');                  $output .= &mt('There are currently no requests for official courses awaiting validation.');
               } elsif ($context eq 'requestauthor') {
                   $output .= &mt('There are currently no requests for authoring space awaiting approval.');
             } elsif ($context eq 'domain') {              } elsif ($context eq 'domain') {
                 $output .= &mt('There are currently no course or community requests awaiting approval.');                  $output .= &mt('There are currently no course or community requests awaiting approval.');
             }              }
Line 358  sub build_queue_display { Line 424  sub build_queue_display {
     if ($context eq 'course') {      if ($context eq 'course') {
         $output .= '<th>'.&mt('Section').'</th>'.          $output .= '<th>'.&mt('Section').'</th>'.
                    '<th>'.&mt('Date requested').'</th>';                     '<th>'.&mt('Date requested').'</th>';
       } elsif ($context eq 'requestauthor') {
           $output .= '<th>'.&mt('Date requested').'</th>';
     } elsif ($context eq 'pending' || $context eq 'stillpending') {      } elsif ($context eq 'pending' || $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>'.
Line 392  sub build_queue_display { Line 460  sub build_queue_display {
                     $namelink = &Apache::loncommon::aboutmewrapper(                      $namelink = &Apache::loncommon::aboutmewrapper(
                                 &Apache::loncommon::plainname($puname,$pudom),                                  &Apache::loncommon::plainname($puname,$pudom),
                                 $puname,$pudom);                                  $puname,$pudom);
                   } elsif ($context eq 'requestauthor') {
                       if (&Apache::lonnet::homeserver($request,$dom) ne 'no_host') {
                           $approve = $count.':'.$request;
                           $reject = $request; 
                           $namelink = &Apache::loncommon::aboutmewrapper(
                                       &Apache::loncommon::plainname($request,$dom),
                                       $request,$dom);
                       }
                 } else {                  } else {
                     my ($cnum,$ownername,$ownerdom,$type,$cdesc);                      my ($cnum,$ownername,$ownerdom,$type,$cdesc);
                     my $queue = 'approval';                       my $queue = 'approval'; 
Line 415  sub build_queue_display { Line 491  sub build_queue_display {
                 }                  }
                 unless ($context eq 'pending') {                  unless ($context eq 'pending') {
                     $row = '<td><span class="LC_nobreak"><label>'.                      $row = '<td><span class="LC_nobreak"><label>'.
                            '<input type="checkbox" value="'.$approve.'" name="approvereq" />'.&mt('Approve').'</label></span><br />'.                             '<input type="radio" value="'.$approve.'" name="'.$count.'radioreq" />'.&mt('Approve').'</label>'.
                            '<span class="LC_nobreak"><label>'.                             '<label>'.('&nbsp;'x2).
                            '<input type="checkbox" value="'.$reject.'" name="rejectreq" />'.&mt('Reject').'</label></span><br /></td>';                             '<input type="radio" value="'.$reject.'" name="'.$count.'radioreq" />'.&mt('Reject').'</label>'.
                              '<label>'.('&nbsp;'x2).
                              '<input type="radio" value="'."later:".$reject.'" name="'.$count.'radioreq" checked />'.&mt('Decide Later').
                              '</label></span><br /></td>';
                 }                  }
                 $row .= '<td>'.$namelink.'</td>'."\n";                  $row .= '<td>'.$namelink.'</td>'."\n";
                 if ($context eq 'course') {                  if ($context eq 'course') {
                     $row .= '<td>'.$showsec.'</td>'."\n".                      $row .= '<td>'.$showsec.'</td>'."\n".
                             '<td>'.$showtime.'</td>'."\n";                              '<td>'.$showtime.'</td>'."\n";
                   } elsif ($context eq 'requestauthor') {
                       $row .= '<td>'.$showtime.'</td>'."\n";
                 } else {                   } else { 
                     if ($context eq 'pending' || $context eq 'stillpending') {                      if ($context eq 'pending' || $context eq 'stillpending') {
                         $row .= '<td>'.$instcode.'</td>'."\n";                          $row .= '<td>'.$instcode.'</td>'."\n";
Line 446  sub build_queue_display { Line 527  sub build_queue_display {
 sub update_request_queue {  sub update_request_queue {
     my ($context,$cdom,$cnum,$coursedesc) = @_;      my ($context,$cdom,$cnum,$coursedesc) = @_;
     my ($output,$access_start,$access_end,$limit,$cap,$notifylist,$namespace,      my ($output,$access_start,$access_end,$limit,$cap,$notifylist,$namespace,
         $stucounts,$idx,$classlist,%requesthash,$cid,$hostname,$protocol,          $stucounts,$idx,$classlist,%requesthash,$cid,$domdesc,$now,
         $domdesc,$now,$sender,$approvedmsg,$rejectedmsg,$beneficiary,          $sender,$approvedmsg,$rejectedmsg,$beneficiary,
         @existing,@missingreq,@invalidusers,@limitexceeded,@completed,          @existing,@missingreq,@invalidusers,@limitexceeded,@completed,
         @processing_errors,@warn_approves,@warn_rejects,@approvals,@warn_dels,          @processing_errors,@warn_approves,@warn_rejects,@approvals,@warn_dels,
         @rejections,@rejectionerrors,@nopermissions,%courseroles,          @rejections,@rejectionerrors,@nopermissions,%courseroles,@toremove,
         %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,$firsturl);          %communityroles,%domdefs,%approvalmsg,%rejectionmsg,$crstype,$queue,
     @approvals = &Apache::loncommon::get_env_multiple('form.approvereq');          $firsturl);
     @rejections = &Apache::loncommon::get_env_multiple('form.rejectreq');      my $count=0;
       while (my @course = &Apache::loncommon::get_env_multiple('form.'.$count.'radioreq')) {
           if ($course[0] =~ /^\d+:.*/) {
               push(@approvals,$course[0]);
           } elsif ($course[0] =~ /^later:.*/) {
               #decide later
           } else {
               push(@rejections,$course[0]);
           }
           $count+=1;
       }
   
     $now = time;      $now = time;
     $sender = $env{'user.name'}.':'.$env{'user.domain'};      $sender = $env{'user.name'}.':'.$env{'user.domain'};
     if ($context eq 'course') {      if ($context eq 'course') {
Line 461  sub update_request_queue { Line 553  sub update_request_queue {
         $beneficiary = 'enroller';          $beneficiary = 'enroller';
         $cid = $env{'request.course.id'};          $cid = $env{'request.course.id'};
         $crstype = lc(&Apache::loncommon::course_type());          $crstype = lc(&Apache::loncommon::course_type());
         my $chome = &Apache::lonnet::homeserver($cnum,$cdom);          $firsturl = &course_portal_url($cnum,$cdom);
         $hostname = &Apache::lonnet::hostname($chome);  
         $protocol = $Apache::lonnet::protocol{$chome};  
         $protocol = 'http' if ($protocol ne 'https');  
         my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);  
         if ($domdefaults{'portal_def'}) {  
             $firsturl = $domdefaults{'portal_def'};  
         } else {  
             $firsturl = $protocol.'://'.$hostname;  
         }  
         %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum);          %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum);
         $access_start =  $env{'course.'.$cid.'.internal.selfenroll_start_access'};          $access_start =  $env{'course.'.$cid.'.internal.selfenroll_start_access'};
         $access_end =  $env{'course.'.$cid.'.internal.selfenroll_end_access'};          $access_end =  $env{'course.'.$cid.'.internal.selfenroll_end_access'};
Line 482  sub update_request_queue { Line 565  sub update_request_queue {
                             mt => 'Your request for enrollment has been approved.',                              mt => 'Your request for enrollment has been approved.',
                         },                          },
                         {                          {
                             mt   => 'Visit [_1], to log-in and access the course',                              mt   => 'Visit [_1] to log-in and access the course',
                             args => [$firsturl],                              args => [$firsturl],
                         }];                          }];
         $rejectedmsg =  [{          $rejectedmsg =  [{
                             mt => 'Your request for enrollment has not been approved.',                              mt => 'Your request for enrollment has not been approved.',
                         }];                          }];
       } elsif ($context eq 'requestauthor') {
           $namespace = 'requestauthorqueue';
           $beneficiary = 'requestauthor';
           %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom);
           my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
           if (ref($domdefs{'requestauthor'}) eq 'HASH') {
               if (ref($domdefs{'requestauthor'}{'notify'}) eq 'HASH') {
                   $notifylist = $domdefs{'requestauthor'}{'notify'}{'approval'};
               }
           }
           my $domconfiguser = &Apache::lonnet::get_domainconfiguser($cdom);
           $firsturl = &course_portal_url($domconfiguser,$cdom);
           $approvedmsg = [{
                               mt => 'Your request for authoring space has been approved.',
                           },
                           {
                               mt   => 'Visit [_1] to log-in and select your author role',
                               args => [$firsturl],
                           }];
           $rejectedmsg =  [{
                               mt => 'Your request for authoring space has not been approved.',
                           }];
           $domdesc = &Apache::lonnet::domain($cdom);
     } else {      } else {
         $domdesc = &Apache::lonnet::domain($cdom);          $domdesc = &Apache::lonnet::domain($cdom);
         $namespace = 'courserequestqueue';          $namespace = 'courserequestqueue';
Line 497  sub update_request_queue { Line 603  sub update_request_queue {
             $queue = 'pending';              $queue = 'pending';
         }          }
         %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom,'_'.$queue);          %requesthash = &Apache::lonnet::dump_dom($namespace,$cdom,'_'.$queue);
         my $chome = &Apache::lonnet::domain($cdom,'primary');  
         $hostname = &Apache::lonnet::hostname($chome);  
         $protocol = $Apache::lonnet::protocol{$chome};  
         $protocol = 'http' if ($protocol ne 'https');  
         my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);  
         if ($domdefaults{'portal_def'}) {  
             $firsturl = $domdefaults{'portal_def'};  
         } else {  
             $firsturl = $protocol.'://'.$hostname;  
         }  
         my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);          my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);
         if (ref($domconfig{'requestcourses'}) eq 'HASH') {          if (ref($domconfig{'requestcourses'}) eq 'HASH') {
             if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') {               if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') { 
Line 518  sub update_request_queue { Line 614  sub update_request_queue {
                             mt => 'Your course request has been approved.',                              mt => 'Your course request has been approved.',
                         },                          },
                         {                          {
                             mt   => 'Visit [_1], to log-in and access the course',                              mt   => 'Visit [_1] to log-in and access the course',
                             args => [$firsturl],                              args => [],
                         }];                          }];
         $rejectionmsg{'course'} =          $rejectionmsg{'course'} =
                         [{                          [{
Line 531  sub update_request_queue { Line 627  sub update_request_queue {
                             mt => 'Your community request has been approved.',                              mt => 'Your community request has been approved.',
                         },                          },
                         {                          {
                             mt   => 'Visit [_1], to log-in and access the community',                              mt   => 'Visit [_1] to log-in and access the community',
                             args => [$firsturl],                              args => [],
                         }];                          }];
   
         $rejectionmsg{'community'} =           $rejectionmsg{'community'} = 
Line 548  sub update_request_queue { Line 644  sub update_request_queue {
         foreach my $role (@roles) {          foreach my $role (@roles) {
             $communityroles{$role}=&Apache::lonnet::plaintext($role,'Community');              $communityroles{$role}=&Apache::lonnet::plaintext($role,'Community');
         }          }
   
     }      }
     foreach my $item (sort {$a <=> $b} @approvals) {      foreach my $item (sort {$a <=> $b} @approvals) {
         if ($context eq 'course') {          if ($context eq 'course') {
Line 588  sub update_request_queue { Line 683  sub update_request_queue {
                         $stucounts->{'allstudents'} ++;                          $stucounts->{'allstudents'} ++;
                         $stucounts->{'selfenrolled'} ++;                          $stucounts->{'selfenrolled'} ++;
                         &send_selfserve_notification($uname.':'.$udom,$approvedmsg,                          &send_selfserve_notification($uname.':'.$udom,$approvedmsg,
                                        $cid,$coursedesc,$now,$beneficiary,$sender,undef,undef,$crstype);                                         $cid,$coursedesc,$now,$beneficiary,$sender,
                                          undef,undef,$crstype);
                         my %userrequest = (                          my %userrequest = (
                             $cdom.'_'.$cnum => {                              $cdom.'_'.$cnum => {
                                 timestamp   => $now,                                  timestamp   => $now,
Line 609  sub update_request_queue { Line 705  sub update_request_queue {
             } else {              } else {
                 push(@invalidusers,$uname.':'.$udom);                  push(@invalidusers,$uname.':'.$udom);
             }              }
           } elsif ($context eq 'requestauthor') {
               my ($num,$uname) = split(/:/,$item);
               my $uhome = &Apache::lonnet::homeserver($uname,$cdom);
               if ($uhome ne 'no_host') {
                   my ($user_is_adv,$user_is_author) = &Apache::lonnet::is_advanced_user($cdom,$uname);
                   if ($user_is_author) {
                       push(@existing,$uname);
                   } elsif (&Apache::lonnet::usertools_access($uname,$cdom,'requestauthor',
                                                              undef,'requestauthor')) {
                       if (&Apache::lonnet::allowed('cau',$cdom)) {
                           if (&Apache::lonnet::assignrole($cdom,$uname,'/'.$cdom.'/','au',undef,time,undef,undef,'requestauthor') eq 'ok') {
                               push(@completed,$uname);
                               unless (&Apache::lonnet::del_dom($namespace,[$uname.'_approval'],$cdom) eq 'ok') {
                                   push(@warn_dels,$uname);
                               }
                               &send_selfserve_notification($uname.':'.$cdom,
                                                            $approvedmsg,undef,undef,$now,
                                                            $beneficiary,$sender);
                               my %userrequest = (
                                   author => {
                                             timestamp   => $now,
                                             adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                                             status      => 'approved',
                                           },
                                   author_status => 'approved',
                               );
                               my $userresult =
                                   &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$uname);
                               if ($userresult ne 'ok') {
                                   push(@warn_approves,$item);
                               }
                           } else {
                               push(@processing_errors,$uname);
                           }
                       } else {
                           push(@nopermissions,$uname);
                       }
                   } else {
                       push(@nopermissions,$uname);
                   }
               } else {
                   push(@invalidusers,$uname.':'.$cdom);
               }
               push(@toremove,(@invalidusers,@nopermissions));
         } else {          } else {
             my ($num,$cnum) = split(':',$item);              my ($num,$cnum) = split(':',$item);
             if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {              if (ref($requesthash{$cnum.'_'.$queue}) eq 'HASH') {
Line 653  sub update_request_queue { Line 793  sub update_request_queue {
                                 } else {                                  } else {
                                     $approvedmsg = $approvalmsg{'course'};                                      $approvedmsg = $approvalmsg{'course'};
                                 }                                  }
                                   my $firsturl = &course_portal_url($cnum,$cdom);
                                   if (ref($approvedmsg) eq 'ARRAY') {
                                       if (ref($approvedmsg->[1]) eq 'HASH') {
                                           $approvedmsg->[1]->{'args'} = [$firsturl];
                                       }
                                   }
                                 push(@completed,$cnum);                                  push(@completed,$cnum);
                                                                   
                                 unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_'.$queue],$cdom) eq 'ok') {                                  unless (&Apache::lonnet::del_dom($namespace,[$cnum.'_'.$queue],$cdom) eq 'ok') {
                                     push(@warn_dels,$cnum);                                      push(@warn_dels,$cnum);
                                 }                                  }
                                 &send_selfserve_notification($ownername.':'.$ownerdom,$approvedmsg,                                  &send_selfserve_notification($ownername.':'.$ownerdom,
                                               $cid,$coursedesc,$now,$beneficiary,$sender,undef,undef,$crstype);                                                $approvedmsg,$cid,$coursedesc,$now,
                                                 $beneficiary,$sender,undef,undef,$crstype);
                                 my %reqhash = (                                  my %reqhash = (
                                                 reqtime     => $history{'reqtime'},                                                  reqtime     => $history{'reqtime'},
                                                 crstype     => $history{'crstype'},                                                  crstype     => $history{'crstype'},
Line 706  sub update_request_queue { Line 853  sub update_request_queue {
     my @changes = (@completed,@rejections);      my @changes = (@completed,@rejections);
     if ($context eq 'domain') {      if ($context eq 'domain') {
         @changes = map {$_.'_'.$queue} (@changes);          @changes = map {$_.'_'.$queue} (@changes);
       } elsif ($context eq 'requestauthor') {
           @changes = map {$_.'_approval'} (@changes);
     }      }
     if (@rejections) {      if (@rejections) {
         foreach my $item (@rejections) {          foreach my $item (@rejections) {
             if ($context eq 'course') {              if (($context eq 'course') || ($context eq 'requestauthor')) {
                 my $user = $item;                  my ($user,$uname,$udom,%userrequest,$key);
                   if ($context eq 'requestauthor') {
                       $uname = $item;
                       $udom = $cdom;
                       $user = $uname.':'.$udom;
                       $key = 'author';
                   } else {
                       $user = $item;
                       ($uname,$udom) = split(/:/,$user);
                       $key = $cdom.'_'.$cnum;
                   }
                 &send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,                  &send_selfserve_notification($user,$rejectedmsg,$cid,$coursedesc,
                                              $now,$beneficiary,$sender,undef,undef,$crstype);                                               $now,$beneficiary,$sender,undef,undef,
                 my ($uname,$udom) = split(/:/,$user);                                               $crstype);
                 my %userrequest = (                  %userrequest = (
                     $cdom.'_'.$cnum => {                      $key => {
                         timestamp   => $now,                          timestamp   => $now,
                         adjudicator => $env{'user.name'}.':'.$env{'user.domain'},                          adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                         status      => 'rejected',                          status      => 'rejection',
                     }                      }
                 );                  );
                   if ($context eq 'requestauthor') {
                       $userrequest{'author_status'} = 'rejection';  
                   }
                 my $userresult =                  my $userresult =
                     &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);                      &Apache::lonnet::put('requestauthor',\%userrequest,$udom,$uname);
                 if ($userresult ne 'ok') {                  if ($userresult ne 'ok') {
                     push(@warn_rejects,$user);                      push(@warn_rejects,$item);
                 }                  }
             } else {              } else {
                 my $cnum = $item;                  my $cnum = $item;
Line 787  sub update_request_queue { Line 949  sub update_request_queue {
             }              }
         }          }
     }      }
       if (@toremove) {
           foreach my $item (@toremove) {
               my %userrequest = (
                   author => {
                               timestamp   => $now,
                               adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
                               status      => 'deleted',
                             },
                             author_status => 'deleted',
               );
               &Apache::lonnet::put('requestauthor',\%userrequest,$cdom,$item);
           }
           @toremove = map {$_.'_approval'} (@toremove);
           my $delresult = &Apache::lonnet::del_dom($namespace,\@toremove,$cdom);
       }
     if (@changes) {      if (@changes) {
         my $delresult;          my $delresult;
         if ($context eq 'course') {          if ($context eq 'course') {
Line 828  sub update_request_queue { Line 1005  sub update_request_queue {
                                                  $now,'coursemanagers',$sender,                                                   $now,'coursemanagers',$sender,
                                                  $approvedlist,$rejectedlist,$crstype);                                                   $approvedlist,$rejectedlist,$crstype);
                 }                  }
               } elsif ($context eq 'requestauthor') {
                   $chgmsg = "'Action was taken on the following authoring space requests by [_1].',$namelink";
                   if (@completed) {
                       $approvedlist = join("\n",@completed);
                       $output .= '<p>'.&mt('The following requests were approved:').'<ul>';
                       foreach my $uname (@completed) {
                           my $userlink =
                               &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                           $output .= '<li>'.$userlink.'</li>';
                           
                       }
                       $output .= '</ul></p>';
                   }
                   if (@rejections) {
                       $rejectedlist = join("\n",@rejections);
                       $output .= '<p>'.&mt('The following requests were rejected:').'<ul>';
                       foreach my $uname (@rejections) {
                           my $userlink =
                               &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                           $output .= '<li>'.$userlink.'</li>';
                       }
                       $output .= '</ul></p>';
                   }
                   if ($notifylist ne '') {
                       &send_selfserve_notification($notifylist,$chgmsg,undef,$domdesc,
                                                    $now,'authormanagers',$sender,
                                                    $approvedlist,$rejectedlist);
                   }
             } 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 875  sub update_request_queue { Line 1080  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt('Authoring space requests from the following users were deleted because one already exists:').'<ul>';
               foreach my $uname (@existing) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt('The following course/community creation requests were deleted because the course or community has already been created:').'<ul>';              $output .= '<p>'.&mt('The following course/community creation requests were deleted because the course or community has already been created:').'<ul>';
             foreach my $cnum (@existing) {              foreach my $cnum (@existing) {
Line 897  sub update_request_queue { Line 1110  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt('The following requests were ignored because the request is no longer in the queue:').'<ul>';
               foreach my $uname (@missingreq) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt('The following course/community creation requests were ignored because the request is no longer in the queue:').'<ul>';              $output .= '<p>'.&mt('The following course/community creation requests were ignored because the request is no longer in the queue:').'<ul>';
             foreach my $cnum (@missingreq) {              foreach my $cnum (@missingreq) {
                 $output .= '<li>'.$cnum.'</li>';                  $output .= '<li>'.$cnum.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
   
         }          }
     }      }
     if (@invalidusers) {      if (@invalidusers) {
Line 913  sub update_request_queue { Line 1133  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt('The following authoring space requests were deleted because the requestor does not have a LON-CAPA account:').'<ul>';
               foreach my $uname (@invalidusers) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
         }          }
     }      }
     if (@limitexceeded) {      if (@limitexceeded) {
Line 925  sub update_request_queue { Line 1153  sub update_request_queue {
         }          }
     }      }
     if (@nopermissions) {      if (@nopermissions) {
         $output .= '<p>'.&mt('The following course/community creation requests could not be processed because the owner does not have rights to create this type of course:').'<ul>';          if ($context eq 'course') {
         foreach my $cnum (@nopermissions) {              $output .= '<p>'.&mt('The following course/community creation requests could not be processed because the owner does not have rights to create this type of course:').'<ul>';
             my $showcourse;              foreach my $cnum (@nopermissions) {
             if (ref($requesthash{$cnum.'_'.$queue})) {                  my $showcourse;
                 $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};                  if (ref($requesthash{$cnum.'_'.$queue})) {
             } else {                      $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                 $showcourse = $cnum;                  } else {
                       $showcourse = $cnum;
                   }
                   $output .= '<li>'.$showcourse.'</li>';
             }              }
             $output .= '<li>'.$showcourse.'</li>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt('The following requests could not be processed because the requestor does not have rights to request an authoring space:').'<ul>';
               foreach my $uname (@nopermissions) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
         }          }
         $output .= '</ul></p>';  
     }      }
     if (@processing_errors) {      if (@processing_errors) {
         if ($context eq 'course') {          if ($context eq 'course') {
Line 944  sub update_request_queue { Line 1182  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt('The following requests could not be processed because an error occurred:').'<ul>';
               foreach my $uname (@processing_errors) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt('The following course/community creation requests could not be processed because an error occurred:').'<ul>';              $output .= '<p>'.&mt('The following course/community creation requests could not be processed because an error occurred:').'<ul>';
             foreach my $cnum (@processing_errors) {              foreach my $cnum (@processing_errors) {
Line 978  sub update_request_queue { Line 1224  sub update_request_queue {
                 $output .= '<li>'.$user.'</li>';                  $output .= '<li>'.$user.'</li>';
             }              }
             $output .= '</ul></p>';              $output .= '</ul></p>';
           } elsif ($context eq 'requestauthor') {
               $output .= '<p>'.&mt("For the following users, an error occurred when updating the user's own author request record:").'<ul>';
               foreach my $uname (@warn_approves,@warn_rejects) {
                   my $userlink =
                       &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
                   $output .= '<li>'.$userlink.'</li>';
               }
               $output .= '</ul></p>';
         } else {          } else {
             $output .= '<p>'.&mt("For the following course/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 993  sub update_request_queue { Line 1247  sub update_request_queue {
         }          }
     }      }
     if (@warn_dels) {      if (@warn_dels) {
         $output .= '<p>'.&mt("For the following course/community requests an error occurred when removing requests for the following from the pending queue:").'<ul>';          if ($context eq 'requestauthor') {
         foreach my $cnum (@warn_dels) {              $output .= '<p>'.&mt("For the following requests an error occurred when removing the request from the queue:").'<ul>';
             my $showcourse;              foreach my $uname (@warn_dels) {
             if (ref($requesthash{$cnum.'_'.$queue})) {                  my $userlink =
                 $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};                      &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
             } else {                  $output .= '<li>'.$userlink.'</li>';
                 $showcourse = $cnum;  
             }              }
             $output .= '<li>'.$showcourse.'</li>';              $output .= '</ul></p>';
           } else {
               $output .= '<p>'.&mt("For the following course/community requests an error occurred when removing requests for the following from the pending queue:").'<ul>';
               foreach my $cnum (@warn_dels) {
                   my $showcourse;
                   if (ref($requesthash{$cnum.'_'.$queue})) {
                       $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
                   } else {
                       $showcourse = $cnum;
                   }
                   $output .= '<li>'.$showcourse.'</li>';
               }
               $output .= '</ul></p>';
         }          }
         $output .= '</ul></p>';  
     }      }
     return $output;      return $output;
 }  }
   
   sub course_portal_url {
       my ($cnum,$cdom) = @_;
       my $chome = &Apache::lonnet::homeserver($cnum,$cdom);
       my $hostname = &Apache::lonnet::hostname($chome);
       my $protocol = $Apache::lonnet::protocol{$chome};
       $protocol = 'http' if ($protocol ne 'https');
       my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
       my $firsturl;
       if ($domdefaults{'portal_def'}) {
           $firsturl = $domdefaults{'portal_def'};
       } else {
           $firsturl = $protocol.'://'.$hostname;
       }
       return $firsturl;
   }
   
 sub get_student_counts {  sub get_student_counts {
     my ($cdom,$cnum) = @_;      my ($cdom,$cnum) = @_;
     my (%idx,%stucounts);      my (%idx,%stucounts);
Line 1158  sub can_clone_course { Line 1438  sub can_clone_course {
 }  }
   
 sub get_processtype {  sub get_processtype {
     my ($uname,$udom,$isadv,$dom,$crstype,$inststatuses,$domconfig) = @_;      my ($context,$uname,$udom,$isadv,$dom,$crstype,$inststatuses,$domconfig) = @_;
     return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH'));      return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH'));
     if ($uname eq '' || $udom eq '') {      if ($uname eq '' || $udom eq '') {
         $uname = $env{'user.name'};          $uname = $env{'user.name'};
         $udom = $env{'user.domain'};          $udom = $env{'user.domain'};
         $isadv = $env{'user.adv'};          $isadv = $env{'user.adv'};
     }      }
     my (%userenv,%settings,$val);      my (%userenv,%settings,$val,@options,$envkey);
     my @options = ('autolimit','validate','approval');      if ($context eq 'course') {
     if ($dom eq $udom) {          @options = ('autolimit','validate','approval');
           $envkey = 'requestcourses.'.$crstype;
           if (ref($domconfig->{'requestcourses'}) eq 'HASH') {
               if (ref($domconfig->{'requestcourses'}->{$crstype}) eq 'HASH') {
                   %settings = %{$domconfig->{'requestcourses'}->{$crstype}};
               }
           }
       } else {
           @options = ('automatic','approval');
           $envkey = 'requestauthor';
           if (ref($domconfig->{'requestauthor'}) eq 'HASH') { 
               %settings = %{$domconfig->{'requestauthor'}};
           }
       }
       if (($dom eq $udom) || ($context eq 'requestauthor')) {
         %userenv =          %userenv =
             &Apache::lonnet::userenvironment($udom,$uname,'requestcourses.'.$crstype,'inststatus');              &Apache::lonnet::userenvironment($udom,$uname,$envkey,'inststatus');
         if ($userenv{'requestcourses.'.$crstype}) {          if ($userenv{$envkey}) {
             $val = $userenv{'requestcourses.'.$crstype};              $val = $userenv{$envkey};
             @{$inststatuses} = ('_custom_');              @{$inststatuses} = ('_custom_');
         } else {          } else {
             my ($task,%alltasks);              my %alltasks;
             if (ref($domconfig->{'requestcourses'}) eq 'HASH') {              if (($isadv) && ($settings{'_LC_adv'} ne '')) {
                 %settings = %{$domconfig->{'requestcourses'}};                  $val = $settings{'_LC_adv'};
                 if (ref($settings{$crstype}) eq 'HASH') {                  @{$inststatuses} = ('_LC_adv_');
                     if (($isadv) && ($settings{$crstype}{'_LC_adv'} ne '')) {              } else {
                         $val = $settings{$crstype}{'_LC_adv'};                  if ($userenv{'inststatus'} ne '') {
                         @{$inststatuses} = ('_LC_adv_');                      @{$inststatuses} = split(',',$userenv{'inststatus'});
                     } else {                  } else {
                         if ($userenv{'inststatus'} ne '') {                      @{$inststatuses} = ('default');
                             @{$inststatuses} = split(',',$userenv{'inststatus'});                  }
                         } else {                  foreach my $status (@{$inststatuses}) {
                             @{$inststatuses} = ('default');                      if (exists($settings{$status})) {
                         }                          my $value = $settings{$status};
                         foreach my $status (@{$inststatuses}) {                          next unless ($value);
                             if (exists($settings{$crstype}{$status})) {                          unless (exists($alltasks{$value})) {
                                 my $value = $settings{$crstype}{$status};                              if (ref($alltasks{$value}) eq 'ARRAY') {
                                 next unless ($value);                                  unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) {
                                 unless (exists($alltasks{$value})) {                                      push(@{$alltasks{$value}},$status);
                                     if (ref($alltasks{$value}) eq 'ARRAY') {  
                                         unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) {  
                                             push(@{$alltasks{$value}},$status);  
                                         }  
                                     } else {  
                                         @{$alltasks{$value}} = ($status);  
                                     }  
                                 }                                  }
                               } else {
                                   @{$alltasks{$value}} = ($status);
                             }                              }
                         }                          }
                         my $maxlimit = 0;                      }
                   }
                         foreach my $key (sort(keys(%alltasks))) {                  my $maxlimit = 0;
                             if ($key =~ /^autolimit=(\d*)$/) {                  if ($context eq 'course') {
                                 if ($1 eq '') {                      foreach my $key (sort(keys(%alltasks))) {
                                     $val ='autolimit=';                          if ($key =~ /^autolimit=(\d*)$/) {
                                     last;                              if ($1 eq '') {
                                 } elsif ($1 > $maxlimit) {                                  $val ='autolimit=';
                                     $maxlimit = $1;                                  last;
                                 }                              } elsif ($1 > $maxlimit) {
                                   $maxlimit = $1;
                             }                              }
                         }                          }
                         if ($maxlimit) {                      }
                             $val = 'autolimit='.$maxlimit;                  }
                         } else {                  if (($context eq 'requestauthor') || (!$val)) {
                             foreach my $option (@options) {                      if ($context eq 'course' && $maxlimit) {
                                 if ($alltasks{$option}) {                          $val = 'autolimit='.$maxlimit;
                                     $val = $option;                      } else {
                                     last;                          foreach my $option (@options) {
                                 }                              if ($alltasks{$option}) {
                                   $val = $option;
                                   last;
                             }                              }
                         }                          }
                     }                      }
Line 1264  sub queued_selfenrollment { Line 1556  sub queued_selfenrollment {
     }      }
     if (keys(%reqs_by_date)) {      if (keys(%reqs_by_date)) {
         unless ($notitle) {          unless ($notitle) {
             $output .= '<b>'.&mt('Enrollment requests pending Course Coordinator approval').'</b><br />';              $output .= '<br /><b>'.&mt('Enrollment requests pending Course Coordinator approval').'</b><br />';
         }          }
         $output .= &Apache::loncommon::start_data_table().          $output .= &Apache::loncommon::start_data_table().
                    &Apache::loncommon::start_data_table_header_row().                     &Apache::loncommon::start_data_table_header_row().
Line 1295  sub queued_selfenrollment { Line 1587  sub queued_selfenrollment {
 }  }
   
 sub update_coursereq_status {  sub update_coursereq_status {
     my ($reqhash,$dom,$cnum,$reqstatus,$context) = @_;      my ($reqhash,$dom,$cnum,$reqstatus,$context,$udom,$uname) = @_;
     my ($storeresult,$statusresult,$output);      my ($storeresult,$statusresult,$output);
     my $requestkey = $dom.'_'.$cnum;      my $requestkey = $dom.'_'.$cnum;
     if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {      if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {
         $storeresult = &Apache::lonnet::store_userdata($reqhash,$requestkey,          $storeresult = &Apache::lonnet::store_userdata($reqhash,$requestkey,
                                                        'courserequests');                                                         'courserequests',$udom,$uname);
         if ($storeresult eq 'ok') {          if ($storeresult eq 'ok') {
             my %status = (              my %status = (
                              'status:'.$dom.':'.$cnum => $reqstatus,                               'status:'.$dom.':'.$cnum => $reqstatus,
                          );                           );
             $statusresult = &Apache::lonnet::put('courserequests',\%status);              $statusresult = &Apache::lonnet::put('courserequests',\%status,$udom,$uname);
         }          }
     } else {      } else {
         $storeresult = 'error: invalid requestkey format';          $storeresult = 'error: invalid requestkey format';
Line 1317  sub update_coursereq_status { Line 1609  sub update_coursereq_status {
         } else {          } else {
             $output =  '<span class="LC_warning">'.$output.'</span><br />';              $output =  '<span class="LC_warning">'.$output.'</span><br />';
         }          }
         &Apache::lonnet::logthis("Error saving course request - $requestkey for $env{'user.name'}:$env{'user.domain'} - $storeresult");          &Apache::lonnet::logthis("Error saving course request - $requestkey for $uname:$udom - $storeresult");
     } elsif ($statusresult ne 'ok') {      } elsif ($statusresult ne 'ok') {
         $output = &mt('An error occurred saving a record of the status of your request: [_1].',$statusresult);          $output = &mt('An error occurred saving a record of the status of your request: [_1].',$statusresult);
         if ($context eq 'domain') {          if ($context eq 'domain') {
Line 1325  sub update_coursereq_status { Line 1617  sub update_coursereq_status {
         } else {          } else {
             $output = '<span class="LC_warning">'.$output.'</span><br />';              $output = '<span class="LC_warning">'.$output.'</span><br />';
         }          }
         &Apache::lonnet::logthis("Error saving course request status for $requestkey (for $env{'user.name'}:$env{'user.domain'}) - $statusresult");          &Apache::lonnet::logthis("Error saving course request status for $requestkey (for $uname:$udom) - $statusresult");
     }      }
     return ($storeresult,$output);      return ($storeresult,$output);
 }  }
   
 sub process_official_reqs {  sub process_official_reqs {
     my ($context,$dom) = @_;      my ($context,$dom,$dcname,$dcdom) = @_;
     my $reqsnamespace = 'courserequestqueue';      my $reqsnamespace = 'courserequestqueue';
     my %requesthash =      my %requesthash =
         &Apache::lonnet::dump_dom($reqsnamespace,$dom,'_pending');          &Apache::lonnet::dump_dom($reqsnamespace,$dom,'_pending');
Line 1409  sub process_official_reqs { Line 1701  sub process_official_reqs {
                     if ($result eq 'created') {                      if ($result eq 'created') {
                         $disposition = 'created';                          $disposition = 'created';
                         $reqstatus = 'created';                          $reqstatus = 'created';
                         push(@{$newcids{$instcode}},$dom.'_'.$cnum);                          my $cid = $dom.'_'.$cnum;
                           push(@{$newcids{$instcode}},$cid);
                           if ($dcname && $dcdom) {
                               my $firsturl = &course_portal_url($cnum,$dom);
                               my $beneficiary = 'pendingrequestor';
                               my $now = time;
                               my $owner = $ownername.':'.$ownerdom;
                               my $approvedmsg =
                                   [{
                                       mt => 'Your requested course: [_1], (queued pending validation) has now been created.',
                                       args => [$cdescr],
                                    },
                                    {
                                       mt   => 'Visit [_1] to log-in and access the course.',
                                       args => [$firsturl],
                                    },
                                    {
                                       mt => 'If currently logged-in to LON-CAPA, log-out and log-in again to select your new course role.'
                                    }];
                               my $sender = $dcname.':'.$dcdom;
                               &send_selfserve_notification($owner,$approvedmsg,
                                                            $cid,$cdescr,$now,
                                                            $beneficiary,$sender,
                                                            undef,undef,$crstype);
                           }
                     }                      }
                 } elsif ($disposition eq 'rejected') {                  } elsif ($disposition eq 'rejected') {
                     $output .= &mt('Queued course request for [_1] submitted by [_2] with status [_3] rejected when validating.',$instcode,$ownername.':'.$ownerdom,$inststatus).$linefeed;                      $output .= &mt('Queued course request for [_1] submitted by [_2] with status [_3] rejected when validating.',$instcode,$ownername.':'.$ownerdom,$inststatus).$linefeed;
Line 1445  sub process_official_reqs { Line 1761  sub process_official_reqs {
                 unless ($disposition eq 'pending') {                  unless ($disposition eq 'pending') {
                     my ($statusresult,$output) =                      my ($statusresult,$output) =
                         &update_coursereq_status(\%requesthash,$dom,$cnum,                          &update_coursereq_status(\%requesthash,$dom,$cnum,
                                                  $reqstatus,'domain');                                                   $reqstatus,'domain',$ownerdom,
                                                    $ownername);
                     unless (&Apache::lonnet::del_dom($reqsnamespace,[$cnum.'_pending'],$dom) eq 'ok') {                      unless (&Apache::lonnet::del_dom($reqsnamespace,[$cnum.'_pending'],$dom) eq 'ok') {
                         $output .= &mt('An error occurred when removing the request for [_1] submitted by [_2] from the pending queue.',$instcode,$ownername.':'.$ownerdom).$linefeed;                          $output .= &mt('An error occurred when removing the request for [_1] submitted by [_2] from the pending queue.',$instcode,$ownername.':'.$ownerdom).$linefeed;
                     }                      }
Line 1472  sub process_official_reqs { Line 1789  sub process_official_reqs {
         }          }
     }      }
     return $output;      return $output;
   }
   
   sub is_active_author {
       if ($env{'user.role.au./'.$env{'user.domain'}.'/'} =~ /^(\d*)\.(\d*)$/) {
           if ((!$1 || $1 < time) &&
               (!$2 || $2 > time)) {
               return 1;
           }
       }
   }
   
   sub author_prompt {
       my ($is_active_author,$offer_author);
       if ($env{'environment.canrequest.author'}) {
           unless (&is_active_author()) {
               unless (&reqauthor_check() =~ /^approval:\d+$/) {
                   $offer_author = 1;
               }
           }
       }
       return $offer_author;
   }
   
   sub reqauthor_check {
       my $queued = $env{'environment.requestauthorqueued'};
       my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'],
                                            $env{'user.domain'},$env{'user.name'});
       my $reqstatus = $reqauthor{'author_status'};
       if (($reqstatus eq '' && $queued ne '') ||
           ($env{'environment.requestauthorqueued'} !~ /^\Q$reqstatus\E/)) {
           if (ref($reqauthor{'author'}) eq 'HASH') {
               $queued = $reqstatus.':'.$reqauthor{'author'}{'timestamp'};
           } else {
               undef($queued);
           }
           &Apache::lonnet::appenv({'environment.requestauthorqueued' => $queued});
       }
       return $queued;
   }
   
   sub process_reqauthor {
       my ($dispositionref,$updateref) = @_;
       if (&is_active_author()) {
           return '<span class="LC_warning">'.
                   &mt('An authoring space has already been assigned to you.').'<br />'.
                   &mt('Please select the Author role from your [_1]roles page[_2].','<a href="/adm/roles">',
                   '</a>').'</span>';
       }
       unless ($env{'environment.canrequest.author'}) {
           return '<span class="LC_warning">'.
                   &mt('You do not currently have rights to request an authoring space.').'<br />'.
                   &mt('Please contact the [_1]helpdesk[_2].','<a href="/adm/helpdesk">',
                   '</a>').'</span>';
       }
       my $queued = &reqauthor_check();
       if ($queued =~ /^approval:(\d+)$/) {
           my $timestamp = $1;
           return '<span class="LC_info">'.
                  &mt('A request for authoring space submitted on [_1] is awaiting approval',
                  &Apache::lonlocal::locallocaltime($timestamp)).
                  '</span>';
       } elsif ($queued =~ /^approved:(\d+)$/) {
           my $timestamp = $1;   
           my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                         ['active'],['au'],[$env{'user.domain'}]);
           if (keys(%roleshash) > 0) {
               return '<span class="LC_info">'.
                      &mt('A request for authoring space submitted on [_1] has been approved.',
                      &Apache::lonlocal::locallocaltime($timestamp)).
                      '</span>';
           }
       }
       my ($output,@inststatuses,%domconfig);
       %domconfig = &Apache::lonnet::get_dom('configuration',['requestauthor'],
                                             $env{'user.domain'});
       my $val = &get_processtype('requestauthor',$env{'user.name'},$env{'user.domain'},
                                  $env{'user.adv'},$env{'user.domain'},undef,
                                  \@inststatuses,\%domconfig);
       my $now = time;
       if ($val eq 'automatic') {
           my $start = $now-1;
           if (&Apache::lonnet::assignrole($env{'user.domain'},$env{'user.name'},'/'.$env{'user.domain'}.'/',
                                           'au',undef,$start,undef,undef,'requestauthor') eq 'ok') {
               $output = '<span class="LC_info">'.
                         &mt('Access to authoring space has been activated').'</span><br />';
                         &Apache::lonroles::update_session_roles();
               &Apache::lonnet::appenv({'user.update.time'  => $now});
               if (ref($updateref)) {
                   $$updateref = $now;
               }
               if (ref($dispositionref)) {
                   $$dispositionref = 'created';
               }
           } else {
               $output = '<span class="LC_info">'.
                         &mt('An error occurred while activating your access to authoring space');
           }
       } elsif ($val eq 'approval') {
           my $domconfiguser = &Apache::lonnet::get_domainconfiguser($env{'user.domain'});
           if (&Apache::lonnet::put('requestauthorqueue',{ $env{'user.name'}.'_'.$val => $now },
                                    $env{'user.domain'},$domconfiguser) eq 'ok') {
               my %userrequest = (
                   author => {
                               timestamp   => $now,
                               status      => $val,
                             },
                   author_status => $val,
               );
               my $req_notifylist;
               if (ref($domconfig{'requestauthor'}) eq 'HASH') {
                   if (ref($domconfig{'requestauthor'}{'notify'}) eq 'HASH') {
                       my $req_notifylist = $domconfig{'requestauthor'}{'notify'}{'approval'};
                       if ($req_notifylist) {
                           my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                        $env{'user.domain'});
                           my $sender = $env{'user.name'}.':'.$env{'user.domain'};
                           my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
                           &send_selfserve_notification($req_notifylist,
                                                        "$fullname ($env{'user.name'}:$env{'user.domain'})",
                                                        undef,$domdesc,$now,'authorreq',$sender);
                       }
                   }
               }
               my $userresult =
                   &Apache::lonnet::put('requestauthor',\%userrequest,$env{'user.domain'},$env{'user.name'});
               $output = '<span class="LC_info">'.
                         &mt('Your request for authoring space has been submitted for approval.').
                         '</span>';
               &Apache::lonnet::appenv({'environment.requestauthorqueued' => $val.':'.$now});
           } else {
               $output = '<span class="LC_info">'.
                         &mt('An error occurred saving your request for authoring space.').
                         '</span>';
           }
       }
       return $output;
 }  }
   
 1;  1;

Removed from v.1.25  
changed lines
  Added in v.1.34


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>