--- loncom/interface/Attic/londropadd.pm 2002/09/18 14:17:47 1.51 +++ loncom/interface/Attic/londropadd.pm 2003/06/20 20:57:44 1.68 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.51 2002/09/18 14:17:47 matthew Exp $ +# $Id: londropadd.pm,v 1.68 2003/06/20 20:57:44 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -41,6 +41,7 @@ use Apache::lonnet(); use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::Constants qw(:common :http REDIRECT); +use Spreadsheet::WriteExcel; ############################################################### ############################################################### @@ -92,7 +93,7 @@ sub modifystudent { } } if ($result eq '') { - $result eq 'Unable to find section for this student'; + $result = 'Unable to find section for this student'; } else { $result =~ s/(ok:)+/ok/g; } @@ -212,6 +213,7 @@ sub javascript_validations { my %param = ( formname => 'studentform', kerb_def_dom => $krbdefdom ); my $authheader = &Apache::loncommon::authform_header(%param); + my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); return (< '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); + my $date_table = &date_setting_table(); $r->print(< @@ -482,18 +450,9 @@ $locform

LON-CAPA Domain for Students

LON-CAPA domain: $domform

Starting and Ending Dates

- - - - - -Set Starting Date

- -Set Ending Date

+

+$date_table +

Full Update

Full update (also print list of users not enrolled anymore)

@@ -520,12 +479,11 @@ sub print_upload_manager_form { my @records=&Apache::loncommon::upfile_record_sep(); 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 ($krbdef,$krbdefdom) = + &Apache::loncommon::get_kerberos_defaults($defdom); &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom); my $i; my $keyfields; @@ -557,8 +515,18 @@ sub print_upload_manager_form { # ======================================================= Enroll single student sub enroll_single_student { my $r=shift; + # + # 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('

Enrolling Student

'); - $r->print('

Enrolling '.$ENV{'form.cuname'}." in domain ". + $r->print('

Enrolling '.$ENV{'form.cuname'}." \@ ". $ENV{'form.lcdomain'}.'

'); if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&& ($ENV{'form.lcdomain'})&&($ENV{'form.lcdomain'}!~/\W/)) { @@ -594,17 +562,25 @@ sub enroll_single_student { my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'}, $ENV{'form.lcdomain'}); if ((($amode) && ($genpwd)) || ($home ne 'no_host')) { + # Clean out any old roles the student has in this class. &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'}, $ENV{'request.course.id'},$ENV{'form.csec'}, $desiredhost); - $r->print(&Apache::lonnet::modifystudent( - $ENV{'form.lcdomain'},$ENV{'form.cuname'}, - $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'}, - $desiredhost)); + my $login_result = &Apache::lonnet::modifystudent + ($ENV{'form.lcdomain'},$ENV{'form.cuname'}, + $ENV{'form.cstid'},$amode,$genpwd, + $ENV{'form.cfirst'},$ENV{'form.cmiddle'}, + $ENV{'form.clast'},$ENV{'form.cgen'}, + $ENV{'form.csec'},$enddate, + $startdate,$ENV{'form.forceid'}, + $desiredhost); + if ($login_result =~ /^ok/) { + $r->print($login_result); + $r->print("

If active, the new role will be available ". + "when the student next logs in to LON-CAPA.

"); + } else { + $r->print("unable to enroll: ".$login_result); + } } else { $r->print('

ERROR '. 'Invalid login mode or password. '. @@ -615,23 +591,103 @@ sub enroll_single_student { } } +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 = ''. + ''. + ' make these dates the default for future enrollment'; + my $perpetual = ''; + my $result = ''; + $result .= "\n"; + $result .= ''. + ''. + ''."\n"; + $result .= ''. + ''. + ''."\n"; + $result .= "
Starting Date'.$startform.''.$dateDefault.'
Ending Date'.$endform.''.$perpetual.'
\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
"; + } else { + $result .= "Unable to set default dates for course:".$put_result. + '
'; + } + return $result; +} + # ======================================================= Menu Phase Two Enroll sub print_enroll_single_student_form { my $r=shift; $r->print("

Enroll One Student

"); - 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 ($krbdef,$krbdefdom) = + &Apache::loncommon::get_kerberos_defaults($defdom); + my $javascript_validations=&javascript_validations($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 $domform = &domain_form($defdom); + my $date_table = &date_setting_table(); # Print it all out $r->print(< @@ -697,20 +753,7 @@ $locform

Group/Section:

- - - - - - -

-Set Starting Date -

-Set Ending Date +$date_table

ID/Student Number

@@ -726,101 +769,173 @@ END return; } -# =================================================== get the current classlist -sub get_current_classlist { - my $r = shift; - # Call DownloadClasslist - my $cid = $ENV{'request.course.id'}; - my $c = $r->connection; - my $classlisthash = &Apache::loncoursedata::DownloadClasslist - ($cid,'Not downloaded',$c); - # Call ProcessClasslist - my %cache; - my @students = &Apache::loncoursedata::ProcessClasslist(\%cache, - $classlisthash, - $cid,$c); - return (\@students,\%cache); -} - # ========================================================= Menu Phase Two Drop sub print_drop_menu { my $r=shift; $r->print("

Drop Students

"); my $cid=$ENV{'request.course.id'}; - my ($student_array,$student_data)=&get_current_classlist($r); - if (! scalar(@$student_array)) { + my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { $r->print("There are no students currently enrolled.\n"); return; } # Print out the available choices - &show_drop_list($student_array,$student_data,$r); + &show_drop_list($r,$classlist,$keylist); return; } # ============================================== view classlist sub print_html_classlist { my $r=shift; + if (! exists($ENV{'form.sortby'})) { + $ENV{'form.sortby'} = 'username'; + } + if ($ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) { + $ENV{'form.Status'} = 'Active'; + } + my $status_select = &Apache::lonhtmlcommon::StatusOptions + ($ENV{'form.Status'},'studentform'); $r->print(< +

-Current Classlist      -CSV format -

+Current Classlist +      END + if ($ENV{'form.action'} ne 'modifystudent') { + $r->print(< +CSV format +         +Excel format + +      +Student Status: +END + } + $r->print($status_select."

\n"); my $cid=$ENV{'request.course.id'}; - my ($student_array,$student_data)=&get_current_classlist($r); - if (! scalar(@$student_array)) { + my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { $r->print("There are no students currently enrolled.\n"); } else { # Print out the available choices if ($ENV{'form.action'} eq 'modifystudent') { - &show_class_list($r,'view','modify',$student_array,$student_data); + &show_class_list($r,'view','modify','modifystudent', + $ENV{'form.Status'},$classlist,$keylist); } else { - &show_class_list($r,'view','aboutme',$student_array,$student_data); + &show_class_list($r,'view','aboutme','classlist', + $ENV{'form.Status'},$classlist,$keylist); } } } # ============================================== view classlist -sub print_csv_classlist { +sub print_formatted_classlist { my $r=shift; + my $mode = shift; my $cid=$ENV{'request.course.id'}; - my ($student_array,$student_data)=&get_current_classlist($r); - if (! scalar(@$student_array)) { + my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { $r->print("There are no students currently enrolled.\n"); } else { - &show_class_list($r,'csv','nolink',$student_array,$student_data); + &show_class_list($r,$mode,'nolink','csv', + $ENV{'form.Status'},$classlist,$keylist); } } # =================================================== Show student list to drop sub show_class_list { - my ($r,$mode,$linkto,$students,$student_data)=@_; + my ($r,$mode,$linkto,$action,$statusmode,$classlist,$keylist)=@_; my $cid=$ENV{'request.course.id'}; + # + # Variables for excel output + my ($excel_workbook, $excel_sheet, $excel_filename,$row); + # + my $sortby = $ENV{'form.sortby'}; + if ($sortby !~ /^(username|domain|section|fullname|id)$/) { + $sortby = 'username'; + } # Print out header if ($mode eq 'view') { if ($linkto eq 'aboutme') { - $r->print('Select a user name to view the users page.'); + $r->print('Select a user name to view the users personal page.'); } elsif ($linkto eq 'modify') { $r->print('Select a user name to modify the students information'); } $r->print(< + +

- - + + END } elsif ($mode eq 'csv') { - $r->print('"'.join('","',("username","domain","ID","student name", - "section")).'"'."\n"); + if($statusmode eq 'Expired') { + $r->print('"Students with expired roles"'); + } + if ($statusmode eq 'Any') { + $r->print('"'.join('","',("username","domain","ID","student name", + "section","status")).'"'."\n"); + } else { + $r->print('"'.join('","',("username","domain","ID","student name", + "section")).'"'."\n"); + } + } elsif ($mode eq 'excel') { + # Create the excel spreadsheet + $excel_filename = '/prtspool/'. + $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'. + time.'_'.rand(1000000000).'.xls'; + $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'. + $excel_filename); + $excel_workbook->set_tempdir('/home/httpd/perl/tmp'); + $excel_sheet = $excel_workbook->addworksheet('classlist'); + # + my $description = 'Classlist for '. + $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; + $excel_sheet->write($row++,0,$description); + # + $excel_sheet->write($row++,0,["username","domain","ID", + "student name","section","status"]); } - foreach my $student (@$students) { - my $username = $student_data->{$student.':username'}; - my $domain = $student_data->{$student.':domain'}; - my $section = $student_data->{$student.':section'}; - my $name = $student_data->{$student.':fullname'}; - my $status = $student_data->{$student.':Status'}; - my $id = $student_data->{$student.':id'}; - next if ($status ne 'Active'); + # + # Sort the students + my %index; + my $i; + foreach (@$keylist) { + $index{$_} = $i++; + } + my $index = $index{$sortby}; + my $second = $index{'username'}; + my $third = $index{'domain'}; + my @Sorted_Students = sort { + lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index]) + || + lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second]) + || + lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third]) + } (keys(%$classlist)); + foreach my $student (@Sorted_Students) { + my $username = $classlist->{$student}->[$index{'username'}]; + my $domain = $classlist->{$student}->[$index{'domain'}]; + my $section = $classlist->{$student}->[$index{'section'}]; + my $name = $classlist->{$student}->[$index{'fullname'}]; + my $id = $classlist->{$student}->[$index{'id'}]; + my $status = $classlist->{$student}->[$index{'status'}]; + next if (($statusmode ne 'Any') && ($status ne $statusmode)); if ($mode eq 'view') { $r->print("\n @@ -848,13 +967,25 @@ END foreach ($username,$domain,$id,$name,$section) { push @line,&Apache::loncommon::csv_translate($_); } + if ($statusmode eq 'Any') { + push @line,&Apache::loncommon::csv_translate($status); + } my $tmp = $"; $" = '","'; $r->print("\"@line\"\n"); $" = $tmp; + } elsif ($mode eq 'excel') { + $excel_sheet->write($row++,0,[$username,$domain,$id, + $name,$section,$status]); } } - $r->print('
usernamedomainIDstudent namesection
+ username + + domain + + ID + + student name + + section +
\n "); if ($linkto eq 'nothing') { @@ -830,9 +945,13 @@ END $username, $domain)); } elsif ($linkto eq 'modify') { - $r->print(''.$username."\n"); + $r->print(''. + $username."\n"); } $r->print(<<"END");

') if ($mode eq 'view'); + if ($mode eq 'view') { + $r->print('
'); + } elsif ($mode eq 'excel') { + $excel_workbook->close(); + $r->print('

'. + 'Your Excel spreadsheet is ready for download.

'."\n"); + } } @@ -864,14 +995,14 @@ END sub print_modify_student_form { my $r = shift(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['sdom','sname']); - - my $sname = $ENV{'form.sname'}; - my $sdom = $ENV{'form.sdom'}; + ['sdom','sname']); + my $sname = $ENV{'form.sname'}; + my $sdom = $ENV{'form.sdom'}; + my $sortby = $ENV{'form.sortby'}; # determine the students name information my %info=&Apache::lonnet::get('environment', ['firstname','middlename', - 'lastname','generation'], + 'lastname','generation','id'], $sdom, $sname); my ($tmp) = keys(%info); if ($tmp =~ /^(con_lost|error|no_such_host)/i) { @@ -886,18 +1017,26 @@ sub print_modify_student_form { # determine the students starting and ending times and section my ($starttime,$endtime,$section) = &get_enrollment_data($sname,$sdom); # 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)$/) { + $ENV{'form.Status'} = 'crap'; + } # Make sure student is enrolled in course $r->print(< + +Only domain coordinators can change a users password. + +

- + + + +

Modify Enrollment for $info{'firstname'} $info{'middlename'} $info{'lastname'} $info{'generation'}, $sname\@$sdom

@@ -911,13 +1050,15 @@ $info{'lastname'} $info{'generation'}, $

-Section: +Student ID:

- - - -
Starting Date:$startdateform
Ending Date:$enddateform
+ +Disable ID/Student Number Safeguard and Force Change of Conflicting IDs +(only do if you know what you are doing) +

+Section:

+

$date_table

END @@ -929,56 +1070,136 @@ END # sub modify_single_student { my $r = shift; - # make sure user can modify student data? + # + # 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'}; + my $status = $ENV{'form.Status'}; + # + # We always need this information + my $slogin = $ENV{'form.slogin'}; + my $sdom = $ENV{'form.sdomain'}; + # + # Get the old data + my %old=&Apache::lonnet::get('environment', + ['firstname','middlename', + 'lastname','generation','id'], + $sdom, $slogin); + $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin, + $ENV{'request.course.id'}); + my ($tmp) = keys(%old); + if ($tmp =~ /^(con_lost|error|no_such_host)/i) { + $r->print("There was an error determining the environment values ". + " for $slogin \@ $sdom."); + return; + } + undef $tmp; + # + # Get the new data my $firstname = $ENV{'form.firstname'}; my $middlename = $ENV{'form.middlename'}; my $lastname = $ENV{'form.lastname'}; my $generation = $ENV{'form.generation'}; my $section = $ENV{'form.section'}; my $courseid = $ENV{'request.course.id'}; - my $sname = $ENV{'form.slogin'}; - my $sdom = $ENV{'form.sdomain'}; - my $starttime = &Apache::lonhtmlcommon::get_date_from_form('startdate', - time); - my $endtime = &Apache::lonhtmlcommon::get_date_from_form('enddate', - time); + my $sid = $ENV{'form.id'}; my $displayable_starttime = localtime($starttime); my $displayable_endtime = localtime($endtime); + # + # check for forceid override + if ((defined($old{'id'})) && ($old{'id'} ne '') && + ($sid ne $old{'id'}) && (! exists($ENV{'form.forceid'}))) { + $r->print("You changed the students id ". + " but did not disable the ID change safeguard.". + " The students id will not be changed."); + $sid = $old{'id'}; + } + # # talk to the user about what we are going to do $r->print(< +

Modifying data for user $slogin \@ $sdom

Student Information

- - - - - +
First name $firstname
Middle name $middlename
Last name $lastname
Generation $generation
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Old Value New Value
First name $old{'firstname'} $firstname
Middle name $old{'middlename'} $middlename
Last name $old{'lastname'} $lastname
Generation $old{'generation'} $generation
ID $old{'id'} $sid
Section $old{'section'} $section

Role Information

- - - + +
Section $section
Start Time $displayable_starttime
End Time $displayable_endtime
Start Time: $displayable_starttime
End Time: $displayable_endtime
+

END - # send request(s) to modify data - my $roleresults = 'refused'; - #my $roleresults = &Apache::lonnet::assignrole($sdom,$sname, - # $courseid.'/'.$section, - # 'st', - # $endtime,$starttime); - if ($roleresults =~/refused/) { + # + # 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.
"); + } + my $roleresults = &Apache::lonnet::modifystudent + ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname, + $generation,$section,$endtime,$starttime,$ENV{'form.forceid'}); + if ($roleresults eq 'refused' ) { $r->print("Your request to change the role information for this ". - "student was refused."); + "student was refused. You do not appear to have ". + "sufficient authority to change student information."); } elsif ($roleresults !~ /ok/) { $r->print("An error occurred during the attempt to change the role". - " information for this student. The error reported was ". + " information for this student.
". + "The error reported was ". $roleresults); + &Apache::lonnet::logthis("londropadd:failed attempt to modify student". + " data for ".$slogin." \@ ".$sdom." by ". + $ENV{'user.name'}." \@ ".$ENV{'user.domain'}. + ":".$roleresults); } else { # everything is okay! - $r->print("Student role updated successfully."); + $r->print("Student information updated successfully.
". + "The student must log out and log in again to see ". + "these changes."); } - # $r->print(<

+ + + +Modify another students data END return; @@ -997,7 +1218,6 @@ sub get_enrollment_data { 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 @@ -1017,12 +1237,49 @@ sub get_enrollment_data { return ($start,$end,$section); } -# =================================================== Show student list to drop +################################################# +################################################# + +=pod + +=item show_drop_list + +Display a list of students to drop +Inputs: + +=over 4 + +=item $r, Apache request + +=item $classlist, hash pointer returned from loncoursedata::get_classlist(); + +=item $keylist, array pointer returned from loncoursedata::get_classlist() +which describes the order elements are stored in the %$classlist values. + +=item $nosort, if true, sorting links are omitted. + +=back + +=cut + +################################################# +################################################# sub show_drop_list { - my ($students,$student_data,$r)=@_; + my ($r,$classlist,$keylist,$nosort)=@_; my $cid=$ENV{'request.course.id'}; - $r->print(<<'END'); - + if (! exists($ENV{'form.sortby'})) { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['sortby']); + } + my $sortby = $ENV{'form.sortby'}; + if ($sortby !~ /^(username|domain|section|fullname|id)$/) { + $sortby = 'username'; + } + # + my $action = "drop"; + $r->print(< +

+END + + if ($nosort) { + $r->print(< + +   + username + domain + ID + student name + section + +END + + } else { + $r->print(< - usernamedomain - IDstudent namesection +  + + username + + domain + + ID + + student name + + section + + END - foreach my $student (@$students) { - my $username = $student_data->{$student.':username'}; - my $domain = $student_data->{$student.':domain'}; - my $section = $student_data->{$student.':section'}; - my $name = $student_data->{$student.':fullname'}; - my $status = $student_data->{$student.':Status'}; - my $id = $student_data->{$student.':id'}; + } + # + # Sort the students + my %index; + my $i; + foreach (@$keylist) { + $index{$_} = $i++; + } + my $index = $index{$sortby}; + my $second = $index{'username'}; + my $third = $index{'domain'}; + my @Sorted_Students = sort { + lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index]) + || + lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second]) + || + lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third]) + } (keys(%$classlist)); + foreach my $student (@Sorted_Students) { + my $error; + my $username = $classlist->{$student}->[$index{'username'}]; + my $domain = $classlist->{$student}->[$index{'domain'}]; + my $section = $classlist->{$student}->[$index{'section'}]; + my $name = $classlist->{$student}->[$index{'fullname'}]; + my $id = $classlist->{$student}->[$index{'id'}]; + my $status = $classlist->{$student}->[$index{'status'}]; next if ($status ne 'Active'); # $r->print(<<"END"); @@ -1117,10 +1421,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'}; @@ -1216,6 +1520,11 @@ sub upfile_drop_add { } } } + # Clean up whitespace + foreach (\$domain,\$username,\$id,\$fname,\$mname, + \$lname,\$gen,\$sec) { + $$_ =~ s/(\s+$|^\s+)//g; + } if ($password) { &modifystudent($domain,$username,$cid,$sec, $desiredhost); @@ -1242,73 +1551,35 @@ sub upfile_drop_add { } } } # end of foreach (@studentdata) - $r->print('

Processed Students: '.$count); + $r->print('

Processed Students: '.$count.'

'); + $r->print("

If active, the new role will be available when the ". + "students next log in to LON-CAPA.

"); ##################################### # Drop students # ##################################### if ($ENV{'form.fullup'} eq 'yes') { $r->print('

Dropping Students

'); # Get current classlist - my ($error,%currentlist)=&get_current_classlist($r); - if (defined($error)) { - $r->print('
ERROR:$error
'); - } - if (defined(%currentlist)) { - # Drop the students + my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { + $r->print("There are no students currently enrolled.\n"); + } else { + # Remove the students we just added from the list of students. foreach (@studentdata) { my %entries=&Apache::loncommon::record_sep($_); unless (($entries{$fields{'username'}} eq '') || (!defined($entries{$fields{'username'}}))) { - delete($currentlist{$entries{$fields{'username'}}. + delete($classlist->{$entries{$fields{'username'}}. ':'.$domain}); } } - # Print out list of dropped students - &show_drop_list($r,%currentlist); - } else { - $r->print("There are no students currently enrolled.\n"); + # Print out list of dropped students. + &show_drop_list($r,$classlist,$keylist,'nosort'); } } } # end of unless } -################################################################### -################################################################### - -=pod - -=item &drop_students - -Inputs: \@droplist, a pointer to an array of students to drop. -Students should be in format of studentname:studentdomain - -Returns: $errors, a string describing any errors encountered. -$successes, a string describing the successful dropping of students. - -=cut - -################################################################### -################################################################### -sub drop_students { - my @droplist = @{shift()}; - my $courseid = $ENV{'request.course.id'}; - my $successes = ''; - my $errors = ''; - foreach (@droplist) { - my ($sname,$sdom)=split(/:/,$_); - my $result = &drop_student($sname,$sdom,$courseid); - if ($result !~ /ok/) { - $errors .= "Error dropping $sname\@$sdom: $result\n"; - } else { - $successes .= "Dropped $sname\@$sdom\n"; - } - } - return ($errors,$successes); -} -################################################################### -################################################################### - - # ================================================================== Phase four sub drop_student_list { my $r=shift; @@ -1321,17 +1592,18 @@ sub drop_student_list { } foreach (@droplist) { my ($uname,$udom)=split(/\:/,$_); + # drop student my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'}); if ($result eq 'ok' || $result eq 'ok:') { - $r->print('Dropped '.$uname.' at '.$udom.'
'); + $r->print('Dropped '.$uname.' @ '.$udom.'
'); + $count++; } else { - $r->print('Error dropping '.$uname.' at '.$udom.': '.$result. + $r->print('Error dropping '.$uname.' @ '.$udom.': '.$result. '
'); } - $count++; } $r->print('

Dropped '.$count.' student(s).'); - $r->print('

Re-enrollment will re-activate data.'); + $r->print('

Re-enrollment will re-activate data.') if ($count); } ################################################################### @@ -1419,7 +1691,7 @@ sub handler { } elsif ($ENV{'form.state'} eq 'done') { &drop_student_list($r); } else { - &menu_phase_two_drop($r); + &print_drop_menu($r); } } elsif ($ENV{'form.action'} eq 'enrollstudent') { if (! exists($ENV{'form.state'})) { @@ -1433,7 +1705,9 @@ sub handler { if (! exists($ENV{'form.state'})) { &print_html_classlist($r); } elsif ($ENV{'form.state'} eq 'csv') { - &print_csv_classlist($r); + &print_formatted_classlist($r,'csv'); + } elsif ($ENV{'form.state'} eq 'excel') { + &print_formatted_classlist($r,'excel'); } else { &print_html_classlist($r); }