--- loncom/interface/Attic/londropadd.pm 2002/12/03 20:30:48 1.62 +++ loncom/interface/Attic/londropadd.pm 2003/11/07 21:04:37 1.90 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.62 2002/12/03 20:30:48 matthew Exp $ +# $Id: londropadd.pm,v 1.90 2003/11/07 21:04:37 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,7 +32,7 @@ # (TeX Content Handler # ############################################################### -############################################################### +############################################################## package Apache::londropadd; @@ -42,15 +42,17 @@ use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::Constants qw(:common :http REDIRECT); use Spreadsheet::WriteExcel; +use Apache::lonlocal; ############################################################### ############################################################### sub header { my $bodytag=&Apache::loncommon::bodytag('Enrollment Manager'); + my $title = &mt('LON-CAPA Enrollment Manager'); return(<<ENDHEAD); <html> <head> -<title>LON-CAPA Enrollment Manager</title> +<title>$title</title> </head> $bodytag <form method="post" enctype="multipart/form-data" @@ -79,13 +81,16 @@ sub modifystudent { # We are in this course my $section=$1; $section='' if ($course eq $courseid.'_st'); - if ( ((!$section) && (!$csec)) || ($section ne $csec) ) { + if (defined($csec) && $section eq $csec) { + $result .= 'ok:'; + } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) { my (undef,$end,$start)=split(/\_/,$roles{$course}); my $now=time; # if this is an active role if (!($start && ($now<$start)) || !($end && ($now>$end))) { my $reply=&Apache::lonnet::modifystudent - ($udom,$unam,'','','','','','','', + # dom name id mode pass f m l g + ($udom,$unam,'', '', '',undef,undef,undef,undef, $section,time,undef,undef,$desiredhost); $result .= $reply.':'; } @@ -136,26 +141,33 @@ sub domain_form { # Menu Phase One sub print_main_menu { my $r=shift; + my %Text = &Apache::lonlocal::texthash + ('upload' => 'Upload a class list', + 'enrollone' => 'Enroll a single student', + 'modify' => 'Modify student data', + 'view' => 'View Class List', + 'drop' => 'Drop Students'); + $r->print(<<END); <p> <font size="+1"> - <a href="/adm/dropadd?action=upload">Upload a course list</a> + <a href="/adm/dropadd?action=upload">$Text{'upload'}</a> </font> </p><p> <font size="+1"> - <a href="/adm/dropadd?action=enrollstudent">Enroll a single student</a> + <a href="/adm/dropadd?action=enrollstudent">$Text{'enrollone'}</a> </font> </p><p> <font size="+1"> - <a href="/adm/dropadd?action=modifystudent">Modify student data</a> + <a href="/adm/dropadd?action=modifystudent">$Text{'modify'}</a> </font> </p><p> <font size="+1"> - <a href="/adm/dropadd?action=classlist">View Classlist</a> + <a href="/adm/dropadd?action=classlist">$Text{'view'}</a> </font> </p><p> <font size="+1"> - <a href="/adm/dropadd?action=drop">Drop Students</a> + <a href="/adm/dropadd?action=drop">$Text{'drop'}</a> </font> </p> END @@ -163,6 +175,11 @@ END ############################################################### ############################################################### +sub hidden_input { + my ($name,$value) = @_; + return '<input type="hidden" name="'.$name.'" value="'.$value.'" />'."\n"; +} + sub print_upload_manager_header { my ($r,$datatoken,$distotal,$krbdefdom)=@_; my $javascript; @@ -181,50 +198,72 @@ sub print_upload_manager_header { } else { $javascript=&upload_manager_javascript_forward_associate(); } - my $javascript_validations=&javascript_validations($krbdefdom); - $r->print(<<ENDPICK); -<h3>Uploading Class List</h3> -<hr> -<h3>Identify fields</h3> -Total number of records found in file: $distotal <hr /> -Enter as many fields as you can. The system will inform you and bring you back -to this page if the data selected is insufficient to run your class.<hr /> -<input type="button" value="Reverse Association" onClick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" /> -<input type="hidden" name="action" value="upload" /> -<input type="hidden" name="state" value="got_file" /> -<input type="hidden" name="associate" value="" /> -<input type="hidden" name="datatoken" value="$datatoken" /> -<input type="hidden" name="fileupload" value="$ENV{'form.fileupload'}" /> -<input type="hidden" name="upfiletype" value="$ENV{'form.upfiletype'}" /> -<input type="hidden" name="upfile_associate" - value="$ENV{'form.upfile_associate'}" /> -<hr /> -<script type="text/javascript" language="Javascript"> -$javascript -$javascript_validations -</script> -ENDPICK + my $javascript_validations=&javascript_validations('auth',$krbdefdom); + my $checked=(($ENV{'form.noFirstLine'})?' checked="1"':''); + $r->print('<h3>'.&mt('Uploading Class List')."</h3>\n". + "<hr>\n". + '<h3>'.&mt('Identify fields')."</h3>\n"); + $r->print("<p>\n". + &mt('Total number of records found in file: [_1].',$distotal). + "\n". + "</p><hr>\n"); + $r->print(&mt('Enter as many fields as you can. '. + 'The system will inform you and bring you back to '. + 'this page if the data selected is insufficient to '. + 'enroll students in your class.')."<hr>\n"); + $r->print(&hidden_input('action','upload'). + &hidden_input('state','got_file'). + &hidden_input('associate',''). + &hidden_input('datatoken',$datatoken). + &hidden_input('fileupload',$ENV{'form.fileupload'}). + &hidden_input('upfiletype',$ENV{'form.upfiletype'}). + &hidden_input('upfile_associate',$ENV{'form.upfile_associate'})); + $r->print('<input type="button" value="Reverse Association" '. + 'name="'.&mt('Reverse Association').'" '. + 'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'); + $r->print('<input type="checkbox" name="noFirstLine" $checked />'. + &mt('Ignore First Line')); + $r->print("<hr />\n". + '<script type="text/javascript" language="Javascript">'."\n". + $javascript."\n".$javascript_validations.'</script>'); } ############################################################### ############################################################### sub javascript_validations { - my ($krbdefdom)=@_; - my %param = ( formname => 'studentform', - kerb_def_dom => $krbdefdom ); - my $authheader = &Apache::loncommon::authform_header(%param); - return (<<ENDPICK); -function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec) { + my ($mode,$krbdefdom)=@_; + my $authheader; + if ($mode eq 'auth') { + my %param = ( formname => 'studentform', + kerb_def_dom => $krbdefdom ); + $authheader = &Apache::loncommon::authform_header(%param); + } + my %alert = &Apache::lonlocal::texthash + (username => 'You need to specify the username field.', + authen => 'You must choose an authentication type.', + 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 student number field was not specified.', + section => 'The optional section or group field was not specified.', + email => 'The optional email address field was not specified.', + continue => 'Continue enrollment?', + ); + +# my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); + my $function_name =(<<END); +function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail) { +END + my $auth_checks = (<<END); var foundatype=0; - var message=''; if (founduname==0) { - alert('You need to specify the username field'); + alert('$alert{'username'}'); return; } // alert('current.radiovalue = '+current.radiovalue); if (current.radiovalue == null || current.radiovalue == 'nochange') { // They did not check any of the login radiobuttons. - alert('You must choose an authentication type'); + alert('$alert{'authen'}'); return; } foundatype=1; @@ -232,11 +271,11 @@ function verify_message (vf,founduname,f var alertmsg = ''; switch (current.value) { case 'krb': - alertmsg = 'You need to specify the Kerberos domain'; + alertmsg = '$alert{'krb'}'; break; case 'loc': case 'fsys': - alertmsg = 'You need to specify the initial password'; + alertmsg = '$alert{'ipass'}'; break; case 'fsys': alertmsg = ''; @@ -249,67 +288,52 @@ function verify_message (vf,founduname,f return; } } - - if (foundname==0) { message='No name fields specified. '; } - if (foundid==0) { message+='No ID or student number field specified. '; } - if (foundsec==0) { message+='No section or group field specified. '; } - if (vf.startdate.value=='') { - message+='No starting date set. '; - } - if (vf.enddate.value=='') { - message+='No ending date set. '; - } - if ((vf.enddate.value!='') && (vf.startdate.value!='')) { - if (Math.round(vf.enddate.value)<Math.round(vf.startdate.value)) { - alert('Ending date is before starting date'); - return; - } +END + my $optional_checks = (<<END); + var message=''; + if (foundname==0) { + message='$alert{'name'}'; + } + if (foundid==0) { + if (message!='') { + message+='\\n'; + } + message+='$alert{'snum'}'; + } + if (foundsec==0) { + if (message!='') { + message+='\\n'; + } + message+='$alert{'section'}'; + } + if (foundemail==0) { + if (message!='') { + message+='\\n'; + } + message+='$alert{'email'}'; } if (message!='') { - message+='Continue enrollment?'; - if (confirm(message)) { - pclose(); - vf.state.value='enrolling'; - vf.submit(); - } + message+= '\\n$alert{'continue'}'; + if (confirm(message)) { + vf.state.value='enrolling'; + vf.submit(); + } } else { - pclose(); - vf.state.value='enrolling'; - vf.submit(); + vf.state.value='enrolling'; + vf.submit(); } } - - function pclose() { - parmwin=window.open("/adm/rat/empty.html","LONCAPAparms", - "height=350,width=350,scrollbars=no,menubar=no"); - parmwin.close(); - } - - function pjump(type,dis,value,marker,ret,call) { - parmwin=window.open("/adm/rat/parameter.html?type="+escape(type) - +"&value="+escape(value)+"&marker="+escape(marker) - +"&return="+escape(ret) - +"&call="+escape(call)+"&name="+escape(dis),"LONCAPAparms", - "height=350,width=350,scrollbars=no,menubar=no"); - - } - - function dateset() { - if (document.studentform.pres_marker.value=='end') { - document.studentform.enddate.value= - document.studentform.pres_value.value; - } - if (document.studentform.pres_marker.value=='start') { - document.studentform.startdate.value= - document.studentform.pres_value.value; - } - pclose(); +END + my $result = $function_name; + if ($mode eq 'auth') { + $result .= $auth_checks; + } + $result .= $optional_checks; + if ($mode eq 'auth') { + $result .= $authheader; } - -$authheader -ENDPICK - + return $result; } ############################################################### @@ -322,6 +346,7 @@ function verify(vf) { var foundname=0; var foundid=0; var foundsec=0; + var foundemail=0; var tw; for (i=0;i<=vf.nfields.value;i++) { tw=eval('vf.f'+i+'.selectedIndex'); @@ -330,8 +355,9 @@ function verify(vf) { if (tw==7) { foundid=1; } if (tw==8) { foundsec=1; } if (tw==9) { foundpwd=1; } + if (tw==10) { foundemail=1; } } - verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec); + verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail); } // @@ -350,7 +376,8 @@ function verify(vf) { // 7 = id // 8 = section // 9 = ipwd (password) -// +// 10 = email address + function flip(vf,tf) { var nw=eval('vf.f'+tf+'.selectedIndex'); var i; @@ -461,94 +488,98 @@ ENDPICK ############################################################### sub print_upload_manager_footer { my ($r,$i,$keyfields,$defdom,$today,$halfyear)=@_; - my %param = ( formname => 'document.studentform'); + + my ($krbdef,$krbdefdom) = + &Apache::loncommon::get_kerberos_defaults($defdom); + my %param = ( formname => 'document.studentform', + kerb_def_dom => $krbdefdom, + kerb_def_auth => $krbdef + ); my $krbform = &Apache::loncommon::authform_kerberos(%param); my $intform = &Apache::loncommon::authform_internal(%param); my $locform = &Apache::loncommon::authform_local(%param); my $domform = &domain_form($defdom); - $r->print(<<ENDPICK); -</table> -<input type=hidden name=nfields value=$i> -<input type=hidden name=keyfields value="$keyfields"> -<h3>Login Type</h3> -<p>Note: this will not take effect if the user already exists</p> -<p> -$krbform -</p> -<p> -$intform -</p> -<p> -$locform -</p> -<h3>LON-CAPA Domain for Students</h3> -LON-CAPA domain: $domform <p> -<h3>Starting and Ending Dates</h3> -<input type="hidden" value='' name="pres_value" > -<input type="hidden" value='' name="pres_type" > -<input type="hidden" value='' name="pres_marker" > -<input type="hidden" value='$today' name="startdate" > -<input type="hidden" value='$halfyear' name="enddate" > -<a - href="javascript:pjump('date_start','Enrollment Starting Date',document.studentform.startdate.value,'start','studentform.pres','dateset');" ->Set Starting Date</a><p> - -<a - href="javascript:pjump('date_end','Enrollment Ending Date',document.studentform.enddate.value,'end','studentform.pres','dateset');" ->Set Ending Date</a><p> -<h3>Full Update</h3> -<input type=checkbox name=fullup value=yes> Full update -(also print list of users not enrolled anymore)<p> -<h3>ID/Student Number</h3> -<input type=checkbox name=forceid value=yes> -Disable ID/Student Number Safeguard and Force Change of Conflicting IDs -(only do if you know what you are doing)<p> -<input type="button" onClick="javascript:verify(this.form)" value="Update Courselist" /><br /> -Note: for large courses, this operation may be time consuming. -ENDPICK + my $date_table = &date_setting_table(); + my $Str = "</table>\n"; + $Str .= &hidden_input('nfields',$i); + $Str .= &hidden_input('keyfields',$keyfields); + $Str .= '<h3>'.&mt('Login Type')."</h3>\n"; + $Str .= "<p>\n". + &mt('Note: this will not take effect if the user already exists'). + "</p><p>\n"; + $Str .= $krbform."\n</p><p>\n". + $intform."\n</p><p>\n". + $locform."\n</p>\n"; + $Str .= '<h3>'.&mt('LON-CAPA Domain for Students')."</h3>\n"; + $Str .= "<p>\n".&mt('LON-CAPA domain: [_1]',$domform)."\n</p>\n"; + $Str .= "<h3>".&mt('Starting and Ending Dates')."</h3>\n"; + $Str .= "<p>\n".$date_table."</p>\n"; + $Str .= "<h3>".&mt('Full Update')."</h3>\n"; + $Str .= '<input type="checkbox" name="fullup" value="yes">'. + ' '.&mt('Full update (also print list of users not enrolled anymore)'). + "</p>\n"; + $Str .= "<h3>".&mt('Student Number')."</h3>\n"; + $Str .= "<p>\n".'<input type="checkbox" name="forceid" value="yes">'; + $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '. + 'of Conflicting IDs (only do if you know what you are doing)'). + "\n</p><p>\n"; + $Str .= '<input type="button" onClick="javascript:verify(this.form)" '. + 'value="Update Courselist" />'."<br />\n"; + $Str .= &mt('Note: for large courses, this operation may be time '. + 'consuming'); + $r->print($Str); + return; } -# ======================================================= Menu Phase Two Upload +############################################################### +############################################################### sub print_upload_manager_form { my $r=shift; - + my $firstLine; my $datatoken; if (!$ENV{'form.datatoken'}) { - $datatoken=&Apache::loncommon::upfile_store($r); + $datatoken=&Apache::loncommon::upfile_store($r); } else { - $datatoken=$ENV{'form.datatoken'}; - &Apache::loncommon::load_tmp_file($r); + $datatoken=$ENV{'form.datatoken'}; + &Apache::loncommon::load_tmp_file($r); } my @records=&Apache::loncommon::upfile_record_sep(); + if($ENV{'form.noFirstLine'}){ + $firstLine=shift(@records); + } my $total=$#records; my $distotal=$total+1; - $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/; - my $krbdefdom=$1; - $krbdefdom=~tr/a-z/A-Z/; my $today=time; my $halfyear=$today+15552000; - my $defdom=$r->dir_config('lonDefDomain'); + my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + my ($krbdef,$krbdefdom) = + &Apache::loncommon::get_kerberos_defaults($defdom); &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom); my $i; my $keyfields; if ($total>=0) { - my @d=(['username','Username'], - ['names','Last Name, First Names'], - ['fname','First Name'], - ['mname','Middle Names/Initials'], - ['lname','Last Name'], - ['gen','Generation'], - ['id','ID/Student Number'], - ['sec','Group/Section'], - ['ipwd','Initial Password']); + my @field=(['username',&mt('Username')], + ['names',&mt('Last Name, First Names')], + ['fname',&mt('First Name')], + ['mname',&mt('Middle Names/Initials')], + ['lname',&mt('Last Name')], + ['gen',&mt('Generation')], + ['id',&mt('ID/Student Number')], + ['sec',&mt('Group/Section')], + ['ipwd',&mt('Initial Password')], + ['email',&mt('EMail Address')]); if ($ENV{'form.upfile_associate'} eq 'reverse') { &Apache::loncommon::csv_print_samples($r,\@records); - $i=&Apache::loncommon::csv_print_select_table($r,\@records,\@d); - foreach (@d) { $keyfields.=$_->[0].','; } + $i=&Apache::loncommon::csv_print_select_table($r,\@records, + \@field); + foreach (@field) { + $keyfields.=$_->[0].','; + } chop($keyfields); } else { - unshift(@d,['none','']); - $i=&Apache::loncommon::csv_samples_select_table($r,\@records,\@d); + unshift(@field,['none','']); + $i=&Apache::loncommon::csv_samples_select_table($r,\@records, + \@field); my %sone=&Apache::loncommon::record_sep($records[0]); $keyfields=join(',',sort(keys(%sone))); } @@ -556,9 +587,22 @@ sub print_upload_manager_form { &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear); } -# ======================================================= Enroll single student +############################################################### +############################################################### sub enroll_single_student { my $r=shift; + # Remove non alphanumeric values from section + $ENV{'form.csec'}=~s/\W//g; + # + # We do the dates first because the action of making them the defaul + # in the course is entirely seperate from the action of enrolling the + # student. Also, a failure in setting the dates as default is not fatal + # to the process of enrolling / modifying a student. + my ($startdate,$enddate) = &get_dates_from_form(); + if ($ENV{'form.makedatesdefault'}) { + $r->print(&make_dates_default($startdate,$enddate)); + } + $r->print('<h3>Enrolling Student</h3>'); $r->print('<p>Enrolling '.$ENV{'form.cuname'}." \@ ". $ENV{'form.lcdomain'}.'</p>'); @@ -605,8 +649,8 @@ sub enroll_single_student { $ENV{'form.cstid'},$amode,$genpwd, $ENV{'form.cfirst'},$ENV{'form.cmiddle'}, $ENV{'form.clast'},$ENV{'form.cgen'}, - $ENV{'form.csec'},$ENV{'form.enddate'}, - $ENV{'form.startdate'},$ENV{'form.forceid'}, + $ENV{'form.csec'},$enddate, + $startdate,$ENV{'form.forceid'}, $desiredhost); if ($login_result =~ /^ok/) { $r->print($login_result); @@ -616,37 +660,223 @@ sub enroll_single_student { $r->print("unable to enroll: ".$login_result); } } else { - $r->print('<p><font color="#ff0000">ERROR</font> '. - 'Invalid login mode or password. '. - 'Unable to enroll '.$ENV{'form.cuname'}.'.</p>'); - } + $r->print('<p><font color="#ff0000">ERROR</font> '); + if ($amode =~ /^krb/) { + $r->print('Missing Kerberos domain information. '); + } else { + $r->print('Invalid login mode or password. '); + } + $r->print('<b>Unable to enroll '.$ENV{'form.cuname'}.'.</b></p>'); + } } else { $r->print('Invalid username or domain'); } } -# ======================================================= Menu Phase Two Enroll +sub setup_date_selectors { + my ($starttime,$endtime) = @_; + if (! defined($starttime)) { + $starttime = time; + if (exists($ENV{'course.'.$ENV{'request.course.id'}. + '.default_enrollment_start_date'})) { + $starttime = $ENV{'course.'.$ENV{'request.course.id'}. + '.default_enrollment_start_date'}; + } + } + if (! defined($endtime)) { + $endtime = time+(6*30*24*60*60); # 6 months from now, approx + if (exists($ENV{'course.'.$ENV{'request.course.id'}. + '.default_enrollment_end_date'})) { + $endtime = $ENV{'course.'.$ENV{'request.course.id'}. + '.default_enrollment_end_date'}; + } + } + my $startdateform = &Apache::lonhtmlcommon::date_setter('studentform', + 'startdate', + $starttime); + my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform', + 'enddate', + $endtime); + return ($startdateform,$enddateform); +} + +sub get_dates_from_form { + my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate'); + my $enddate = &Apache::lonhtmlcommon::get_date_from_form('enddate'); + if ($ENV{'form.no_end_date'}) { + $enddate = 0; + } + return ($startdate,$enddate); +} + +sub date_setting_table { + my ($starttime,$endtime) = @_; + my ($startform,$endform)=&setup_date_selectors($starttime,$endtime); + my $dateDefault = '<nobr>'. + '<input type="checkbox" name="makedatesdefault" />'. + ' make these dates the default for future enrollment'; + my $perpetual = '<nobr><input type="checkbox" name="no_end_date"'; + if (defined($endtime) && $endtime == 0) { + $perpetual .= ' checked'; + } + $perpetual.= ' />'.' no ending date</nobr>'; + my $result = ''; + $result .= "<table>\n"; + $result .= '<tr><td align="right">Starting Date</td>'. + '<td>'.$startform.'</td>'. + '<td>'.$dateDefault.'</td>'."</tr>\n"; + $result .= '<tr><td align="right">Ending Date</td>'. + '<td>'.$endform.'</td>'. + '<td>'.$perpetual.'</td>'."</tr>\n"; + $result .= "</table>\n"; + return $result; +} + +sub make_dates_default { + my ($startdate,$enddate) = @_; + my $result = ''; + my $dom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + my $crs = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + my $put_result = &Apache::lonnet::put('environment', + {'default_enrollment_start_date'=>$startdate, + 'default_enrollment_end_date' =>$enddate},$dom,$crs); + if ($put_result eq 'ok') { + $result .= "Set default start and end dates for course<br />"; + # + # Refresh the course environment + &Apache::lonnet::coursedescription($ENV{'request.course.id'}); + } else { + $result .= "Unable to set default dates for course:".$put_result. + '<br />'; + } + return $result; +} + +## +## Single student enrollment routines (some of them) +## +sub get_student_username_domain_form { + my $r = shift; + my $domform = &Apache::loncommon::select_dom_form + ($ENV{'course.'.$ENV{'request.course.id'}.'.domain'},'cudomain',0); + $r->print(<<END); +<input type="hidden" name="action" value="enrollstudent" /> +<input type="hidden" name="state" value="gotusername" /> +<h3>Enroll One Student</h3> +<table> +<tr><th>Username:</th> + <td><input type="text" name="cuname" size="15" /></td></tr> +<tr><th>Domain:</th> + <td>$domform</td></tr> +<tr><th> </th> + <td> + <input type="submit" name="Begin Enrollment" value="Begin Enrollment" /> + </td></tr> +</table> +END + return; +} + sub print_enroll_single_student_form { my $r=shift; $r->print("<h3>Enroll One Student</h3>"); - my ($krbdefdom) = $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/; - $krbdefdom=~tr/a-z/A-Z/; - my $today = time; - my $halfyear = $today+15552000; - my $defdom=$r->dir_config('lonDefDomain'); - my $javascript_validations=&javascript_validations($krbdefdom); - # Set up authentication forms - my %param = ( formname => 'document.studentform'); - my $krbform = &Apache::loncommon::authform_kerberos(%param); - my $intform = &Apache::loncommon::authform_internal(%param); - my $locform = &Apache::loncommon::authform_local(%param); - # Set up domain selection form - my $domform = &domain_form($defdom); - # Print it all out + # + my $username = $ENV{'form.cuname'}; + my $domain = $ENV{'form.cudomain'}; + my $home = &Apache::lonnet::homeserver($username,$domain); + # $new_user flags whether we are creating a new user or using an old one + my $new_user = 1; + if ($home ne 'no_host') { + $new_user = 0; + } + # + my $user_data_html = ''; + my $javascript_validations = ''; + if ($new_user) { + my $defdom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + # Set up authentication forms + my ($krbdef,$krbdefdom) = + &Apache::loncommon::get_kerberos_defaults($domain); + $javascript_validations=&javascript_validations('auth',$krbdefdom); + my %param = ( formname => 'document.studentform', + kerb_def_dom => $krbdefdom, + kerb_def_auth => $krbdef + ); + my $krbform = &Apache::loncommon::authform_kerberos(%param); + my $intform = &Apache::loncommon::authform_internal(%param); + my $locform = &Apache::loncommon::authform_local(%param); + # + # Set up domain selection form + my $homeserver_form = ''; + my %servers = &Apache::loncommon::get_library_servers($domain); + $homeserver_form = '<select name="lcserver" size="1">'."\n". + '<option value="default" selected>default</option>'."\n"; + while (my ($servername,$serverdescription) = each (%servers)) { + $homeserver_form .= '<option value="'.$servername.'">'. + $serverdescription."</option>\n"; + } + $homeserver_form .= "</select>\n"; + # + # + $user_data_html = <<END; +<h3>User Data for $username\@$domain</h3> +<table> +<tr><th>First Name:</th> + <td><input type="text" name="cfirst" size="15"></td></tr> +<tr><th>Middle Name:</th> + <td><input type="text" name="cmiddle" size="15"></td></tr> +<tr><th>Last Name:</th> + <td><input type="text" name="clast" size="15"></td></tr> +<tr><th>Generation:</th> + <td><input type="text" name="cgen" size="5"> </td></tr> +<tr><th>Home Server:</th> + <td>$homeserver_form</td></tr> +</table> +<h3>Password</h3> +Please select an authentication mechanism +<table> +<p> +$krbform +<br /> +$intform +<br /> +$locform +</p> +END + } else { + # User already exists. Do not worry about authentication + my %uenv = &Apache::lonnet::dump('environment',$domain,$username); + $javascript_validations = &javascript_validations('noauth'); + $user_data_html = <<END; +<h3>User Data for $username\@$domain</h3> +<input type="hidden" name="lcserver" value="default" /> +<table> +<tr><th>First Name:</th> + <td> + <input type="text" name="cfirst" value="$uenv{'firstname'}" size="15" /> + </td></tr> +<tr><th>Middle Name:</th> + <td> + <input type="text" name="cmiddle" value="$uenv{'middlename'}" size="15" /> + </td></tr> +<tr><th>Last Name:</th> + <td> + <input type="text" name="clast"value="$uenv{'lastname'}" size="15" /> + </td></tr> +<tr><th>Generation:</th> + <td> + <input type="text" name="cgen" value="$uenv{'generation'}" size="5" /> + </td></tr> +</table> +END + } + my $date_table = &date_setting_table(); + # Print it all out $r->print(<<END); -<input type="hidden" name="action" value="enrollstudent"> -<input type="hidden" name="state" value="done"> - +<input type="hidden" name="action" value="enrollstudent" /> +<input type="hidden" name="state" value="done" /> +<input type="hidden" name="cuname" value="$username" /> +<input type="hidden" name="lcdomain" value="$domain" /> <script type="text/javascript" language="Javascript"> function verify(vf) { var founduname=0; @@ -683,44 +913,14 @@ function clearpwd(vf) { } </script> -<h3>Personal Data</h3> -<table> -<tr><td>First Name:</td><td> <input type="text" name="cfirst" size="15"></td></tr> -<tr><td>Middle Name:</td><td> <input type="text" name="cmiddle" size="15"></td></tr> -<tr><td>Last Name: </td><td><input type="text" name="clast" size="15"></td></tr> -<tr><td>Generation: </td><td><input type="text" name="cgen" size="5"> </td></tr> -</table> -<h3>Login Data</h3> -<p>Username: <input type="text" name="cuname" size="15"></p> -<p>Domain: $domform</p> -<p>Note: login settings below will not take effect if the user already exists -</p><p> -$krbform -</p><p> -$intform -</p><p> -$locform -</p><p> +$user_data_html <h3>Course Data</h3> <p>Group/Section: <input type="text" name="csec" size="5" /> <p> -<!-- Date setting form elements --> -<input type="hidden" name="pres_value" value='' /> -<input type="hidden" name="pres_type" value='' /> -<input type="hidden" name="pres_marker" value='' /> -<input type="hidden" name="startdate" value='$today' /> -<input type="hidden" name="enddate" value='$halfyear' /> -</p><p> -<a - href="javascript:pjump('date_start','Enrollment Starting Date',document.studentform.startdate.value,'start','studentform.pres','dateset');" ->Set Starting Date</a> -</p><p> -<a - href="javascript:pjump('date_end','Enrollment Ending Date',document.studentform.enddate.value,'end','studentform.pres','dateset');" ->Set Ending Date</a> +$date_table </p> <h3>ID/Student Number</h3> <p> @@ -766,7 +966,7 @@ sub print_html_classlist { <input type="hidden" name="action" value="$ENV{'form.action'}" /> <input type="hidden" name="state" value="" /> <p> -<font size="+1">Current Classlist</font> +<font size="+1">Current Class List</font> END if ($ENV{'form.action'} ne 'modifystudent') { @@ -871,7 +1071,7 @@ END $excel_workbook->set_tempdir('/home/httpd/perl/tmp'); $excel_sheet = $excel_workbook->addworksheet('classlist'); # - my $description = 'Classlist for '. + my $description = 'Class List for '. $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; $excel_sheet->write($row++,0,$description); # @@ -983,13 +1183,13 @@ sub print_modify_student_form { } # determine the students starting and ending times and section my ($starttime,$endtime,$section) = &get_enrollment_data($sname,$sdom); + if ($starttime =~ /^error/) { + $r->print('<h2>Error</h2>'); + $r->print('<p>'.$starttime.'</p>'); + return; + } # Deal with date forms - my $startdateform = &Apache::lonhtmlcommon::date_setter('studentform', - 'startdate', - $starttime); - my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform', - 'enddate', - $endtime); + my $date_table = &date_setting_table($starttime,$endtime); # if (! exists($ENV{'form.Status'}) || $ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) { @@ -1029,12 +1229,8 @@ Disable ID/Student Number Safeguard and (only do if you know what you are doing) </p><p> <b>Section</b>: <input type="text" name="section" value="$section" size="4"/> -</p><p> -<table> -<tr><td align="right"><b>Starting Date:</b></td><td>$startdateform</td></tr> -<tr><td align="right"><b>Ending Date:</b></td><td>$enddateform</td></tr> -</table> </p> +<p>$date_table</p> <input type="submit" value="Submit Modifications" /> </body></html> END @@ -1046,6 +1242,15 @@ END # sub modify_single_student { my $r = shift; + # + # Remove non alphanumeric values from the section + $ENV{'form.section'} =~ s/\W//g; + # + # Do the date defaults first + my ($starttime,$endtime) = &get_dates_from_form(); + if ($ENV{'form.makedatesdefault'}) { + $r->print(&make_dates_default($starttime,$endtime)); + } # Get the 'sortby' and 'Status' variables so the user goes back to their # previous screen my $sortby = $ENV{'form.sortby'}; @@ -1078,15 +1283,12 @@ sub modify_single_student { my $section = $ENV{'form.section'}; my $courseid = $ENV{'request.course.id'}; my $sid = $ENV{'form.id'}; - my $starttime = &Apache::lonhtmlcommon::get_date_from_form('startdate', - time); - my $endtime = &Apache::lonhtmlcommon::get_date_from_form('enddate', - time); my $displayable_starttime = localtime($starttime); my $displayable_endtime = localtime($endtime); # # check for forceid override - if (($sid ne $old{'id'}) && (! exists($ENV{'form.forceid'}))) { + if ((defined($old{'id'})) && ($old{'id'} ne '') && + ($sid ne $old{'id'}) && (! exists($ENV{'form.forceid'}))) { $r->print("<font color=\"ff0000\">You changed the students id ". " but did not disable the ID change safeguard.". " The students id will not be changed.</font>"); @@ -1131,13 +1333,21 @@ sub modify_single_student { </table> <h3>Role Information</h3> <table> -<tr><td>Start Time </td><td> $displayable_starttime </td></tr> -<tr><td>End Time </td><td> $displayable_endtime </td></tr> +<tr><td align="right"><b>Start Time:</b></td><td> $displayable_starttime </td></tr> +<tr><td align="right"><b>End Time:</b></td><td> $displayable_endtime </td></tr> </table> <p> END # - # Send request(s) to modify data + # Send request(s) to modify data (final undef is for 'desiredhost', + # which is a moot point because the student already has an account. + my $modify_section_results = &modifystudent($sdom,$slogin, + $ENV{'request.course.id'}, + $section,undef); + if ($modify_section_results !~ /^ok/) { + $r->print("An error occured during the attempt to change the ". + "section for this student.<br />"); + } my $roleresults = &Apache::lonnet::modifystudent ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname, $generation,$section,$endtime,$starttime,$ENV{'form.forceid'}); @@ -1177,13 +1387,12 @@ sub get_enrollment_data { my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname); my ($tmp) = keys(%roles); # Bail out if we were unable to get the students roles - return "666" if ($tmp =~ /^(con_lost|error|no_such_host)/i); + return ('error'.$tmp) if ($tmp =~ /^(con_lost|error|no_such_host)/i); # Go through the roles looking for enrollment in this course my ($end,$start) = (undef,undef); my $section = ''; my $count = scalar(keys(%roles)); while (my ($course,$role) = each(%roles)) { - &Apache::lonnet::logthis('course = '.$course.' role = '.$role); if ($course=~ /^\/$courseid\/*\s*(\w+)*_st$/ ) { # # Get active role @@ -1346,26 +1555,25 @@ END # sub print_first_courselist_upload_form { my $r=shift; - my $upfile_select=&Apache::loncommon::upfile_select_html(); - my $create_classlist_help = - &Apache::loncommon::help_open_topic("Course_Create_Class_List", - "How do I create a class list from a spreadsheet"); - my $create_csv_help = - &Apache::loncommon::help_open_topic("Course_Convert_To_CSV", - "How do I create a CSV file from a spreadsheet"); - $r->print(<<ENDUPFORM); -<input type=hidden name=phase value=two> -<h3>Upload a courselist</h3> -$upfile_select -<p> -<input type=submit name="fileupload" value="Upload Courselist"> -<input type="hidden" name="action" value="upload" /> -<input type="hidden" name="state" value="got_file" /> -</p> -$create_classlist_help <br /> -$create_csv_help -</body></html> -ENDUPFORM + my $str; + $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 class list')."</h3>\n"; + $str .= &Apache::loncommon::upfile_select_html(); + $str .= "<p>\n"; + $str .= '<input type="submit" name="fileupload" value="'. + &mt('Upload class list').'">'."\n"; + $str .= '<input type="checkbox" name="noFirstLine" /> '. + &mt('Ignore First Line')."</p>\n"; + $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List", + "How do I create a class list from a spreadsheet"). + "<br />\n"; + $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV", + "How do I create a CSV file from a spreadsheet"). + "<br />\n"; + $str .= "</body>\n</html>\n"; + $r->print($str); return; } @@ -1374,6 +1582,7 @@ sub upfile_drop_add { my $r=shift; &Apache::loncommon::load_tmp_file($r); my @studentdata=&Apache::loncommon::upfile_record_sep(); + if($ENV{'form.noFirstLine'}){shift(@studentdata);} my @keyfields = split(/\,/,$ENV{'form.keyfields'}); my $cid = $ENV{'request.course.id'}; my %fields=(); @@ -1387,10 +1596,10 @@ sub upfile_drop_add { } } # - my $startdate = $ENV{'form.startdate'}; - my $enddate = $ENV{'form.enddate'}; - if ($startdate=~/\D/) { $startdate=''; } - if ($enddate=~/\D/) { $enddate=''; } + my ($startdate,$enddate) = &get_dates_from_form(); + if ($ENV{'form.makedatesdefault'}) { + $r->print(&make_dates_default($startdate,$enddate)); + } # Determine domain and desired host (home server) my $domain=$ENV{'form.lcdomain'}; my $desiredhost = $ENV{'form.lcserver'}; @@ -1399,8 +1608,9 @@ sub upfile_drop_add { } else { my %home_servers = &Apache::loncommon::get_library_servers($domain); if (! exists($home_servers{$desiredhost})) { - $r->print('<font color="#ff0000">Error:</font>'. - 'Invalid home server specified'); + $r->print('<font color="#ff0000">'.&mt('Error').'</font>'. + &mt('Invalid home server specified')); + $r->print("</body>\n</html>\n"); return; } } @@ -1422,11 +1632,19 @@ sub upfile_drop_add { $genpwd=$ENV{'form.locarg'}; } } + if ($amode =~ /^krb/) { + if (! defined($genpwd) || $genpwd eq '') { + $r->print('<font color="red" size="+1">'. + &mt('Unable to enroll students').'</font> '. + &mt('No Kerberos domain was specified.').'</p>'); + $amode = ''; # This causes the loop below to be skipped + } + } unless (($domain=~/\W/) || ($amode eq '')) { ####################################### ## Enroll Students ## ####################################### - $r->print('<h3>Enrolling Students</h3>'); + $r->print('<h3>'.&mt('Enrolling Students')."</h3>\n<p>\n"); my $count=0; my $flushc=0; my %student=(); @@ -1455,9 +1673,10 @@ sub upfile_drop_add { } } if ($entries{$fields{'username'}}=~/\W/) { - $r->print('<p><b>Unacceptable username: '. - $entries{$fields{'username'}}.' for user '. - $fname.' '.$mname.' '.$lname.' '.$gen.'</b><p>'); + $r->print('<br />'. + &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]', + $entries{$fields{'username'}},$fname,$mname,$lname,$gen). + '</b>'); } else { # determine section number my $sec=''; @@ -1467,6 +1686,8 @@ sub upfile_drop_add { $sec=$entries{$fields{'sec'}}; } } + # remove non alphanumeric values from section + $sec =~ s/\W//g; # determine student id number my $id=''; if (defined($fields{'id'})) { @@ -1475,6 +1696,14 @@ sub upfile_drop_add { } $id=~tr/A-Z/a-z/; } + # determine email address + my $email=''; + if (defined($fields{'email'})) { + if (defined($entries{$fields{'email'}})) { + $email=$entries{$fields{'email'}}; + unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; } + } + } # determine student password my $password=''; if ($genpwd) { @@ -1491,17 +1720,18 @@ sub upfile_drop_add { \$lname,\$gen,\$sec) { $$_ =~ s/(\s+$|^\s+)//g; } - if ($password) { + if ($password || $ENV{'form.login'} eq 'loc') { &modifystudent($domain,$username,$cid,$sec, $desiredhost); my $reply=&Apache::lonnet::modifystudent ($domain,$username,$id,$amode,$password, $fname,$mname,$lname,$gen,$sec,$enddate, - $startdate,$ENV{'form.forceid'},$desiredhost); + $startdate,$ENV{'form.forceid'},$desiredhost, + $email); if ($reply ne 'ok') { - $r->print('<p><b>'. - 'Error enrolling '.$username.': '. - $reply.'</b></p>'); + $reply =~ s/^error://; + $r->print('<br />'. + &mt('<b>[_1]</b>: Unable to enroll: [_2]',$username,$reply)); } else { $count++; $flushc++; $student{$username}=1; @@ -1512,23 +1742,28 @@ sub upfile_drop_add { } } } else { - $r->print("<p><b>No password for $username</b><p>"); + $r->print('<br />'. + &mt('<b>[_1]</b>: Unable to enroll. No password specified.',$username) + ); } } } } # end of foreach (@studentdata) - $r->print('<p>Processed Students: '.$count.'</p>'); - $r->print("<p>If active, the new role will be available when the ". - "students next log in to LON-CAPA.</p>"); + $r->print("</p>\n<p>\n".&mt('Processed [_1] student(s).',$count). + "</p>\n"); + $r->print("<p>\n". + &mt('If active, the new role will be available when the '. + 'students next log in to LON-CAPA.')."</p>\n"); ##################################### # Drop students # ##################################### if ($ENV{'form.fullup'} eq 'yes') { - $r->print('<h3>Dropping Students</h3>'); + $r->print('<h3>'.&mt('Dropping Students')."</h3>\n"); # Get current classlist my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); if (! defined($classlist)) { - $r->print("There are no students currently enrolled.\n"); + $r->print(&mt('There are no students currently enrolled.'). + "\n"); } else { # Remove the students we just added from the list of students. foreach (@studentdata) { @@ -1561,15 +1796,16 @@ sub drop_student_list { # drop student my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'}); if ($result eq 'ok' || $result eq 'ok:') { - $r->print('Dropped '.$uname.' @ '.$udom.'<br>'); + $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'<br>'); $count++; } else { - $r->print('Error dropping '.$uname.' @ '.$udom.': '.$result. + $r->print( + &mt('Error dropping [_1]:[_2]',$uname.'@'.$udom,$result). '<br />'); } } - $r->print('<p><b>Dropped '.$count.' student(s).</b>'); - $r->print('<p>Re-enrollment will re-activate data.') if ($count); + $r->print('<p><b>'.&mt('Dropped [_1] student(s).',$count).'</b></p>'); + $r->print('<p>'.&mt('Re-enrollment will re-activate data.')) if ($count); } ################################################################### @@ -1593,7 +1829,8 @@ The response to the request is governed upload enrolling enroll students based on upload drop undefined print the classlist ready to drop drop done drop the selected students - enrollstudent undefined print single student enroll menu + enrollstudent undefined print student username domain form + enrollstudent gotusername print single student enroll menu enrollstudent enrolling enroll student classlist undefined print html classlist classlist csv print csv classlist @@ -1608,7 +1845,7 @@ The response to the request is governed sub handler { my $r=shift; if ($r->header_only) { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } @@ -1629,7 +1866,7 @@ sub handler { $r->content_type('text/csv'); } else { # Start page - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; $r->print(&header()); } @@ -1661,11 +1898,13 @@ sub handler { } } elsif ($ENV{'form.action'} eq 'enrollstudent') { if (! exists($ENV{'form.state'})) { + &get_student_username_domain_form($r); + } elsif ($ENV{'form.state'} eq 'gotusername') { &print_enroll_single_student_form($r); } elsif ($ENV{'form.state'} eq 'enrolling') { &enroll_single_student($r); } else { - &print_enroll_single_student_form($r); + &get_student_username_domain_form($r); } } elsif ($ENV{'form.action'} eq 'classlist') { if (! exists($ENV{'form.state'})) {