--- loncom/interface/lonuserutils.pm 2009/03/21 06:21:55 1.73.2.3 +++ loncom/interface/lonuserutils.pm 2009/08/03 15:57:25 1.95 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.73.2.3 2009/03/21 06:21:55 raeburn Exp $ +# $Id: lonuserutils.pm,v 1.95 2009/08/03 15:57:25 bisitz 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,7 +343,7 @@ 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" '. @@ -401,17 +403,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 email address 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 +543,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 +587,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 +599,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 +623,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 +688,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 +699,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 +759,136 @@ 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); + $Str .= &set_login($defdom,$krbform,$intform,$locform) + .&Apache::lonhtmlcommon::row_closure(); + my ($home_server_pick,$numlib) = &Apache::loncommon::home_server_form_item($defdom,'lcserver', 'default','hide'); +#FIXME: Broken?!? $home_server_pick returns empty value on prod (2.8.1) and on dev server. SB 2009-08-03 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_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 .= &Apache::lonhtmlcommon::row_title(&mt('Home Server')) + .$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"' + $Str .= '<p><input type="button"' .'onClick="javascript:verify(this.form,this.form.csec)" ' - .'value="'.&mt('Update Users').'" />'."\n" + .'value="'.&mt('Update Users').'" />' + .'</p>'."\n" .'</div>'; $r->print($Str); return; @@ -815,18 +897,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 +946,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 +978,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, @@ -1308,7 +1392,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)); @@ -1502,7 +1586,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') { @@ -1518,7 +1602,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') { @@ -2056,7 +2140,7 @@ END 'status' => "status", 'role' => "role", 'type' => "enroll type/action", - 'email' => "email address", + 'email' => "e-mail address", 'photo' => "photo", 'extent' => "extent", 'pr' => "Proceed", @@ -2064,7 +2148,7 @@ 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", 'clicker' => "Clicker-ID", @@ -2129,7 +2213,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> @@ -2174,7 +2258,7 @@ 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'}) { @@ -2188,15 +2272,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(). @@ -2468,7 +2552,7 @@ END $cellentry = '<b>'.&mt('auto').'</b> <label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'" /> Change</label>'; $autocount ++; } else { - $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><nobr><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'" /> Change</label></nobr></td></tr><tr><td><nobr>'; + $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><span class="LC_nobreak"><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'" /> Change</label></span></td></tr><tr><td><span class="LC_nobreak">'; $manualcount ++; if ($in{'lockedtype'}) { $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" /> '.&mt('Unlock').'</label>'; @@ -2477,7 +2561,7 @@ END $cellentry .= '<label><input type="checkbox" name="lockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" /> '.&mt('Lock').'</label>'; $lockcount ++; } - $cellentry .= '</nobr></td></tr></table>'; + $cellentry .= '</span></td></tr></table>'; } $r->print("<td>$cellentry</td>\n"); } else { @@ -2513,7 +2597,7 @@ END } } $r->print('<td><input type="checkbox" name="'. - 'actionlist" value="'.$checkval.'"></td>'); + 'actionlist" value="'.$checkval.'" /></td>'); } else { $r->print('<td> </td>'); } @@ -2548,7 +2632,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> '); } @@ -2835,8 +2919,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; @@ -3014,7 +3098,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; } @@ -3235,7 +3319,7 @@ sub show_drop_list { $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; @@ -3353,7 +3437,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> @@ -3372,10 +3456,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; } @@ -3386,24 +3474,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; } @@ -3447,7 +3553,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'}) { @@ -3530,6 +3637,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; } @@ -3578,6 +3686,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, @@ -3653,8 +3763,8 @@ sub upfile_drop_add { if ($entries{$fields{'username'}} ne &LONCAPA::clean_username($entries{$fields{'username'}})) { $r->print('<br />'. - &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]', - $entries{$fields{'username'}},$fname,$mname,$lname,$gen)); + &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]', + '<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen)); next; } else { if ($entries{$fields{'domain'}} @@ -3673,10 +3783,10 @@ sub upfile_drop_add { $entries{$fields{'sec'}} =~ s/\W//g; my $item = $entries{$fields{'sec'}}; if ($item eq "none" || $item eq 'all') { - $r->print('<br />'.&mt('<b>[_1]</b>: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a reserved word.',$username,$fname,$mname,$lname,$gen,$item)); + $r->print('<br />'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a reserved word.','<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$item)); next; } elsif (exists($curr_groups{$item})) { - $r->print('<br />'.&mt('<b>[_1]</b>: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a course group.',$username,$fname,$mname,$lname,$gen,$item).' '.&mt('Section names and group names must be distinct.')); + $r->print('<br />'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a course group.','<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$item).' '.&mt('Section names and group names must be distinct.')); next; } else { push(@secs,$item); @@ -3688,7 +3798,7 @@ sub upfile_drop_add { if (ref($userlist{$username.':'.$userdomain}) eq 'ARRAY') { my $currsec = $userlist{$username.':'.$userdomain}[$secidx]; if ($currsec ne $env{'request.course.sec'}) { - $r->print('<br />'.&mt('<b>[_1]</b>: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]".',$username,$fname,$mname,$lname,$gen,$secs[0]).'<br />'); + $r->print('<br />'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]".','<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$secs[0]).'<br />'); if ($currsec eq '') { $r->print(&mt('This user already has an active/future student role in the course, unaffiliated to any section.')); @@ -3717,7 +3827,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; @@ -3738,8 +3856,13 @@ sub upfile_drop_add { } if ($role eq '') { my $rolestr = join(', ',@permitted_roles); - $r->print('<br />'. - &mt('<b>[_1]</b>: You do not have permission to add the requested role [_2] for the user.',$entries{$fields{'username'}},$entries{$fields{'role'}}).'<br />'.&mt('Allowable role(s) is/are: [_1].',$rolestr)."\n"); + $r->print('<br />' + .&mt('[_1]: You do not have permission to add the requested role [_2] for the user.' + ,'<b>'.$entries{$fields{'username'}}.'</b>' + ,$entries{$fields{'role'}}) + .'<br />' + .&mt('Allowable role(s) is/are: [_1].',$rolestr)."\n" + ); next; } } @@ -3795,7 +3918,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]} = ''; @@ -3844,7 +3967,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 '') { @@ -3864,7 +3987,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]; @@ -3879,7 +4002,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) { @@ -3899,15 +4023,15 @@ sub upfile_drop_add { } else { if ($context eq 'course') { $r->print('<br />'. - &mt('<b>[_1]</b>: Unable to enroll. No password specified.',$username) + &mt('[_1]: Unable to enroll. No password specified.','<b>'.$username.'</b>') ); } elsif ($context eq 'author') { $r->print('<br />'. - &mt('<b>[_1]</b>: Unable to add co-author. No password specified.',$username) + &mt('[_1]: Unable to add co-author. No password specified.','<b>'.$username.'</b>') ); } else { $r->print('<br />'. - &mt('<b>[_1]</b>: Unable to add user. No password specified.',$username) + &mt('[_1]: Unable to add user. No password specified.','<b>'.$username.'</b>') ); } } @@ -4010,7 +4134,7 @@ sub user_change_result { if ($userresult =~ /^error:(.+)$/) { my $error = $1; $r->print('<br />'. - &mt('<b>[_1]</b>: Unable to add/modify: [_2]',$username.':'.$userdomain,$error)); + &mt('[_1]: Unable to add/modify: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error)); } } else { $counts->{'user'} ++; @@ -4020,7 +4144,7 @@ sub user_change_result { if ($authresult =~ /^error:(.+)$/) { my $error = $1; $r->print('<br />'. - &mt('<b>[_1]</b>: Unable to modify authentication: [_2]',$username.':'.$userdomain,$error)); + &mt('[_1]: Unable to modify authentication: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error)); } } else { $counts->{'auth'} ++; @@ -4030,7 +4154,7 @@ sub user_change_result { if ($roleresult =~ /^error:(.+)$/) { my $error = $1; $r->print('<br />'. - &mt('<b>[_1]</b>: Unable to add role: [_2]',$username.':'.$userdomain,$error)); + &mt('[_1]: Unable to add role: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error)); } } else { $counts->{'role'} ++; @@ -4300,7 +4424,7 @@ sub update_user_list { $r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,no users].",$count).'</b></p>'); if ($count > 0) { if ($choice eq 'revoke' || $choice eq 'drop') { - $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.</p>')); + $r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>'); } # Flush the course logs so reverse user roles immediately updated &Apache::lonnet::flushcourselogs(); @@ -4394,7 +4518,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";