--- loncom/interface/Attic/londropadd.pm 2002/09/26 14:04:34 1.55 +++ loncom/interface/Attic/londropadd.pm 2002/11/08 20:51:48 1.60 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.55 2002/09/26 14:04:34 matthew Exp $ +# $Id: londropadd.pm,v 1.60 2002/11/08 20:51:48 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; ############################################################### ############################################################### @@ -734,81 +735,87 @@ 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 + +      +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','modifystudent', - 'any',$student_array,$student_data); + $ENV{'form.Status'},$classlist,$keylist); } else { &show_class_list($r,'view','aboutme','classlist', - 'any',$student_array,$student_data); + $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','csv', - 'any',$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,$action,$statusmode,$students,$s_data)=@_; + my ($r,$mode,$linkto,$action,$statusmode,$classlist,$keylist)=@_; my $cid=$ENV{'request.course.id'}; - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['sortby']); + # + # 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'; @@ -816,58 +823,83 @@ sub show_class_list { # 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"]); + } + # + # 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($s_data->{$a.':'.$sortby}) cmp lc($s_data->{$b.':'.$sortby}) - || - lc($s_data->{$a.':username'}) cmp lc($s_data->{$b.':username'}) - || - lc($s_data->{$a.':domain'}) cmp lc($s_data->{$b.':domain'}) - } @$students; + 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; - if (exists($s_data->{$student.':error'})) { - $error = $s_data->{$student.':error'}; - } - if ($error) { - $r->print(''."\n"); - next; - } - my $username = $s_data->{$student.':username'}; - my $domain = $s_data->{$student.':domain'}; - my $section = $s_data->{$student.':section'}; - my $name = $s_data->{$student.':fullname'}; - my $status = $s_data->{$student.':Status'}; - my $id = $s_data->{$student.':id'}; - next if (($statusmode ne 'any') && ($status ne $statusmode)); + 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
- username + username - domain + domain - ID + ID - student name + student name - section + section
'. - 'Error'. - 'Error retrieving data for '. - join('@',split(/:/,$student)). - ', '.$error.'
\n "); if ($linkto eq 'nothing') { @@ -877,9 +909,12 @@ END $username, $domain)); } elsif ($linkto eq 'modify') { - $r->print(''. + $r->print(''. $username."\n"); } $r->print(<<"END"); @@ -896,13 +931,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('

') 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"); + } } @@ -912,7 +959,7 @@ END sub print_modify_student_form { my $r = shift(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['sdom','sname','sortby']); + ['sdom','sname']); my $sname = $ENV{'form.sname'}; my $sdom = $ENV{'form.sdom'}; my $sortby = $ENV{'form.sortby'}; @@ -940,6 +987,11 @@ sub print_modify_student_form { my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform', 'enddate', $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(< @@ -952,6 +1004,8 @@ Only domain coordinators can change a us + +

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

@@ -989,8 +1043,10 @@ END # sub modify_single_student { my $r = shift; - # Get the 'sortby' variable so the user does not need to re-sort + # 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'}; @@ -1001,6 +1057,8 @@ sub modify_single_student { ['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 ". @@ -1062,11 +1120,14 @@ sub modify_single_student { ID $old{'id'} $sid + + Section + $old{'section'} + $section

Role Information

-
Section $section
Start Time $displayable_starttime
End Time $displayable_endtime
@@ -1097,7 +1158,10 @@ END } $r->print(<

-Modify another students data + + + +Modify another students data END return; @@ -1136,16 +1200,45 @@ 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,$s_data,$r)=@_; + my ($r,$classlist,$keylist,$nosort)=@_; my $cid=$ENV{'request.course.id'}; - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['sortby']); + 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(< @@ -1164,6 +1257,23 @@ function uncheckAll(field) {

+END + + if ($nosort) { + $r->print(< + +   + username + domain + ID + student name + section + +END + + } else { + $r->print(<   @@ -1179,32 +1289,32 @@ function uncheckAll(field) { END + } + # + # 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($s_data->{$a.':'.$sortby}) cmp lc($s_data->{$b.':'.$sortby}) - || - lc($s_data->{$a.':username'}) cmp lc($s_data->{$b.':username'}) - || - lc($s_data->{$a.':domain'}) cmp lc($s_data->{$b.':domain'}) - } @$students; + 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; - if (exists($s_data->{$student.':error'})) { - $error = $s_data->{$student.':error'}; - } - if ($error) { - $r->print(''. - 'Error'. - 'Error retrieving data for '. - join('@',split(/:/,$student)). - ', '.$error.''."\n"); - next; - } - my $username = $s_data->{$student.':username'}; - my $domain = $s_data->{$student.':domain'}; - my $section = $s_data->{$student.':section'}; - my $name = $s_data->{$student.':fullname'}; - my $status = $s_data->{$student.':Status'}; - my $id = $s_data->{$student.':id'}; + 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"); @@ -1373,6 +1483,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); @@ -1408,66 +1523,26 @@ sub upfile_drop_add { 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; @@ -1480,17 +1555,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.' @ '.$udom.'
'); + $count++; } else { $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); } ################################################################### @@ -1592,7 +1668,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); }