Diff for /loncom/interface/selfenroll.pm between versions 1.18 and 1.27.2.3

version 1.18, 2009/05/16 23:21:00 version 1.27.2.3, 2014/04/06 14:24:40
Line 34  use Apache::lonnet; Line 34  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::createaccount;  use Apache::createaccount;
   use Apache::loncoursequeueadmin;
   use Apache::lonuserutils;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 sub handler {  sub handler {
Line 53  sub handler { Line 55  sub handler {
     &Apache::lonlocal::get_language_handle($r);      &Apache::lonlocal::get_language_handle($r);
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['courseid']);      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['courseid']);
     my $js = &Apache::createaccount::catreturn_js();      my $js = &Apache::createaccount::catreturn_js();
     my ($coursechk,$courseid) = &validate_course_id($env{'form.courseid'});  
     if ($coursechk ne 'ok') {      my $courseid = Apache::lonnet::is_course($env{'form.courseid'});
         &page_header($r,$courseid,$js);  
       unless ($courseid) {
           &page_header($r,$env{'form.courseid'},$js);
         $r->print('<h3>'.&mt('Self-enrollment error').'</h3>'.          $r->print('<h3>'.&mt('Self-enrollment error').'</h3>'.
                   '<span class="LC_error">'.                    '<span class="LC_error">'.
                   &mt('Invalid domain or course number').'</span>');                    &mt('Invalid domain or course number').'</span>');
Line 80  sub handler { Line 84  sub handler {
         $knownuser,$selfenroll_access_start,$selfenroll_access_end,          $knownuser,$selfenroll_access_start,$selfenroll_access_end,
         $selfenroll_section,$selfenroll_future,%curr_role,$cdomdesc,          $selfenroll_section,$selfenroll_future,%curr_role,$cdomdesc,
         $selfenroll_approval,$selfenroll_limit,$selfenroll_cap,          $selfenroll_approval,$selfenroll_limit,$selfenroll_cap,
         $selfenroll_notifylist,$owner);          $selfenroll_notifylist,$owner,$crstype);
     $selfenroll_types = $coursehash{'internal.selfenroll_types'};      $selfenroll_types = $coursehash{'internal.selfenroll_types'};
     $selfenroll_registered =  $coursehash{'internal.selfenroll_registered'};      $selfenroll_registered =  $coursehash{'internal.selfenroll_registered'};
     $selfenroll_section = $coursehash{'internal.selfenroll_section'};      $selfenroll_section = $coursehash{'internal.selfenroll_section'};
Line 91  sub handler { Line 95  sub handler {
     $selfenroll_approval = $coursehash{'internal.selfenroll_approval'};      $selfenroll_approval = $coursehash{'internal.selfenroll_approval'};
     $selfenroll_notifylist = $coursehash{'internal.selfenroll_notifylist'};      $selfenroll_notifylist = $coursehash{'internal.selfenroll_notifylist'};
     $owner = $coursehash{'internal.courseowner'};      $owner = $coursehash{'internal.courseowner'};
       $crstype = $coursehash{'internal.type'};
       if ($crstype eq '') {
           $crstype = 'Course';
       }
     my $nospace;      my $nospace;
     if ($selfenroll_types ne '') {      if ($selfenroll_types ne '') {
         my $start = $coursehash{'internal.selfenroll_start_date'};          my $start = $coursehash{'internal.selfenroll_start_date'};
Line 224  sub handler { Line 232  sub handler {
         &process_self_enroll($r,$cdom,$cnum,$selfenroll_types,$selfenroll_registered,          &process_self_enroll($r,$cdom,$cnum,$selfenroll_types,$selfenroll_registered,
                              $selfenroll_access_start,$selfenroll_access_end,                               $selfenroll_access_start,$selfenroll_access_end,
                              $selfenroll_section,$now,$selfenroll_approval,                               $selfenroll_section,$now,$selfenroll_approval,
                              $selfenroll_notifylist,$owner);                               $selfenroll_notifylist,$owner,$crstype,$lonhost,$handle);
     } elsif ($env{'form.phase'} eq 'login') {      } elsif ($env{'form.phase'} eq 'login') {
         my $submit_text = &mt('Log in');          my $submit_text = &mt('Log in');
         $r->print('<h3>'.&mt('Log-in to LON-CAPA').'</h3>');          $r->print('<h3>'.&mt('Log-in to LON-CAPA').'</h3>');
Line 358  sub page_footer { Line 366  sub page_footer {
     return;      return;
 }  }
   
 sub validate_course_id {  
     my ($courseid) = @_;  
     my ($cdom,$cnum) = ($env{'form.courseid'} =~ /^($match_domain)_($match_courseid)$/);  
     if ($cdom ne '' && $cnum ne '') {  
         if (&Apache::lonnet::is_course($cdom,$cnum)) {  
             return ('ok',$courseid);  
         }  
     }   
     return;  
 }  
   
 sub user_is_known {  sub user_is_known {
     my $known = 0;      my $known = 0;
     if ($env{'user.name'} ne '' && $env{'user.name'} ne 'public'      if ($env{'user.name'} ne '' && $env{'user.name'} ne 'public'
Line 414  sub has_role { Line 411  sub has_role {
 sub process_self_enroll {  sub process_self_enroll {
     my ($r,$cdom,$cnum,$selfenroll_types,$selfenroll_registered,      my ($r,$cdom,$cnum,$selfenroll_types,$selfenroll_registered,
         $selfenroll_access_start,$selfenroll_access_end,$selfenroll_section,          $selfenroll_access_start,$selfenroll_access_end,$selfenroll_section,
         $now,$selfenroll_approval,$selfenroll_notifylist,$owner) = @_;          $now,$selfenroll_approval,$selfenroll_notifylist,$owner,$crstype,$lonhost,$handle) = @_;
     my $udom = $env{'user.domain'};      my $udom = $env{'user.domain'};
     my $uname = $env{'user.name'};      my $uname = $env{'user.name'};
     my $selfenroll = 0;      my $selfenroll = 0;
Line 445  sub process_self_enroll { Line 442  sub process_self_enroll {
             my ($registered,$instsec,$message) = &check_registered($cdom,$cnum);              my ($registered,$instsec,$message) = &check_registered($cdom,$cnum);
             $usec = $instsec;              $usec = $instsec;
             if (!$registered) {              if (!$registered) {
                 $r->print('<h3>'.&mt('Self-enrollment unavailable').'</h3>'.&mt('Self-enrollment is restricted to students officially registered for this course.').'<br />');                  $r->print('<h3>'.&mt('Self-enrollment unavailable').'</h3>'.
                             &mt('Self-enrollment is restricted to students officially registered for this course.').'<br />');
                 if ($message) {                  if ($message) {
                     $r->print($message);                      $r->print($message);
                 } else {                  } else {
Line 457  sub process_self_enroll { Line 455  sub process_self_enroll {
         if ($selfenroll_approval) {          if ($selfenroll_approval) {
             my $outcome =               my $outcome = 
                 &store_selfenroll_request($udom,$uname,$usec,$cdom,$cnum,                  &store_selfenroll_request($udom,$uname,$usec,$cdom,$cnum,
                                           $selfenroll_notifylist,$owner);                                            $selfenroll_notifylist,$owner,
                                             $selfenroll_approval,$crstype,$lonhost,$handle);
             $r->print($outcome);              $r->print($outcome);
         } else {          } else {
             my $enrollresult =               my $enrollresult = 
Line 475  sub process_self_enroll { Line 474  sub process_self_enroll {
                 }                  }
                 &Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,                  &Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,
                                                     $area);                                                      $area);
                 &Apache::lonnet::set_userprivs(\%userroles,\%newrole,%newgroups);                  &Apache::lonnet::set_userprivs(\%userroles,\%newrole,\%newgroups);
                 $userroles{'user.role.'.$spec} = $selfenroll_access_start.'.'.$selfenroll_access_end;                  $userroles{'user.role.'.$spec} = $selfenroll_access_start.'.'.$selfenroll_access_end;
                 &Apache::lonnet::appenv(\%userroles,[$role,'cm']);                  &Apache::lonnet::appenv(\%userroles,[$role,'cm']);
                 $r->print('<h3>'.&mt('Enrollment process complete').'</h3>');                  $r->print('<h3>'.&mt('Enrollment process complete').'</h3>');
Line 535  sub user_can_selfenroll { Line 534  sub user_can_selfenroll {
 }  }
   
 sub store_selfenroll_request {  sub store_selfenroll_request {
     my ($udom,$uname,$usec,$cdom,$cnum,$selfenroll_notifylist,$owner) = @_;      my ($udom,$uname,$usec,$cdom,$cnum,$selfenroll_notifylist,$owner,
           $selfenroll_approval,$crstype,$lonhost,$handle) = @_;
     my $namespace = 'selfenrollrequests';      my $namespace = 'selfenrollrequests';
     my $output;      my $output;
     my $now = time;      my $now = time;
     my %existing =       my %existing = 
         &Apache::lonnet::get($namespace,[$uname.':'.$udom],$cdom,$cnum);          &Apache::lonnet::get($namespace,[$uname.':'.$udom],$cdom,$cnum);
     if ($existing{$uname.':'.$udom}) {      if ($existing{$uname.':'.$udom}) {
         my ($timestamp,$sec) = split(/:/,$existing{$uname.':'.$udom});          my $status;
         $output = &mt('A self-enrollment request already exists for you for this course.').'<br />'.&mt('Your earlier request was submitted: [_1] and remains in a queue awaiting action by a Course Coordinator.',&Apache::lonlocal::locallocaltime($timestamp));          $output = &mt('A self-enrollment request already exists for you for this course.').'<br />';
           my %info = &Apache::lonnet::get($namespace,[$cdom.'_'.$cnum],$udom,$uname);
           if (ref($info{$cdom.'_'.$cnum}) eq 'HASH') {
               $status = $info{$cdom.'_'.$cnum}{'status'};
           }
           if ($status eq 'pending') {
               my $token = $info{$cdom.'_'.$cnum}{'token'};
               my ($statusupdate,$pendingform) = &pending_selfenrollment_form($cdom,$cnum,$crstype,$token,$lonhost);
               if ($statusupdate eq 'pending') {
                   $output .= $pendingform;
               }
           } else {
               $output .= &mt('Your earlier request is in a queue awaiting action by a Course Coordinator.').
                          '<br /><br />'.&Apache::loncoursequeueadmin::queued_selfenrollment();
           }
     } else {      } else {
         my %selfenroll = (          my %selfenroll = (
                             $uname.':'.$udom => $now.':'.$usec,                              $uname.':'.$udom => $now.':'.$usec,
                          );                           );
         my $putresult = &Apache::lonnet::put($namespace,\%selfenroll,$cdom,$cnum);          my $putresult = &Apache::lonnet::put($namespace,\%selfenroll,$cdom,$cnum);
           my $status = 'request';
           if ($selfenroll_approval eq '2') {
               $status = 'pending';
           } 
         if ($putresult eq 'ok') {          if ($putresult eq 'ok') {
             my %userenroll = (              my %userenroll = (
                                $cdom.'_'.$cnum =>  {                                 $cdom.'_'.$cnum =>  {
                                                       timestamp => $now,                                                        timestamp => $now,
                                                       section   => $usec,                                                        section   => $usec,
                                                       status    => 'request',                                                         status    => $status,
                                                    });                                                     });
               my $token;
               if ($status eq 'pending') {
                   $token = &Apache::lonnet::tmpput(\%selfenroll,$lonhost);
                   $userenroll{$cdom.'_'.$cnum}{'token'} = $token;
                   $userenroll{$cdom.'_'.$cnum}{'lonhost'} = $lonhost;
                   $userenroll{$cdom.'_'.$cnum}{'handle'} = $handle; 
               } 
             my $warning;              my $warning;
             my $userresult = &Apache::lonnet::put($namespace,\%userenroll,$udom,$uname);              my $userresult = &Apache::lonnet::put($namespace,\%userenroll,$udom,$uname);
             if ($userresult ne 'ok') {              if ($userresult ne 'ok') {
                 $warning = &mt('An error occurred saving a personal record of your request.');                  $warning = &mt('An error occurred saving a personal record of your request.');
             }              }
             $output = &mt('Your request for self-enrollment has been recorded.').'<br />'.              $output = &mt('Your request for self-enrollment has been recorded.').'<br />';
                       &mt('A message will be sent to your LON-CAPA account when the course coordinator takes action on your request.').'<br />';              if ($status eq 'pending') {
             my %emails = &Apache::loncommon::getemails($uname,$udom);                  my ($statusupdate,$pendingform) = &pending_selfenrollment_form($cdom,$cnum,$crstype,$token,$lonhost);
             if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) {                  if ($statusupdate eq 'request') {
                 my $address = $emails{'permanentemail'};                      $status = $statusupdate;
                 if ($address eq '') {                  } else {
                     $address = $emails{'notification'};                      $output .= $pendingform;
                 }                  }
                 $output.= &mt('An e-mail will also be sent to: [_1] when this occurs.',$address).'<br />';              }
             }              if ($status eq 'request') {
             if ($warning) {                   $output .= &mt('A message will be sent to your LON-CAPA account when the course coordinator takes action on your request.').'<br />'.
                 $output .= '<span class="LC_warning">'.$warning.'</span><br />';                             &mt('To access your LON-CAPA message, go to the Main Menu and click on "Send and Receive Messages".').'<br />';
             }                  my %emails = &Apache::loncommon::getemails($uname,$udom);
                     if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) {
             if ($selfenroll_notifylist) {                      my $address = $emails{'permanentemail'};
                 my $fullname = &Apache::loncommon::plainname($uname,$udom);                      if ($address eq '') {
                 my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum);                          $address = $emails{'notification'};
                 my $coursedesc = $courseinfo{'description'};                      }
                 &send_notification($selfenroll_notifylist,$fullname,$cdom.                      $output.= &mt('An e-mail will also be sent to: [_1] when this occurs.',$address).'<br />';
                                    '_'.$cnum,$coursedesc,$now,'request',$owner);                  }
                   if ($warning) { 
                       $output .= '<span class="LC_warning">'.$warning.'</span><br />';
                   }
                   $output .= &Apache::loncoursequeueadmin::queued_selfenrollment();
   
                   if ($selfenroll_notifylist) {
                       my $fullname = &Apache::loncommon::plainname($uname,$udom);
                       my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum);
                       my $coursedesc = $courseinfo{'description'};
                       &Apache::loncoursequeueadmin::send_selfserve_notification(
                           $selfenroll_notifylist,$fullname,$cdom.'_'.$cnum,
                           $coursedesc,$now,'selfenrollreq',$owner);
                   }
             }              }
         } else {          } else {
             $output = '<span class="LC_error">'.&mt('An error occurred when recording your request.').'</span>';              $output = '<span class="LC_error">'.&mt('An error occurred when recording your request.').'</span>';
Line 590  sub store_selfenroll_request { Line 628  sub store_selfenroll_request {
     return $output;      return $output;
 }  }
   
 sub send_notification {  sub pending_selfenrollment_form {
     my ($notifylist,$textstr,$cid,$coursedesc,$timestamp,$context,$sender,      my ($cdom,$cnum,$crstype,$token,$lonhost) = @_;
         $approvedlist,$rejectedlist) = @_;      my ($status,$output);
 # FIXME locallocaltime needs to be able to take $sender_lh as an argument      my $coursetype = &Apache::lonuserutils::get_extended_type($cdom,$cnum,$crstype);
 #       so this can be localized to the recipients date display format/time zone       my %postvalues = (
     $timestamp =&Apache::lonlocal::locallocaltime($timestamp);                        'username'   => $env{'user.name'},
     my $msgcc;                        'domain'     => $env{'user.domain'},
     my ($rawsubj,@rawmsg,$subject,$message,$namelink);                        'course'     => $cdom.'_'.$cnum,
     $namelink = &Apache::loncommon::aboutmewrapper(                        'coursetype' => $coursetype,
                 &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}));                                   );
     if ($context eq 'managers') {      my %domconfig = &Apache::lonnet::get_dom('configuration',['selfenrollment'],$cdom);
         $rawsubj = 'Self-enrollment requests processed';  
         push(@rawmsg,{      if (ref($domconfig{'selfenrollment'}) eq 'HASH') {
                       mt => 'Enrollment requests in the following course: [_1] have been processed.',          my ($url,$buttontext,$code,@fields);
                       args => ["\n$coursedesc\n"],          if (ref($domconfig{'selfenrollment'}{'validation'}) eq 'HASH') {
                      });              my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum,{ 'one_time' => 1});
     } elsif ($context eq 'enroller') {              $postvalues{'uniquecode'} = $courseinfo{'internal.uniquecode'};
         $rawsubj = 'Enrollment request';              $postvalues{'description'} = $courseinfo{'description'};
         push(@rawmsg,{              $url = $domconfig{'selfenrollment'}{'validation'}{'url'};
                       mt  => 'Your request for enrollment in the following course: [_1], requested on [_2], has been reviewed by a Course Coordinator.',              if (ref($domconfig{'selfenrollment'}{'validation'}{'fields'}) eq 'ARRAY') {
                       args => ["\n$coursedesc\n","$timestamp\n"],                  @fields = @{$domconfig{'selfenrollment'}{'validation'}{'fields'}};
               }
                      });              $buttontext = $domconfig{'selfenrollment'}{'validation'}{'button'};
         if (ref($textstr) eq 'ARRAY') {  
             push(@rawmsg,@{$textstr});              $output .= $domconfig{'selfenrollment'}{'validation'}{'markup'};
         }              if (($url =~ m{^(https?\://|/)}) && (@fields > 0)) {
     } else {                  $output .= '<form name="selfenrollvalidation" action="'.$url.'" method="post">'."\n";
         $rawsubj = 'Self-enrollment request';                  foreach my $field (@fields) {
         push(@rawmsg,{                      if ($postvalues{$field}) {
                       mt  => 'Enrollment in the following course: [_1] was requested by [_2] on [_3].',                          $output .= '<input type="hidden" name="'.$field.'" value="'.$postvalues{$field}.'" />'."\n";
                       args => ["\n$coursedesc\n",$textstr,$timestamp],                      }
                      },                  }
                      {                  if ($buttontext eq '') {
                       mt =>'As Course Coordinator, use: [_1]Main Menu -> Manage Course Users -> Enrollment Requests[_1] to display a list of pending enrollment requests,[_1] which you can either approve or reject.',                      $buttontext = &mt('Complete my enrollment');
                       args => ["\n"],                  }
                      });                  my $protocol = $Apache::lonnet::protocol{$lonhost};
     }                  $protocol = 'http' if ($protocol ne 'https');
     my @to_notify = split(/,/,$notifylist);                  my $enroller = $protocol.'://'.&Apache::lonnet::hostname($lonhost).'/cgi-bin/enrollqueued.pl';
     my $numsent = 0;                  $output .= '<input type="hidden" name="enroller" value="'.$enroller.'" />'."\n".
     my @recusers;                             '<input type="hidden" name="token" value="'.$token.'" />'."\n".
     my @recudoms;                             '<input type="submit" name="validate" value="'.$buttontext.'" />'."\n".
     foreach my $cc (@to_notify) {                             '</form>'."\n";
         my ($ccname,$ccdom) = split(/:/,$cc);                  $status = 'pending';
         if (!exists($msgcc->{$ccname.':'.$ccdom})) {              } else {
             push(@recusers,$ccname);                  $status = 'request';
             push(@recudoms,$ccdom);  
             $msgcc->{$ccname.':'.$ccdom}='';  
             $numsent ++;  
         }  
     }  
     my %reciphash = (  
                      cc => $msgcc,  
     );  
     my ($uname,$udom);  
     if ($sender =~ /:/) {  
         ($uname,$udom) = split(/:/,$sender);  
     } else {  
         $uname = $sender;  
         my %courseinfo = &Apache::lonnet::coursedescription($cid);  
         $udom = $courseinfo{'num'};  
     }  
     my %sentmessage;  
     my $stamp = time;  
     my $msgcount = &Apache::lonmsg::get_uniq();  
     my $sender_lh = &Apache::loncommon::user_lang($uname,$udom,$cid);  
     $subject = &Apache::lonlocal::mt_user($sender_lh,$rawsubj);  
     $message = '';  
     foreach my $item (@rawmsg) {  
         if (ref($item) eq 'HASH') {  
             $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);  
     my ($recipid,$recipstatus) =  
         &Apache::lonmsg::store_recipients($subject,$uname,$udom,\%reciphash);  
     foreach my $recip (sort(keys(%{$msgcc}))) {  
         my ($ccname,$ccdom) = split(/:/,$recip);  
         my $recip_lh = &Apache::loncommon::user_lang($ccname,$ccdom,$cid);  
         my $subject = &Apache::lonlocal::mt_user($sender_lh,$rawsubj);  
         my $message = '';  
         foreach my $item (@rawmsg) {  
             if (ref($item) eq 'HASH') {  
                 $message .= &Apache::lonlocal::mt_user($sender_lh,$item->{mt},  
                                                        @{$item->{args}})."\n";  
             }  
         }  
         if ($context eq 'managers') {  
             if ($approvedlist) {  
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Approved enrollments:')."\n".$approvedlist;  
             }  
             if ($rejectedlist) {  
                 $message .= "\n\n".&Apache::lonlocal::mt_user($sender_lh,'Rejected enrollments:')."\n".$rejectedlist;  
             }              }
         }          }
         my $status = &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,\%sentmessage,undef,undef,undef,1,$recipid);      } else {
           $status = 'request';
     }      }
       return ($status,$output);
 }  }
   
 sub jump_to_role {  sub jump_to_role {

Removed from v.1.18  
changed lines
  Added in v.1.27.2.3


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