'.
&Apache::loncommon::end_data_table_row()."\n";
} else {
- $outcome .= ' ('.$authformcurrent.')';
+ $outcome .= ' ('.$authformcurrent.')'.
+ &Apache::loncommon::end_data_table_row()."\n";
}
if ($authform_other ne '') {
$outcome .= $authform_other;
@@ -1450,8 +1395,8 @@ sub update_user_data {
$env{'form.ccdomain'});
# Error messages
my $error = ''.&mt('Error').': ';
- my $end = '
'.
- ''.
&mt('Return to previous page').''.&Apache::loncommon::end_page();
my $title;
@@ -1489,25 +1434,25 @@ sub update_user_data {
$r->print(&update_result_form($uhome));
# Check Inputs
if (! $env{'form.ccuname'} ) {
- $r->print($error.&mt('No login name specified').'.'.$end);
+ $r->print($error.&mt('No login name specified').'.'.$end.$rtnlink);
return;
}
if ( $env{'form.ccuname'} ne
&LONCAPA::clean_username($env{'form.ccuname'}) ) {
$r->print($error.&mt('Invalid login name').'. '.
&mt('Only letters, numbers, periods, dashes, @, and underscores are valid').'.'.
- $end);
+ $end.$rtnlink);
return;
}
if (! $env{'form.ccdomain'} ) {
- $r->print($error.&mt('No domain specified').'.'.$end);
+ $r->print($error.&mt('No domain specified').'.'.$end.$rtnlink);
return;
}
if ( $env{'form.ccdomain'} ne
&LONCAPA::clean_domain($env{'form.ccdomain'}) ) {
$r->print($error.&mt ('Invalid domain name').'. '.
&mt('Only letters, numbers, periods, dashes, and underscores are valid').'.'.
- $end);
+ $end.$rtnlink);
return;
}
if (! exists($env{'form.makeuser'})) {
@@ -1543,19 +1488,19 @@ sub update_user_data {
# If they are creating a new user but have not specified login
# information this will be caught below.
} else {
- $r->print($error.&mt('Invalid login mode or password').$end);
+ $r->print($error.&mt('Invalid login mode or password').$end.$rtnlink);
return;
}
$r->print('
'.&mt('User [_1] in domain [_2]',
$env{'form.ccuname'}, $env{'form.ccdomain'}).'
');
-
+ my (%alerts,%rulematch,%inst_results,%curr_rules);
if ($env{'form.makeuser'}) {
$r->print('
'.&mt('Creating new account.').'
');
# Check for the authentication mode and password
if (! $amode || ! $genpwd) {
- $r->print($error.&mt('Invalid login mode or password').$end);
+ $r->print($error.&mt('Invalid login mode or password').$end.$rtnlink);
return;
}
# Determine desired host
@@ -1566,13 +1511,43 @@ sub update_user_data {
my %home_servers =
&Apache::lonnet::get_servers($env{'form.ccdomain'},'library');
if (! exists($home_servers{$desiredhost})) {
- $r->print($error.&mt('Invalid home server specified'));
+ $r->print($error.&mt('Invalid home server specified').$end.$rtnlink);
return;
}
}
+ # Check ID format
+ my %checkhash;
+ my %checks = ('id' => 1);
+ %{$checkhash{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}}} = (
+ 'newuser' => 1,
+ 'id' => $env{'form.cid'},
+ );
+ if ($env{'form.cid'} ne '') {
+ &Apache::loncommon::user_rule_check(\%checkhash,\%checks,\%alerts,
+ \%rulematch,\%inst_results,\%curr_rules);
+ if (ref($alerts{'id'}) eq 'HASH') {
+ if (ref($alerts{'id'}{$env{'form.ccdomain'}}) eq 'HASH') {
+ my $domdesc =
+ &Apache::lonnet::domain($env{'form.ccdomain'},'description');
+ if ($alerts{'id'}{$env{'form.ccdomain'}}{$env{'form.cid'}}) {
+ my $userchkmsg;
+ if (ref($curr_rules{$env{'form.ccdomain'}}) eq 'HASH') {
+ $userchkmsg =
+ &Apache::loncommon::instrule_disallow_msg('id',
+ $domdesc,1).
+ &Apache::loncommon::user_rule_formats($env{'form.ccdomain'},
+ $domdesc,$curr_rules{$env{'form.ccdomain'}}{'id'},'id');
+ }
+ $r->print($error.&mt('Invalid ID format').$end.
+ $userchkmsg.$rtnlink);
+ return;
+ }
+ }
+ }
+ }
# Call modifyuser
my $result = &Apache::lonnet::modifyuser
- ($env{'form.ccdomain'},$env{'form.ccuname'},$env{'form.cstid'},
+ ($env{'form.ccdomain'},$env{'form.ccuname'},$env{'form.cid'},
$amode,$genpwd,$env{'form.cfirstname'},
$env{'form.cmiddlename'},$env{'form.clastname'},
$env{'form.cgeneration'},undef,$desiredhost,
@@ -1586,7 +1561,7 @@ sub update_user_data {
($env{'form.login'} ne '' )) {
# Modify user privileges
if (! $amode || ! $genpwd) {
- $r->print($error.'Invalid login mode or password'.$end);
+ $r->print($error.'Invalid login mode or password'.$end.$rtnlink);
return;
}
# Only allow authentification modification if the person has authority
@@ -1599,7 +1574,7 @@ sub update_user_data {
($env{'form.ccuname'},$env{'form.ccdomain'}));
} else {
# Okay, this is a non-fatal error.
- $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.');
+ $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.'.$end);
}
}
##
@@ -1607,17 +1582,40 @@ sub update_user_data {
# Check for need to change
my %userenv = &Apache::lonnet::get
('environment',['firstname','middlename','lastname','generation',
- 'permanentemail','portfolioquota','inststatus'],
+ 'id','permanentemail','portfolioquota','inststatus'],
$env{'form.ccdomain'},$env{'form.ccuname'});
my ($tmp) = keys(%userenv);
if ($tmp =~ /^(con_lost|error)/i) {
%userenv = ();
}
# Check to see if we need to change user information
- foreach my $item ('firstname','middlename','lastname','generation','permanentemail') {
+ foreach my $item ('firstname','middlename','lastname','generation','permanentemail','id') {
# Strip leading and trailing whitespace
$env{'form.c'.$item} =~ s/(\s+$|^\s+)//g;
}
+ # Check to see if we can change the ID/student number
+ my $forceid = $env{'form.forceid'};
+ my $recurseid = $env{'form.recurseid'};
+ my $newuser = 0;
+ my $disallowed_id = 0;
+ my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);
+ if (!$forceid) {
+ $env{'form.cid'} = $userenv{'id'};
+ } elsif ($env{'form.cid'} ne $userenv{'id'}) {
+ my $checkhash;
+ my $checks = { 'id' => 1 };
+ $checkhash->{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}} =
+ { 'newuser' => $newuser,
+ 'id' => $env{'form.cid'},
+ };
+ &Apache::loncommon::user_rule_check($checkhash,$checks,
+ \%alerts,\%rulematch,\%idinst_results,\%curr_rules,\%got_rules);
+ if (ref($alerts{'id'}) eq 'HASH') {
+ if (ref($alerts{'id'}{$env{'form.ccdomain'}}) eq 'HASH') {
+ $disallowed_id = 1;
+ }
+ }
+ }
my ($quotachanged,$namechanged,$oldportfolioquota,$newportfolioquota,
$inststatus,$isdefault,$defquotatext);
my ($defquota,$settingstatus) =
@@ -1673,6 +1671,7 @@ sub update_user_data {
$env{'form.cmiddlename'} ne $userenv{'middlename'} ||
$env{'form.clastname'} ne $userenv{'lastname'} ||
$env{'form.cgeneration'} ne $userenv{'generation'} ||
+ $env{'form.cid'} ne $userenv{'id'} ||
$env{'form.cpermanentemail'} ne $userenv{'permanentemail'} )) {
$namechanged = 1;
}
@@ -1682,6 +1681,7 @@ sub update_user_data {
$changeHash{'middlename'} = $env{'form.cmiddlename'};
$changeHash{'lastname'} = $env{'form.clastname'};
$changeHash{'generation'} = $env{'form.cgeneration'};
+ $changeHash{'id'} = $env{'form.cid'};
$changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
my $putresult = &Apache::lonnet::put
('environment',\%changeHash,
@@ -1694,38 +1694,64 @@ sub update_user_data {
'mddl' => "middle",
'lst' => "last",
'gen' => "generation",
+ 'id' => "ID/Student number",
'mail' => "permanent e-mail",
'disk' => "disk space allocated to portfolio files",
'prvs' => "Previous",
'chto' => "Changed To"
);
+ $r->print('
END
+ $r->print(&Apache::loncommon::end_data_table_row().
+ &Apache::loncommon::end_data_table());
+ if (($forceid) && ($recurseid) && (!$disallowed_id) &&
+ (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) {
+ my %userupdate = (
+ lastname => $env{'form.clasaname'},
+ middlename => $env{'form.cmiddlename'},
+ firstname => $env{'form.cfirstname'},
+ generation => $env{'fora.cgeneration'},
+ id => $env{'form.cid'},
+ );
+ my $idresult = &propagate_id_change($env{'form.ccname'},
+ $env{'form.ccdomain'},\%userupdate);
+ $r->print(' '.$idresult.' ');
+ }
if (($env{'form.ccdomain'} eq $env{'user.domain'}) &&
($env{'form.ccuname'} eq $env{'user.name'})) {
my %newenvhash;
@@ -1749,12 +1775,19 @@ END
# They did not want to change the users name but we can
# still tell them what the name is
my %lt=&Apache::lonlocal::texthash(
+ 'id' => "ID/Student number",
'mail' => "Permanent e-mail",
'disk' => "Disk space allocated to user's portfolio files",
);
$r->print(<<"END");
-
'.$lt{'disk'}.': '.$newportfolioquota.' Mb '.
@@ -1766,6 +1799,7 @@ END
}
##
my $now=time;
+ my $rolechanges = 0;
$r->print('
'.&mt('Modifying Roles').'
');
foreach my $key (keys (%env)) {
next if (! $env{$key});
@@ -1782,12 +1816,14 @@ END
$r->print(&mt('Revoking [_1] in [_2]: [_3]',
$role,$scope,''.$result.'').' ');
if ($role eq 'st') {
- my $result = &classlist_drop($scope,$env{'form.ccuname'},
- $env{'form.ccdomain'},$now);
+ my $result =
+ &Apache::lonuserutils::classlist_drop($scope,
+ $env{'form.ccuname'},$env{'form.ccdomain'},
+ $now);
$r->print($result);
}
- }
- if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$ }s) {
+ }
+ 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.': '.
@@ -1795,6 +1831,7 @@ END
$env{'form.ccuname'},$1,$2,$3,$4).
' ');
}
+ $rolechanges ++;
} elsif ($key=~/^form\.del/) {
if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {
# Delete standard role
@@ -1806,8 +1843,10 @@ END
$r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,
''.$result.'').' ');
if ($role eq 'st') {
- my $result = &classlist_drop($scope,$env{'form.ccuname'},
- $env{'form.ccdomain'},$now);
+ my $result =
+ &Apache::lonuserutils::classlist_drop($scope,
+ $env{'form.ccuname'},$env{'form.ccdomain'},
+ $now);
$r->print($result);
}
}
@@ -1820,6 +1859,7 @@ END
$env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
0,1).' ');
}
+ $rolechanges ++;
} elsif ($key=~/^form\.ren/) {
my $udom = $env{'form.ccdomain'};
my $uname = $env{'form.ccuname'};
@@ -1858,6 +1898,7 @@ END
$r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : [_5]',
$rolename,$rnam,$rdom,$url,$result).' ');
}
+ $rolechanges ++;
} elsif ($key=~/^form\.act/) {
my $udom = $env{'form.ccdomain'};
my $uname = $env{'form.ccuname'};
@@ -1971,10 +2012,14 @@ END
}
$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) {
+ $r->print(&mt('No roles to modify'));
+ }
$r->print(&Apache::loncommon::end_page());
}
@@ -2000,30 +2045,6 @@ sub update_result_form {
return $outcome;
}
-sub classlist_drop {
- my ($scope,$uname,$udom,$now) = @_;
- my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});
- my $cid=$cdom.'_'.$cnum;
- my $user = $uname.':'.$udom;
- if (!&active_student_roles($cnum,$cdom,$uname,$udom)) {
- my $result =
- &Apache::lonnet::cput('classlist',
- { $user => $now },
- $env{'course.'.$cid.'.domain'},
- $env{'course.'.$cid.'.num'});
- return &mt('Drop from classlist: [_1]',
- ''.$result.'').' ';
- }
-}
-
-sub active_student_roles {
- my ($cnum,$cdom,$uname,$udom) = @_;
- my %roles =
- &Apache::lonnet::get_my_roles($uname,$udom,'userroles',
- ['future','active'],['st']);
- return exists($roles{"$cnum:$cdom:st"});
-}
-
sub quota_admin {
my ($setquota,$changeHash) = @_;
my $quotachanged;
@@ -2372,11 +2393,13 @@ sub handler {
$context = 'domain';
}
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
- ['action','state']);
+ ['action','state','callingform','roletype','showrole','bulkaction']);
&Apache::lonhtmlcommon::clear_breadcrumbs();
- &Apache::lonhtmlcommon::add_breadcrumb
- ({href=>"/adm/createuser",
- text=>"User Management"});
+ if ($env{'form.action'} ne 'dateselect') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/createuser",
+ text=>"User Management"});
+ }
my ($permission,$allowed) = &get_permission($context);
if (!$allowed) {
$env{'user.error.msg'}=
@@ -2426,7 +2449,7 @@ sub handler {
if (! exists($env{'form.state'})) {
&Apache::lonuserutils::print_expire_menu($r,$context);
} elsif ($env{'form.state'} eq 'done') {
- &Apache::lonuserutils::expire_user_list($r);
+ &Apache::lonuserutils::expire_user_list($r,$context);
} else {
&Apache::lonuserutils::print_expire_menu($r,$context);
}
@@ -2434,12 +2457,13 @@ sub handler {
} elsif ($env{'form.action'} eq 'singleuser' && $permission->{'cusr'}) {
my $phase = $env{'form.phase'};
my @search = ('srchterm','srchby','srchin','srchtype','srchdomain');
+ &Apache::loncreateuser::restore_prev_selections();
+ my $srch;
+ foreach my $item (@search) {
+ $srch->{$item} = $env{'form.'.$item};
+ }
if (($phase eq 'get_user_info') || ($phase eq 'userpicked')) {
- my $srch;
- foreach my $item (@search) {
- $srch->{$item} = $env{'form.'.$item};
- }
if ($env{'form.phase'} eq 'get_user_info') {
my ($currstate,$response,$forcenewuser,$results) =
&user_search_result($srch);
@@ -2465,7 +2489,7 @@ sub handler {
$response = '';
}
&print_user_modification_page($r,$ccuname,$ccdomain,
- $srch,$response);
+ $srch,$response,$context);
} elsif ($currstate eq 'query') {
&print_user_query_page($r,'createuser');
} else {
@@ -2475,12 +2499,13 @@ sub handler {
} elsif ($env{'form.phase'} eq 'userpicked') {
my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});
my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});
- &print_user_modification_page($r,$ccuname,$ccdomain,$srch);
+ &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',
+ $context);
}
} elsif ($env{'form.phase'} eq 'update_user_data') {
&update_user_data($r);
} else {
- &print_username_entry_form($r);
+ &print_username_entry_form($r,undef,$srch);
}
} elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {
if ($env{'form.phase'} eq 'set_custom_roles') {
@@ -2489,22 +2514,46 @@ sub handler {
&custom_role_editor($r);
}
} elsif ($env{'form.action'} eq 'listusers' && $permission->{'view'}) {
- $r->print(&header());
- &Apache::lonhtmlcommon::add_breadcrumb
- ({href=>'/adm/createuser?action=listusers',
- text=>"List Users' Roles"});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users' Roles",
- 'User_Management_List'));
- if (! exists($env{'form.state'})) {
- &Apache::lonuserutils::print_html_classlist($r,undef,$permission);
- } elsif ($env{'form.state'} eq 'csv') {
- &Apache::lonuserutils::print_html_classlist($r,'csv',$permission);
- } elsif ($env{'form.state'} eq 'excel') {
- &Apache::lonuserutils::print_html_classlist($r,'excel',$permission);
- } else {
- &Apache::lonuserutils::print_html_classlist($r,undef,$permission);
+ if ($env{'form.phase'} eq 'bulkchange') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'backPage(document.studentform)',
+ text=>"List Users"});
+ my $setting = $env{'form.roletype'};
+ my $choice = $env{'form.bulkaction'};
+ $r->print(&header());
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users",
+ 'User_Management_List'));
+ if ($permission->{'cusr'}) {
+ &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice);
+ }
+ } else {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=listusers',
+ text=>"List Users"});
+ my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles);
+ my $formname = 'studentform';
+ if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
+ ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) =
+ &Apache::lonuserutils::courses_selector($env{'request.role.domain'},
+ $formname);
+ $jscript .= &verify_user_display();
+ my $js = &add_script($jscript).$cb_jscript;
+ my $loadcode =
+ &Apache::lonuserutils::course_selector_loadcode($formname);
+ if ($loadcode ne '') {
+ $r->print(&header($js,{'onload' => $loadcode,}));
+ } else {
+ $r->print(&header($js));
+ }
+ } else {
+ $r->print(&header(&add_script(&verify_user_display())));
+ }
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users",
+ 'User_Management_List'));
+ &Apache::lonuserutils::print_userlist($r,undef,$permission,$context,
+ $formname,$totcodes,$codetitles,$idlist,$idlist_titles);
+ $r->print(&Apache::loncommon::end_page());
}
- $r->print(&Apache::loncommon::end_page());
} elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) {
$r->print(&header());
&Apache::lonhtmlcommon::add_breadcrumb
@@ -2515,30 +2564,60 @@ sub handler {
if (! exists($env{'form.state'})) {
&Apache::lonuserutils::print_expire_menu($r,$context);
} elsif ($env{'form.state'} eq 'done') {
- &Apache::lonuserutiles::expire_user_list($r);
+ &Apache::lonuserutiles::expire_user_list($r,$context);
} else {
&print_expire_menu($r,$context);
}
$r->print(&Apache::loncommon::end_page());
+ } elsif ($env{'form.action'} eq 'dateselect') {
+ if ($permission->{'cusr'}) {
+ $r->print(&header(undef,undef,{'no_nav_bar' => 1}).
+ &Apache::lonuserutils::date_section_selector($context).
+ &Apache::loncommon::end_page());
+ } else {
+ $r->print(&header().
+ ''.&mt('You do not have permission to modify dates or sections for users').''.
+ &Apache::loncommon::end_page());
+ }
} else {
$r->print(&header());
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); $r->print(&print_main_menu($permission));
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
+ $r->print(&print_main_menu($permission));
$r->print(&Apache::loncommon::end_page());
}
return OK;
}
sub header {
- my ($jscript,$loaditems) = @_;
+ my ($jscript,$loaditems,$args) = @_;
my $start_page;
if (ref($loaditems) eq 'HASH') {
- $start_page=&Apache::loncommon::start_page('User Management',$jscript,{'add_entries' => $loaditems,});
+ $start_page=&Apache::loncommon::start_page('User Management',$jscript,{'add_entries' => $loaditems});
} else {
- $start_page=&Apache::loncommon::start_page('User Management',$jscript);
+ $start_page=&Apache::loncommon::start_page('User Management',$jscript,$args);
}
return $start_page;
}
+sub add_script {
+ my ($js) = @_;
+ return '';
+}
+
+sub verify_user_display {
+ my $output = <<"END";
+
+function display_update() {
+ document.studentform.action.value = 'listusers';
+ document.studentform.phase.value = 'display';
+ document.studentform.submit();
+}
+
+END
+ return $output;
+
+}
+
###############################################################
###############################################################
# Menu Phase One
@@ -2546,22 +2625,22 @@ sub print_main_menu {
my ($permission) = @_;
my @menu =
(
- { text => 'Upload a File of Users to Set Roles',
+ { text => 'Upload a File of Users to Modify/Create Users and/or Add roles',
help => 'User_Management_Upload',
action => 'upload',
permission => $permission->{'cusr'},
},
- { text => 'Set User Roles for an Individual User',
+ { text => 'Create User/Set User Roles for a single user',
help => 'User_Management_Single_User',
action => 'singleuser',
permission => $permission->{'cusr'},
},
-# { text => 'Display User Roles for Multiple Users',
-# help => 'User_Management_List',
-# action => 'listusers',
-# permission => $permission->{'view'},
-# },
-# { text => 'Expire User Roles ',
+ { text => 'Display Lists of Users',
+ help => 'User_Management_List',
+ action => 'listusers',
+ permission => $permission->{'view'},
+ },
+# { text => 'Expire User Roles',
# help => 'User_Management_Drops',
# action => 'expire',
# permission => $permission->{'cusr'},
@@ -2763,7 +2842,8 @@ sub user_search_result {
{&Apache::lonnet::get('environment',
['firstname',
'lastname',
- 'permanentemail'])};
+ 'permanentemail'],
+ $cudomain,$cuname)};
}
}
}
@@ -3112,7 +3192,9 @@ sub course_level_table {
'.$area.' Domain: '.$domain.'
'."\n";
if ($role ne 'cc') {
if (%sections_count) {
- my $currsec = &course_sections(\%sections_count,$protectedcourse.'_'.$role);
+ my $currsec =
+ &Apache::lonuserutils::course_sections(\%sections_count,
+ $protectedcourse.'_'.$role);
$table .=
'
'.
'
@@ -3152,7 +3234,9 @@ ENDTIMEENTRY
'.$plrole.'
'.$area.'
'."\n";
if (%sections_count) {
- my $currsec = &course_sections(\%sections_count,$customrole);
+ my $currsec =
+ &Apache::lonuserutils::course_sections(\%sections_count,
+ $customrole);
$table.=
'