--- loncom/interface/lonuserutils.pm 2007/12/22 04:23:05 1.25
+++ loncom/interface/lonuserutils.pm 2007/12/24 05:26:31 1.33
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Utility functions for managing LON-CAPA user accounts
#
-# $Id: lonuserutils.pm,v 1.25 2007/12/22 04:23:05 raeburn Exp $
+# $Id: lonuserutils.pm,v 1.33 2007/12/24 05:26:31 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -304,7 +304,7 @@ sub print_upload_manager_header {
my $javascript_validations =
&javascript_validations('upload',$krbdefdom,$password_choice,undef,
$env{'request.role.domain'},$context,
- $permission,$groupslist);
+ $groupslist);
my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':'');
$r->print(&mt('Total number of records found in file: [_1].',$distotal).
"
\n");
@@ -332,7 +332,7 @@ sub print_upload_manager_header {
###############################################################
sub javascript_validations {
my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain,
- $context,$permission,$groupslist)=@_;
+ $context,$groupslist)=@_;
my %param = (
kerb_def_dom => $krbdefdom,
@@ -1264,7 +1264,7 @@ sub print_userlist {
if ($env{'form.showrole'} eq 'Any') {
$roleselected = ' selected="selected" ';
}
- my $role_select;
+ my ($role_select,$cnum,$cdom);
if ($context eq 'domain') {
$role_select = &domain_roles_select();
$r->print('');
@@ -1288,6 +1288,10 @@ sub print_userlist {
}
$role_select .= '';
$r->print('');
+ if ($context eq 'course') {
+ ($cnum,$cdom) = &get_course_identity();
+ $r->print(§ion_group_filter($cnum,$cdom));
+ }
}
if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) {
$r->print(' '.&list_submit_button(&mt('Update Display')).
@@ -1331,8 +1335,6 @@ sub print_userlist {
$userlist{$student} = $classlist->{$student};
}
}
- my $cid = $env{'request.course.id'};
- my ($cnum,$cdom) = &get_course_identity($cid);
my $showroles;
if ($env{'form.showrole'} ne 'Any') {
$showroles = [$env{'form.showrole'}];
@@ -1468,6 +1470,62 @@ sub print_userlist {
$env{'form.phase'}.'" />');
}
+sub section_group_filter {
+ my ($cnum,$cdom) = @_;
+ my @filters;
+ if ($env{'request.course.sec'} eq '') {
+ @filters = ('sec');
+ }
+ push(@filters,'grp');
+ my %name = (
+ sec => 'secfilter',
+ grp => 'grpfilter',
+ );
+ my %title = &Apache::lonlocal::texthash (
+ sec => 'Section(s)',
+ grp => 'Group(s)',
+ all => 'all',
+ none => 'none',
+ );
+ my ($output,@options);
+ foreach my $item (@filters) {
+ my $markup;
+ if ($env{'form.'.$name{$item}} eq '') {
+ $env{'form.'.$name{$item}} = 'all';
+ }
+ if ($item eq 'sec') {
+ if ($env{'form.showrole'} eq 'cc') {
+ $env{'form.'.$name{$item}} = 'none';
+ }
+ my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
+ @options = sort(keys(%sections_count));
+ } elsif ($item eq 'grp') {
+ my %curr_groups = &Apache::longroup::coursegroups();
+ @options = sort(keys(%curr_groups));
+ }
+ if (@options > 0) {
+ my $currsel;
+ $markup = ''."\n";
+ foreach my $option ('all','none',@options) {
+ $currsel = '';
+ if ($env{'form.'.$name{$item}} eq $option) {
+ $currsel = ' selected="selected" ';
+ }
+ $markup .= ' '."\n";
+ }
+ $markup .= ''."\n";
+ $output .= (' 'x3).'';
+ }
+ }
+ return $output;
+}
+
sub list_submit_button {
my ($text) = @_;
return '';
@@ -1819,7 +1877,7 @@ sub show_users_list {
$sortby = 'username';
}
my $setting = $env{'form.roletype'};
- my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers);
+ my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers,$secfilter,$grpfilter);
if ($context eq 'course') {
$cid = $env{'request.course.id'};
($cnum,$cdom) = &get_course_identity($cid);
@@ -1990,7 +2048,7 @@ END
$context,$permission,$mode);
$r->print(''.$results_description.'
');
}
- my ($output,$actionselect);
+ my ($output,$actionselect,%canchange,%canchangesec);
if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
if ($mode ne 'autoenroll') {
if ($permission->{'cusr'}) {
@@ -2029,6 +2087,45 @@ $lt{'ac'}: $actionselect
END
+ my @allroles;
+ if ($env{'form.showrole'} eq 'Any') {
+ my $custom = 1;
+ if ($context eq 'domain') {
+ @allroles = &roles_by_context($setting,$custom);
+ } else {
+ @allroles = &roles_by_context($context,$custom);
+ }
+ } else {
+ @allroles = ($env{'form.showrole'});
+ }
+ foreach my $role (@allroles) {
+ if ($context eq 'domain') {
+ if ($setting eq 'domain') {
+ if (&Apache::lonnet::allowed('c'.$role,
+ $env{'request.role.domain'})) {
+ $canchange{$role} = 1;
+ }
+ } elsif ($setting eq 'author') {
+ if (&Apache::lonnet::allowed('c'.$role,
+ $env{'request.role.domain'})) {
+ $canchange{$role} = 1;
+ }
+ }
+ } elsif ($context eq 'author') {
+ if (&Apache::lonnet::allowed('c'.$role,
+ $env{'user.domain'}.'/'.$env{'user.name'})) {
+ $canchange{$role} = 1;
+ }
+ } elsif ($context eq 'course') {
+ if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
+ $canchange{$role} = 1;
+ } elsif ($env{'request.course.sec'} ne '') {
+ if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
+ $canchangesec{$role} = $env{'request.course.sec'};
+ }
+ }
+ }
+ }
}
}
$output .= "\n
\n". @@ -2124,6 +2221,17 @@ END $index{$idx} = $i++; } my $usercount = 0; + my ($secfilter,$grpfilter); + if ($context eq 'course') { + $secfilter = $env{'form.secfilter'}; + $grpfilter = $env{'form.grpfilter'}; + if ($secfilter eq '') { + $secfilter = 'all'; + } + if ($grpfilter eq '') { + $grpfilter = 'all'; + } + } # Get groups, role, permanent e-mail so we can sort on them if # necessary. foreach my $user (keys(%{$userlist})) { @@ -2161,11 +2269,40 @@ END delete($userlist->{$user}); next; } - if (ref($classgroups) eq 'HASH') { - $groups = $classgroups->{$user}; - } - if (ref($groups->{active}) eq 'HASH') { - $userlist->{$user}->[$index{'groups'}] = join(', ',keys(%{$groups->{'active'}})); + if ($context eq 'course') { + my @ac_groups; + if (ref($classgroups) eq 'HASH') { + $groups = $classgroups->{$user}; + } + if (ref($groups->{'active'}) eq 'HASH') { + @ac_groups = keys(%{$groups->{'active'}}); + $userlist->{$user}->[$index{'groups'}] = join(', ',@ac_groups); + } + if ($mode ne 'autoenroll') { + my $section = $userlist->{$user}->[$index{'section'}]; + if ($secfilter eq 'none') { + if ($section ne '') { + delete($userlist->{$user}); + next; + } + } elsif ($secfilter ne 'all') { + if ($section ne $secfilter) { + delete($userlist->{$user}); + next; + } + } + if ($grpfilter eq 'none') { + if (@ac_groups > 0) { + delete($userlist->{$user}); + next; + } + } elsif ($grpfilter ne 'all') { + if (!grep(/^\Q$grpfilter\E$/,@ac_groups)) { + delete($userlist->{$user}); + next; + } + } + } } my %emails = &Apache::loncommon::getemails($uname,$udom); if ($emails{'permanentemail'} =~ /\S/) { @@ -2242,18 +2379,38 @@ END $r->print("
'.$lt{'fors'}.'
'; - } elsif ($env{'form.shorole'} eq 'Any') { + } elsif ($env{'form.showrole'} eq 'Any') { $output .= ''.$lt{'fors'}.'
'. ''.$lt{'forn'}.' ';
$info = $lt{'reta'};
@@ -2604,7 +2775,6 @@ END
} else {
$info = '';
}
- my $sections_select .= &course_sections(\%sections_count,$env{'form.showrole'});
my $rowtitle = &mt('New section to assign');
my $secbox = §ion_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context);
$output .= $info.$secbox;
@@ -2669,13 +2839,48 @@ sub results_header_row {
$description .= &mt('All users in course with [_1] roles',$rolefilter);
}
}
- if (exists($permission->{'view_section'})) {
+ my $constraint;
+ my $viewablesec = &viewable_section($permission);
+ if ($viewablesec ne '') {
if ($env{'form.showrole'} eq 'st') {
- $description .= ' '.&mt('(section [_1] only)',$permission->{'view_section'});
- } elsif ($env{'form.showrole'} eq 'any') {
- $description .= ' '.&mt('(section [_1] only)',$permission->{'view_section'});
+ $constraint = &mt('only users in section "[_1]"',$viewablesec);
+ } elsif ($env{'form.showrole'} ne 'cc') {
+ $constraint = &mt('only users affiliated with no section or section "[_1]"',$viewablesec);
+ }
+ if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) {
+ if ($env{'form.grpfilter'} eq 'none') {
+ $constraint .= &mt(' and not in any group');
+ } else {
+ $constraint .= &mt(' and members of group: "[_1]"',$env{'form.grpfilter'});
+ }
+ }
+ } else {
+ if (($env{'form.secfilter'} ne 'all') && ($env{'form.secfilter'} ne '')) {
+ if ($env{'form.secfilter'} eq 'none') {
+ $constraint = &mt('only users affiliated with no section');
+ } else {
+ $constraint = &mt('only users affiliated with section "[_1]"',$env{'form.secfilter'});
+ }
+ }
+ if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) {
+ if ($env{'form.grpfilter'} eq 'none') {
+ if ($constraint eq '') {
+ $constraint = &mt('only users not in any group');
+ } else {
+ $constraint .= &mt(' and also not in any group');
+ }
+ } else {
+ if ($constraint eq '') {
+ $constraint = &mt('only members of group: "[_1]"',$env{'form.grpfilter'});
+ } else {
+ $constraint .= &mt(' and also members of group: "[_1]"'.$env{'form.grpfilter'});
+ }
+ }
}
}
+ if ($constraint ne '') {
+ $description .= ' ('.$constraint.')';
+ }
} elsif ($context eq 'author') {
$description =
&mt('Author space for [_1]',
@@ -2773,8 +2978,8 @@ sub viewable_section {
#################################################
#################################################
sub show_drop_list {
- my ($r,$classlist,$keylist,$nosort,$permission)=@_;
- my $cid=$env{'request.course.id'};
+ my ($r,$classlist,$nosort,$permission) = @_;
+ my $cid = $env{'request.course.id'};
my ($cnum,$cdom) = &get_course_identity($cid);
if (! exists($env{'form.sortby'})) {
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
@@ -2784,9 +2989,6 @@ sub show_drop_list {
if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) {
$sortby = 'username';
}
- my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
- $classlist,$keylist,$cdom,$cnum);
- #
my $action = "drop";
my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();
$r->print(<
+
$username
$domain
$id
$name
$section
- $start
+ $start $startitem
$end
$active_groups
END
@@ -2917,7 +3131,7 @@ END
}
$r->print(&Apache::loncommon::end_data_table().'
');
%lt=&Apache::lonlocal::texthash(
- 'dp' => "Expire Users' Roles",
+ 'dp' => "Drop Students",
'ca' => "check all",
'ua' => "uncheck all",
);
@@ -2974,6 +3188,10 @@ sub upfile_drop_add {
$fields{$env{'form.f'.$i}}=$keyfields[$i];
}
}
+ if ($env{'form.fullup'} ne 'yes') {
+ $r->print('
\n".&mt('Processed [_1] user(s).',$counts{'user'}). + $r->print("
\n\n".&mt('Processed [quant,_1,user].',$counts{'user'}). "
\n"); if ($counts{'role'} > 0) { $r->print("\n". - &mt('Roles added for [_1] users. If user is active, the new role will be available when the user next logs in to LON-CAPA.',$counts{'role'})."
\n"); + &mt('Roles added for [quant,_1,user].',$counts{'role'}).' '.&mt('If a user is currently logged-in to LON-CAPA, any new roles which are active will be available when the user next logs in.')."\n"); + } else { + $r->print(''.&mt('No roles added').'
'); } if ($counts{'auth'} > 0) { $r->print("\n". @@ -3293,23 +3674,22 @@ sub upfile_drop_add { $counts{'auth'})."
\n"); } $r->print(&print_namespacing_alerts($domain,\%alerts,\%curr_rules)); - $r->print(''); ##################################### - # Drop students # + # Display list of students to drop # ##################################### if ($env{'form.fullup'} eq 'yes') { - $r->print(''.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,users].",$count).'
'); + $r->print(''."\n"); } sub classlist_drop { - my ($scope,$uname,$udom,$now,$action) = @_; + my ($scope,$uname,$udom,$now) = @_; my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)}); - my $cid=$cdom.'_'.$cnum; - my $user = $uname.':'.$udom; - if ($action eq 'drop') { + if (&Apache::lonnet::is_course($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'}); + { $user => $now },$cdom,$cnum); return &mt('Drop from classlist: [_1]', ''.$result.'').'