--- loncom/interface/lonuserutils.pm 2008/12/12 16:50:53 1.77 +++ loncom/interface/lonuserutils.pm 2009/08/28 22:47:07 1.98 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.77 2008/12/12 16:50:53 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.98 2009/08/28 22:47:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -86,7 +86,7 @@ sub modifystudent { sub modifyuserrole { my ($context,$setting,$changeauth,$cid,$udom,$uname,$uid,$umode,$upass, $first,$middle,$last,$gene,$sec,$forceid,$desiredhome,$email,$role, - $end,$start,$checkid) = @_; + $end,$start,$checkid,$inststatus) = @_; my ($scope,$userresult,$authresult,$roleresult,$idresult); if ($setting eq 'course' || $context eq 'course') { $scope = '/'.$cid; @@ -124,7 +124,7 @@ sub modifyuserrole { $userresult = &Apache::lonnet::modifyuser($udom,$uname,$uid,$umode,$upass,$first, $middle,$last,$gene,$forceid,$desiredhome, - $email,$role,$start,$end); + $email,$inststatus); if ($userresult eq 'ok') { if ($role ne '') { $role =~ s/_/\//g; @@ -328,9 +328,11 @@ sub print_upload_manager_header { &javascript_validations('upload',$krbdefdom,$password_choice,undef, $env{'request.role.domain'},$context, $groupslist); - my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':''); - $r->print(&mt('Total number of records found in file: [_1]','<b>'.$distotal.'</b>'). - "<br />\n"); + my $checked=(($env{'form.noFirstLine'})?' checked="checked"':''); + $r->print('<p>' + .&mt('Total number of records found in file: [_1]' + ,'<b>'.$distotal.'</b>') + ."</p>\n"); $r->print('<div class="LC_left_float"><h3>'. &mt('Identify fields in uploaded list')."</h3>\n"); $r->print(&mt('Enter as many fields as you can.<br /> The system will inform you and bring you back to this page, <br /> if the data selected are insufficient to add users.')."<br />\n"); @@ -341,14 +343,17 @@ sub print_upload_manager_header { &hidden_input('fileupload',$env{'form.fileupload'}). &hidden_input('upfiletype',$env{'form.upfiletype'}). &hidden_input('upfile_associate',$env{'form.upfile_associate'})); - $r->print('<br /><label><input type="checkbox" name="noFirstLine"'.$checked.'/>'. + $r->print('<br /><label><input type="checkbox" name="noFirstLine"'.$checked.' />'. &mt('Ignore First Line').'</label><br />'); $r->print('<br /><input type="button" value="'.&mt('Reverse Association').'" '. 'name="Reverse Association" '. - 'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'); + 'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'); $r->print("<br /><br />\n". '<script type="text/javascript" language="Javascript">'."\n". - $javascript."\n".$javascript_validations.'</script>'); + '// <![CDATA['."\n". + $javascript."\n".$javascript_validations."\n". + '// ]]>'."\n". + '</script>'); } ############################################################### @@ -401,17 +406,20 @@ sub javascript_validations { krb => 'You need to specify the Kerberos domain.', ipass => 'You need to specify the initial password.', name => 'The optional name field was not specified.', - snum => 'The optional ID number field was not specified.', + snum => 'The optional student/employee ID field was not specified.', section => 'The optional section field was not specified.', email => 'The optional e-mail address field was not specified.', role => 'The optional role field was not specified.', domain => 'The optional domain field was not specified.', continue => 'Continue adding users?', ); + if (($mode eq 'upload') && ($context eq 'domain')) { + $alert{'inststatus'} = &mt('The optional affiliation field was not specified'); + } my $function_name = <<"END"; $setsections_js -function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain) { +function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus) { END my ($authnum,%can_assign) = &Apache::loncommon::get_assignable_auth($domain); my $auth_checks; @@ -538,6 +546,20 @@ END } message+='$alert{'domain'}'; } +END + if (($mode eq 'upload') && ($context eq 'domain')) { + $optional_checks .= (<<END); + + if (foundinststatus==0) { + if (message!='') { + message+='\\n'; + } + message+='$alert{'inststatus'}'; + } +END + } + $optional_checks .= (<<END); + if (message!='') { message+= '\\n$alert{'continue'}'; if (confirm(message)) { @@ -568,6 +590,7 @@ function verify(vf,sec_caller) { var foundemail=0; var foundrole=0; var founddomain=0; + var foundinststatus=0; var tw; for (i=0;i<=vf.nfields.value;i++) { tw=eval('vf.f'+i+'.selectedIndex'); @@ -579,8 +602,9 @@ function verify(vf,sec_caller) { if (tw==10) { foundemail=1; } if (tw==11) { foundrole=1; } if (tw==12) { founddomain=1; } + if (tw==13) { foundinststatus=1; } } - verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain); + verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus); } // @@ -602,6 +626,7 @@ function verify(vf,sec_caller) { // 10 = email address // 11 = role // 12 = domain +// 13 = inststatus function flip(vf,tf) { var nw=eval('vf.f'+tf+'.selectedIndex'); @@ -666,6 +691,7 @@ function verify(vf,sec_caller) { var foundsec=0; var foundrole=0; var founddomain=0; + var foundinststatus=0; var tw; for (i=0;i<=vf.nfields.value;i++) { tw=eval('vf.f'+i+'.selectedIndex'); @@ -676,8 +702,9 @@ function verify(vf,sec_caller) { if (i==8 && tw!=0) { foundpwd=1; } if (i==9 && tw!=0) { foundrole=1; } if (i==10 && tw!=0) { founddomain=1; } + if (i==13 && tw!=0) { foundinstatus=1; } } - verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundrole,founddomain); + verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundrole,founddomain,foundinststatus); } function flip(vf,tf) { @@ -735,78 +762,134 @@ sub print_upload_manager_footer { my $locform = &Apache::loncommon::authform_local(%param); my $date_table = &date_setting_table(undef,undef,$context,undef, $formname,$permission); + my $Str = "\n".'<div class="LC_left_float">'; $Str .= &hidden_input('nfields',$i); $Str .= &hidden_input('keyfields',$keyfields); - $Str .= "<h3>".&mt('Login Type')."</h3>\n"; + + $Str .= '<h3>'.&mt('Options').'</h3>' + .&Apache::lonhtmlcommon::start_pick_box(); + + $Str .= &Apache::lonhtmlcommon::row_title(&mt('Login Type')); if ($context eq 'domain') { - $Str .= '<p>'.&mt('Change authentication for existing users in domain "[_1]" to these settings?',$defdom).' <span class="LC_nobreak"><label><input type="radio" name="changeauth" value="No" checked="checked" />'.&mt('No').'</label> <label><input type="radio" name="changeauth" value="Yes" />'.&mt('Yes').'</label></span></p>'; + $Str .= '<p>' + .&mt('Change authentication for existing users in domain "[_1]" to these settings?' + ,$defdom) + .' <span class="LC_nobreak"><label>' + .'<input type="radio" name="changeauth" value="No" checked="checked" />' + .&mt('No').'</label>' + .' <label>' + .'<input type="radio" name="changeauth" value="Yes" />' + .&mt('Yes').'</label>' + .'</span></p>'; } else { - $Str .= "<p>\n". - &mt('Note: This will not take effect if the user already exists.'). + $Str .= '<p class="LC_info">'."\n". + &mt('This will not take effect if the user already exists.'). &Apache::loncommon::help_open_topic('Auth_Options'). "</p>\n"; } $Str .= &set_login($defdom,$krbform,$intform,$locform); + my ($home_server_pick,$numlib) = &Apache::loncommon::home_server_form_item($defdom,'lcserver', 'default','hide'); if ($numlib > 1) { - $Str .= '<h3>'.&mt('LON-CAPA Home Server for New Users')."</h3>\n". - &mt('LON-CAPA domain: [_1] with home server: [_2]',$defdom, - $home_server_pick).'<br />'; - } else { - $Str .= $home_server_pick; - } - $Str .= '<h3>'.&mt('Default domain').'</h3>'."\n". - &Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1); - $Str .= '<h3>'.&mt('Starting and Ending Dates'). - "</h3>\n"; - $Str .= "<p>\n".$date_table."</p>\n"; + $Str .= &Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + &mt('LON-CAPA Home Server for New Users')) + .&mt('LON-CAPA domain: [_1] with home server:','"'.$defdom.'"') + .$home_server_pick + .&Apache::lonhtmlcommon::row_closure(); + } else { + $Str .= $home_server_pick. + &Apache::lonhtmlcommon::row_closure(); + } + + $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain')) + .&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1) + .&Apache::lonhtmlcommon::row_closure(); + + $Str .= &Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates')) + ."<p>\n".$date_table."</p>\n" + .&Apache::lonhtmlcommon::row_closure(); + if ($context eq 'domain') { - $Str .= '<h3>'.&mt('Settings for assigning roles:').'</h3>'."\n". - &mt('Pick the action to take on roles for these users:').'<br /><span class="LC_nobreak"><label><input type="radio" name="roleaction" value="norole" checked="checked" /> '.&mt('No role changes').'</label> <label><input type="radio" name="roleaction" value="domain" /> '.&mt('Add a domain role').'</label> <label><input type="radio" name="roleaction" value="course" /> '.&mt('Add a course role').'</label></span>'; - } - if ($context eq 'author') { - $Str .= '<h3>'.&mt('Default role')."</h3>\n". - &mt('Choose the role to assign to users without a value specified in the uploaded file'); + $Str .= &Apache::lonhtmlcommon::row_title( + &mt('Settings for assigning roles')) + .&mt('Pick the action to take on roles for these users:').'<br />' + .'<span class="LC_nobreak"><label>' + .'<input type="radio" name="roleaction" value="norole" checked="checked" />' + .' '.&mt('No role changes').'</label>' + .' <label>' + .'<input type="radio" name="roleaction" value="domain" />' + .' '.&mt('Add a domain role').'</label>' + .' <label>' + .'<input type="radio" name="roleaction" value="course" />' + .' '.&mt('Add a course role').'</label>' + .'</span>'; + } elsif ($context eq 'author') { + $Str .= &Apache::lonhtmlcommon::row_title( + &mt('Default role')) + .&mt('Choose the role to assign to users without a value specified in the uploaded file.') } elsif ($context eq 'course') { - $Str .= '<h3>'.&mt('Default role and section')."</h3>\n". - &mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file'); - } else { - $Str .= '<br /><br /><b>'.&mt('Default role and/or section(s)')."</b><br />\n". - &mt('Role and/or section(s) for users without values specified in the uploaded file.'); + $Str .= &Apache::lonhtmlcommon::row_title( + &mt('Default role and section')) + .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.'); + } else { + $Str .= &Apache::lonhtmlcommon::row_title( + &mt('Default role and/or section(s)')) + .&mt('Role and/or section(s) for users without values specified in the uploaded file.'); } - $Str .= '<br />'; if (($context eq 'domain') || ($context eq 'author')) { + $Str .= '<br />'; my ($options,$cb_script,$coursepick) = &default_role_selector($context,1); if ($context eq 'domain') { - $Str .= '<span class="LC_role_level">'.&mt('Domain Level').'</span><br />'.$options.'<br /><br /><span class="LC_role_level">'.&mt('Course Level').'</span><br />'.$cb_script.$coursepick; + $Str .= '<p>' + .'<b>'.&mt('Domain Level').'</b><br />' + .$options + .'</p><p>' + .'<b>'.&mt('Course Level').'</b>' + .'</p>' + .$cb_script.$coursepick + .&Apache::lonhtmlcommon::row_closure(); } elsif ($context eq 'author') { - $Str .= $options; + $Str .= $options + .&Apache::lonhtmlcommon::row_closure(1); # last row in pick_box } } else { my ($cnum,$cdom) = &get_course_identity(); my $rowtitle = &mt('section'); my $secbox = §ion_picker($cdom,$cnum,'Any',$rowtitle, $permission,$context,'upload'); - $Str .= $secbox."<h3>".&mt('Full Update')."</h3>\n". - '<p><label><input type="checkbox" name="fullup" value="yes">'. - ' '.&mt('Display students with current/future access who are not in the uploaded file.').'</label><br />'.&mt('Students selected from this list can be dropped.').'</p>'."\n"; + $Str .= $secbox + .&Apache::lonhtmlcommon::row_closure(); + + $Str .= &Apache::lonhtmlcommon::row_title(&mt('Full Update')) + .'<label><input type="checkbox" name="fullup" value="yes" />'. + ' '.&mt('Display students with current/future access who are not in the uploaded file.') + .'</label><br />' + .&mt('Students selected from this list can be dropped.') + .&Apache::lonhtmlcommon::row_closure(); } if ($context eq 'course' || $context eq 'domain') { $Str .= &forceid_change($context); } + + $Str .= &Apache::lonhtmlcommon::end_pick_box(); $Str .= '</div>'; - $Str .= '<div class="LC_clear_float_footer">'; + + # Footer + $Str .= '<div class="LC_clear_float_footer">' + .'<hr />'; if ($context eq 'course') { - $Str .= '<div class="LC_info">' + $Str .= '<p class="LC_info">' .&mt('Note: For large courses, this operation may be time consuming.') - .'</div>'; + .'</p>'; } - $Str .= '<input type="button"' - .'onClick="javascript:verify(this.form,this.form.csec)" ' - .'value="'.&mt('Update Users').'" />'."\n" + $Str .= '<p><input type="button"' + .' onclick="javascript:verify(this.form,this.form.csec)"' + .' value="'.&mt('Update Users').'" />' + .'</p>'."\n" .'</div>'; $r->print($Str); return; @@ -815,18 +898,18 @@ sub print_upload_manager_footer { sub forceid_change { my ($context) = @_; my $output = - "<h3>".&mt('Student/Employee ID')."</h3>\n". - "<p>\n".'<label><input type="checkbox" name="forceid" value="yes">'. - &mt('Disable Student/Employee ID Safeguard and force change of conflicting IDs'). - '</label><br />'."\n". - &mt('(only do if you know what you are doing.)')."\n"; + &Apache::lonhtmlcommon::row_title(&mt('Student/Employee ID')) + .'<label><input type="checkbox" name="forceid" value="yes" />' + .&mt('Disable Student/Employee ID Safeguard and force change of conflicting IDs') + .'</label><br />'."\n" + .&mt('(only do if you know what you are doing.)')."\n"; if ($context eq 'domain') { $output .= '<br /><label><input type="checkbox" name="recurseid"'. - ' value="yes">'. - &mt('Update Student/Employee ID in courses in which user is active/future student,[_1](if forcing change).','<br />'). + ' value="yes" />'. + &mt('Update student/employee ID in courses in which user is active/future student,[_1](if forcing change).','<br />'). '</label>'."\n"; } - $output .= '</p>'; + $output .= &Apache::lonhtmlcommon::row_closure(1); # last row in pick_box return $output; } @@ -864,6 +947,7 @@ sub print_upload_manager_form { 'email_choice' => 'scalar', 'role_choice' => 'scalar', 'domain_choice' => 'scalar', + 'inststatus_choice' => 'scalar', }; my $defdom = $env{'request.role.domain'}; if ($context eq 'course') { @@ -895,7 +979,8 @@ sub print_upload_manager_form { ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}], ['email',&mt('E-mail Address'), $env{'form.email_choice'}], ['role',&mt('Role'), $env{'form.role_choice'}], - ['domain',&mt('Domain'), $env{'form.domain_choice'}]); + ['domain',&mt('Domain'), $env{'form.domain_choice'}], + ['inststatus',&mt('Affiliation'), $env{'form.inststatus_choice'}]); if ($env{'form.upfile_associate'} eq 'reverse') { &Apache::loncommon::csv_print_samples($r,\@records); $i=&Apache::loncommon::csv_print_select_table($r,\@records, @@ -1098,7 +1183,7 @@ sub default_role_selector { '<th>'.$lt{'grs'}.'</th>'. &Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row()."\n". - '<td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n". + '<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','coursedesc',''".')" /></td>'."\n". '<td><select name="courserole">'."\n". &default_course_roles($context,$checkpriv,%customroles)."\n". '</select></td><td>'. @@ -1291,9 +1376,9 @@ sub print_userlist { 'html' => 'HTML'); my $output_selector = '<select size="1" name="output" >'; foreach my $outputformat ('html','csv','excel') { - my $option = '<option value="'.$outputformat.'" '; + my $option = '<option value="'.$outputformat.'"'; if ($outputformat eq $env{'form.output'}) { - $option .= 'selected '; + $option .= ' selected="selected"'; } $option .='>'.$lt{$outputformat}.'</option>'; $output_selector .= "\n".$option; @@ -1308,7 +1393,7 @@ sub print_userlist { .'</span></label>'.(' 'x3)."\n"); my $roleselected = ''; if ($env{'form.showrole'} eq 'Any') { - $roleselected = ' selected="selected" '; + $roleselected = ' selected="selected"'; } my ($cnum,$cdom); $r->print(&role_filter($context)); @@ -1316,6 +1401,12 @@ sub print_userlist { ($cnum,$cdom) = &get_course_identity(); $r->print(§ion_group_filter($cnum,$cdom)); } + if ($env{'form.phase'} eq '') { + $r->print('<br /><br />'.&list_submit_button(&mt('Display List of Users')). + "\n</p>\n". + '<input type="hidden" name="phase" value="" /></form>'); + return; + } if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) { $r->print(' '.&list_submit_button(&mt('Update Display')). "\n</p>\n"); @@ -1496,7 +1587,7 @@ sub role_filter { my $output; my $roleselected = ''; if ($env{'form.showrole'} eq 'Any') { - $roleselected = ' selected="selected" '; + $roleselected = ' selected="selected"'; } my ($role_select); if ($context eq 'domain') { @@ -1512,7 +1603,7 @@ sub role_filter { foreach my $role (@poss_roles) { $roleselected = ''; if ($role eq $env{'form.showrole'}) { - $roleselected = ' selected="selected" '; + $roleselected = ' selected="selected"'; } my $plrole; if ($role eq 'cr') { @@ -1569,7 +1660,7 @@ sub section_group_filter { foreach my $option ('all','none',@options) { $currsel = ''; if ($env{'form.'.$name{$item}} eq $option) { - $currsel = ' selected="selected" '; + $currsel = ' selected="selected"'; } $markup .= ' <option value="'.$option.'"'.$currsel.'>'; if (($option eq 'all') || ($option eq 'none')) { @@ -1908,15 +1999,15 @@ sub aggregate_user_info { sub process_date_info { my ($userdata) = @_; my $now = time; - $userdata->{'status'} = &mt('Active'); + $userdata->{'status'} = 'Active'; if ($userdata->{'start'} > 0) { if ($now < $userdata->{'start'}) { - $userdata->{'status'} = &mt('Future'); + $userdata->{'status'} = 'Future'; } } if ($userdata->{'end'} > 0) { if ($now > $userdata->{'end'}) { - $userdata->{'status'} = &mt('Expired'); + $userdata->{'status'} = 'Expired'; } } return; @@ -1968,6 +2059,7 @@ sub show_users_list { if ($env{'course.'.$cid.'.internal.showphoto'}) { $r->print(' <script type="text/javascript"> +// <![CDATA[ function photowindow(photolink) { var title = "Photo_Viewer"; var options = "scrollbars=1,resizable=1,menubar=0"; @@ -1975,6 +2067,7 @@ function photowindow(photolink) { stdeditbrowser = open(photolink,title,options,"1"); stdeditbrowser.focus(); } +// ]]> </script> '); } @@ -1991,6 +2084,7 @@ END $r->print(<<END); <script type="text/javascript" language="Javascript"> +// <![CDATA[ $check_uncheck_js $verify_action_js @@ -2028,7 +2122,19 @@ function username_display_launch(usernam document.location.href = '/adm/'+domain+'/'+username+'/aboutme'; } } + if (target == 'track') { + if (document.$formname.userwin.checked == true) { + var url = '/adm/trackstudent?selected_student='+username+':'+domain+'&only_body=1'; + var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no'; + var trackwin = window.open(url,'',options,1); + trackwin.focus(); + return; + } else { + document.location.href = '/adm/trackstudent?selected_student='+username+':'+domain; + } + } } +// ]]> </script> $date_sec_selector <input type="hidden" name="state" value="$env{'form.state'}" /> @@ -2050,7 +2156,7 @@ END 'status' => "status", 'role' => "role", 'type' => "enroll type/action", - 'email' => "email address", + 'email' => "e-mail address", 'photo' => "photo", 'extent' => "extent", 'pr' => "Proceed", @@ -2058,9 +2164,10 @@ END '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", + 'aboutme' => "Display a user's personal information page", 'owin' => "Open in a new window", 'modify' => "Modify a user's information", + 'track' => "View a user's recent activity", 'clicker' => "Clicker-ID", ); if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { @@ -2123,7 +2230,7 @@ END END if ($actionselect) { $output .= <<"END"; -<div class="LC_left_float"><fieldset><legend><b>$lt{'ac'}</b></legend> +<div class="LC_left_float"><fieldset><legend>$lt{'ac'}</legend> $actionselect <br/><br /><input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.$formname.actionlist)" /> <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.$formname.actionlist)" /><br /><input type="button" value="$lt{'pr'}" onclick="javascript:verify_action('actionlist')" /></fieldset></div> @@ -2168,12 +2275,18 @@ END } } } - $output .= '<div class="LC_left_float"><fieldset><legend><b>'.$lt{'link'}.'</b></legend>'. + $output .= '<div class="LC_left_float"><fieldset><legend>'.$lt{'link'}.'</legend>'. '<table><tr>'; my @linkdests = ('aboutme'); if ($permission->{'cusr'}) { unshift (@linkdests,'modify'); } + if (&Apache::lonnet::allowed('vsa', $env{'request.course.id'}) || + &Apache::lonnet::allowed('vsa', $env{'request.course.id'}.'/'. + $env{'request.course.sec'})) { + push(@linkdests,'track'); + } + $output .= '<td>'; my $usernamelink = $env{'form.usernamelink'}; if ($usernamelink eq '') { @@ -2182,15 +2295,15 @@ END foreach my $item (@linkdests) { my $checkedstr = ''; if ($item eq $usernamelink) { - $checkedstr = ' checked="checked" '; + $checkedstr = ' checked="checked"'; } - $output .= '<span class="LC_nobreak"><label><input type="radio" name="usernamelink" value="'.$item.'"'.$checkedstr.'> '.$lt{$item}.'</label></span><br />'; + $output .= '<span class="LC_nobreak"><label><input type="radio" name="usernamelink" value="'.$item.'"'.$checkedstr.' /> '.$lt{$item}.'</label></span><br />'; } my $checkwin; if ($env{'form.userwin'}) { - $checkwin = 'checked = "checked"'; + $checkwin = ' checked="checked"'; } - $output .= '</td><td valign="top"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1" '.$checkwin.'/>'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>'; + $output .= '</td><td valign="top"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>'; } $output .= "\n".'<div class="LC_clear_float_footer"> </div>'."\n". &Apache::loncommon::start_data_table(). @@ -2303,6 +2416,11 @@ END $grpfilter = 'all'; } } + my %ltstatus = &Apache::lonlocal::texthash( + Active => 'Active', + Future => 'Future', + Expired => 'Expired', + ); # Get groups, role, permanent e-mail so we can sort on them if # necessary. foreach my $user (keys(%{$userlist})) { @@ -2502,7 +2620,7 @@ END } } $r->print('<td><input type="checkbox" name="'. - 'actionlist" value="'.$checkval.'"></td>'); + 'actionlist" value="'.$checkval.'" /></td>'); } else { $r->print('<td> </td>'); } @@ -2515,6 +2633,12 @@ END $r->print('<td>'.&print_username_link($mode,\%in).'</td>'); } elsif (($item eq 'start' || $item eq 'end') && ($actionselect)) { $r->print('<td>'.$in{$item}.'<input type="hidden" name="'.$checkval.'_'.$item.'" value="'.$sdata->[$index{$item}].'" /></td>'."\n"); + } elsif ($item eq 'status') { + my $showitem = $in{$item}; + if (defined($ltstatus{$in{$item}})) { + $showitem = $ltstatus{$in{$item}}; + } + $r->print('<td>'.$showitem.'</td>'."\n"); } else { $r->print('<td>'.$in{$item}.'</td>'."\n"); } @@ -2531,7 +2655,7 @@ END } if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') { - $r->print(' <td align="right"><a href="javascript:photowindow('."'".$in{'photo'}."'".')"><img src="'.$in{'thumbnail'}.'" border="1"></a></td>'); + $r->print(' <td align="right"><a href="javascript:photowindow('."'".$in{'photo'}."'".')"><img src="'.$in{'thumbnail'}.'" border="1" alt="" /></a></td>'); } else { $r->print(' <td> </td> '); } @@ -2818,8 +2942,8 @@ sub select_actions { } } if ($choices{'sections'}) { - $output .= '<input type="hidden" name="retainsec" value= "" />'."\n". - '<input type="hidden" name="newsecs" value= "" />'."\n"; + $output .= '<input type="hidden" name="retainsec" value="" />'."\n". + '<input type="hidden" name="newsecs" value="" />'."\n"; } } return $output; @@ -2833,9 +2957,9 @@ sub date_section_javascript { 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 = ' -<script type="text/javascript">'."\n"; - $output .= <<"ENDONE"; + my $output = <<"ENDONE"; +<script type="text/javascript"> +// <![CDATA[ function opendatebrowser(callingform,formname,calledby) { var bulkaction = callingform.bulkaction.options[callingform.bulkaction.selectedIndex].value; var url = '/adm/createuser?'; @@ -2858,6 +2982,7 @@ ENDONE stdeditbrowser = open(url,title,options,'1'); stdeditbrowser.focus(); } +// ]]> </script> ENDTWO return $output; @@ -2871,6 +2996,7 @@ sub date_section_selector { my $sec_js = &setsections_javascript($formname,$groupslist); my $output = <<"END"; <script type="text/javascript"> +// <![CDATA[ $sec_js @@ -2939,6 +3065,7 @@ END $verify_action_js +// ]]> </script> ENDJS my %lt = &Apache::lonlocal::texthash ( @@ -2997,7 +3124,7 @@ ENDJS $output .= $info.$secbox; } $output .= '<p>'. -'<input type="button" name="dateselection" value="'.&mt('Make changes').'" onclick="javascript:saveselections(this.form)" /></p>'."\n". +'<input type="button" name="dateselection" value="'.&mt('Save').'" onclick="javascript:saveselections(this.form)" /></p>'."\n". '</form>'; return $output; } @@ -3215,10 +3342,12 @@ sub show_drop_list { <input type="hidden" name="action" value="$action" /> <input type="hidden" name="state" value="done" /> <script type="text/javascript" language="Javascript"> +// <![CDATA[ $check_uncheck_js +// ]]> </script> <p> -<input type="hidden" name="phase" value="four"> +<input type="hidden" name="phase" value="four" /> END my ($indexhash,$keylist) = &make_keylist_array(); my $studentcount = 0; @@ -3336,7 +3465,7 @@ END # $r->print(&Apache::loncommon::start_data_table_row()); $r->print(<<"END"); - <td><input type="checkbox" name="droplist" value="$studentkey"></td> + <td><input type="checkbox" name="droplist" value="$studentkey" /></td> <td>$username</td> <td>$domain</td> <td>$id</td> @@ -3355,10 +3484,14 @@ END 'ua' => "uncheck all", ); $r->print(<<"END"); -</p><p> -<input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)"> -<input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)"> -<p><input type=submit value="$lt{'dp'}"></p> +</p> +<p> +<input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)" /> +<input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)" /> +</p> +<p> +<input type="submit" value="$lt{'dp'}" /> +</p> END return; } @@ -3369,24 +3502,42 @@ END sub print_first_users_upload_form { my ($r,$context) = @_; my $str; - $str = '<input type="hidden" name="phase" value="two">'; + $str = '<input type="hidden" name="phase" value="two" />'; $str .= '<input type="hidden" name="action" value="upload" />'; $str .= '<input type="hidden" name="state" value="got_file" />'; - $str .= "<h3>".&mt('Upload a file containing information about users')."</h3>\n"; - $str .= &Apache::loncommon::upfile_select_html(); - $str .= '<p>'; - $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List", - &mt("How do I create a users list from a spreadsheet")). - "<br />\n"; - $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV", - &mt("How do I create a CSV file from a spreadsheet")); - $str .= "</p>\n"; - $str .= "<p>\n"; - $str .= '<label><input type="checkbox" name="noFirstLine" /> '. - &mt('Ignore First Line')."</label></p>\n"; - $str .= '<input type="submit" name="fileupload" value="'. - &mt('Go to next step').'">'."<br />\n"; + + $str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n"; + + # Excel and CSV Help + $str .= '<p>' + .&Apache::loncommon::help_open_topic("Course_Create_Class_List", + &mt("How do I create a users list from a spreadsheet")) + ."<br />\n" + .&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", + &mt("How do I create a CSV file from a spreadsheet")) + ."</p>\n"; + + $str .= &Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title(&mt('File')) + .'<p class="LC_info">'."\n" + .&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.')."\n" + .'</p>'."\n" + .&Apache::loncommon::upfile_select_html() + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '<label for="noFirstLine">' + .&mt('Ignore First Line') + .'</label>') + .'<input type="checkbox" name="noFirstLine" id="noFirstLine" />' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box(); + + $str .= '<p>' + .'<input type="submit" name="fileupload" value="'.&mt('Next').'" />' + .'</p>'; + $str .= &Apache::loncommon::end_page(); + $r->print($str); return; } @@ -3430,7 +3581,8 @@ sub upfile_drop_add { 'ipwd_choice' => 'scalar', 'email_choice' => 'scalar', 'role_choice' => 'scalar', - 'domain_choice' => 'scalar'}); + 'domain_choice' => 'scalar', + 'inststatus_choice' => 'scalar'}); # my ($startdate,$enddate) = &get_dates_from_form(); if ($env{'form.makedatesdefault'}) { @@ -3513,6 +3665,7 @@ sub upfile_drop_add { 'permanentemail','id'); my %canmodify; if (&Apache::lonnet::allowed('mau',$domain)) { + push(@userinfo,'inststatus'); foreach my $field (@userinfo) { $canmodify{$field} = 1; } @@ -3561,6 +3714,8 @@ sub upfile_drop_add { } else { $r->print('<h3>'.&mt('Adding/Modifying Users')."</h3>\n<p>\n"); } + $r->rflush; + my %counts = ( user => 0, auth => 0, @@ -3700,7 +3855,15 @@ sub upfile_drop_add { if (defined($fields{'email'})) { if (defined($entries{$fields{'email'}})) { $email=$entries{$fields{'email'}}; - unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; } } + unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; } + } + } + # determine affiliation + my $inststatus=''; + if (defined($fields{'inststatus'})) { + if (defined($entries{$fields{'inststatus'}})) { + $inststatus=$entries{$fields{'inststatus'}}; + } } # determine user password my $password = $genpwd; @@ -3783,7 +3946,7 @@ sub upfile_drop_add { } } my @newinfo = (\$fname,\$mname,\$lname,\$gen,\$email,\$id); - for (my $i=0; $i<@userinfo; $i++) { + for (my $i=0; $i<@newinfo; $i++) { if (${$newinfo[$i]} ne '') { if (!$canmodify{$userinfo[$i]}) { ${$newinfo[$i]} = ''; @@ -3832,7 +3995,7 @@ sub upfile_drop_add { $fname,$mname,$lname,$gen,$sec,$enddate, $startdate,$env{'form.forceid'}, $desiredhost,$email,'manual','',$cid, - '',$context); + '',$context,$inststatus); $userresult = $roleresult; } else { if ($role ne '') { @@ -3852,7 +4015,7 @@ sub upfile_drop_add { $mname,$lname,$gen,$sec, $env{'form.forceid'},$desiredhost, $email,$role,$enddate, - $startdate,$checkid); + $startdate,$checkid,$inststatus); } } elsif (@secs > 0) { $singlesec = $secs[0]; @@ -3867,7 +4030,8 @@ sub upfile_drop_add { $id,$amode,$password,$fname, $mname,$lname,$gen,$singlesec, $env{'form.forceid'},$desiredhost, - $email,$role,$enddate,$startdate,$checkid); + $email,$role,$enddate,$startdate, + $checkid,$inststatus); } } if ($multiple) { @@ -4382,7 +4546,7 @@ sub course_sections { my $output = ''; my @sections = (sort {$a <=> $b} keys %{$sections_count}); my $numsec = scalar(@sections); - my $is_selected = ' selected="selected" '; + my $is_selected = ' selected="selected"'; if ($numsec <= 1) { $output = '<select name="currsec_'.$role.'" >'."\n". ' <option value="">'.&mt('Select').'</option>'."\n";