--- loncom/interface/loncreateuser.pm 2009/02/03 05:28:00 1.276 +++ loncom/interface/loncreateuser.pm 2009/02/05 12:19:50 1.277 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.276 2009/02/03 05:28:00 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.277 2009/02/05 12:19:50 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -68,6 +68,7 @@ use Apache::loncommon; use Apache::lonlocal; use Apache::longroup; use Apache::lonuserutils; +use Apache::selfenroll(); use LONCAPA qw(:DEFAULT :match); my $loginscript; # piece of javascript used in two separate instances @@ -3409,6 +3410,29 @@ sub handler { &update_selfenroll_config($r,$context,$permission); } $r->print(&Apache::loncommon::end_page()); + } elsif ($env{'form.action'} eq 'selfenrollqueue') { + $r->print(&header()); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/createuser?action=selfenrollqueue', + text=>"Enrollment requests"}); + my $cid = $env{'request.course.id'}; + my $cdom = $env{'course.'.$cid.'.domain'}; + my $cnum = $env{'course.'.$cid.'.num'}; + if (!exists($env{'form.state'})) { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment requests', + 'Course_SelfEnrollment_Approval')); + $r->print('

'.&mt('Pending enrollment requests').'

'."\n"); + &display_selfenroll_queue($r,$context,$permission,$cnum,$cdom); + } elsif ($env{'form.state'} eq 'done') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/createuser?action=selfenrollqueue', + text=>"Result"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment result', + 'Course_Self_Enrollment')); + $r->print('

'.&mt('Enrollment request processing').'

'."\n"); + &update_selfenroll_queue($r,$context,$permission,$cid,$cnum,$cdom); + } + $r->print(&Apache::loncommon::end_page()); } elsif ($env{'form.action'} eq 'changelogs') { $r->print(&header()); &Apache::lonhtmlcommon::add_breadcrumb @@ -3551,6 +3575,16 @@ sub print_main_menu { permission => $permission->{'custom'}, linktitle => 'Configure a custom role.', }); + if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) { + push(@{ $menu[1]->{items} }, + { linktext => 'Enrollment Requests', + icon => 'selfenrl-queue.png', + #help => 'Course_Approve_Selfenroll', + url => '/adm/createuser?action=selfenrollqueue', + permission => $permission->{'cusr'}, + linktitle =>'Approve or reject enrollment requests.', + }); + } if (!exists($permission->{'cusr_section'})){ @@ -3982,7 +4016,7 @@ ENDSCRIPT } } if (@ccs) { - $output .= '
'.&mt('Personnel to be notified when a self-enrollment request needs approval, or has been approved:').' '.&Apache::loncommon::start_data_table(). + $output .= '
'.&mt('Personnel to be notified when an enrollment request needs approval, or has been approved:').' '.&Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_row(); my $count = 0; my $numcols = 4; @@ -4053,6 +4087,238 @@ ENDSCRIPT return; } +sub display_selfenroll_queue { + my ($r,$context,$permission,$cnum,$cdom) = @_; + my $namespace = 'selfenrollrequests'; + my ($output,%queue_by_date); + my %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum); + if (keys(%requesthash) > 0) { + $r->print('
'. + ''. + ''. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + ''.&mt('Action').''. + ''.&mt('Requestor').''. + ''.&mt('Section').''. + ''.&mt('Date requested').''. + &Apache::loncommon::end_data_table_header_row()); + foreach my $item (keys(%requesthash)) { + my ($timestamp,$usec) = split(/:/,$requesthash{$item}); + if (exists($queue_by_date{$timestamp})) { + if (ref($queue_by_date{$timestamp}) eq 'ARRAY') { + push(@{$queue_by_date{$timestamp}},$item.':'.$usec); + } + } else { + @{$queue_by_date{$timestamp}} = ($item.':'.$usec); + } + } + my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date)); + my $count = 0; + foreach my $item (@sortedtimes) { + if (ref($queue_by_date{$item}) eq 'ARRAY') { + foreach my $request (sort(@{$queue_by_date{$item}})) { + my ($puname,$pudom,$pusec) = split(/:/,$request); + my $showsec = $pusec; + if ($showsec eq '') { + $showsec = &mt('none'); + } + my $namelink = &Apache::loncommon::aboutmewrapper( + &Apache::loncommon::plainname($puname,$pudom), + $puname,$pudom); + $r->print(&Apache::loncommon::start_data_table_row(). + '
'. + '
'. + ''.$namelink.''. + ''.$showsec.''. + ''.&Apache::lonlocal::locallocaltime($item).''. + &Apache::loncommon::end_data_table_row()); + $count ++; + } + } + } + $r->print(&Apache::loncommon::end_data_table(). + '
'); + } else { + $r->print(&mt('There are currently no enrollment requests.')); + } + return; +} + +sub update_selfenroll_queue { + my ($r,$context,$permission,$cid,$cnum,$cdom) = @_; + my @approvals = &Apache::loncommon::get_env_multiple('form.approvereq'); + my @rejections = &Apache::loncommon::get_env_multiple('form.rejectreq'); + my $access_start = $env{'course.'.$cid.'.internal.selfenroll_start_access'}; + my $access_end = $env{'course.'.$cid.'.internal.selfenroll_end_access'}; + my $limit = $env{'course.'.$cid.'.internal.selfenroll_limit'}; + my $cap = $env{'course.'.$cid.'.internal.selfenroll_cap'}; + my $notifylist = $env{'course.'.$cid.'.internal.selfenroll_notifylist'}; + my $namespace = 'selfenrollrequests'; + my ($stucounts,$idx,$classlist) = &get_student_counts($cdom,$cnum); + my %requesthash = &Apache::lonnet::dump($namespace,$cdom,$cnum); + my $coursedesc = $env{'course.'.$cid.'.description'}; + 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 (@existing,@missingreq,@invalidusers,@limitexceeded,@enrolled,@enrollerrors,); + my $now = time; + my $sender = $env{'user.name'}.':'.$env{'user.domain'}; + my $approvedmsg = [{ + mt => 'Your request for enrollment has been approved.', + }, + { + mt => 'Visit [_1], to log-in and access the course', + args => [$protocol.'://'.$hostname], + }]; + + my $rejectedmsg = [{ + mt => 'Your request for enrollment has not been approved.', + }]; + foreach my $item (sort {$a <=> $b} @approvals) { + my ($num,$uname,$udom,$usec) = split(/:/,$item); + my $uhome = &Apache::lonnet::homeserver($uname,$udom); + if ($uhome ne 'no_host') { + if (exists($requesthash{$uname.':'.$udom})) { + + if (exists($classlist->{$uname.':'.$udom})) { + if (ref($classlist->{$uname.':'.$udom}) eq 'ARRAY') { + if (($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Active') || + ($classlist->{$uname.':'.$udom}->[$idx->{'status'}] eq 'Future')) { + push(@existing,$uname.':'.$udom); + next; + } + } + } + } else { + push(@missingreq,$uname.':'.$udom); + next; + } + if (!grep(/^\Q$item\E$/,@rejections)) { + if ($limit eq 'allstudents') { + if ($stucounts->{$limit} >= $cap) { + push(@limitexceeded,$uname.':'.$udom); + last; + } + } elsif ($limit eq 'selfenrolled') { + if ($stucounts->{$limit} >= $cap) { + push(@limitexceeded,$uname.':'.$udom); + last; + } + } + my $result = + &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$usec,$access_end,$access_start,'selfenroll',undef,$cdom.'_'.$cnum,1); + if ($result eq 'ok') { + push(@enrolled,$uname.':'.$udom); + $stucounts->{'allstudents'} ++; + $stucounts->{'selfenrolled'} ++; + &Apache::selfenroll::send_notification($uname.':'.$udom,$approvedmsg,$cid, + $coursedesc,$now,'enroller',$sender); + } else { + push(@enrollerrors,$uname.':'.$udom); + } + } + } else { + push(@invalidusers,$uname.':'.$udom); + } + } + my @changes = (@enrolled,@rejections); + if (@rejections) { + foreach my $user (@rejections) { + &Apache::selfenroll::send_notification($user,$rejectedmsg,$cid, + $coursedesc,$now,'enroller',$sender); + } + } + if (@changes) { + my $delresult = &Apache::lonnet::del($namespace,\@changes,$cdom,$cnum); + if ($delresult eq 'ok') { + my $namelink = + &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}).' ('.$env{'user.name'}.':'.$env{'user.domain'}.')'; + my $chgmsg = "'Action was taken on the following enrollment requests by [_1].',$namelink"; + my ($approvedlist,$rejectedlist); + if (@enrolled) { + $approvedlist = join("\n",@enrolled); + $r->print('

'.&mt('The following were enrolled in the course:').'

'); + } + if (@rejections) { + $rejectedlist = join("\n",@rejections); + $r->print('

'.&mt('The following enrollment requests were rejected:').'

'); + } + &Apache::selfenroll::send_notification($notifylist,$chgmsg,$cid, + $coursedesc,$now,'managers', + $sender,$approvedlist,$rejectedlist); + } + } + if (@existing) { + $r->print('

'.&mt('The following enrollment requests were deleted because the user is already enrolled in the course:').'

'); + } + if (@missingreq) { + $r->print('

'.&mt('The following enrollment requests were ignored because the request is no longer in the enrollment queue:').'

'); + } + if (@invalidusers) { + $r->print('

'.&mt('The following enrollment requests were deleted because the requestor does not have a LON-CAPA account:').'

'); + } + if (@limitexceeded) { + $r->print('

'.&mt('The following enrollment requests were skipped because the enrollment limit has been reached for the course:').'

'); + } + if (@enrollerrors) { + $r->print('

'.&mt('The following enrollment requests could not be processed because an error occurred:').'

'); + } + return; +} + +sub get_student_counts { + my ($cdom,$cnum) = @_; + my (%idx,%stucounts); + my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cnum); + $idx{'type'} = &Apache::loncoursedata::CL_TYPE(); + $idx{'status'} = &Apache::loncoursedata::CL_STATUS(); + while (my ($student,$data) = each(%$classlist)) { + if (($data->[$idx{'status'}] eq 'Active') || + ($data->[$idx{'status'}] eq 'Future')) { + if ($data->[$idx{'type'}] eq 'selfenroll') { + $stucounts{'selfenroll'} ++; + } + $stucounts{'allstudents'} ++; + } + } + return (\%stucounts,\%idx,$classlist); +} + sub visible_in_cat { my ($cdom,$cnum) = @_; my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom); @@ -5438,9 +5704,9 @@ sub update_selfenroll_config { } $r->print('
  • '.&mt('"[_1]" set to "[_2]".',$title,$newval)); if ($newnotify) { - $r->print('
    '.&mt('The following will be notified when a self-enrollment request needs approval, or has been approved: [_1].',$newnotify)); + $r->print('
    '.&mt('The following will be notified when an enrollment request needs approval, or has been approved: [_1].',$newnotify)); } else { - $r->print('
    '.&mt('No notifications sent when a self-enrollment request needs approval, or has been approved.')); + $r->print('
    '.&mt('No notifications sent when an enrollment request needs approval, or has been approved.')); } $r->print('
  • '."\n"); }