--- loncom/interface/selfenroll.pm 2008/07/10 00:19:56 1.8 +++ loncom/interface/selfenroll.pm 2008/07/11 13:43:53 1.9 @@ -1,7 +1,7 @@ # The LearningOnline Network # Allow users to self-enroll in a course # -# $Id: selfenroll.pm,v 1.8 2008/07/10 00:19:56 raeburn Exp $ +# $Id: selfenroll.pm,v 1.9 2008/07/11 13:43:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -61,13 +61,14 @@ sub handler { text=>"Self-enroll"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Self-enroll in course')); if ($coursechk ne 'ok') { - $r->print(&mt('Invalid domain or course number')); + $r->print('

'.&mt('Self-enrollment error').'

'. + ''.&mt('Invalid domain or course number').''); $r->print(&Apache::loncommon::end_page()); return OK; } my ($cdom,$cnum,$canenroll,$selfenroll_types,$selfenroll_registered, @cancreate,$knownuser,$selfenroll_access_start,$selfenroll_access_end, - $selfenroll_section,%curr_role,%coursehash); + $selfenroll_section,$selfenroll_future,%curr_role,%coursehash,$cdomdesc); my $now = time; %coursehash = &Apache::lonnet::coursedescription($cid); $cdom = $coursehash{'domain'}; @@ -80,14 +81,55 @@ sub handler { if ($selfenroll_types ne '') { my $start = $coursehash{'internal.selfenroll_start_date'}; my $end = $coursehash{'internal.selfenroll_end_date'}; - if (($start > 0 && $start < $now) && ($end > 0 && $end > $now)) { + if (($start > 0 && $start < $now) && (($end == 0) || ($end > 0 && $end > $now))) { $canenroll = 1; + } elsif (($end == 0) || ($end > 0 && $end > $now)) { + if ($start > $now) { + $selfenroll_future = &Apache::lonlocal::locallocaltime($start); + } } } + $knownuser = &user_is_known(); if (!$canenroll) { - $r->print(&mt('Self-enrollment is not currently available for this course.').'

'); + $r->print('

'.&mt('Self-enrollment unavailable').'

'. + &mt('Self-enrollment is not currently available for this course.'). + '

'); + if ($selfenroll_types ne '') { + if ($selfenroll_future ne '') { + if ($selfenroll_types eq '*') { + $r->print(&mt('Self-enrollment will become available starting [_1], and will be available to all LON-CAPA users.',$selfenroll_future).'
'); + } else { + my ($enrolltypes,$longtypes,$alldoms); + if ($knownuser) { + &get_selfenroll_filters($selfenroll_types,$env{'user.domain'}); + my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); + if (ref($enrolltypes) eq 'HASH') { + if (ref($enrolltypes->{$env{'user.domain'}}) eq 'ARRAY') { + if (grep(/^any$/,@{$enrolltypes->{$env{'user.domain'}}})) { + $r->print(&mt('Self-enrollment will become available starting [_1], and will be available to all LON-CAPA users at your institution ([_2]).', + $selfenroll_future,$domdesc).'
'); + + } else { + if (&user_can_selfenroll($env{'user.domain'}, + $env{'user.name'}, + $enrolltypes->{$env{'user.domain'}})) { + $r->print(&mt('Self-enrollment will become available starting [_1]; please enroll at that time.',$selfenroll_future)); + } else { + $r->print(&mt('Although self-enrollment will become available starting [_1], you are ineligible for enrollment.',$selfenroll_future).'
'); + $r->print(&print_selfenroll_types($longtypes,$env{'user.domain'})); + } + } + } + } + } else { + $r->print(&mt('Self-enrollment will become available starting [_1].', + $selfenroll_future).'
'); + $r->print(&print_selfenroll_types($longtypes)); + } + } + } + } } - $knownuser = &user_is_known(); if ($knownuser) { foreach my $key (keys(%env)) { if ($key =~ m-^user\.role\.st\./$cdom/$cnum/?(\w*)$-) { @@ -134,7 +176,9 @@ sub handler { my $missing_formitem = &mt('The link to the requested page could not be followed.')."\\n".&mt('The placeholder for the courseID is absent.'); if ($knownuser) { if (keys(%curr_role)) { - $r->print(&has_role(%curr_role)); + $r->print('

'.&mt('Self-enrollment unavailable').'

'. + ''.&has_role(%curr_role).''); + $r->print(&Apache::loncommon::end_page()); return OK; } &process_self_enroll($r,$cdom,$cnum,$selfenroll_types,$selfenroll_registered, @@ -166,7 +210,8 @@ function getIndexByName(item) { } END - $r->print(&mt('You need to be logged into LON-CAPA to self-enroll in a course.').''); } else { $r->print(''); my ($enrolltypes,$longtypes,$alldoms) = - &get_selfenroll_filters($selfenroll_types,$cdom); - $r->print(&print_selfenroll_types($longtypes,$cdom)); + &get_selfenroll_filters($selfenroll_types); + $r->print(&print_selfenroll_types($longtypes)); } } else { - $r->print(&mt('You must [_1]log-in[_2] to LON-CAPA with an existing account to be able to enroll in this course, as account creation is not permitted when self-enrolling.','','')); + my $cdomdesc = &Apache::lonnet::domain($cdom,'description'); + $r->print('

'.&mt('LON-CAPA account required').'

'); + $r->print(&mt('You must [_1]log-in[_2] to LON-CAPA with an existing account to be able to enroll in this course, as account creation at this institution ([_3]) is not permitted when self-enrolling.','','',$cdomdesc)); if ($selfenroll_types ne '*') { my ($enrolltypes,$longtypes,$alldoms) = &get_selfenroll_filters($selfenroll_types); - $r->print('

'.&print_selfenroll_types($longtypes)); + $r->print('
'.&print_selfenroll_types($longtypes)); } + my $displayurl = &escape($firsturl); + $r->print(&mt('Submit a request to the LON-CAPA [_1]helpdesk[_2] for [_3] if you require assistance.','','',$cdomdesc)); } $r->print('
'."\n". ''."\n". @@ -264,9 +313,9 @@ sub has_role { my $output; if ($curr_role{'status'} eq 'active') { my $rolelink = &jump_to_role($curr_role{'role'}); - $output = &mt('You currently have an active role (section: "[_1]") in this course.',$curr_role{'section'}).' '.$rolelink; + $output = &mt('You already have an active student role (section: "[_1]") in this course.',$curr_role{'section'}).'
'.$rolelink; } elsif ($curr_role{'status'} eq 'future') { - $output = &mt('You have a role (section: "[_1]") in this course which will become active [_2].',$curr_role{'section'},$curr_role{'start'}); + $output = &mt('You have a student role (section: "[_1]") in this course which will become active [_2].',$curr_role{'section'},$curr_role{'start'}); } return $output; } @@ -276,30 +325,21 @@ sub process_self_enroll { $selfenroll_access_start,$selfenroll_access_end,$selfenroll_section,$now) = @_; my $udom = $env{'user.domain'}; my $uname = $env{'user.name'}; - my @info = ['inststatus']; - my %userhash = &Apache::lonnet::userenvironment($udom,$uname,@info); - my ($enrolltypes,$longtypes,$alldoms) = - &get_selfenroll_filters($selfenroll_types,$udom); - my @inststatuses; - if ($userhash{'inststatus'} eq '') { - push(@inststatuses,'other'); - } else { - my @esc_statuses = split(/:/,$userhash{'inststatus'}); - @inststatuses = map { &unescape($_); } (@esc_statuses); - } my $selfenroll = 0; - if ($alldoms) { + my ($enrolltypes,$longtypes,$alldoms); + if ($selfenroll_types eq '*') { $selfenroll = 1; - } elsif (ref($enrolltypes) eq 'HASH') { - if (ref($enrolltypes->{$udom}) eq 'ARRAY') { - if (grep(/^any$/,@{$enrolltypes->{$udom}})) { - $selfenroll = 1; - } else { - foreach my $type (@inststatuses) { - if (grep(/^\Q$type\E$/,@{$enrolltypes->{$udom}})) { - $selfenroll = 1; - last; - } + } else { + ($enrolltypes,$longtypes,$alldoms) = + &get_selfenroll_filters($selfenroll_types,$udom); + if ($alldoms) { + $selfenroll = 1; + } elsif (ref($enrolltypes) eq 'HASH') { + if (ref($enrolltypes->{$udom}) eq 'ARRAY') { + if (grep(/^any$/,@{$enrolltypes->{$udom}})) { + $selfenroll = 1; + } else { + $selfenroll = &user_can_selfenroll($udom,$uname,$enrolltypes->{$udom}); } } } @@ -313,7 +353,7 @@ sub process_self_enroll { my ($registered,$instsec,$message) = &check_registered($cdom,$cnum); $usec = $instsec; if (!$registered) { - $r->print(&mt('Self-enrollment is restricted to students officially registered for this course.').'
'); + $r->print('

'.&mt('Self-enrollment unavailable').'

'.&mt('Self-enrollment is restricted to students officially registered for this course.').'
'); if ($message) { $r->print($message); } else { @@ -340,6 +380,7 @@ sub process_self_enroll { &Apache::lonnet::set_userprivs(\%userroles,\%newrole,%newgroups); $userroles{'user.role.'.$spec} = $selfenroll_access_start.'.'.$selfenroll_access_end; &Apache::lonnet::appenv(\%userroles,[$role,'cm']); + $r->print('

'.&mt('Enrollment process complete').'

'); if ($selfenroll_access_end && $selfenroll_access_end <= $now) { $r->print(&mt('The end date for access to this course for users who self-enroll has passed.').'
'.&mt('Consequently, although a new role was created for you in the course, it is an inactive role which does not provide access to the course.')); } else { @@ -359,18 +400,43 @@ sub process_self_enroll { } } } else { - $r->print(&mt('Self-enrollment in this course failed.')); + $r->print('

'.&mt('Enrollment incomplete').'

'. + &mt('Self-enrollment in this course failed.')); if ($enrollresult ne '') { $r->print(''.$enrollresult.''); } } } else { - $r->print(&mt('You are not permitted to enroll yourself in this course.').'
'); + $r->print('

'.&mt('Self-enrollment unavailable').'

'. + &mt('You are not permitted to enroll yourself in this course.').'
'); $r->print(&print_selfenroll_types($longtypes)); } return; } +sub user_can_selfenroll { + my ($udom,$uname,$domenrolltypes) = @_; + my $selfenroll = 0; + my @info = ['inststatus']; + my %userhash = &Apache::lonnet::userenvironment($udom,$uname,@info); + my @inststatuses; + if ($userhash{'inststatus'} eq '') { + push(@inststatuses,'other'); + } else { + my @esc_statuses = split(/:/,$userhash{'inststatus'}); + @inststatuses = map { &unescape($_); } (@esc_statuses); + } + foreach my $type (@inststatuses) { + if (ref($domenrolltypes) eq 'ARRAY') { + if (grep(/^\Q$type\E$/,@{$domenrolltypes})) { + $selfenroll = 1; + last; + } + } + } + return $selfenroll; +} + sub jump_to_role { my ($role) = @_; my $output = <<"END"; @@ -383,7 +449,7 @@ function SelectRole() { END $output .= ''."\n". &mt('Enter course now').''."\n". - ''."\n". + ''."\n". ''."\n". ''."\n". '
'; @@ -409,10 +475,27 @@ sub get_selfenroll_filters { my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($selfdom); if (ref($usertypes) eq 'HASH') { - $usertypes->{'any'} = &mt('any'); - $usertypes->{'other'} = &mt('other'); - @{$enrolltypes{$selfdom}} = @types; - @{$longtypes{$selfdom}} = map {$usertypes->{$_}} @types; + my $anytype = 1; + foreach my $key (keys(%{$usertypes})) { + if (!grep(/^\Q$key\E$/,@types)) { + $anytype = 0; + last; + } + } + if ($anytype) { + if (!(grep(/^other$/,@types))) { + $anytype = 0; + } + } + $usertypes->{'any'} = &mt('Any users'); + $usertypes->{'other'} = &mt('Others'); + if ($anytype) { + @{$enrolltypes{$selfdom}} = ('any'); + } else { + @{$enrolltypes{$selfdom}} = @types; + } + @{$longtypes{$selfdom}} = + map {$usertypes->{$_}} @{$enrolltypes{$selfdom}} } } } @@ -424,25 +507,27 @@ sub print_selfenroll_types { my ($longtypes,$domain) = @_; my $output; if (ref($longtypes) eq 'HASH') { - if (keys(%{$longtypes}) > 0) { - if ($domain ne '') { - if (ref($longtypes->{$domain}) eq 'ARRAY') { - if (grep(/^any$/,@{$longtypes->{$domain}})) { - $output = &mt('Self-enrollment in this course is only available to users in domain "[_1]".',$domain); - } else { - my $status_str = join(', ',@{$longtypes->{$domain}}); - $output = &mt('Self-enrollment in this course is only available to users in domain "[_1]" who have the following status: "[_2]".',$domain,$status_str); - } + if ($domain ne '') { + my $domdesc = &Apache::lonnet::domain($domain,'description'); + if (ref($longtypes->{$domain}) eq 'ARRAY') { + if (grep(/^any$/,@{$longtypes->{$domain}})) { + $output = &mt('Self-enrollment in this course is available to any user affiliated with [_1].',$domdesc); + } else { + my $status_str = join(', ',@{$longtypes->{$domain}}); + $output = &mt('Self-enrollment in this course is only available to users affiliated with [_1] who have the following status: "[_2]".',$domdesc,$status_str); } } else { - $output = &mt('Self-enrollment in this course is only available to users in the following domains (with the following status):').' '; } else { $output = &mt('Self-enrollment is not currently available for this course.'); }