');
+ }
}
$r->print(&Apache::loncommon::end_page());
}
sub update_roles {
- my ($r) = @_;
+ my ($r,$context) = @_;
my $now=time;
- my $rolechanges = 0;
+ my @rolechanges;
my %disallowed;
$r->print('
'.&mt('Modifying Roles').'
');
foreach my $key (keys (%env)) {
@@ -2064,7 +2092,7 @@ sub update_roles {
my $result =
&Apache::lonnet::revokerole($env{'form.ccdomain'},
$env{'form.ccuname'},
- $scope,$role);
+ $scope,$role,'','',$context);
$r->print(&mt('Revoking [_1] in [_2]: [_3]',
$role,$scope,''.$result.'').' ');
if ($role eq 'st') {
@@ -2074,16 +2102,21 @@ sub update_roles {
$now);
$r->print($result);
}
+ if (!grep(/^\Q$role\E$/,@rolechanges)) {
+ push(@rolechanges,$role);
+ }
}
if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}s) {
# Revoke custom role
$r->print(&mt('Revoking custom role:').
' '.$4.' by '.$3.':'.$2.' in '.$1.': '.
&Apache::lonnet::revokecustomrole($env{'form.ccdomain'},
- $env{'form.ccuname'},$1,$2,$3,$4).
+ $env{'form.ccuname'},$1,$2,$3,$4,'','',$context).
' ');
+ if (!grep(/^cr$/,@rolechanges)) {
+ push(@rolechanges,'cr');
+ }
}
- $rolechanges ++;
} elsif ($key=~/^form\.del/) {
if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {
# Delete standard role
@@ -2091,7 +2124,8 @@ sub update_roles {
my $result =
&Apache::lonnet::assignrole($env{'form.ccdomain'},
$env{'form.ccuname'},
- $scope,$role,$now,0,1);
+ $scope,$role,$now,0,1,'',
+ $context);
$r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,
''.$result.'').' ');
if ($role eq 'st') {
@@ -2101,6 +2135,9 @@ sub update_roles {
$now);
$r->print($result);
}
+ if (!grep(/^\Q$role\E$/,@rolechanges)) {
+ push(@rolechanges,$role);
+ }
}
if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
@@ -2110,8 +2147,10 @@ sub update_roles {
&Apache::lonnet::assigncustomrole($env{'form.ccdomain'},
$env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
0,1).' ');
+ if (!grep(/^cr$/,@rolechanges)) {
+ push(@rolechanges,'cr');
+ }
}
- $rolechanges ++;
} elsif ($key=~/^form\.ren/) {
my $udom = $env{'form.ccdomain'};
my $uname = $env{'form.ccuname'};
@@ -2139,11 +2178,15 @@ sub update_roles {
}
} else {
my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},
- $env{'form.ccuname'},$url,$role,0,$now);
+ $env{'form.ccuname'},$url,$role,0,$now,'','',
+ $context);
$output = &mt('Re-enabling [_1] in [_2]: [_3]',
$role,$url,$result).' ';
}
$r->print($output);
+ if (!grep(/^\Q$role\E$/,@rolechanges)) {
+ push(@rolechanges,$role);
+ }
}
# Re-enable custom role
if ($key=~m{^form\.ren\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
@@ -2153,8 +2196,10 @@ sub update_roles {
$url,$rdom,$rnam,$rolename,0,$now);
$r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : [_5]',
$rolename,$rnam,$rdom,$url,$result).' ');
+ if (!grep(/^cr$/,@rolechanges)) {
+ push(@rolechanges,'cr');
+ }
}
- $rolechanges ++;
} elsif ($key=~/^form\.act/) {
my $udom = $env{'form.ccdomain'};
my $uname = $env{'form.ccuname'};
@@ -2189,6 +2234,9 @@ sub update_roles {
$r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));
}
}
+ if (!grep(/^cr$/,@rolechanges)) {
+ push(@rolechanges,'cr');
+ }
} elsif ($key=~/^form\.act\_($match_domain)\_($match_name)\_([^\_]+)$/) {
# Activate roles for sections with 3 id numbers
# set start, end times, and the url for the class
@@ -2227,7 +2275,10 @@ sub update_roles {
if ($emptysec) {
$r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
}
- }
+ }
+ if (!grep(/^\Q$three\E$/,@rolechanges)) {
+ push(@rolechanges,$three);
+ }
} elsif ($key=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {
# Activate roles for sections with two id numbers
# set start, end times, and the url for the class
@@ -2237,26 +2288,31 @@ sub update_roles {
my $end = ( $env{'form.end_'.$1.'_'.$2} ?
$env{'form.end_'.$1.'_'.$2} :
0 );
- my $url='/'.$1.'/';
+ my $one = $1;
+ my $two = $2;
+ my $url='/'.$one.'/';
# split multiple sections
my %sections = ();
- my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2);
+ my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two},\%sections,$two);
if ($num_sections == 0) {
- $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
+ $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,''));
} else {
my $emptysec = 0;
foreach my $sec (sort {$a cmp $b} keys %sections) {
if ($sec ne '') {
my $securl = $url.'/'.$sec;
- $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$2,$start,$end,$1,undef,$sec));
+ $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$two,$start,$end,$one,undef,$sec));
} else {
$emptysec = 1;
}
}
if ($emptysec) {
- $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
+ $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,''));
}
}
+ if (!grep(/^\Q$two\E$/,@rolechanges)) {
+ push(@rolechanges,$two);
+ }
} else {
$r->print('
');
}
@@ -2268,19 +2324,18 @@ sub update_roles {
}
$r->print(' '.&mt('Please go back and choose a different section name.').' ');
}
- $rolechanges ++;
}
} # End of foreach (keys(%env))
# Flush the course logs so reverse user roles immediately updated
&Apache::lonnet::flushcourselogs();
- if (!$rolechanges) {
+ if (@rolechanges == 0) {
$r->print(&mt('No roles to modify'));
}
- return $rolechanges;
+ return @rolechanges;
}
sub enroll_single_student {
- my ($r,$uhome,$amode,$genpwd,$now,$newuser) = @_;
+ my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context) = @_;
$r->print('
'.&mt('Enrolling Student').'
');
# Remove non alphanumeric values from section
@@ -2295,7 +2350,7 @@ sub enroll_single_student {
$env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'},
$env{'form.cmiddlename'},$env{'form.clastname'},
$env{'form.generation'},$env{'form.sections'},$enddate,
- $startdate,'manual',undef,$env{'request.course.id'});
+ $startdate,'manual',undef,$env{'request.course.id'},'',$context);
if ($enroll_result =~ /^ok/) {
$r->print(&mt('[_1] enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'}));
if ($env{'form.sections'} ne '') {
@@ -2504,7 +2559,7 @@ sub custom_role_editor {
'crl' => "Course Level",
'dml' => "Domain Level",
'ssl' => "System Level");
- $r->print('Select a Template ');
+ $r->print(&mt('Select a Template').' ');
$r->print('');
@@ -2714,7 +2769,8 @@ sub handler {
$context = 'domain';
}
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
- ['action','state','callingform','roletype','showrole','bulkaction']);
+ ['action','state','callingform','roletype','showrole','bulkaction','popup','phase',
+ 'username','domain','srchterm','srchdomain','srchin','srchby','srchtype']);
&Apache::lonhtmlcommon::clear_breadcrumbs();
if ($env{'form.action'} ne 'dateselect') {
&Apache::lonhtmlcommon::add_breadcrumb
@@ -2771,7 +2827,6 @@ sub handler {
foreach my $item (@search) {
$srch->{$item} = $env{'form.'.$item};
}
-
if (($phase eq 'get_user_info') || ($phase eq 'userpicked') ||
($phase eq 'createnewuser')) {
if ($env{'form.phase'} eq 'createnewuser') {
@@ -2794,14 +2849,8 @@ sub handler {
$currstate = $env{'form.currstate'};
}
if ($currstate eq 'select') {
- my $operation;
- if ($env{'form.action'} eq 'singleuser') {
- $operation = 'createuser';
- } elsif ($env{'form.action'} eq 'singlestudent') {
- $operation = 'enrollstudent';
- }
&print_user_selection_page($r,$response,$srch,$results,
- $operation,\@search,$context);
+ \@search,$context);
} elsif ($currstate eq 'modify') {
my ($ccuname,$ccdomain);
if (($srch->{'srchby'} eq 'uname') &&
@@ -2823,6 +2872,7 @@ sub handler {
} elsif ($currstate eq 'query') {
&print_user_query_page($r,'createuser');
} else {
+ $env{'form.phase'} = '';
&print_username_entry_form($r,$context,$response,$srch,
$forcenewuser);
}
@@ -2923,6 +2973,34 @@ sub handler {
''.&mt('You do not have permission to modify dates or sections for users').''.
&Apache::loncommon::end_page());
}
+ } elsif ($env{'form.action'} eq 'selfenroll') {
+ $r->print(&header());
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=selfenroll',
+ text=>"Configure Self-enrollment"});
+ if (!exists($env{'form.state'})) {
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Configure Self-enrollment',
+ 'Course_Self_Enrollment'));
+
+ &print_selfenroll_menu($r,$context,$permission);
+ } elsif ($env{'form.state'} eq 'done') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=selfenroll',
+ text=>"Result"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Self-enrollment result',
+ 'Course_Self_Enrollment'));
+ &update_selfenroll_config($r,$context);
+ }
+ $r->print(&Apache::loncommon::end_page());
+ } elsif ($env{'form.action'} eq 'changelogs') {
+ $r->print(&header());
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=changelogs',
+ text=>"User Management Logs"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Changes',
+ 'Course_User_Logs'));
+ &print_userchangelogs_display($r,$context,$permission);
+ $r->print(&Apache::loncommon::end_page());
} else {
$r->print(&header());
$r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
@@ -3027,16 +3105,32 @@ sub print_main_menu {
if (!exists($permission->{'cusr_section'})) {
push(@courselinks,
{ text => 'Automated Student Enrollment Manager',
+ help => 'Course_Automated_Enrollment',
permission => (&Apache::lonnet::auto_run($cnum,$cdom)
&& $permission->{'cusr'}),
url => '/adm/populate',
- });
+ },
+ { text => 'Configure User Self-enrollment',
+ help => 'Course_Self_Enrollment',
+ action => 'selfenroll',
+ permission => $permission->{'cusr'},
+ });
}
push(@courselinks,
{ text => 'Manage Course Groups',
help => 'Course_Manage_Group',
permission => $permission->{'grp_manage'},
url => '/adm/coursegroups?refpage=cusr',
+ },
+ { text => 'View Log-in History',
+ help => 'Course_User_Logins',
+ action => 'logins',
+ permission => $permission->{'cusr'},
+ },
+ { text => 'View Change Logs',
+ help => 'Course_User_Logs',
+ action => 'changelogs',
+ permission => $permission->{'cusr'},
});
push(@menu,@courselinks);
}
@@ -3044,6 +3138,10 @@ sub print_main_menu {
foreach my $menu_item (@menu) {
next if (! $menu_item->{'permission'});
$menu_html.='
';
+ if (exists($menu_item->{'help'})) {
+ $menu_html.=
+ &Apache::loncommon::help_open_topic($menu_item->{'help'});
+ }
$menu_html.='';
if (exists($menu_item->{'url'})) {
$menu_html.=qq{};
@@ -3052,10 +3150,6 @@ sub print_main_menu {
qq{};
}
$menu_html.= &mt($menu_item->{'text'}).'';
- if (exists($menu_item->{'help'})) {
- $menu_html.=
- &Apache::loncommon::help_open_topic($menu_item->{'help'});
- }
$menu_html.='
';
}
return $menu_html;
@@ -3072,6 +3166,355 @@ sub restore_prev_selections {
\%saveable_parameters);
}
+sub print_selfenroll_menu {
+ my ($r,$context,$permission) = @_;
+ my $formname = 'enrollstudent';
+ my $nolink = 1;
+ my ($row,$lt) = &get_selfenroll_titles();
+ my $groupslist = &Apache::lonuserutils::get_groupslist();
+ my $setsec_js =
+ &Apache::lonuserutils::setsections_javascript($formname,$groupslist);
+ my $output = ''."\n".
+ '
'.$lt->{'selfenroll'}.'
'."\n".
+ '';
+ $r->print($output);
+ return;
+}
+
+sub selfenroll_date_forms {
+ my ($startform,$endform) = @_;
+ my $output .= &Apache::lonhtmlcommon::start_pick_box()."\n".
+ &Apache::lonhtmlcommon::row_title(&mt('Starts'),
+ 'LC_oddrow_value')."\n".
+ $startform."\n".
+ &Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::row_title(&mt('Ends'),
+ 'LC_oddrow_value')."\n".
+ $endform."\n".
+ &Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::end_pick_box();
+ return $output;
+}
+
+sub print_userchangelogs_display {
+ my ($r,$context,$permission) = @_;
+ my $formname = 'roleslog';
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);
+ if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }
+
+ $r->print('');
+ return;
+}
+
+sub role_display_filter {
+ my ($formname,$cdom,$cnum,$curr) = @_;
+ my $context = 'course';
+ my $nolink = 1;
+ my $output = '
'.&mt("You are not authorized to create new users in your current role's domain - [_1].",$env{'request.role.domain'}).' '.&mt('Contact the helpdesk if you need to create a new user.',$helplink).'
';
@@ -3674,7 +4121,7 @@ sub course_level_dc {
'
'.
'
'.$lt{'new'}.' '.
''.
- ''.
+ ''.
'
'.
'';
$otheritems .= <print('
'.$lt->{'selfenroll'}.'
'."\n");
+ if (ref($row) eq 'ARRAY') {
+ foreach my $item (@{$row}) {
+ if ($item eq 'enroll_dates') {
+ my (%currenrolldate,%newenrolldate);
+ foreach my $type ('start','end') {
+ $currenrolldate{$type} = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$type.'_date'};
+ $newenrolldate{$type} = &Apache::lonhtmlcommon::get_date_from_form('selfenroll_'.$type.'_date');
+ if ($newenrolldate{$type} ne $currenrolldate{$type}) {
+ $changes{'internal.selfenroll_'.$type.'_date'} = $newenrolldate{$type};
+ }
+ }
+ } elsif ($item eq 'access_dates') {
+ my (%currdate,%newdate);
+ foreach my $type ('start','end') {
+ $currdate{$type} = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$type.'_access'};
+ $newdate{$type} = &Apache::lonhtmlcommon::get_date_from_form('selfenroll_'.$type.'_access');
+ if ($newdate{$type} ne $currdate{$type}) {
+ $changes{'internal.selfenroll_'.$type.'_access'} = $newdate{$type};
+ }
+ }
+ } else {
+ my $curr_val =
+ $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$item};
+ my $newval = $env{'form.selfenroll_'.$item};
+ if ($item eq 'section') {
+ $newval = $env{'form.sections'};
+ if (grep(/^\Q$newval\E$/,keys(%{$groupslist}))) {
+ $newval = $curr_val;
+ $warning{$item} = &mt('Section for self-enrolled users unchanged as the proposed section is a group').' '.&mt('Group names and section names must be distinct');
+ } elsif ($newval eq 'all') {
+ $newval = $curr_val;
+ $warning{$item} = &mt("Section for self-enrolled users unchanged, as 'all' is a reserved section name.");
+ }
+ if ($newval eq '') {
+ $newval = 'none';
+ }
+ }
+ if ($newval ne $curr_val) {
+ $changes{'internal.selfenroll_'.$item} = $newval;
+ }
+ }
+ }
+ if (keys(%warning) > 0) {
+ foreach my $item (@{$row}) {
+ if (exists($warning{$item})) {
+ $r->print($warning{$item}.' ');
+ }
+ }
+ }
+ if (keys(%changes) > 0) {
+ my $putresult = &Apache::lonnet::put('environment',\%changes,$cdom,$cnum);
+ if ($putresult eq 'ok') {
+ if ((exists($changes{'internal.selfenroll_types'})) ||
+ (exists($changes{'internal.selfenroll_start_date'})) ||
+ (exists($changes{'internal.selfenroll_end_date'}))) {
+ my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',
+ $cnum,undef,undef,'Course');
+ my $chome = &Apache::lonnet::homeserver($cnum,$cdom);
+ if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
+ foreach my $item ('selfenroll_types','selfenroll_start_date','selfenroll_end_date') {
+ if (exists($changes{'internal.'.$item})) {
+ $crsinfo{$env{'request.course.id'}}{$item} =
+ $changes{'internal.'.$item};
+ }
+ }
+ my $crsputresult =
+ &Apache::lonnet::courseidput($cdom,\%crsinfo,
+ $chome,'notime');
+ }
+ }
+ $r->print(&mt('The following changes were made to self-enrollment settings:').'
');
+ foreach my $item (@{$row}) {
+ my $title = $item;
+ if (ref($lt) eq 'HASH') {
+ $title = $lt->{$item};
+ }
+ if ($item eq 'enroll_dates') {
+ foreach my $type ('start','end') {
+ if (exists($changes{'internal.selfenroll_'.$type.'_date'})) {
+ my $newdate = &Apache::lonlocal::locallocaltime($changes{'internal.selfenroll_'.$type.'_date'});
+ $r->print('
'.&mt('[_1]: [_2] set to "[_3]".',
+ $title,$type,$newdate).'
');
+ }
+ }
+ } elsif ($item eq 'access_dates') {
+ foreach my $type ('start','end') {
+ if (exists($changes{'internal.selfenroll_'.$type.'_access'})) {
+ my $newdate = &Apache::lonlocal::locallocaltime($changes{'internal.selfenroll_'.$type.'_access'});
+ $r->print('
'.&mt('[_1]: [_2] set to "[_3]".',
+ $title,$type,$newdate).'