--- loncom/interface/selfenroll.pm 2008/06/03 03:07:38 1.4
+++ loncom/interface/selfenroll.pm 2008/07/14 10:25:25 1.11
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Allow users to self-enroll in a course
#
-# $Id: selfenroll.pm,v 1.4 2008/06/03 03:07:38 raeburn Exp $
+# $Id: selfenroll.pm,v 1.11 2008/07/14 10:25:25 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -33,6 +33,7 @@ use Apache::Constants qw(:common);
use Apache::lonnet;
use Apache::loncommon;
use Apache::lonlocal;
+use Apache::createaccount;
use LONCAPA qw(:DEFAULT :match);
sub handler {
@@ -44,6 +45,7 @@ sub handler {
}
my $handle = &Apache::lonnet::check_for_valid_session($r);
my $lonidsdir=$r->dir_config('lonIDsDir');
+ my $lonhost = $r->dir_config('lonHostID');
if ($handle ne '') {
&Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
}
@@ -51,27 +53,32 @@ sub handler {
&Apache::lonlocal::get_language_handle($r);
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cid']);
my ($coursechk,$cid) = &validate_course_id($env{'form.cid'});
- my $start_page =
- &Apache::loncommon::start_page('Self-enroll in a LON-CAPA course','',
- {'no_inline_link' => 1,});
- $r->print($start_page);
- &Apache::lonhtmlcommon::clear_breadcrumbs();
- &Apache::lonhtmlcommon::add_breadcrumb
- ({href=>"/adm/selfenroll?cid=$cid",
- text=>"Self-enroll"});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('Self-enroll in course'));
if ($coursechk ne 'ok') {
- $r->print(&mt('Invalid domain or course number'));
+ &page_header($r,$cid);
+ $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);
my $now = time;
+ my $js;
+ if ($env{'form.phase'} eq 'login') {
+ $js = &Apache::createaccount::javascript_setforms($now);
+ }
+ &page_header($r,$cid,$js);
+ my $include = $r->dir_config('lonIncludes');
+ if ($env{'form.phase'} eq 'login') {
+ my $jsh=Apache::File->new($include."/londes.js");
+ $r->print(<$jsh>);
+ }
+ my ($cdom,$cnum,$desc,$canenroll,$selfenroll_types,$selfenroll_registered,
+ @cancreate,$knownuser,$selfenroll_access_start,$selfenroll_access_end,
+ $selfenroll_section,$selfenroll_future,%curr_role,%coursehash,$cdomdesc);
%coursehash = &Apache::lonnet::coursedescription($cid);
$cdom = $coursehash{'domain'};
$cnum = $coursehash{'num'};
+ $desc = $coursehash{'description'};
$selfenroll_types = $coursehash{'internal.selfenroll_types'};
$selfenroll_registered = $coursehash{'internal.selfenroll_registered'};
$selfenroll_section = $coursehash{'internal.selfenroll_section'};
@@ -80,21 +87,59 @@ 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*)$-) {
my $sec = $1;
- if ($sec eq '') {
- $sec = &mt('none');
- }
my ($start,$end) = split(/\./,$env{$key});
my $status = 'active';
if (($end) && ($end<=$now)) {
@@ -106,6 +151,9 @@ sub handler {
if ($status eq 'active' || $status eq 'future') {
$curr_role{'status'} = $status;
$curr_role{'section'} = $sec;
+ if ($curr_role{'section'} eq '') {
+ $curr_role{'section'} = &mt('none');
+ }
$curr_role{'start'} = &Apache::lonlocal::locallocaltime($start);
$curr_role{'role'} = 'st./'.$cdom.'/'.$cnum;
if ($sec ne '') {
@@ -131,20 +179,33 @@ sub handler {
if ($sso_url eq '') {
$sso_url = $login_path;
}
- my $missing_formitem = &mt('The link to the requested page could not be followed.')."\\n".&mt('The placeholder for the courseID is absent.');
+ $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,
$selfenroll_access_start,$selfenroll_access_end,
$selfenroll_section,$now);
+ } elsif ($env{'form.phase'} eq 'login') {
+ my $submit_text = &mt('Log in');
+ $r->print(''.&mt('Log-in to LON-CAPA').'
');
+ my $udom = &Apache::lonnet::default_login_domain();
+ $r->print(&Apache::createaccount::login_box($now,$lonhost,$cid,
+ $submit_text,$udom,'selfenroll'));
+ $r->print(&mt('You will be able to self-enroll in the course you selected ([_1]) after you have successfully logged in.',''.$desc.'').
+ &Apache::loncommon::end_page());
+ return OK;
} elsif (@cancreate > 0) {
$r->print(<
function setPath(formaction,item,arg) {
- document.forms.logmein.action = formaction;
+ if (formaction != '') {
+ document.forms.logmein.action = formaction;
+ }
var itemid = getIndexByName("setting");
if (itemid > -1) {
document.logmein.elements[itemid].name = item;
@@ -166,7 +227,8 @@ function getIndexByName(item) {
}
END
- $r->print(&mt('You need to be logged into LON-CAPA to self-enroll in a course.').'- '.&mt('If you have an account in LON-CAPA, [_1]log-in[_2].','','').'
');
+ $r->print(''.&mt('LON-CAPA account required').'
'.
+ &mt('You need to be logged into LON-CAPA to self-enroll in a course.').'- '.&mt('If you have an account in LON-CAPA, [_1]log-in[_2].','','').'
');
if (@cancreate > 1) {
$r->print('- '.&mt('Otherwise:').'
');
my $count = 0;
@@ -196,28 +258,47 @@ END
}
}
if ($selfenroll_types eq '*') {
- $r->print('
'.&mt('You will have an opportunity to self enroll in the course once the account has been created.').'
');
+ $r->print('
'.&mt('You will be able to self enroll in this course once the account has been created.').'
');
} 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".
&Apache::loncommon::end_page());
return OK;
}
+sub page_header {
+ my ($r,$cid,$js) = @_;
+ my $start_page =
+ &Apache::loncommon::start_page('Self-enroll in a LON-CAPA course',$js,
+ {'no_inline_link' => 1,});
+ $r->print($start_page);
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/selfenroll?cid=$cid",
+ text=>"Self-enroll"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Self-enroll in course'));
+ return;
+}
+
sub validate_course_id {
my ($cid) = @_;
my ($cdom,$cnum) = ($env{'form.cid'} =~ /^($match_domain)_($match_courseid)$/);
@@ -264,9 +345,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,27 +357,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 = &unescape(split(/:/,$userhash{'inststatus'}));
- if (@inststatuses == 0) {
- push(@inststatuses,'other');
- }
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});
}
}
}
@@ -310,7 +385,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 officially registered students.').'
');
+ $r->print(''.&mt('Self-enrollment unavailable').'
'.&mt('Self-enrollment is restricted to students officially registered for this course.').'
');
if ($message) {
$r->print($message);
} else {
@@ -321,7 +396,8 @@ sub process_self_enroll {
}
my $enrollresult =
&Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,
- undef,undef,$usec,$selfenroll_access_end,$selfenroll_access_start, 'manual',undef,$cdom.'_'.$cnum,$selfenroll);
+ undef,undef,$usec,$selfenroll_access_end,$selfenroll_access_start,
+ 'manual',undef,$cdom.'_'.$cnum,$selfenroll);
if ($enrollresult eq 'ok') {
my (%userroles,%newrole,%newgroups);
my $role = 'st';
@@ -335,7 +411,8 @@ sub process_self_enroll {
$area);
&Apache::lonnet::set_userprivs(\%userroles,\%newrole,%newgroups);
$userroles{'user.role.'.$spec} = $selfenroll_access_start.'.'.$selfenroll_access_end;
- &Apache::lonnet::appenv(\%userroles,[$role]);
+ &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 {
@@ -355,18 +432,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";
@@ -379,7 +481,7 @@ function SelectRole() {
END
$output .= ''."\n".
&mt('Enter course now').''."\n".
- '';
@@ -405,10 +507,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}}
}
}
}
@@ -420,27 +539,29 @@ 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): ').'';
- foreach my $selfdom (sort(keys(%{$longtypes}))) {
- if (ref($longtypes->{$selfdom}) eq 'ARRAY') {
- $output .= '- '.$selfdom.': '.join(', ',@{$longtypes->{$selfdom}}).'
';
- }
+ $output = &mt('Self-enrollment is not currently available for this course for users affiliated with [_1].',$domdesc);
+ }
+ } elsif (keys(%{$longtypes}) > 0) {
+ $output = &mt('Self-enrollment in this course is only available to users affiliated with the following institutions, and who have the required status:').' ';
+ foreach my $selfdom (sort(keys(%{$longtypes}))) {
+ my $selfdomdesc = &Apache::lonnet::domain($selfdom,'description');
+ if (ref($longtypes->{$selfdom}) eq 'ARRAY') {
+ $output .= '- '.$selfdomdesc.': '.join(', ',@{$longtypes->{$selfdom}}).'
';
}
- $output .= '
';
}
+ $output .= '
';
} else {
- $output = &mt('Self-enrollment is not currently available in this course');
+ $output = &mt('Self-enrollment is not currently available for this course.');
}
}
return $output;