--- loncom/interface/lonuserutils.pm 2007/12/01 03:48:20 1.6
+++ loncom/interface/lonuserutils.pm 2007/12/14 00:20:53 1.16
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Utility functions for managing LON-CAPA user accounts
#
-# $Id: lonuserutils.pm,v 1.6 2007/12/01 03:48:20 albertel Exp $
+# $Id: lonuserutils.pm,v 1.16 2007/12/14 00:20:53 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -35,7 +35,8 @@ use Apache::lonnet;
use Apache::loncommon();
use Apache::lonhtmlcommon;
use Apache::lonlocal;
-use LONCAPA();
+use Apache::longroup;
+use LONCAPA qw(:DEFAULT :match);
###############################################################
###############################################################
@@ -95,7 +96,7 @@ sub modifyuserrole {
}
} elsif ($context eq 'domain') {
$scope = '/'.$env{'request.role.domain'}.'/';
- } elsif ($context eq 'construction_space') {
+ } elsif ($context eq 'author') {
$scope = '/'.$env{'user.domain'}.'/'.$env{'user.name'};
}
if ($context eq 'domain') {
@@ -135,22 +136,30 @@ sub modifyuserrole {
sub propagate_id_change {
my ($uname,$udom,$user) = @_;
- my (@types,@roles,@cdoms);
+ my (@types,@roles);
@types = ('active','future');
@roles = ('st');
my $idresult;
my %roleshash = &Apache::lonnet::get_my_roles($uname,
- $udom,'userroles',\@types,\@roles,\@cdoms);
+ $udom,'userroles',\@types,\@roles);
+ my %args = (
+ one_time => 1,
+ );
foreach my $item (keys(%roleshash)) {
my ($cnum,$cdom,$role) = split(/:/,$item);
my ($start,$end) = split(/:/,$roleshash{$item});
if (&Apache::lonnet::is_course($cdom,$cnum)) {
- my %userupdate;
- my $result = &update_classlist($cdom,$cnum,$udom,$uname,\%userupdate);
+ my $result = &update_classlist($cdom,$cnum,$udom,$uname,$user);
+ my %coursehash =
+ &Apache::lonnet::coursedescription($cdom.'_'.$cnum,\%args);
+ my $cdesc = $coursehash{'description'};
+ if ($cdesc eq '') {
+ $cdesc = $cdom.'_'.$cnum;
+ }
if ($result eq 'ok') {
- $idresult .= "Classlist change: $uname:$udom - class -> $cnum:$cdom\n";
+ $idresult .= &mt('Classlist update for "[_1]" in "[_2]".',$uname.':'.$udom,$cdesc).'
'."\n";
} else {
- $idresult .= "Error - $result -during classlist update for $uname:$udom in $cnum:$cdom\n";
+ $idresult .= &mt('Error: "[_1]" during classlist update for "[_2]" in "[_3]".',$result,$uname.':'.$udom,$cdesc).'
'."\n";
}
}
}
@@ -202,7 +211,7 @@ sub domain_roles_select {
# domain context
#
# Role types
- my @roletypes = ('domain','construction_space','course');
+ my @roletypes = ('domain','author','course');
my %lt = &role_type_names();
#
# build up the menu information to be passed to
@@ -224,7 +233,7 @@ sub domain_roles_select {
my @roles;
if ($roletype eq 'domain') {
@roles = &domain_roles();
- } elsif ($roletype eq 'construction_space') {
+ } elsif ($roletype eq 'author') {
@roles = &construction_space_roles();
} else {
@roles = &course_roles('domain');
@@ -245,7 +254,7 @@ sub domain_roles_select {
}
my $result = &Apache::loncommon::linked_select_forms
('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'},
- 'roletype','showrole',\%select_menus,['domain','construction_space','course']);
+ 'roletype','showrole',\%select_menus,['domain','author','course']);
return $result;
}
@@ -650,7 +659,7 @@ sub print_upload_manager_footer {
my $formname;
if ($context eq 'course') {
$formname = 'document.studentform';
- } elsif ($context eq 'construction_space') {
+ } elsif ($context eq 'author') {
$formname = 'document.studentform';
} elsif ($context eq 'domain') {
$formname = 'document.studentform';
@@ -701,7 +710,7 @@ sub print_upload_manager_footer {
$Str .= '
'.&mt('role').': '.
@@ -754,7 +763,7 @@ sub forceid_change {
if ($context eq 'domain') {
$output .= ''."\n";
}
return $output;
@@ -845,7 +854,7 @@ sub print_upload_manager_form {
}
sub setup_date_selectors {
- my ($starttime,$endtime,$mode) = @_;
+ my ($starttime,$endtime,$mode,$nolink) = @_;
if (! defined($starttime)) {
$starttime = time;
unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
@@ -866,12 +875,15 @@ sub setup_date_selectors {
}
}
}
- my $startdateform = &Apache::lonhtmlcommon::date_setter('studentform',
- 'startdate',
- $starttime);
- my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform',
- 'enddate',
- $endtime);
+
+ my $startdateform =
+ &Apache::lonhtmlcommon::date_setter('studentform','startdate',$starttime,
+ undef,undef,undef,undef,undef,undef,undef,$nolink);
+
+ my $enddateform =
+ &Apache::lonhtmlcommon::date_setter('studentform','enddate',$endtime,
+ undef,undef,undef,undef,undef,undef,undef,$nolink);
+
if ($mode eq 'create_enrolldates') {
$startdateform = &Apache::lonhtmlcommon::date_setter('ccrs',
'startenroll',
@@ -902,35 +914,44 @@ sub get_dates_from_form {
}
sub date_setting_table {
- my ($starttime,$endtime,$mode) = @_;
- my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode);
+ my ($starttime,$endtime,$mode,$bulkaction) = @_;
+ my $nolink;
+ if ($bulkaction) {
+ $nolink = 1;
+ }
+ my ($startform,$endform) =
+ &setup_date_selectors($starttime,$endtime,$mode,$nolink);
my $dateDefault;
if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
$dateDefault = ' ';
- } elsif ($mode ne 'construction_space' && $mode ne 'domain') {
- $dateDefault = ' '; + my $result = &Apache::lonhtmlcommon::start_pick_box()."\n"; + $result .= &Apache::lonhtmlcommon::row_title(&mt('Starting Date'), + 'LC_oddrow_value')."\n". + $startform."\n". + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_title(&mt('Ending Date'), + 'LC_oddrow_value')."\n". + $endform.' '.$perpetual. + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::end_pick_box().' '; if ($dateDefault) { $result .= $dateDefault.' '."\n"; } @@ -947,7 +968,8 @@ sub make_dates_default { {'default_enrollment_start_date'=>$startdate, 'default_enrollment_end_date' =>$enddate},$dom,$crs); if ($put_result eq 'ok') { - $result .= "Set default start and end dates for course "; + $result .= &mt('Set default start and end dates for course'). + ' '."\n"; # # Refresh the course environment &Apache::lonnet::coursedescription($env{'request.course.id'}, @@ -964,7 +986,7 @@ sub default_role_selector { my ($context,$checkpriv) = @_; my %customroles; my ($options,$coursepick,$cb_jscript); - if ($context ne 'construction_space') { + if ($context ne 'author') { %customroles = &my_custom_roles(); } @@ -978,7 +1000,7 @@ sub default_role_selector { ' '."\n"; if ($context eq 'course') { $options .= &default_course_roles($context,$checkpriv,%customroles); - } elsif ($context eq 'construction_space') { + } elsif ($context eq 'author') { my @roles = &construction_space_roles($checkpriv); foreach my $role (@roles) { my $plrole=&Apache::lonnet::plaintext($role); @@ -1107,7 +1129,7 @@ sub course_roles { sub curr_role_permissions { my ($context,$setting,$checkpriv) = @_; my @roles; - if ($context eq 'construction_space') { + if ($context eq 'author') { @roles = &construction_space_roles($checkpriv); } elsif ($context eq 'domain') { if ($setting eq 'course') { @@ -1148,7 +1170,11 @@ sub print_userlist { ($env{'form.Status'}); if ($env{'form.showrole'} eq '') { - $env{'form.showrole'} = 'Any'; + if ($context eq 'course') { + $env{'form.showrole'} = 'st'; + } else { + $env{'form.showrole'} = 'Any'; + } } if (! defined($env{'form.output'}) || $env{'form.output'} !~ /^(csv|excel|html)$/ ) { @@ -1239,8 +1265,12 @@ sub print_userlist { &Apache::lonhtmlcommon::end_pick_box().''. ' '.&list_submit_button(&mt('Update Display')). "\n \n"); + if ($env{'form.coursepick'}) { + $r->print(''.&mt('Searching').' ... '); + } + } else { + $r->print(' '.&mt('Searching').' ... '); } - $r->print(' '.&mt('Searching').' ... '); $r->rflush(); if ($context eq 'course') { my $classlist = &Apache::loncoursedata::get_classlist(); @@ -1268,33 +1298,33 @@ sub print_userlist { my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef, \@statuses,$showroles); &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo, - \%advrolehash); + \%advrolehash,$permission); } else { my (%cstr_roles,%dom_roles); - if ($context eq 'construction_space') { + if ($context eq 'author') { # List co-authors and assistant co-authors my @possroles = ('ca','aa'); %cstr_roles = &Apache::lonnet::get_my_roles(undef,undef,undef, \@statuses,\@possroles); &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo, - \%cstr_roles); + \%cstr_roles,$permission); } elsif ($context eq 'domain') { if ($env{'form.roletype'} eq 'domain') { %dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'}); foreach my $key (keys(%dom_roles)) { if (ref($dom_roles{$key}) eq 'HASH') { &gather_userinfo($context,$format,\%userlist,$indexhash, - \%userinfo,$dom_roles{$key}); + \%userinfo,$dom_roles{$key},$permission); } } - } elsif ($env{'form.roletype'} eq 'construction_space') { + } elsif ($env{'form.roletype'} eq 'author') { my %dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'},['au']); my %coauthors; foreach my $key (keys(%dom_roles)) { if (ref($dom_roles{$key}) eq 'HASH') { if ($env{'form.showrole'} eq 'au') { &gather_userinfo($context,$format,\%userlist,$indexhash, - \%userinfo,$dom_roles{$key}); + \%userinfo,$dom_roles{$key},$permission); } else { my @possroles; if ($env{'form.showrole'} eq 'Any') { @@ -1310,7 +1340,7 @@ sub print_userlist { $authordom,undef,\@statuses,\@possroles); } &gather_userinfo($context,$format,\%userlist, - $indexhash,\%userinfo,\%coauthors); + $indexhash,\%userinfo,\%coauthors,$permission); } } } @@ -1323,6 +1353,7 @@ sub print_userlist { &Apache::lonnet::coursedescription($cid,{'one_time' => 1}); my $cdom = $coursehash{'domain'}; my $cnum = $coursehash{'num'}; + next if ($cnum eq '' || $cdom eq ''); my $cdesc = $coursehash{'description'}; my (@roles,@sections,%access,%users,%userdata, %statushash); @@ -1355,20 +1386,22 @@ sub print_userlist { } } &gather_userinfo($context,$format,\%userlist,$indexhash, - \%userinfo,\%allusers); + \%userinfo,\%allusers,$permission); } else { + $r->print(''); return; } } } } if (keys(%userlist) == 0) { - if ($context eq 'construction_space') { + if ($context eq 'author') { $r->print(&mt('There are no co-authors to display.')."\n"); } elsif ($context eq 'domain') { if ($env{'form.roletype'} eq 'domain') { $r->print(&mt('There are no users with domain roles to display.')."\n"); - } elsif ($env{'form.roletype'} eq 'construction_space') { + } elsif ($env{'form.roletype'} eq 'author') { $r->print(&mt('There are no authors or co-authors to display.')."\n"); } elsif ($env{'form.roletype'} eq 'course') { $r->print(&mt('There are no course users to display')."\n"); @@ -1380,30 +1413,31 @@ sub print_userlist { # Print out the available choices my $usercount; if ($env{'form.action'} eq 'modifystudent') { - ($usercount) = &show_users_list($r,$context,'view','modify', + ($usercount) = &show_users_list($r,$context,'view',$permission, $env{'form.Status'},\%userlist,$keylist); } else { ($usercount) = &show_users_list($r,$context,$env{'form.output'}, - 'aboutme',$env{'form.Status'},\%userlist,$keylist); + $permission,$env{'form.Status'},\%userlist,$keylist); } if (!$usercount) { $r->print(' '.&mt('There are no users matching the search criteria.')); } } - $r->print(''); + $r->print(''); } sub list_submit_button { my ($text) = @_; - return ''; + return ''; } sub gather_userinfo { - my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash) = @_; + my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash,$permission) = @_; foreach my $item (keys(%{$rolehash})) { @{$userlist->{$item}} = (); my %userdata; - if ($context eq 'construction_space' || $context eq 'course') { + if ($context eq 'author' || $context eq 'course') { ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) = split(/:/,$item); ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item}); @@ -1414,7 +1448,7 @@ sub gather_userinfo { split(/:/,$item); ($userdata{'end'},$userdata{'start'})=split(/:/,$rolehash->{$item}); &build_user_record(\%userdata,$userinfo,$indexhash,$item,$userlist); - } elsif ($env{'form.roletype'} eq 'construction_space') { + } elsif ($env{'form.roletype'} eq 'author') { if (ref($rolehash->{$item}) eq 'HASH') { $userdata{'extent'} = $item; foreach my $key (keys(%{$rolehash->{$item}})) { @@ -1429,6 +1463,7 @@ sub gather_userinfo { ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) = split(/:/,$item); if (ref($rolehash->{$item}) eq 'HASH') { + my $numcids = keys(%{$rolehash->{$item}}); foreach my $cid (sort(keys(%{$rolehash->{$item}}))) { if (ref($rolehash->{$item}{$cid}) eq 'HASH') { my $spanstart = ''; @@ -1436,6 +1471,13 @@ sub gather_userinfo { my $space = ', '; if ($format eq 'html' || $format eq 'view') { $spanstart = ''; + if ($permission->{'cusr'}) { + if ($numcids > 1) { + $spanstart .= ''; + } else { + $spanstart .= ''; + } + } $spanend = ' '; $space = ', '; } @@ -1458,6 +1500,7 @@ sub gather_userinfo { sub build_user_record { my ($userdata,$userinfo,$indexhash,$record_key,$userlist) = @_; + next if ($userdata->{'start'} eq '-1' && $userdata->{'end'} eq '-1'); &process_date_info($userdata); my $username = $userdata->{'username'}; my $domain = $userdata->{'domain'}; @@ -1492,7 +1535,8 @@ sub courses_selector { my $format_reply; my $jscript = ''; - my $totcodes = + my $totcodes = 0; + $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes, $cdom,$totcodes); if ($totcodes > 0) { @@ -1694,7 +1738,7 @@ sub process_date_info { } sub show_users_list { - my ($r,$context,$mode,$linkto,$statusmode,$userlist,$keylist)=@_; + my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist)=@_; # # Variables for excel output my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format); @@ -1712,6 +1756,7 @@ sub show_users_list { if (!grep(/^\Q$sortby\E$/,@sortable)) { $sortby = 'username'; } + my $setting = $env{'form.roleaction'}; my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers); if ($context eq 'course') { $cid=$env{'request.course.id'}; @@ -1719,16 +1764,19 @@ sub show_users_list { $cnum = $env{'course.'.$cid.'.num'}; ($classgroups) = &Apache::loncoursedata::get_group_memberships( $userlist,$keylist,$cdom,$cnum); - if (! exists($env{'form.displayphotos'})) { - $env{'form.displayphotos'} = 'off'; - } - $displayphotos = $env{'form.displayphotos'}; - if (! exists($env{'form.displayclickers'})) { - $env{'form.displayclickers'} = 'off'; - } - $displayclickers = $env{'form.displayclickers'}; - if ($env{'course.'.$cid.'.internal.showphoto'}) { - $r->print(' + if ($mode eq 'autoenroll') { + $env{'form.showrole'} = 'st'; + } else { + if (! exists($env{'form.displayphotos'})) { + $env{'form.displayphotos'} = 'off'; + } + $displayphotos = $env{'form.displayphotos'}; + if (! exists($env{'form.displayclickers'})) { + $env{'form.displayclickers'} = 'off'; + } + $displayclickers = $env{'form.displayclickers'}; + if ($env{'course.'.$cid.'.internal.showphoto'}) { + $r->print(' - '); - } - $r->print(< '); - my $output; - if ($mode eq 'html' || $mode eq 'view') { - $r->print(< '); + } + my ($output,$actionselect); + if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') { + if ($mode ne 'autoenroll') { + if ($permission->{'cusr'}) { + $actionselect = &select_actions($context,$setting,$statusmode); + } + $r->print(< ';
+ my @linkdests = ('aboutme');
+ if ($permission->{'cusr'}) {
+ push (@linkdests,'modify');
+ $output .= ''.$lt{'link'}.': ';
+ my $usernamelink = $env{'form.usernamelink'};
+ if ($usernamelink eq '') {
+ $usernamelink = 'aboutme';
+ }
+ foreach my $item (@linkdests) {
+ my $checkedstr = '';
+ if ($item eq $usernamelink) {
+ $checkedstr = ' checked="checked" ';
+ }
+ $output .= ' + +END + } } $output .= "\n \n". &Apache::loncommon::start_data_table(). @@ -1827,15 +1978,16 @@ END $lt{'type'} |
";
} else {
- $output .= "
-Count |
- ";
+ $output .= "\n".''.&mt('Count').' | '."\n";
+ if ($actionselect) {
+ $output .= ''.&mt('Select').' | '."\n";
+ }
}
foreach my $item (@cols) {
$output .= "$lt{$item} | \n";
}
my %role_types = &role_type_names();
- if ($context eq 'course') {
+ if ($context eq 'course' && $mode ne 'autoenroll') {
if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {
# Clicker display on or off?
my %clicker_options = &Apache::lonlocal::texthash(
@@ -1869,8 +2021,8 @@ END
' '."\n";
}
}
- $output .= &Apache::loncommon::end_data_table_header_row();
}
+ $output .= &Apache::loncommon::end_data_table_header_row();
# Done with the HTML header line
} elsif ($mode eq 'csv') {
#
@@ -1914,6 +2066,10 @@ END
# Get groups, role, permanent e-mail so we can sort on them if
# necessary.
foreach my $user (keys(%{$userlist})) {
+ if ($context eq 'domain' && $user eq $env{'request.role.domain'}.'-domainconfig:'.$env{'request.role.domain'}) {
+ delete($userlist->{$user});
+ next;
+ }
my ($uname,$udom,$role,$groups,$email);
if (($statusmode ne 'Any') &&
($userlist->{$user}->[$index{'status'}] ne $statusmode)) {
@@ -1923,8 +2079,12 @@ END
if ($context eq 'domain') {
if ($env{'form.roletype'} eq 'domain') {
($role,$uname,$udom) = split(/:/,$user);
-
- } elsif ($env{'form.roletype'} eq 'construction_space') {
+ if (($uname eq $env{'request.role.domain'}.'-domainconfig') &&
+ ($udom eq $env{'request.role.domain'})) {
+ delete($userlist->{$user});
+ next;
+ }
+ } elsif ($env{'form.roletype'} eq 'author') {
($uname,$udom,$role) = split(/:/,$user,-1);
} elsif ($env{'form.roletype'} eq 'course') {
($uname,$udom,$role) = split(/:/,$user);
@@ -1984,6 +2144,7 @@ END
foreach my $item (@{$keylist}) {
$in{$item} = $sdata->[$index{$item}];
}
+ my $role = $in{'role'};
$in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}]);
if (! defined($in{'start'}) || $in{'start'} == 0) {
$in{'start'} = &mt('none');
@@ -1997,25 +2158,54 @@ END
}
if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
$r->print(&Apache::loncommon::start_data_table_row());
- $r->print("$rowcount | \n");
- if ($linkto eq 'aboutme') {
- $in{'username'} =
- &Apache::loncommon::aboutmewrapper($in{'username'},
- $in{'username'},
- $in{'domain'});
- } elsif ($linkto eq 'modify') {
- $in{'username'} = ''.
- $in{'username'}."\n";
+ my $checkval;
+ if ($mode eq 'autoenroll') {
+ my $cellentry;
+ if ($in{'type'} eq 'auto') {
+ $cellentry = ''.&mt('auto').'
$cellentry | \n");
+ } else {
+ $r->print("$rowcount | \n");
+ $checkval;
+ if ($actionselect) {
+ $checkval = $user;
+ if ($context eq 'course') {
+ if ($role eq 'st') {
+ $checkval .= ':st';
+ }
+ $checkval .= ':'.$in{'section'};
+ if ($role eq 'st') {
+ $checkval .= ':'.$in{'type'}.':'.$in{'lockedtype'};
+ }
+ }
+ $r->print('');
+ }
}
foreach my $item (@cols) {
- $r->print(' | '.$in{$item}.' | '."\n");
+ if ($item eq 'username') {
+ $r->print(''.&print_username_link($mode,$permission,
+ \%in).' | ');
+ } elsif (($item eq 'start' || $item eq 'end') && ($actionselect)) {
+ $r->print(''.$in{$item}.' | '."\n");
+ } else {
+ $r->print(''.$in{$item}.' | '."\n");
+ }
}
- if ($context eq 'course') {
+ if (($context eq 'course') && ($mode ne 'autoenroll')) {
if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {
if ($displayclickers eq 'on') {
my $clickers =
@@ -2094,17 +2284,284 @@ END
}
}
+sub print_username_link {
+ my ($mode,$permission,$in) = @_;
+ my $output;
+ if ($mode eq 'autoenroll') {
+ $output = $in->{'username'};
+ } elsif (!$permission->{'cusr'}) {
+ $output = &Apache::loncommon::aboutmewrapper($in->{'username'},
+ $in->{'username'},
+ $in->{'domain'});
+ } else {
+ $output = '{'username'}','$in->{'domain'}'".')" />'.
+ $in->{'username'}.'';
+ }
+ return $output;
+}
+
sub role_type_names {
my %lt = &Apache::lonlocal::texthash (
- 'domain' => 'Domain Roles',
- 'construction_space' => 'Co-Author Roles',
- 'course' => 'Course Roles',
+ 'domain' => 'Domain Roles',
+ 'author' => 'Co-Author Roles',
+ 'course' => 'Course Roles',
);
return %lt;
}
+sub select_actions {
+ my ($context,$setting,$statusmode) = @_;
+ my %lt = &Apache::lonlocal::texthash(
+ revoke => "Revoke user roles",
+ delete => "Delete user roles",
+ reenable => "Re-enable expired user roles",
+ activate => "Make future user roles active now",
+ chgdates => "Change starting/ending dates",
+ chgsec => "Change section associated with user roles",
+ );
+ my ($output,$options,%choices);
+ if ($statusmode eq 'Any') {
+ $options .= '
+';
+ $choices{'dates'} = 1;
+ } else {
+ if ($statusmode eq 'Future') {
+ $options .= '
+';
+ $choices{'dates'} = 1;
+ } elsif ($statusmode eq 'Expired') {
+ $options .= '
+';
+ $choices{'dates'} = 1;
+ }
+ if ($statusmode eq 'Active' || $statusmode eq 'Future') {
+ $options .= '
+
+';
+ $choices{'dates'} = 1;
+ }
+ }
+ if ($context eq 'domain') {
+ $options .= '
+';
+ }
+ if (($context eq 'course') || ($context eq 'domain' && $setting eq 'course')) {
+ if ($statusmode ne 'Expired') {
+ $options .= '
+';
+ $choices{'sections'} = 1;
+ }
+ }
+ if ($options) {
+ $output = ''."\n".
+ ''."\n".$options."\n".'';
+ if ($choices{'dates'}) {
+ $output .=
+ ''."\n".
+ ''."\n".
+ ''."\n".
+ ''."\n".
+ ''."\n".
+ ''."\n".
+ ''."\n".
+ ''."\n".
+ ''."\n".
+ ''."\n".
+ ''."\n".
+ ''."\n";
+ if ($context eq 'course') {
+ $output .= ''."\n";
+ }
+ }
+ if ($choices{'sections'}) {
+ $output .= ''."\n".
+ ''."\n";
+ }
+ }
+ return $output;
+}
+
+sub date_section_javascript {
+ my ($context,$setting) = @_;
+ my $title;
+ if (($context eq 'course') || ($context eq 'domain' && $setting eq 'course')) {
+ $title = &mt('Date and Section selector');
+ } else {
+ $title = &mt('Date selector');
+ }
+ my $output = '
+
+ENDTWO
+ return $output;
+}
+
+sub date_section_selector {
+ my ($context) = @_;
+ my $callingform = $env{'form.callingform'};
+ my $formname = 'dateselect';
+ my $groupslist = &get_groupslist();
+ my $sec_js = &setsections_javascript($formname,$groupslist);
+ my $output = <<"END";
+
+';
+ my %lt = &Apache::lonlocal::texthash (
+ chac => 'Access dates to apply for selected users',
+ chse => 'Changes in section affiliation to apply to selected users',
+ fors => 'For student roles changing the section, will result in a section switch as students may only be in one section of a course at a time.',
+ forn => 'For a role in a course that is not a student role, a user may have roles in more than one section of a course at a time.',
+ reta => "Retain each user's current section affiliations?",
+ dnap => '(Does not apply to student roles).',
+ );
+ my ($date_items,$headertext);
+ if ($env{'form.bulkaction'} eq 'chgsec') {
+ $headertext = $lt{'chse'};
+ } else {
+ $headertext = $lt{'chac'};
+ my $starttime;
+ if (($env{'form.bulkaction'} eq 'activate') ||
+ ($env{'form.bulkaction'} eq 'reenable')) {
+ $starttime = time;
+ }
+ $date_items = &date_setting_table($starttime,undef,$context,
+ $env{'form.bulkaction'});
+ }
+ $output .= ''.$headertext.''. + ''; + return $output; +} + sub results_header_row { - my ($rolefilter,$statusmode,$context) = @_; + my ($rolefilter,$statusmode,$context,$permission) = @_; my ($description,$showfilter); if ($rolefilter ne 'Any') { $showfilter = $rolefilter; @@ -2113,8 +2570,7 @@ sub results_header_row { $description = &mt('Course - ').$env{'course.'.$env{'request.course.id'}.'.description'}.': '; if ($statusmode eq 'Expired') { $description .= &mt('Users in course with expired [_1] roles',$showfilter); - } - if ($statusmode eq 'Future') { + } elsif ($statusmode eq 'Future') { $description .= &mt('Users in course with future [_1] roles',$showfilter); } elsif ($statusmode eq 'Active') { $description .= &mt('Users in course with active [_1] roles',$showfilter); @@ -2125,8 +2581,17 @@ sub results_header_row { $description .= &mt('All users in course with [_1] roles',$rolefilter); } } - } elsif ($context eq 'construction_space') { - $description = &mt('Author space for [_1].').' '; + if (exists($permission->{'view_section'})) { + 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'}); + } + } + } elsif ($context eq 'author') { + $description = + &mt('Author space for [_1]', + &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'})).': '; if ($statusmode eq 'Expired') { $description .= &mt('Co-authors with expired [_1] roles',$showfilter); } elsif ($statusmode eq 'Future') { @@ -2157,7 +2622,7 @@ sub results_header_row { $description .= &mt('All users in domain with [_1] roles',$rolefilter); } } - } elsif ($env{'form.roletype'} eq 'construction_space') { + } elsif ($env{'form.roletype'} eq 'author') { if ($statusmode eq 'Expired') { $description .= &mt('Co-authors in domain with expired [_1] roles',$showfilter); } elsif ($statusmode eq 'Future') { @@ -2483,7 +2948,7 @@ sub upfile_drop_add { } elsif ($setting eq 'course') { $defaultrole = $env{'form.courserole'}; } - } elsif ($context eq 'construction_space') { + } elsif ($context eq 'author') { $defaultrole = $env{'form.defaultrole'}; } if ($context eq 'domain' && $setting eq 'course') { @@ -2506,7 +2971,7 @@ sub upfile_drop_add { ####################################### if ($context eq 'course') { $r->print(''.&mt('Enrolling Users')."\n\n"); - } elsif ($context eq 'construction_space') { + } elsif ($context eq 'author') { $r->print(' '.&mt('Updating Co-authors')."\n\n"); } else { $r->print(' '.&mt('Adding/Modifying Users')."\n\n");
@@ -2646,6 +3111,8 @@ sub upfile_drop_add {
next if ($alerts{'username'}{$domain}{$username});
}
}
+ } else {
+# FIXME check if user info can be updated.
}
if ($id ne '') {
if (!$newuser) {
@@ -2698,7 +3165,7 @@ sub upfile_drop_add {
$r->print(' '); + $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for [_3]", + $plrole,$scope,$uname.':'.$udom).' '); $count++; } else { $r->print( - &mt('Error dropping [_1]:[_2]',$uname.'@'.$udom,$result). - ' '); + &mt("Error $result_text{'error'}{$choice} [_1] in [_2] for [_3]:[_4]", + $plrole,$scope,$uname.':'.$udom,$result).' '); + } + } + $r->print(' '.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,users].",$count).' '); + if ($count > 0) { + if ($choice eq 'revoke') { + $r->print(''.&mt('Re-enabling will re-activate data for the role. ')); + } + # Flush the course logs so reverse user roles immediately updated + &Apache::lonnet::flushcourselogs(); + } + if ($env{'form.makedatesdefault'}) { + if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') { + $r->print(&make_dates_default($startdate,$enddate)); } } - $r->print(''.&mt('Dropped [_1] user(s).',$count).' '); - $r->print(''.&mt('Re-enrollment will re-activate data.')) if ($count);
}
-sub section_check_js {
- my $groupslist;
- my %curr_groups = &Apache::longroup::coursegroups();
- if (%curr_groups) {
- $groupslist = join('","',sort(keys(%curr_groups)));
+sub classlist_drop {
+ my ($scope,$uname,$udom,$now,$action) = @_;
+ my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});
+ my $cid=$cdom.'_'.$cnum;
+ my $user = $uname.':'.$udom;
+ if ($action eq 'drop') {
+ 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.'').' |