+$date_sec_selector
END
}
@@ -1194,217 +2048,1158 @@ END
'start' => "start date",
'end' => "end date",
'status' => "status",
+ 'role' => "role",
'type' => "enroll type/action",
'email' => "email address",
- 'clicker' => "clicker id",
'photo' => "photo",
+ 'extent' => "extent",
+ 'pr' => "Proceed",
+ 'ca' => "check all",
+ 'ua' => "uncheck all",
+ 'ac' => "Action to take for selected users",
+ 'link' => "Behavior of clickable username link for each user",
+ 'aboutme' => "Display a user's personal page",
+ 'owin' => "Open in a new window",
+ 'modify' => "Modify a user's information",
+ 'clicker' => "Clicker-ID",
);
- my @cols = ('username','domain','id','fullname');
- if ($context eq 'course') {
- push(@cols,'section');
- }
- push(@cols,('start','end'));
- if ($statusmode eq 'Any') {
- push(@cols,'status');
- }
- if ($context eq 'course') {
- push(@cols,'groups');
+ if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
+ $lt{'extent'} = &mt('Course(s): description, section(s), status');
+ } elsif ($context eq 'author') {
+ $lt{'extent'} = &mt('Author');
+ }
+ my @cols;
+ if ($mode eq 'pickauthor') {
+ @cols = ('username','fullname','status','email');
+ } else {
+ @cols = ('username','domain','id','fullname');
+ if ($context eq 'course') {
+ push(@cols,'section');
+ }
+ if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) {
+ push(@cols,('start','end'));
+ }
+ if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') {
+ push(@cols,'role');
+ }
+ if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' ||
+ $env{'form.roletype'} eq 'course')) {
+ push (@cols,'extent');
+ }
+ if (($statusmode eq 'Any') &&
+ (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) {
+ push(@cols,'status');
+ }
+ if ($context eq 'course') {
+ push(@cols,'groups');
+ }
+ push(@cols,'email');
}
- push(@cols,'email');
- if ($mode eq 'html' || $mode eq 'view') {
- if ($linkto eq 'aboutme') {
- $r->print(&mt("Select a user name to view the user's personal page."));
- } elsif ($linkto eq 'modify') {
- $r->print(&mt("Select a user name to modify the user's information"));
- }
- $r->print(<
-
+ my $rolefilter = $env{'form.showrole'};
+ if ($env{'form.showrole'} eq 'cr') {
+ $rolefilter = &mt('custom');
+ } elsif ($env{'form.showrole'} ne 'Any') {
+ $rolefilter = &Apache::lonnet::plaintext($env{'form.showrole'});
+ }
+ my $results_description;
+ if ($mode ne 'autoenroll') {
+ $results_description = &results_header_row($rolefilter,$statusmode,
+ $context,$permission,$mode);
+ $r->print(''.$results_description.' ');
+ }
+ my ($output,$actionselect,%canchange,%canchangesec);
+ if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
+ if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
+ if ($permission->{'cusr'}) {
+ $actionselect = &select_actions($context,$setting,$statusmode,$formname);
+ }
+ $r->print(<
+
+
+
+
END
-
- $r->print("\n\n".
+ if ($actionselect) {
+ $output .= <<"END";
+
$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 .= '';
+ }
+ $output .= "\n".''."\n".
&Apache::loncommon::start_data_table().
- &Apache::loncommon::start_data_table_header_row());
+ &Apache::loncommon::start_data_table_header_row();
if ($mode eq 'autoenroll') {
- $r->print("
- $lt{'type'}
- ");
- } else {
- $r->print("
-Count
- ");
+ $output .= "
+ $lt{'type'}
+ ";
+ } else {
+ if ($mode eq 'pickauthor') {
+ $output .= "\n".' '."\n";
+ } else {
+ $output .= "\n".''.&mt('Count').' '."\n";
+ }
+ if ($actionselect) {
+ $output .= ''.&mt('Select').' '."\n";
+ }
}
foreach my $item (@cols) {
- $r->print(''.$lt{$item}.' '."\n");
+ $output .= "$lt{$item} \n";
}
- if ($context eq 'course') {
- # Clicker display on or off?
- my %clicker_options = &Apache::lonlocal::texthash(
- 'on' => 'Show',
- 'off' => 'Hide',
- );
- my $clickerchg = 'on';
- if ($displayclickers eq 'on') {
- $clickerchg = 'off';
- }
- $r->print(' '."\n".' '.
- ''.
- $clicker_options{$clickerchg}.' '.$lt{'clicker'}."\n".
- ' '."\n");
-
- # Photo display on or off?
- if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
- my %photo_options = &Apache::lonlocal::texthash(
- 'on' => 'Show',
- 'off' => 'Hide',
- );
- my $photochg = 'on';
- if ($displayphotos eq 'on') {
- $photochg = 'off';
- }
- $r->print(' '."\n".' '.
- ''.
+ my %role_types = &role_type_names();
+ 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 = (
+ 'on' => 'Show',
+ 'off' => 'Hide',
+ );
+ my $clickerchg = 'on';
+ if ($displayclickers eq 'on') {
+ $clickerchg = 'off';
+ }
+ $output .= ' '."\n".' '
+ .&mt('[_1]'.$clicker_options{$clickerchg}.'[_2] clicker id'
+ ,''
+ ,' ')
+ ."\n".' '."\n";
+
+ # Photo display on or off?
+ if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
+ my %photo_options = &Apache::lonlocal::texthash(
+ 'on' => 'Show',
+ 'off' => 'Hide',
+ );
+ my $photochg = 'on';
+ if ($displayphotos eq 'on') {
+ $photochg = 'off';
+ }
+ $output .= ' '."\n".' '.
+ ''.
$photo_options{$photochg}.' '.$lt{'photo'}."\n".
- ' '."\n");
+ ' '."\n";
+ }
}
- $r->print(&Apache::end_data_table_header_row());
- }
+ }
+ $output .= &Apache::loncommon::end_data_table_header_row();
# Done with the HTML header line
-
} elsif ($mode eq 'csv') {
#
# Open a file
$CSVfilename = '/prtspool/'.
- $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
- time.'_'.rand(1000000000).'.csv';
+ $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
+ time.'_'.rand(1000000000).'.csv';
unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {
$r->log_error("Couldn't open $CSVfilename for output $!");
- $r->print("Problems occured in writing the csv file. ".
- "This error has been logged. ".
- "Please alert your LON-CAPA administrator.");
+ $r->print(&mt('Problems occurred in writing the CSV file. '
+ .'This error has been logged. '
+ .'Please alert your LON-CAPA administrator.'));
$CSVfile = undef;
}
#
+ push @cols,'clicker';
# Write headers and data to file
- if($statusmode eq 'Expired') {
- print $CSVfile '"'.&mt('Users with expired roles').'"'."\n"; }
- if($statusmode eq 'Future') {
- print $CSVfile '"'.&mt('Users with future roles').'"'."\n";
- }
+ print $CSVfile '"'.$results_description.'"'."\n";
print $CSVfile '"'.join('","',map {
&Apache::loncommon::csv_translate($lt{$_})
- } (@cols)).'"'."\n";
+ } (@cols))."\"\n";
} elsif ($mode eq 'excel') {
+ push @cols,'clicker';
# Create the excel spreadsheet
($excel_workbook,$excel_filename,$format) =
&Apache::loncommon::create_workbook($r);
return if (! defined($excel_workbook));
$excel_sheet = $excel_workbook->addworksheet('userlist');
- #
- my $description;
- if ($context eq 'course') {
- $description = &mt('Class List for ').
- $env{'course.'.$env{'request.course.id'}.'.description'};
- } elsif ($context eq 'construction_space') {
- $description = &mt('List of co-authors for construction space for [_1]',
- &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'}));
- } else {
- $description = &mt('List of users for domain: [_1]',&Apache::lonnet::domain($env{'request.role.domain'},'description'));
- }
- $excel_sheet->write($row++,0,$description,$format->{'h1'});
+ $excel_sheet->write($row++,0,$results_description,$format->{'h2'});
#
my @colnames = map {$lt{$_}} (@cols);
+
$excel_sheet->write($row++,0,\@colnames,$format->{'bold'});
}
# Done with header lines in all formats
-
- #
- # Sort the users
my %index;
my $i;
- foreach (@$keylist) {
- $index{$_} = $i++;
+ foreach my $idx (@$keylist) {
+ $index{$idx} = $i++;
}
- $index{'groups'} = scalar(@$keylist);
+ 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})) {
+ if ($user eq '' ) {
+ delete($userlist->{$user});
+ next;
+ }
+ 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)) {
+ delete($userlist->{$user});
+ next;
+ }
+ if ($context eq 'domain') {
+ if ($env{'form.roletype'} eq 'domain') {
+ ($role,$uname,$udom) = split(/:/,$user);
+ 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);
+ }
+ } else {
+ ($uname,$udom,$role) = split(/:/,$user,-1);
+ if (($context eq 'course') && $role eq '') {
+ $role = 'st';
+ }
+ }
+ $userlist->{$user}->[$index{'role'}] = $role;
+ if (($env{'form.showrole'} ne 'Any') && (!($env{'form.showrole'} eq 'cr' && $role =~ /^cr\//)) && ($role ne $env{'form.showrole'})) {
+ delete($userlist->{$user});
+ next;
+ }
+ 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 (($env{'request.course.sec'} ne '') &&
+ ($section ne $env{'request.course.sec'})) {
+ if ($role eq 'st') {
+ delete($userlist->{$user});
+ next;
+ }
+ }
+ 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;
+ }
+ }
+ if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
+ if (($displayphotos eq 'on') && ($role eq 'st')) {
+ $userlist->{$user}->[$index{'photo'}] =
+ &Apache::lonnet::retrievestudentphoto($udom,$uname,'jpg');
+ $userlist->{$user}->[$index{'thumbnail'}] =
+ &Apache::lonnet::retrievestudentphoto($udom,$uname,
+ 'gif','thumbnail');
+ }
+ }
+ }
+ }
+ my %emails = &Apache::loncommon::getemails($uname,$udom);
+ if ($emails{'permanentemail'} =~ /\S/) {
+ $userlist->{$user}->[$index{'email'}] = $emails{'permanentemail'};
+ }
+ $usercount ++;
+ }
+ my $autocount = 0;
+ my $manualcount = 0;
+ my $lockcount = 0;
+ my $unlockcount = 0;
+ if ($usercount) {
+ $r->print($output);
+ } else {
+ if ($mode eq 'autoenroll') {
+ return ($usercount,$autocount,$manualcount,$lockcount,$unlockcount);
+ } else {
+ return;
+ }
+ }
+ #
+ # Sort the users
my $index = $index{$sortby};
my $second = $index{'username'};
my $third = $index{'domain'};
- my @Sorted_Students = sort {
- lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index])
+ my @sorted_users = sort {
+ lc($userlist->{$a}->[$index]) cmp lc($userlist->{$b}->[$index])
||
- lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second]) ||
- lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
- } (keys(%$classlist));
- my $studentcount = 0;
- my $autocount = 0;
- my $manualcount = 0;
- my $unlockcount = 0;
- my $lockcount = 0;
- foreach my $student (@Sorted_Students) {
- my $sdata = $classlist->{$student};
- my $groups = $classgroups->{$student};
- my $username = $sdata->[$index{'username'}];
- my $domain = $sdata->[$index{'domain'}];
- my $section = $sdata->[$index{'section'}];
- my $active_groups;
- if (ref($groups->{active}) eq 'HASH') {
- $active_groups = join(', ',keys(%{$groups->{'active'}}));
+ lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second]) ||
+ lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third])
+ } (keys(%$userlist));
+ my $rowcount = 0;
+ foreach my $user (@sorted_users) {
+ my %in;
+ my $sdata = $userlist->{$user};
+ $rowcount ++;
+ foreach my $item (@{$keylist}) {
+ $in{$item} = $sdata->[$index{$item}];
+ }
+ my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];
+ if ($clickers!~/\w/) { $clickers='-'; }
+ $in{'clicker'} = $clickers;
+ my $role = $in{'role'};
+ $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}]);
+ if (! defined($in{'start'}) || $in{'start'} == 0) {
+ $in{'start'} = &mt('none');
+ } else {
+ $in{'start'} = &Apache::lonlocal::locallocaltime($in{'start'});
}
- my $name = $sdata->[$index{'fullname'}];
- my $id = $sdata->[$index{'id'}];
- my $status = $sdata->[$index{'status'}];
- next if (($statusmode ne 'Any') && ($status ne $statusmode));
- my $start = $sdata->[$index{'start'}];
- my $end = $sdata->[$index{'end'}];
- if (! defined($start) || $start == 0) {
- $start = &mt('none');
+ if (! defined($in{'end'}) || $in{'end'} == 0) {
+ $in{'end'} = &mt('none');
} else {
- $start = &Apache::lonlocal::locallocaltime($start);
+ $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});
}
- if (! defined($end) || $end == 0) {
- $end = &mt('none');
+ if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
+ $r->print(&Apache::loncommon::start_data_table_row());
+ my $checkval;
+ if ($mode eq 'autoenroll') {
+ my $cellentry;
+ if ($in{'type'} eq 'auto') {
+ $cellentry = ''.&mt('auto').' Change ';
+ $autocount ++;
+ } else {
+ $cellentry = '';
+ }
+ $r->print("$cellentry \n");
+ } else {
+ if ($mode ne 'pickauthor') {
+ $r->print("$rowcount \n");
+ }
+ if ($actionselect) {
+ my $showcheckbox;
+ if ($role =~ /^cr\//) {
+ $showcheckbox = $canchange{'cr'};
+ } else {
+ $showcheckbox = $canchange{$role};
+ }
+ if (!$showcheckbox) {
+ if ($context eq 'course') {
+ if ($canchangesec{$role} ne '') {
+ if ($canchangesec{$role} eq $in{'section'}) {
+ $showcheckbox = 1;
+ }
+ }
+ }
+ }
+ if ($showcheckbox) {
+ $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(' ');
+ } else {
+ $r->print(' ');
+ }
+ } elsif ($mode eq 'pickauthor') {
+ $r->print(' ');
+ }
+ }
+ foreach my $item (@cols) {
+ if ($item eq 'username') {
+ $r->print(''.&print_username_link($mode,\%in).' ');
+ } elsif (($item eq 'start' || $item eq 'end') && ($actionselect)) {
+ $r->print(''.$in{$item}.' '."\n");
+ } else {
+ $r->print(''.$in{$item}.' '."\n");
+ }
+ }
+ if (($context eq 'course') && ($mode ne 'autoenroll')) {
+ if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') {
+ if ($displayclickers eq 'on') {
+ my $clickers =
+ (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1];
+ if ($clickers!~/\w/) { $clickers='-'; }
+ $r->print(''.$clickers.' ');
+ } else {
+ $r->print(' ');
+ }
+ if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
+ if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') {
+ $r->print(' ');
+ } else {
+ $r->print(' ');
+ }
+ }
+ }
+ }
+ $r->print(&Apache::loncommon::end_data_table_row());
+ } elsif ($mode eq 'csv') {
+ next if (! defined($CSVfile));
+ # no need to bother with $linkto
+ if (! defined($in{'start'}) || $in{'start'} == 0) {
+ $in{'start'} = &mt('none');
+ } else {
+ $in{'start'} = &Apache::lonlocal::locallocaltime($in{'start'});
+ }
+ if (! defined($in{'end'}) || $in{'end'} == 0) {
+ $in{'end'} = &mt('none');
+ } else {
+ $in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});
+ }
+ my @line = ();
+ foreach my $item (@cols) {
+ push @line,&Apache::loncommon::csv_translate($in{$item});
+ }
+ print $CSVfile '"'.join('","',@line)."\"\n";
+ } elsif ($mode eq 'excel') {
+ my $col = 0;
+ foreach my $item (@cols) {
+ if ($item eq 'start' || $item eq 'end') {
+ if (defined($item) && $item != 0) {
+ $excel_sheet->write($row,$col++,
+ &Apache::lonstathelpers::calc_serial($in{item}),
+ $format->{'date'});
+ } else {
+ $excel_sheet->write($row,$col++,'none');
+ }
+ } else {
+ $excel_sheet->write($row,$col++,$in{$item});
+ }
+ }
+ $row++;
+ }
+ }
+ if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll' || $mode eq 'pickauthor') {
+ $r->print(&Apache::loncommon::end_data_table().' ');
+ } elsif ($mode eq 'excel') {
+ $excel_workbook->close();
+ $r->print(&mt('[_1]Your Excel spreadsheet[_2] is ready for download.', '',' ')."
\n");
+ } elsif ($mode eq 'csv') {
+ close($CSVfile);
+ $r->print(&mt('[_1]Your CSV file[_2] is ready for download.', '',' ')."
\n");
+ $r->rflush();
+ }
+ if ($mode eq 'autoenroll') {
+ return ($usercount,$autocount,$manualcount,$lockcount,$unlockcount);
+ } else {
+ return ($usercount);
+ }
+}
+
+sub bulkaction_javascript {
+ my ($formname,$caller) = @_;
+ my $docstart = 'document';
+ if ($caller eq 'popup') {
+ $docstart = 'opener.document';
+ }
+ my %lt = &Apache::lonlocal::texthash(
+ acwi => 'Access will be set to start immediately',
+ asyo => 'as you did not select an end date in the pop-up window',
+ accw => 'Access will be set to continue indefinitely',
+ asyd => 'as you did not select an end date in the pop-up window',
+ sewi => "Sections will be switched to 'No section'",
+ ayes => "as you either selected the 'No section' option",
+ oryo => 'or you did not select a section in the pop-up window',
+ arol => 'A role with no section will be added',
+ swbs => 'Sections will be switched to:',
+ rwba => 'Roles will be added for section(s):',
+ );
+ my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox");
+ my $noaction = &mt("You need to select an action to take for the user(s) you have selected");
+ my $singconfirm = &mt(' for a single user?');
+ my $multconfirm = &mt(' for multiple users?');
+ my $output = <<"ENDJS";
+function verify_action (field) {
+ var numchecked = 0;
+ var singconf = '$singconfirm';
+ var multconf = '$multconfirm';
+ if ($docstart.$formname.elements[field].length > 0) {
+ for (i=0; i<$docstart.$formname.elements[field].length; i++) {
+ if ($docstart.$formname.elements[field][i].checked == true) {
+ numchecked ++;
+ }
+ }
+ } else {
+ if ($docstart.$formname.elements[field].checked == true) {
+ numchecked ++;
+ }
+ }
+ if (numchecked == 0) {
+ alert("$alert");
+ return;
+ } else {
+ var message = $docstart.$formname.bulkaction[$docstart.$formname.bulkaction.selectedIndex].text;
+ var choice = $docstart.$formname.bulkaction[$docstart.$formname.bulkaction.selectedIndex].value;
+ if (choice == '') {
+ alert("$noaction");
+ return;
} else {
- $end = &Apache::lonlocal::locallocaltime($end);
+ if (numchecked == 1) {
+ message += singconf;
+ } else {
+ message += multconf;
+ }
+ENDJS
+ if ($caller ne 'popup') {
+ $output .= <<"NEWWIN";
+ if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate' || choice == 'chgsec') {
+ opendatebrowser(document.$formname,'$formname','go');
+ return;
+
+ } else {
+ if (confirm(message)) {
+ document.$formname.phase.value = 'bulkchange';
+ document.$formname.submit();
+ return;
+ }
+ }
+NEWWIN
+ } else {
+ $output .= <<"POPUP";
+ if (choice == 'chgdates' || choice == 'reenable' || choice == 'activate') {
+ var datemsg = '';
+ if (($docstart.$formname.startdate_month.value == '') &&
+ ($docstart.$formname.startdate_day.value == '') &&
+ ($docstart.$formname.startdate_year.value == '')) {
+ datemsg = "\\n$lt{'acwi'},\\n$lt{'asyo'}.\\n";
+ }
+ if (($docstart.$formname.enddate_month.value == '') &&
+ ($docstart.$formname.enddate_day.value == '') &&
+ ($docstart.$formname.enddate_year.value == '')) {
+ datemsg += "\\n$lt{'accw'},\\n$lt{'asyd'}.\\n";
+ }
+ if (datemsg != '') {
+ message += "\\n"+datemsg;
+ }
+ }
+ if (choice == 'chgsec') {
+ var rolefilter = $docstart.$formname.showrole.options[$docstart.$formname.showrole.selectedIndex].value;
+ var retained = $docstart.$formname.retainsec.value;
+ var secshow = $docstart.$formname.newsecs.value;
+ if (secshow == '') {
+ if (rolefilter == 'st' || retained == 0 || retained == "") {
+ message += "\\n\\n$lt{'sewi'},\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n";
+ } else {
+ message += "\\n\\n$lt{'arol'}\\n$lt{'ayes'},\\n$lt{'oryo'}.\\n";
+ }
+ } else {
+ if (rolefilter == 'st' || retained == 0 || retained == "") {
+ message += "\\n\\n$lt{'swbs'} "+secshow+".\\n";
+ } else {
+ message += "\\n\\n$lt{'rwba'} "+secshow+".\\n";
+ }
+ }
+ }
+ if (confirm(message)) {
+ $docstart.$formname.phase.value = 'bulkchange';
+ $docstart.$formname.submit();
+ window.close();
+ }
+POPUP
+ }
+ $output .= '
}
- my $status = $sdata->[$index{'status'}];
- next if ($status ne 'Active');
- #
- $r->print(&Apache::loncommon::start_data_table_row());
- $r->print(<<"END");
-
- $username
- $domain
- $id
- $name
- $start
- $end
+ }
+}
+';
+ return $output;
+}
+
+sub print_username_link {
+ my ($mode,$in) = @_;
+ my $output;
+ if ($mode eq 'autoenroll') {
+ $output = $in->{'username'};
+ } else {
+ $output = '{'username'}','$in->{'domain'}'".')" />'.
+ $in->{'username'}.' ';
+ }
+ return $output;
+}
+
+sub role_type_names {
+ my %lt = &Apache::lonlocal::texthash (
+ 'domain' => 'Domain Roles',
+ 'author' => 'Co-Author Roles',
+ 'course' => 'Course Roles',
+ );
+ return %lt;
+}
+
+sub select_actions {
+ my ($context,$setting,$statusmode,$formname) = @_;
+ 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);
+ # FIXME Disable actions for now for roletype=course in domain context
+ if ($context eq 'domain' && $setting eq 'course') {
+ return;
+ }
+ if ($context eq 'course') {
+ if ($env{'form.showrole'} ne 'Any') {
+ if (!&Apache::lonnet::allowed('c'.$env{'form.showrole'},
+ $env{'request.course.id'})) {
+ if ($env{'request.course.sec'} eq '') {
+ return;
+ } else {
+ if (!&Apache::lonnet::allowed('c'.$env{'form.showrole'},$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
+ return;
+ }
+ }
+ }
+ }
+ }
+ if ($statusmode eq 'Any') {
+ $options .= '
+'.$lt{'chgdates'}.' ';
+ $choices{'dates'} = 1;
+ } else {
+ if ($statusmode eq 'Future') {
+ $options .= '
+'.$lt{'activate'}.' ';
+ $choices{'dates'} = 1;
+ } elsif ($statusmode eq 'Expired') {
+ $options .= '
+'.$lt{'reenable'}.' ';
+ $choices{'dates'} = 1;
+ }
+ if ($statusmode eq 'Active' || $statusmode eq 'Future') {
+ $options .= '
+'.$lt{'chgdates'}.'
+'.$lt{'revoke'}.' ';
+ $choices{'dates'} = 1;
+ }
+ }
+ if ($context eq 'domain') {
+ $options .= '
+'.$lt{'delete'}.' ';
+ }
+ if (($context eq 'course') || ($context eq 'domain' && $setting eq 'course')) {
+ if (($statusmode ne 'Expired') && ($env{'request.course.sec'} eq '')) {
+ $options .= '
+'.$lt{'chgsec'}.' ';
+ $choices{'sections'} = 1;
+ }
+ }
+ if ($options) {
+ $output = ''."\n".
+ ''.
+ &mt('Please select').' '."\n".$options."\n".' ';
+ if ($choices{'dates'}) {
+ $output .=
+ ' '."\n".
+ ' '."\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 = 'Date_And_Section_Selector';
+ my %nopopup = &Apache::lonlocal::texthash (
+ revoke => "Check the boxes for any users for whom roles are to be revoked, and click 'Proceed'",
+ delete => "Check the boxes for any users for whom roles are to be deleted, and click 'Proceed'",
+ none => "Choose an action to take for selected users",
+ );
+ my $output = '
+
+ENDTWO
+ return $output;
+}
+
+sub date_section_selector {
+ my ($context,$permission) = @_;
+ my $callingform = $env{'form.callingform'};
+ my $formname = 'dateselect';
+ my $groupslist = &get_groupslist();
+ my $sec_js = &setsections_javascript($formname,$groupslist);
+ my $output = <<"END";
+
+ENDJS
+ 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'},$formname,
+ $permission);
+ }
+ $output .= ''.$headertext.' '.
+ '';
+ return $output;
+}
+
+sub section_picker {
+ my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode) = @_;
+ my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
+ my $sections_select .= &course_sections(\%sections_count,$role);
+ my $secbox = ''.&Apache::lonhtmlcommon::start_pick_box()."\n";
+ if ($mode eq 'upload') {
+ my ($options,$cb_script,$coursepick) =
+ &default_role_selector($context,1);
+ $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value').
+ $options. &Apache::lonhtmlcommon::row_closure(1)."\n";
+ }
+ $secbox .= &Apache::lonhtmlcommon::row_title($rowtitle,'LC_oddrow_value')."\n";
+ if ($env{'request.course.sec'} eq '') {
+ $secbox .= '
'."\n";
+ } else {
+ $secbox .= ' '.
+ $env{'request.course.sec'};
+ }
+ $secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n".
+ &Apache::lonhtmlcommon::end_pick_box().'';
+ return $secbox;
+}
+
+sub results_header_row {
+ my ($rolefilter,$statusmode,$context,$permission,$mode) = @_;
+ my ($description,$showfilter);
+ if ($rolefilter ne 'Any') {
+ $showfilter = $rolefilter;
+ }
+ if ($context eq 'course') {
+ if ($mode eq 'csv' || $mode eq 'excel') {
+ $description = &mt('Course - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' ';
+ }
+ if ($statusmode eq 'Expired') {
+ $description .= &mt('Users in course with expired [_1] roles',$showfilter);
+ } 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);
+ } else {
+ if ($rolefilter eq 'Any') {
+ $description .= &mt('All users in course');
+ } else {
+ $description .= &mt('All users in course with [_1] roles',$rolefilter);
+ }
+ }
+ my $constraint;
+ my $viewablesec = &viewable_section($permission);
+ if ($viewablesec ne '') {
+ if ($env{'form.showrole'} eq 'st') {
+ $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]'
+ ,''
+ .&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') {
+ $description .= &mt('Co-authors with future [_1] roles',$showfilter);
+ } elsif ($statusmode eq 'Active') {
+ $description .= &mt('Co-authors with active [_1] roles',$showfilter);
+ } else {
+ if ($rolefilter eq 'Any') {
+ $description .= &mt('All co-authors');
+ } else {
+ $description .= &mt('All co-authors with [_1] roles',$rolefilter);
+ }
+ }
+ } elsif ($context eq 'domain') {
+ my $domdesc = &Apache::lonnet::domain($env{'request.role.domain'},'description');
+ $description = &mt('Domain - [_1]:',$domdesc).' ';
+ if ($env{'form.roletype'} eq 'domain') {
+ if ($statusmode eq 'Expired') {
+ $description .= &mt('Users in domain with expired [_1] roles',$showfilter);
+ } elsif ($statusmode eq 'Future') {
+ $description .= &mt('Users in domain with future [_1] roles',$showfilter);
+ } elsif ($statusmode eq 'Active') {
+ $description .= &mt('Users in domain with active [_1] roles',$showfilter);
+ } else {
+ if ($rolefilter eq 'Any') {
+ $description .= &mt('All users in domain');
+ } else {
+ $description .= &mt('All users in domain with [_1] roles',$rolefilter);
+ }
+ }
+ } 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') {
+ $description .= &mt('Co-authors in domain with future [_1] roles',$showfilter);
+ } elsif ($statusmode eq 'Active') {
+ $description .= &mt('Co-authors in domain with active [_1] roles',$showfilter);
+ } else {
+ if ($rolefilter eq 'Any') {
+ $description .= &mt('All users with co-author roles in domain',$showfilter);
+ } else {
+ $description .= &mt('All co-authors in domain with [_1] roles',$rolefilter);
+ }
+ }
+ } elsif ($env{'form.roletype'} eq 'course') {
+ my $coursefilter = $env{'form.coursepick'};
+ if ($coursefilter eq 'category') {
+ my $instcode = &instcode_from_coursefilter();
+ if ($instcode eq '.') {
+ $description .= &mt('All courses in domain').' - ';
+ } else {
+ $description .= &mt('Courses in domain with institutional code: [_1]',$instcode).' - ';
+ }
+ } elsif ($coursefilter eq 'selected') {
+ $description .= &mt('Selected courses in domain').' - ';
+ } elsif ($coursefilter eq 'all') {
+ $description .= &mt('All courses in domain').' - ';
+ }
+ if ($statusmode eq 'Expired') {
+ $description .= &mt('users with expired [_1] roles',$showfilter);
+ } elsif ($statusmode eq 'Future') {
+ $description .= &mt('users with future [_1] roles',$showfilter);
+ } elsif ($statusmode eq 'Active') {
+ $description .= &mt('users with active [_1] roles',$showfilter);
+ } else {
+ if ($rolefilter eq 'Any') {
+ $description .= &mt('all users');
+ } else {
+ $description .= &mt('users with [_1] roles',$rolefilter);
+ }
+ }
+ }
+ }
+ return $description;
+}
+
+sub viewable_section {
+ my ($permission) = @_;
+ my $viewablesec;
+ if (ref($permission) eq 'HASH') {
+ if (exists($permission->{'view_section'})) {
+ $viewablesec = $permission->{'view_section'};
+ } elsif (exists($permission->{'cusr_section'})) {
+ $viewablesec = $permission->{'cusr_section'};
+ }
+ }
+ return $viewablesec;
}
+
#################################################
#################################################
sub show_drop_list {
- my ($r,$classlist,$keylist,$nosort)=@_;
- 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'},
['sortby']);
@@ -1413,43 +3208,56 @@ sub show_drop_list {
if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) {
$sortby = 'username';
}
- my $cdom = $env{'course.'.$cid.'.domain'};
- my $cnum = $env{'course.'.$cid,'.num'};
- 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(<
-
END
-
-my %lt=&Apache::lonlocal::texthash('usrn' => "username",
- 'dom' => "domain",
- 'sn' => "student name",
- 'sec' => "section",
- 'start' => "start date",
- 'end' => "end date",
- 'groups' => "active groups",
- );
+ my ($indexhash,$keylist) = &make_keylist_array();
+ my $studentcount = 0;
+ if (ref($classlist) eq 'HASH') {
+ foreach my $student (keys(%{$classlist})) {
+ my $sdata = $classlist->{$student};
+ my $status = $sdata->[$indexhash->{'status'}];
+ my $section = $sdata->[$indexhash->{'section'}];
+ if ($status ne 'Active') {
+ delete($classlist->{$student});
+ next;
+ }
+ if ($env{'request.course.sec'} ne '') {
+ if ($section ne $env{'request.course.sec'}) {
+ delete($classlist->{$student});
+ next;
+ }
+ }
+ $studentcount ++;
+ }
+ }
+ if (!$studentcount) {
+ $r->print(&mt('There are no students to drop.'));
+ return;
+ }
+ my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
+ $classlist,$keylist,$cdom,$cnum);
+ my %lt=&Apache::lonlocal::texthash('usrn' => "username",
+ 'dom' => "domain",
+ 'sn' => "student name",
+ 'sec' => "section",
+ 'start' => "start date",
+ 'end' => "end date",
+ 'groups' => "active groups",
+ );
if ($nosort) {
- $r->print(&Apache::loncommon::start_data_table());
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row());
$r->print(<
$lt{'usrn'}
$lt{'dom'}
@@ -1459,61 +3267,55 @@ my %lt=&Apache::lonlocal::texthash('usrn
$lt{'start'}
$lt{'end'}
$lt{'groups'}
-
END
-
+ $r->print(&Apache::loncommon::end_data_table_header_row());
} else {
- $r->print(&Apache::loncommon::start_data_table());
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row());
$r->print(<
+
- $lt{'usrn'}
+ $lt{'usrn'}
- $lt{'dom'}
+ $lt{'dom'}
- ID
+ ID
- $lt{'sn'}
+ $lt{'sn'}
- $lt{'sec'}
+ $lt{'sec'}
- $lt{'start'}
+ $lt{'start'}
- $lt{'end'}
+ $lt{'end'}
- $lt{'groups'}
+ $lt{'groups'}
-
END
+ $r->print(&Apache::loncommon::end_data_table_header_row());
}
#
# Sort the students
- my %index;
- my $i;
- foreach (@$keylist) {
- $index{$_} = $i++;
- }
- $index{'groups'} = scalar(@$keylist);
- my $index = $index{$sortby};
- my $second = $index{'username'};
- my $third = $index{'domain'};
+ my $index = $indexhash->{$sortby};
+ my $second = $indexhash->{'username'};
+ my $third = $indexhash->{'domain'};
my @Sorted_Students = sort {
lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index])
||
lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
||
lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
- } (keys(%$classlist));
+ } (keys(%{$classlist}));
foreach my $student (@Sorted_Students) {
my $error;
my $sdata = $classlist->{$student};
- my $username = $sdata->[$index{'username'}];
- my $domain = $sdata->[$index{'domain'}];
- my $section = $sdata->[$index{'section'}];
- my $name = $sdata->[$index{'fullname'}];
- my $id = $sdata->[$index{'id'}];
- my $start = $sdata->[$index{'start'}];
- my $end = $sdata->[$index{'end'}];
+ my $username = $sdata->[$indexhash->{'username'}];
+ my $domain = $sdata->[$indexhash->{'domain'}];
+ my $section = $sdata->[$indexhash->{'section'}];
+ my $name = $sdata->[$indexhash->{'fullname'}];
+ my $id = $sdata->[$indexhash->{'id'}];
+ my $start = $sdata->[$indexhash->{'start'}];
+ my $end = $sdata->[$indexhash->{'end'}];
my $groups = $classgroups->{$student};
my $active_groups;
if (ref($groups->{active}) eq 'HASH') {
@@ -1529,18 +3331,18 @@ END
} else {
$end = &Apache::lonlocal::locallocaltime($end);
}
- my $status = $sdata->[$index{'status'}];
- next if ($status ne 'Active');
+ my $studentkey = $student.':'.$section;
+ my $startitem = ' ';
#
$r->print(&Apache::loncommon::start_data_table_row());
$r->print(<<"END");
-
+
$username
$domain
$id
$name
$section
- $start
+ $start $startitem
$end
$active_groups
END
@@ -1548,7 +3350,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",
);
@@ -1561,8 +3363,6 @@ END
return;
}
-
-
#
# Print out the initial form to get the file containing a list of users
#
@@ -1572,19 +3372,20 @@ sub print_first_users_upload_form {
$str = ' ';
$str .= ' ';
$str .= ' ';
- $str .= "".&mt('Upload a list of users')." \n";
+ $str .= "".&mt('Upload a file containing information about users')." \n";
$str .= &Apache::loncommon::upfile_select_html();
- $str .= "\n";
- $str .= ' '."\n";
- $str .= ' '.
- &mt('Ignore First Line')."
\n";
+ $str .= '';
$str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",
&mt("How do I create a users list from a spreadsheet")).
" \n";
$str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
- &mt("How do I create a CSV file from a spreadsheet")).
- " \n";
+ &mt("How do I create a CSV file from a spreadsheet"));
+ $str .= "
\n";
+ $str .= "\n";
+ $str .= ' '.
+ &mt('Ignore First Line')."
\n";
+ $str .= ' '." \n";
$str .= &Apache::loncommon::end_page();
$r->print($str);
return;
@@ -1592,7 +3393,7 @@ sub print_first_users_upload_form {
# ================================================= Drop/Add from uploaded file
sub upfile_drop_add {
- my ($r,$context) = @_;
+ my ($r,$context,$permission) = @_;
&Apache::loncommon::load_tmp_file($r);
my @userdata=&Apache::loncommon::upfile_record_sep();
if($env{'form.noFirstLine'}){shift(@userdata);}
@@ -1607,10 +3408,14 @@ sub upfile_drop_add {
$fields{$env{'form.f'.$i}}=$keyfields[$i];
}
}
+ if ($env{'form.fullup'} ne 'yes') {
+ $r->print('
\n");
+ } else {
+ $r->print(''.&mt('No roles added').'
');
}
if ($counts{'auth'} > 0) {
$r->print("\n".
&mt('Authentication changed for [_1] existing users.',
$counts{'auth'})."
\n");
}
- $r->print('');
+ $r->print(&print_namespacing_alerts($domain,\%alerts,\%curr_rules));
#####################################
- # Drop students #
+ # Display list of students to drop #
#####################################
if ($env{'form.fullup'} eq 'yes') {
- $r->print(''.&mt('Dropping Students')." \n");
+ $r->print(''.&mt('Students to Drop')." \n");
# Get current classlist
- my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
+ my $classlist = &Apache::loncoursedata::get_classlist();
if (! defined($classlist)) {
- $r->print(&mt('There are no students currently enrolled.').
- "\n");
- } else {
+ $r->print(''.
+ ' '.
+ &mt('There are no students with current/future access to the course.').
+ ''."\n");
+ } elsif (ref($classlist) eq 'HASH') {
# Remove the students we just added from the list of students.
- foreach (@userdata) {
- my %entries=&Apache::loncommon::record_sep($_);
+ foreach my $line (@userdata) {
+ my %entries=&Apache::loncommon::record_sep($line);
unless (($entries{$fields{'username'}} eq '') ||
(!defined($entries{$fields{'username'}}))) {
delete($classlist->{$entries{$fields{'username'}}.
@@ -1906,21 +3942,64 @@ sub upfile_drop_add {
}
}
# Print out list of dropped students.
- &show_drop_list($r,$classlist,$keylist,'nosort');
+ &show_drop_list($r,$classlist,'nosort',$permission);
}
}
} # end of unless
+ if ($env{'form.fullup'} ne 'yes') {
+ $r->print('');
+ }
+}
+
+sub print_namespacing_alerts {
+ my ($domain,$alerts,$curr_rules) = @_;
+ my $output;
+ if (ref($alerts) eq 'HASH') {
+ if (keys(%{$alerts}) > 0) {
+ if (ref($alerts->{'username'}) eq 'HASH') {
+ foreach my $dom (sort(keys(%{$alerts->{'username'}}))) {
+ my $count;
+ if (ref($alerts->{'username'}{$dom}) eq 'HASH') {
+ $count = keys(%{$alerts->{'username'}{$dom}});
+ }
+ my $domdesc = &Apache::lonnet::domain($domain,'description');
+ if (ref($curr_rules->{$dom}) eq 'HASH') {
+ $output .= &Apache::loncommon::instrule_disallow_msg(
+ 'username',$domdesc,$count,'upload');
+ }
+ $output .= &Apache::loncommon::user_rule_formats($dom,
+ $domdesc,$curr_rules->{$dom}{'username'},
+ 'username');
+ }
+ }
+ if (ref($alerts->{'id'}) eq 'HASH') {
+ foreach my $dom (sort(keys(%{$alerts->{'id'}}))) {
+ my $count;
+ if (ref($alerts->{'id'}{$dom}) eq 'HASH') {
+ $count = keys(%{$alerts->{'id'}{$dom}});
+ }
+ my $domdesc = &Apache::lonnet::domain($domain,'description');
+ if (ref($curr_rules->{$dom}) eq 'HASH') {
+ $output .= &Apache::loncommon::instrule_disallow_msg(
+ 'id',$domdesc,$count,'upload');
+ }
+ $output .= &Apache::loncommon::user_rule_formats($dom,
+ $domdesc,$curr_rules->{$dom}{'id'},'id');
+ }
+ }
+ }
+ }
}
sub user_change_result {
- my ($r,$userresult,$authresult,$roleresult,$counts,$flushc,$username,
- $userchg) = @_;
+ my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc,
+ $username,$userdomain,$userchg) = @_;
my $okresult = 0;
if ($userresult ne 'ok') {
if ($userresult =~ /^error:(.+)$/) {
my $error = $1;
$r->print(' '.
- &mt('[_1] : Unable to add/modify: [_2]',$username,$error));
+ &mt('[_1]: Unable to add/modify: [_2]',''.$username.':'.$userdomain.' ',$error));
}
} else {
$counts->{'user'} ++;
@@ -1930,7 +4009,7 @@ sub user_change_result {
if ($authresult =~ /^error:(.+)$/) {
my $error = $1;
$r->print(' '.
- &mt('[_1] : Unable to modify authentication: [_2]',$username,$error));
+ &mt('[_1]: Unable to modify authentication: [_2]',''.$username.':'.$userdomain.' ',$error));
}
} else {
$counts->{'auth'} ++;
@@ -1940,7 +4019,7 @@ sub user_change_result {
if ($roleresult =~ /^error:(.+)$/) {
my $error = $1;
$r->print(' '.
- &mt('[_1] : Unable to add role: [_2]',$username,$error));
+ &mt('[_1]: Unable to add role: [_2]',''.$username.':'.$userdomain.' ',$error));
}
} else {
$counts->{'role'} ++;
@@ -1948,64 +4027,311 @@ sub user_change_result {
}
if ($okresult) {
$flushc++;
- $userchg->{$username}=1;
+ $userchg->{$username.':'.$userdomain}=1;
$r->print('. ');
if ($flushc>15) {
$r->rflush;
$flushc=0;
}
}
+ if ($idresult) {
+ $r->print($idresult);
+ }
return $flushc;
}
# ========================================================= Menu Phase Two Drop
-sub print_expire_menu {
- my ($r,$context) = @_;
- $r->print("".&mt("Expire Users' Roles")." ");
- my $cid=$env{'request.course.id'};
- my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();
+sub print_drop_menu {
+ my ($r,$context,$permission) = @_;
+ $r->print(''.&mt("Drop Students").' '."\n".
+ ''. &Apache::loncommon::end_page());
return;
}
-
# ================================================================== Phase four
-sub expire_user_list {
- my ($r,$context) = @_;
+sub update_user_list {
+ my ($r,$context,$setting,$choice) = @_;
+ my $now = time;
my $count=0;
- my @droplist = &Apache::loncommon::get_env_multiple('form.droplist');
- foreach (@droplist) {
- my ($uname,$udom)=split(/\:/,$_);
- # drop student
- my $result = &modifystudent($udom,$uname,$env{'request.course.id'});
+ my @changelist;
+ if ($choice eq 'drop') {
+ @changelist = &Apache::loncommon::get_env_multiple('form.droplist');
+ } else {
+ @changelist = &Apache::loncommon::get_env_multiple('form.actionlist');
+ }
+ my %result_text = ( ok => { 'revoke' => 'Revoked',
+ 'delete' => 'Deleted',
+ 'reenable' => 'Re-enabled',
+ 'activate' => 'Activated',
+ 'chgdates' => 'Changed Access Dates for',
+ 'chgsec' => 'Changed section for',
+ 'drop' => 'Dropped',
+ },
+ error => {'revoke' => 'revoking',
+ 'delete' => 'deleting',
+ 'reenable' => 're-enabling',
+ 'activate' => 'activating',
+ 'chgdates' => 'changing access dates for',
+ 'chgsec' => 'changing section for',
+ 'drop' => 'dropping',
+ },
+ );
+ my ($startdate,$enddate);
+ if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') {
+ ($startdate,$enddate) = &get_dates_from_form();
+ }
+ foreach my $item (@changelist) {
+ my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype,@sections,
+ $scopestem);
+ if ($choice eq 'drop') {
+ ($uname,$udom,$sec) = split(/:/,$item,-1);
+ $role = 'st';
+ $cid = $env{'request.course.id'};
+ $scopestem = '/'.$cid;
+ $scopestem =~s/\_/\//g;
+ if ($sec eq '') {
+ $scope = $scopestem;
+ } else {
+ $scope = $scopestem.'/'.$sec;
+ }
+ } elsif ($context eq 'course') {
+ ($uname,$udom,$role,$sec,$type,$locktype) = split(/\:/,$item,-1);
+ $cid = $env{'request.course.id'};
+ $scopestem = '/'.$cid;
+ $scopestem =~s/\_/\//g;
+ if ($sec eq '') {
+ $scope = $scopestem;
+ } else {
+ $scope = $scopestem.'/'.$sec;
+ }
+ } elsif ($context eq 'author') {
+ ($uname,$udom,$role) = split(/\:/,$item,-1);
+ $scope = '/'.$env{'user.domain'}.'/'.$env{'user.name'};
+ } elsif ($context eq 'domain') {
+ if ($setting eq 'domain') {
+ ($role,$uname,$udom) = split(/\:/,$item,-1);
+ $scope = '/'.$env{'request.role.domain'}.'/';
+ } elsif ($setting eq 'author') {
+ ($uname,$udom,$role,$scope) = split(/\:/,$item);
+ } elsif ($setting eq 'course') {
+ ($uname,$udom,$role,$cid,$sec,$type,$locktype) =
+ split(/\:/,$item);
+ $scope = '/'.$cid;
+ $scope =~s/\_/\//g;
+ if ($sec ne '') {
+ $scope .= '/'.$sec;
+ }
+ }
+ }
+ my $plrole = &Apache::lonnet::plaintext($role);
+ my $start = $env{'form.'.$item.'_start'};
+ my $end = $env{'form.'.$item.'_end'};
+ if ($choice eq 'drop') {
+ # drop students
+ $end = $now;
+ $type = 'manual';
+ $result =
+ &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
+ } elsif ($choice eq 'revoke') {
+ # revoke or delete user role
+ $end = $now;
+ if ($role eq 'st') {
+ $result =
+ &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
+ } else {
+ $result =
+ &Apache::lonnet::revokerole($udom,$uname,$scope,$role,
+ '','',$context);
+ }
+ } elsif ($choice eq 'delete') {
+ if ($role eq 'st') {
+ &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context);
+ }
+ $result =
+ &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now,
+ $start,1,'',$context);
+ } else {
+ #reenable, activate, change access dates or change section
+ if ($choice ne 'chgsec') {
+ $start = $startdate;
+ $end = $enddate;
+ }
+ if ($choice eq 'reenable') {
+ if ($role eq 'st') {
+ $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
+ } else {
+ $result =
+ &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
+ $now,'','',$context);
+ }
+ } elsif ($choice eq 'activate') {
+ if ($role eq 'st') {
+ $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
+ } else {
+ $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
+ $now,'','',$context);
+ }
+ } elsif ($choice eq 'chgdates') {
+ if ($role eq 'st') {
+ $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context);
+ } else {
+ $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
+ $start,'','',$context);
+ }
+ } elsif ($choice eq 'chgsec') {
+ my (@newsecs,$revresult,$nochg,@retained);
+ if ($role ne 'cc') {
+ @newsecs = split(/,/,$env{'form.newsecs'});
+ }
+ # remove existing section if not to be retained.
+ if (!$env{'form.retainsec'}) {
+ if ($sec eq '') {
+ if (@newsecs == 0) {
+ $result = &mt('No change in section assignment (none)');
+ $nochg = 1;
+ } else {
+ $revresult =
+ &Apache::lonnet::revokerole($udom,$uname,
+ $scope,$role,
+ '','',$context);
+ }
+ } else {
+ if (@newsecs > 0) {
+ if (grep(/^\Q$sec\E$/,@newsecs)) {
+ push(@retained,$sec);
+ } else {
+ $revresult =
+ &Apache::lonnet::revokerole($udom,$uname,
+ $scope,$role,
+ '','',$context);
+ }
+ } else {
+ $revresult =
+ &Apache::lonnet::revokerole($udom,$uname,
+ $scope,$role,
+ '','',$context);
+ }
+ }
+ } else {
+ if ($sec eq '') {
+ $nochg = 1;
+ } else {
+ push(@retained,$sec);
+ }
+ }
+ # add new sections
+ if (@newsecs == 0) {
+ if (!$nochg) {
+ if ($role eq 'st') {
+ $result =
+ &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context);
+ } else {
+ my $newscope = $scopestem;
+ $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context);
+ }
+ }
+ } else {
+ foreach my $newsec (@newsecs) {
+ if (!grep(/^\Q$newsec\E$/,@retained)) {
+ if ($role eq 'st') {
+ $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context);
+ } else {
+ my $newscope = $scopestem;
+ if ($newsec ne '') {
+ $newscope .= '/'.$newsec;
+ }
+ $result = &Apache::lonnet::assignrole($udom,$uname,
+ $newscope,$role,$end,$start);
+ }
+ }
+ }
+ }
+ }
+ }
+ my $extent = $scope;
+ if ($choice eq 'drop' || $context eq 'course') {
+ my ($cnum,$cdom,$cdesc) = &get_course_identity($cid);
+ if ($cdesc) {
+ $extent = $cdesc;
+ }
+ }
if ($result eq 'ok' || $result eq 'ok:') {
- $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).' ');
+ $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for [_3]",
+ $plrole,$extent,$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,$extent,$uname.':'.$udom,$result).' ');
+ }
+ }
+ $r->print(''."\n");
+}
+
+sub classlist_drop {
+ my ($scope,$uname,$udom,$now) = @_;
+ my ($cdom,$cnum) = ($scope=~m{^/($match_domain)/($match_courseid)});
+ if (&Apache::lonnet::is_course($cdom,$cnum)) {
+ if (!&active_student_roles($cnum,$cdom,$uname,$udom)) {
+ my %user;
+ my $result = &update_classlist($cdom,$cnum,$udom,$uname,\%user,$now);
+ return &mt('Drop from classlist: [_1]',
+ ''.$result.' ').' ';
}
}
- $r->print(''.&mt('Dropped [_1] user(s).',$count).'
');
- $r->print(''.&mt('Re-enrollment will re-activate data.')) if ($count);
+}
+
+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 section_check_js {
- my $groupslist;
- my %curr_groups = &Apache::longroup::coursegroups();
- if (%curr_groups) {
- $groupslist = join('","',sort(keys(%curr_groups)));
- }
+ my $groupslist= &get_groupslist();
return <<"END";
function validate(caller) {
- var groups = new Array("$groupslist");
+ var groups = new Array($groupslist);
var secname = caller.value;
if ((secname == 'all') || (secname == 'none')) {
alert("'"+secname+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");
@@ -2052,5 +4378,644 @@ sub set_login {
return $response;
}
+sub course_sections {
+ my ($sections_count,$role,$current_sec) = @_;
+ my $output = '';
+ my @sections = (sort {$a <=> $b} keys %{$sections_count});
+ my $numsec = scalar(@sections);
+ my $is_selected = ' selected="selected" ';
+ if ($numsec <= 1) {
+ $output = ''."\n".
+ ' '.&mt('Select').' '."\n";
+ if ($current_sec eq 'none') {
+ $output .=
+ ' '.&mt('No section').' '."\n";
+ } else {
+ $output .=
+ ' '.&mt('No section').' '."\n";
+ }
+ if ($numsec == 1) {
+ if ($current_sec eq $sections[0]) {
+ $output .=
+ ' '.$sections[0].' '."\n";
+ } else {
+ $output .=
+ ' '.$sections[0].' '."\n";
+ }
+ }
+ } else {
+ $output = ''.&mt('Select').''."\n";
+ if ($current_sec eq 'none') {
+ $output .=
+ ' '.&mt('No section')." \n";
+ } else {
+ $output .=
+ ' '.&mt('No section')." \n";
+ }
+ } else {
+ $output .= 'multiple="multiple" size="'.$multiple.'">'."\n";
+ }
+ foreach my $sec (@sections) {
+ if ($current_sec eq $sec) {
+ $output .= ''.$sec." \n";
+ } else {
+ $output .= ''.$sec." \n";
+ }
+ }
+ }
+ $output .= ' ';
+ return $output;
+}
+
+sub get_groupslist {
+ my $groupslist;
+ my %curr_groups = &Apache::longroup::coursegroups();
+ if (%curr_groups) {
+ $groupslist = join('","',sort(keys(%curr_groups)));
+ $groupslist = '"'.$groupslist.'"';
+ }
+ return $groupslist;
+}
+
+sub setsections_javascript {
+ my ($formname,$groupslist,$mode,$checkauth) = @_;
+ my ($checkincluded,$finish,$rolecode,$setsection_js);
+ if ($mode eq 'upload') {
+ $checkincluded = 'formname.name == "'.$formname.'"';
+ $finish = "return 'ok';";
+ $rolecode = "var role = formname.defaultrole.options[formname.defaultrole.selectedIndex].value;\n";
+ } elsif ($formname eq 'cu') {
+ $checkincluded = 'formname.elements[i-1].checked == true';
+ if ($checkauth) {
+ $finish = "var authcheck = auth_check();\n".
+ " if (authcheck == 'ok') {\n".
+ " formname.submit();\n".
+ " }\n";
+ } else {
+ $finish = 'formname.submit()';
+ }
+ $rolecode = "var match = str.split('_');
+ var role = match[3];\n";
+ } elsif ($formname eq 'enrollstudent') {
+ $checkincluded = 'formname.name == "'.$formname.'"';
+ if ($checkauth) {
+ $finish = "var authcheck = auth_check();\n".
+ " if (authcheck == 'ok') {\n".
+ " formname.submit();\n".
+ " }\n";
+ } else {
+ $finish = 'formname.submit()';
+ }
+ $rolecode = "var match = str.split('_');
+ var role = match[1];\n";
+ } else {
+ $checkincluded = 'formname.name == "'.$formname.'"';
+ $finish = "seccheck = 'ok';";
+ $rolecode = "var match = str.split('_');
+ var role = match[1];\n";
+ $setsection_js = "var seccheck = 'alert';";
+ }
+ my %alerts = &Apache::lonlocal::texthash(
+ secd => 'Section designations do not apply to Course Coordinator roles.',
+ accr => 'A course coordinator role will be added with access to all sections.',
+ inea => 'In each course, each user may only have one student role at a time.',
+ youh => 'You had selected ',
+ secs => 'sections.',
+ plmo => 'Please modify your selections so they include no more than one section.',
+ mayn => 'may not be used as the name for a section, as it is a reserved word.',
+ plch => 'Please choose a different section name.',
+ mnot => 'may not be used as a section name, as it is the name of a course group.',
+ secn => 'Section names and group names must be distinct. Please choose a different section name.',
+ );
+ $setsection_js .= <<"ENDSECCODE";
+
+function setSections(formname) {
+ var re1 = /^currsec_/;
+ var groups = new Array($groupslist);
+ for (var i=0;i 0) {
+ if (formname.elements[i+1].value != "" && formname.elements[i+1].value != null) {
+ sections = sections + "," + formname.elements[i+1].value;
+ }
+ }
+ else {
+ sections = formname.elements[i+1].value;
+ }
+ var newsecs = formname.elements[i+1].value;
+ var numsplit;
+ if (newsecs != null && newsecs != "") {
+ numsplit = newsecs.split(/,/g);
+ numsec = numsec + numsplit.length;
+ }
+
+ if ((role == 'st') && (numsec > 1)) {
+ alert("$alerts{'inea'} $alerts{'youh'} "+numsec+" $alerts{'secs'}\\n$alerts{'plmo'}")
+ return;
+ }
+ else {
+ if (numsplit != null) {
+ for (var j=0; j 0) {
+ my %rule_check = &Apache::lonnet::inst_rulecheck($dom,$uname,undef,'username',\@user_rules);
+ if (keys(%rule_check) > 0) {
+ $usertype = 'unofficial';
+ foreach my $item (keys(%rule_check)) {
+ if ($rule_check{$item}) {
+ $usertype = 'official';
+ last;
+ }
+ }
+ }
+ }
+ }
+ return $usertype;
+}
+
+sub roles_by_context {
+ my ($context,$custom) = @_;
+ my @allroles;
+ if ($context eq 'course') {
+ @allroles = ('st','ad','ta','ep','in','cc');
+ if ($custom) {
+ push(@allroles,'cr');
+ }
+ } elsif ($context eq 'author') {
+ @allroles = ('ca','aa');
+ } elsif ($context eq 'domain') {
+ @allroles = ('li','dg','sc','au','dc');
+ }
+ return @allroles;
+}
+
+sub get_permission {
+ my ($context,$roles) = @_;
+ my %permission;
+ if ($context eq 'course') {
+ my $custom = 1;
+ my @allroles = &roles_by_context($context,$custom);
+ foreach my $role (@allroles) {
+ if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
+ $permission{'cusr'} = 1;
+ last;
+ }
+ }
+ if (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) {
+ $permission{'custom'} = 1;
+ }
+ if (&Apache::lonnet::allowed('vcl',$env{'request.course.id'})) {
+ $permission{'view'} = 1;
+ }
+ if (!$permission{'view'}) {
+ my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'};
+ $permission{'view'} = &Apache::lonnet::allowed('vcl',$scope);
+ if ($permission{'view'}) {
+ $permission{'view_section'} = $env{'request.course.sec'};
+ }
+ }
+ if (!$permission{'cusr'}) {
+ if ($env{'request.course.sec'} ne '') {
+ my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'};
+ $permission{'cusr'} = (&Apache::lonnet::allowed('cst',$scope));
+ if ($permission{'cusr'}) {
+ $permission{'cusr_section'} = $env{'request.course.sec'};
+ }
+ }
+ }
+ if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
+ $permission{'grp_manage'} = 1;
+ }
+ } elsif ($context eq 'author') {
+ $permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'});
+ $permission{'view'} = $permission{'cusr'};
+ } else {
+ my @allroles = &roles_by_context($context);
+ foreach my $role (@allroles) {
+ if (&Apache::lonnet::allowed('c'.$role,$env{'request.role.domain'})) {
+ $permission{'cusr'} = 1;
+ last;
+ }
+ }
+ if (!$permission{'cusr'}) {
+ if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
+ $permission{'cusr'} = 1;
+ }
+ }
+ if (&Apache::lonnet::allowed('ccr',$env{'request.role.domain'})) {
+ $permission{'custom'} = 1;
+ }
+ $permission{'view'} = $permission{'cusr'};
+ }
+ my $allowed = 0;
+ foreach my $perm (values(%permission)) {
+ if ($perm) { $allowed=1; last; }
+ }
+ return (\%permission,$allowed);
+}
+
+# ==================================================== Figure out author access
+
+sub authorpriv {
+ my ($auname,$audom)=@_;
+ unless ((&Apache::lonnet::allowed('cca',$audom.'/'.$auname))
+ || (&Apache::lonnet::allowed('caa',$audom.'/'.$auname))) { return ''; } return 1;
+}
+
+sub roles_on_upload {
+ my ($context,$setting,%customroles) = @_;
+ my (@possible_roles,@permitted_roles);
+ @possible_roles = &curr_role_permissions($context,$setting,1);
+ foreach my $role (@possible_roles) {
+ if ($role eq 'cr') {
+ push(@permitted_roles,keys(%customroles));
+ } else {
+ push(@permitted_roles,$role);
+ }
+ }
+ return @permitted_roles;
+}
+
+sub get_course_identity {
+ my ($cid) = @_;
+ my ($cnum,$cdom,$cdesc);
+ if ($cid eq '') {
+ $cid = $env{'request.course.id'}
+ }
+ if ($cid ne '') {
+ $cnum = $env{'course.'.$cid.'.num'};
+ $cdom = $env{'course.'.$cid.'.domain'};
+ $cdesc = $env{'course.'.$cid.'.description'};
+ if ($cnum eq '' || $cdom eq '') {
+ my %coursehash =
+ &Apache::lonnet::coursedescription($cid,{'one_time' => 1});
+ $cdom = $coursehash{'domain'};
+ $cnum = $coursehash{'num'};
+ $cdesc = $coursehash{'description'};
+ }
+ }
+ return ($cnum,$cdom,$cdesc);
+}
+
+sub dc_setcourse_js {
+ my ($formname,$mode,$context) = @_;
+ my ($dc_setcourse_code,$authen_check);
+ my $cctext = &Apache::lonnet::plaintext('cc');
+ my %alerts = §ioncheck_alerts();
+ my $role = 'role';
+ if ($mode eq 'upload') {
+ $role = 'courserole';
+ } else {
+ $authen_check = &verify_authen($formname,$context);
+ }
+ $dc_setcourse_code = (<<"SCRIPTTOP");
+$authen_check
+
+function setCourse() {
+ var course = document.$formname.dccourse.value;
+ if (course != "") {
+ if (document.$formname.dcdomain.value != document.$formname.origdom.value) {
+ alert("$alerts{'curd'}");
+ return;
+ }
+ var userrole = document.$formname.$role.options[document.$formname.$role.selectedIndex].value
+ var section="";
+ var numsections = 0;
+ var newsecs = new Array();
+ for (var i=0; i 1)) {
+ alert("$alerts{'inea'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.")
+ return;
+ }
+ for (var j=0; j 0)) {
+ alert("$alerts{'secd'} $cctext $alerts{'role'}.\\n$alerts{'accr'}.");
+ section = "";
+ }
+SCRIPTTOP
+ if ($mode ne 'upload') {
+ $dc_setcourse_code .= (<<"ENDSCRIPT");
+ var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole
+ var numcourse = getIndex(document.$formname.dccourse);
+ if (numcourse == "-1") {
+ alert("$alerts{'thwa'}");
+ return;
+ }
+ else {
+ document.$formname.elements[numcourse].name = "act"+coursename;
+ var numnewsec = getIndex(document.$formname.newsec);
+ if (numnewsec != "-1") {
+ document.$formname.elements[numnewsec].name = "sec"+coursename;
+ document.$formname.elements[numnewsec].value = section;
+ }
+ var numstart = getIndex(document.$formname.start);
+ if (numstart != "-1") {
+ document.$formname.elements[numstart].name = "start"+coursename;
+ }
+ var numend = getIndex(document.$formname.end);
+ if (numend != "-1") {
+ document.$formname.elements[numend].name = "end"+coursename
+ }
+ }
+ }
+ var authcheck = auth_check();
+ if (authcheck == 'ok') {
+ document.$formname.submit();
+ }
+}
+ENDSCRIPT
+ } else {
+ $dc_setcourse_code .= "
+ document.$formname.sections.value = section;
+ }
+ return 'ok';
+}
+";
+ }
+ $dc_setcourse_code .= (<<"ENDSCRIPT");
+
+ function getIndex(caller) {
+ for (var i=0;i 0) {
+ var loginpicked = 0;
+ for (var i=0; i 'You must select a course in the current domain',
+ inea => 'In each course, each user may only have one student role at a time',
+ youh => 'You had selected',
+ sect => 'sections',
+ plsm => 'Please modify your selections so they include no more than one section',
+ mayn => 'may not be used as the name for a section, as it is a reserved word',
+ plsc => 'Please choose a different section name',
+ mayt => 'may not be used as the name for a section, as it is the name of a course group',
+ secn => 'Section names and group names must be distinct',
+ secd => 'Section designations do not apply to ',
+ role => 'roles',
+ accr => 'role will be added with access to all sections',
+ thwa => 'There was a problem with your course selection'
+ );
+ return %alerts;
+}
+
+sub authcheck_alerts {
+ my %alerts =
+ &Apache::lonlocal::texthash(
+ authen => 'You must choose an authentication type.',
+ krb => 'You need to specify the Kerberos domain.',
+ ipass => 'You need to specify the initial password.',
+ );
+ return %alerts;
+}
+
1;
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.