--- loncom/interface/lonuserutils.pm 2008/01/06 04:27:25 1.45
+++ loncom/interface/lonuserutils.pm 2008/05/29 00:43:21 1.56
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Utility functions for managing LON-CAPA user accounts
#
-# $Id: lonuserutils.pm,v 1.45 2008/01/06 04:27:25 raeburn Exp $
+# $Id: lonuserutils.pm,v 1.56 2008/05/29 00:43:21 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -42,7 +42,7 @@ use LONCAPA qw(:DEFAULT :match);
###############################################################
# Drop student from all sections of a course, except optional $csec
sub modifystudent {
- my ($udom,$unam,$courseid,$csec,$desiredhost)=@_;
+ my ($udom,$unam,$courseid,$csec,$desiredhost,$context)=@_;
# if $csec is undefined, drop the student from all the courses matching
# this one. If $csec is defined, drop them from all other sections of
# this course and add them to section $csec
@@ -69,7 +69,7 @@ sub modifystudent {
# dom name id mode pass f m l g
($udom,$unam,'', '', '',undef,undef,undef,undef,
$section,time,undef,undef,$desiredhost,'','manual',
- '',$courseid);
+ '',$courseid,'',$context);
$result .= $reply.':';
}
}
@@ -129,7 +129,8 @@ sub modifyuserrole {
if ($role ne '') {
$role =~ s/_/\//g;
$roleresult = &Apache::lonnet::assignrole($udom,$uname,$scope,
- $role,$end,$start);
+ $role,$end,$start,'',
+ '',$context);
}
}
return ($userresult,$authresult,$roleresult,$idresult);
@@ -924,8 +925,15 @@ sub setup_date_selectors {
sub get_dates_from_form {
- my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate');
- my $enddate = &Apache::lonhtmlcommon::get_date_from_form('enddate');
+ my ($startname,$endname) = @_;
+ if ($startname eq '') {
+ $startname = 'startdate';
+ }
+ if ($endname eq '') {
+ $endname = 'enddate';
+ }
+ my $startdate = &Apache::lonhtmlcommon::get_date_from_form($startname);
+ my $enddate = &Apache::lonhtmlcommon::get_date_from_form($endname);
if ($env{'form.no_end_date'}) {
$enddate = 0;
}
@@ -1251,34 +1259,11 @@ sub print_userlist {
if ($env{'form.showrole'} eq 'Any') {
$roleselected = ' selected="selected" ';
}
- my ($role_select,$cnum,$cdom);
- if ($context eq 'domain') {
- $role_select = &domain_roles_select();
- $r->print('');
- } else {
- $role_select = '';
- $r->print('');
- if ($context eq 'course') {
- ($cnum,$cdom) = &get_course_identity();
- $r->print(§ion_group_filter($cnum,$cdom));
- }
+ my ($cnum,$cdom);
+ $r->print(&role_filter($context));
+ 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')).
@@ -1307,7 +1292,7 @@ sub print_userlist {
}
$r->rflush();
if ($context eq 'course') {
- if ($env{'form.showrole'} eq 'st' || ($env{'form.showrole'} eq 'Any') {
+ if (($env{'form.showrole'} eq 'st') || ($env{'form.showrole'} eq 'Any')) {
my $classlist = &Apache::loncoursedata::get_classlist();
%userlist = %{$classlist};
}
@@ -1450,6 +1435,41 @@ sub print_userlist {
$env{'form.phase'}.'" />');
}
+sub role_filter {
+ my ($context) = @_;
+ my $output;
+ my $roleselected = '';
+ if ($env{'form.showrole'} eq 'Any') {
+ $roleselected = ' selected="selected" ';
+ }
+ my ($role_select);
+ if ($context eq 'domain') {
+ $role_select = &domain_roles_select();
+ $output = '';
+ } else {
+ $role_select = '';
+ $output = '';
+ }
+ return $output;
+}
+
sub section_group_filter {
my ($cnum,$cdom) = @_;
my @filters;
@@ -1467,9 +1487,9 @@ sub section_group_filter {
all => 'all',
none => 'none',
);
- my ($output,@options);
+ my $output;
foreach my $item (@filters) {
- my $markup;
+ my ($markup,@options);
if ($env{'form.'.$name{$item}} eq '') {
$env{'form.'.$name{$item}} = 'all';
}
@@ -1513,6 +1533,10 @@ sub list_submit_button {
sub gather_userinfo {
my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash,$permission) = @_;
+ my $viewablesec;
+ if ($context eq 'course') {
+ $viewablesec = &viewable_section($permission);
+ }
foreach my $item (keys(%{$rolehash})) {
my %userdata;
if ($context eq 'author') {
@@ -1522,7 +1546,6 @@ sub gather_userinfo {
&build_user_record($context,\%userdata,$userinfo,$indexhash,
$item,$userlist);
} elsif ($context eq 'course') {
- my $viewablesec = &viewable_section($permission);
($userdata{'username'},$userdata{'domain'},$userdata{'role'},
$userdata{'section'}) = split(/:/,$item,-1);
($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item});
@@ -1791,6 +1814,7 @@ sub make_keylist_array {
$index->{'role'} = &Apache::loncoursedata::CL_ROLE();
$index->{'extent'} = &Apache::loncoursedata::CL_EXTENT();
$index->{'photo'} = &Apache::loncoursedata::CL_PHOTO();
+ $index->{'thumbnail'} = &Apache::loncoursedata::CL_THUMBNAIL();
foreach my $key (keys(%{$index})) {
$keylist->[$index->{$key}] = $key;
}
@@ -1839,7 +1863,10 @@ sub process_date_info {
}
sub show_users_list {
- my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist)=@_;
+ my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname)=@_;
+ if ($formname eq '') {
+ $formname = 'studentform';
+ }
#
# Variables for excel output
my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
@@ -1854,6 +1881,9 @@ sub show_users_list {
} else {
push(@sortable,'extent');
}
+ if ($mode eq 'pickauthor') {
+ @sortable = ('username','fullname','email','status');
+ }
if (!grep(/^\Q$sortby\E$/,@sortable)) {
$sortby = 'username';
}
@@ -1894,113 +1924,49 @@ function photowindow(photolink) {
END
}
}
- if ($mode ne 'autoenroll') {
+ if ($mode ne 'autoenroll' && $mode ne 'pickauthor') {
my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript();
- my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox");
- my $singconfirm = &mt(' for a single user?');
- my $multconfirm = &mt(' for multiple users?');
my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode);
- 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 $verify_action_js = &bulkaction_javascript($formname);
$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 .= ' ';
- }
- $output .= '
- \n".
+ $output .= "\n".' '.
-&mt('Use "Save" to update the main window with your selections.').'
');
+ $r->print(''.$results_description.'
');
}
my ($output,$actionselect,%canchange,%canchangesec);
- if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
- if ($mode ne 'autoenroll') {
+ 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);
+ $actionselect = &select_actions($context,$setting,$statusmode,$formname);
}
$r->print(<
';
- } else {
- $output .= &mt("Click on a username to view the user's personal page.").'
';
- }
if ($actionselect) {
$output .= <<"END";
-$lt{'ac'}: $actionselect
+$lt{'type'}
+ $lt{'type'}
";
} else {
- $output .= "\n".''.&mt('Count').' '."\n";
+ if ($mode eq 'pickauthor') {
+ $output .= "\n".' '."\n";
+ } else {
+ $output .= "\n".''.&mt('Count').' '."\n";
+ }
if ($actionselect) {
$output .= ''.&mt('Select').' '."\n";
}
}
foreach my $item (@cols) {
- $output .= "$lt{$item} \n";
+ $output .= "$lt{$item} \n";
}
my %role_types = &role_type_names();
if ($context eq 'course' && $mode ne 'autoenroll') {
@@ -2186,8 +2165,8 @@ END
$clickerchg = 'off';
}
$output .= ' '."\n".' '.
- ''.
+ ''.
$clicker_options{$clickerchg}.' '.$lt{'clicker'}."\n".
' '."\n";
@@ -2202,8 +2181,8 @@ END
$photochg = 'off';
}
$output .= ' '."\n".' '.
- ''.
+ ''.
$photo_options{$photochg}.' '.$lt{'photo'}."\n".
' '."\n";
}
@@ -2243,7 +2222,6 @@ END
}
# Done with header lines in all formats
-
my %index;
my $i;
foreach my $idx (@$keylist) {
@@ -2345,6 +2323,8 @@ END
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');
}
@@ -2401,7 +2381,7 @@ END
} else {
$in{'end'} = &Apache::lonlocal::locallocaltime($in{'end'});
}
- if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
+ 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') {
@@ -2423,7 +2403,9 @@ END
}
$r->print("$cellentry \n");
} else {
- $r->print("$rowcount \n");
+ if ($mode ne 'pickauthor') {
+ $r->print("$rowcount \n");
+ }
if ($actionselect) {
my $showcheckbox;
if ($role =~ /^cr\//) {
@@ -2457,12 +2439,13 @@ END
} else {
$r->print(' ');
}
+ } elsif ($mode eq 'pickauthor') {
+ $r->print('');
}
}
foreach my $item (@cols) {
if ($item eq 'username') {
- $r->print(' '.&print_username_link($mode,$permission,
- \%in).' ');
+ $r->print(''.&print_username_link($mode,\%in).' ');
} elsif (($item eq 'start' || $item eq 'end') && ($actionselect)) {
$r->print(''.$in{$item}.' '."\n");
} else {
@@ -2481,7 +2464,7 @@ END
}
if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') {
- $r->print(' ');
+ $r->print(' ');
} else {
$r->print(' ');
}
@@ -2525,7 +2508,7 @@ END
$row++;
}
}
- if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
+ 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();
@@ -2545,15 +2528,130 @@ END
}
}
+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 {
+ 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 .= '
+ }
+ }
+}
+';
+ return $output;
+}
+
sub print_username_link {
- my ($mode,$permission,$in) = @_;
+ my ($mode,$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'}'".')" />'.
@@ -2572,7 +2670,7 @@ sub role_type_names {
}
sub select_actions {
- my ($context,$setting,$statusmode) = @_;
+ my ($context,$setting,$statusmode,$formname) = @_;
my %lt = &Apache::lonlocal::texthash(
revoke => "Revoke user roles",
delete => "Delete user roles",
@@ -2633,7 +2731,7 @@ sub select_actions {
}
}
if ($options) {
- $output = ''."\n".
+ $output = '';
if ($choices{'dates'}) {
@@ -2649,7 +2747,8 @@ sub select_actions {
''."\n".
''."\n".
''."\n".
- ''."\n";
+ ''."\n".
+ ''."\n";
if ($context eq 'course') {
$output .= ''."\n";
}
@@ -2664,37 +2763,17 @@ sub select_actions {
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 $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 = '
-
-';
+ENDJS
my %lt = &Apache::lonlocal::texthash (
chac => 'Access dates to apply for selected users',
chse => 'Changes in section affiliation to apply to selected users',
@@ -2847,8 +2933,7 @@ END
$output .= $info.$secbox;
}
$output .= '
'.
-'