'.
- ' '.
+ ' '.
&mt('No limit').' '.
' '.
&mt('Limit by total students').' '.
@@ -4047,12 +4090,285 @@ ENDSCRIPT
}
$output .= &Apache::lonhtmlcommon::end_pick_box().
' '
+ .&mt('Save').'" onclick="validate_types(this.form);" />'
.' ';
$r->print($output);
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().
+ ''.
+ ' '.&mt('Approve').' '.
+ ''.
+ ' '.&mt('Reject').' '.
+ ''.$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,@warn_approves,@warn_rejects);
+ 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);
+ my %userrequest = (
+ $cdom.'_'.$cnum => {
+ timestamp => $now,
+ section => $usec,
+ adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
+ status => 'approved',
+ }
+ );
+ my $userresult =
+ &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);
+ if ($userresult ne 'ok') {
+ push(@warn_approves,$uname.':'.$udom);
+ }
+ } 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);
+ my ($uname,$udom) = split(/:/,$user);
+ my %userrequest = (
+ $cdom.'_'.$cnum => {
+ timestamp => $now,
+ adjudicator => $env{'user.name'}.':'.$env{'user.domain'},
+ status => 'rejected',
+ }
+ );
+ my $userresult =
+ &Apache::lonnet::put($namespace,\%userrequest,$udom,$uname);
+ if ($userresult ne 'ok') {
+ push(@warn_rejects,$user);
+ }
+ }
+ }
+ 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:').'
');
+ foreach my $user (@enrolled) {
+ my ($uname,$udom) = split(/:/,$user);
+ my $userlink =
+ &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom);
+ $r->print(''.$userlink.' ');
+ }
+ $r->print(' ');
+ }
+ if (@rejections) {
+ $rejectedlist = join("\n",@rejections);
+ $r->print(''.&mt('The following enrollment requests were rejected:').'
');
+ foreach my $user (@rejections) {
+ $r->print(''.$user.' ');
+ }
+ $r->print(' ');
+ }
+ &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:').'
');
+ foreach my $user (@existing) {
+ $r->print(''.$user.' ');
+ }
+ $r->print(' ');
+ }
+ if (@missingreq) {
+ $r->print(''.&mt('The following enrollment requests were ignored because the request is no longer in the enrollment queue:').'
');
+ foreach my $user (@missingreq) {
+ $r->print(''.$user.' ');
+ }
+ $r->print(' ');
+ }
+ if (@invalidusers) {
+ $r->print(''.&mt('The following enrollment requests were deleted because the requestor does not have a LON-CAPA account:').'
');
+ foreach my $user (@invalidusers) {
+ $r->print(''.$user.' ');
+ }
+ $r->print(' ');
+ }
+ if (@limitexceeded) {
+ $r->print(''.&mt('The following enrollment requests were skipped because the enrollment limit has been reached for the course:').'
');
+ foreach my $user (@limitexceeded) {
+ $r->print(''.$user.' ');
+ }
+ $r->print(' ');
+ }
+ if (@enrollerrors) {
+ $r->print(''.&mt('The following enrollment requests could not be processed because an error occurred:').'
');
+ foreach my $user (@enrollerrors) {
+ $r->print(''.$user.' ');
+ }
+ $r->print(' ');
+ }
+ if (@warn_approves) {
+ $r->print(''.&mt("For the following users, an error occurred when updating the user's own self-enroll requests record:").'
');
+ foreach my $user (@warn_approves) {
+ $r->print(''.$user.' ');
+ }
+ $r->print(' ');
+ }
+ if (@warn_rejects) {
+ $r->print(''.&mt("For the following users, an error occurred when updating the user's own self-enroll requests record:").'
');
+ foreach my $user (@warn_rejects) {
+ $r->print(''.$user.' ');
+ }
+ $r->print(' ');
+ }
+ 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);
@@ -4063,7 +4379,7 @@ sub visible_in_cat {
miss => 'Your course does not currently appear in the Course Catalog for this domain.',
yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',
coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',
- make => 'Make any changes to self-enrollment settings below, click "Save changes", then take action to include the course in the Catalog:',
+ make => 'Make any changes to self-enrollment settings below, click "Save", then take action to include the course in the Catalog:',
take => 'Take the following action to ensure the course appears in the Catalog:',
dc_unhide => 'Ask a domain coordinator to change the "Exclude from course catalog" setting.',
dc_addinst => 'Ask a domain coordinator to enable display the catalog of "Official courses (with institutional codes)".',
@@ -5438,9 +5754,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");
}