--- loncom/interface/statistics/lonstudentassessment.pm 2003/03/05 20:31:13 1.35 +++ loncom/interface/statistics/lonstudentassessment.pm 2003/03/07 15:18:39 1.38 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstudentassessment.pm,v 1.35 2003/03/05 20:31:13 matthew Exp $ +# $Id: lonstudentassessment.pm,v 1.38 2003/03/07 15:18:39 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -452,6 +452,8 @@ sub html_initialize { $padding = ' 'x3; $count = 0; # + $r->print("

".$ENV{'course.'.$ENV{'request.course.id'}.'.description'}. + "  ".localtime(time)."

"); my $Str = "
\n";
     # First, the @StudentData fields need to be listed
     my @to_show = &get_student_fields_to_show();
@@ -656,8 +658,7 @@ my $filename;
 my $rows_output;
 my $cols_output;
 
-my $num_students;
-my $start_time;
+my %prog_state; # progress window state
 
 sub excel_initialize {
     my ($r) = @_;
@@ -672,9 +673,6 @@ sub excel_initialize {
     $rows_output = 0;
     $cols_output = 0;
     #
-    $num_students = 0;
-    $start_time   = time;
-    #
     # Create sheet
     $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
     #
@@ -764,6 +762,11 @@ sub excel_initialize {
     $r->print("\n");
     $r->rflush();
     #
+    # Initialize progress window
+    %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
+        ($r,'Excel File Compilation Status',
+         'Excel File Compilation Progress', $studentcount);
+    #
     return;
 }
 
@@ -805,31 +808,8 @@ sub excel_outputstudent {
     $rows_output++; 
     $cols_output=0;
     #
-    # Time estimate
-    $num_students++;
-    if ($num_students % 10 == 0) {
-        my $time_est = (time - $start_time)/$num_students * 
-            (scalar(@Apache::lonstatistics::Students)-$num_students);
-        $time_est = int($time_est);
-        if (int ($time_est/60) > 0) {
-            my $min = int($time_est/60);
-            my $sec = $time_est % 60;
-            $time_est = $min.' minutes';
-            if ($sec > 1) {
-                $time_est.= ', '.$sec.' seconds';
-            } elsif ($sec > 0) {
-                $time_est.= ', '.$sec.' second';
-            }
-        } else {
-            $time_est .= ' seconds';
-        }
-        $r->print($num_students.' out of '.
-                  (scalar(@Apache::lonstatistics::Students)).
-                  " students processed.  ".
-                  $time_est." remain.  Elapsed: ".(time - $start_time).
-                  "
\n"); - $r->rflush(); - } + # Update the progress window + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); return; } @@ -843,14 +823,12 @@ sub excel_finish { # return if($c->aborted()); # + # Close the progress window + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + # # Tell the user where to get their excel file - $r->print('

'. + $r->print('
'. 'Your Excel spreadsheet.'."\n"); - my $total_time = time - $start_time; - if (int ($total_time / 60) > 0) { - $total_time = int($total_time/60).' minutes, '.($total_time % 60); - } - $r->print('
'.$total_time.' seconds total'); $r->rflush(); return; } @@ -875,18 +853,144 @@ sub excel_finish { ####################################################### { +my $outputfile; +my $filename; + +my %prog_state; # progress window state + sub csv_initialize{ my ($r) = @_; - $r->print("

Not implemented yet

"); + # + # Clean up + $filename = undef; + $outputfile = undef; + undef(%prog_state); + # + # Open a file + $filename = '/prtspool/'. + $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'. + time.'_'.rand(1000000000).'.csv'; + unless ($outputfile = Apache::File->new('>/home/httpd'.$filename)) { + $r->log_error("Couldn't open $filename for output $!"); + $r->print("Problems occured in writing the csv file. ". + "This error has been logged. ". + "Please alert your LON-CAPA administrator."); + $outputfile = undef; + } + # + # Datestamp + my $description = $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; + print $outputfile '"'.&Apache::loncommon::csv_translate($description).'",'. + '"'.&Apache::loncommon::csv_translate(scalar(localtime(time))).'"'. + "\n"; + + # + # Print out the headings + my $Str = ''; + my $Str2 = undef; + foreach my $field (&get_student_fields_to_show()) { + if ($show eq 'scores') { + $Str .= '"'.&Apache::loncommon::csv_translate($field).'",'; + } elsif ($show eq 'totals') { + $Str .= '"",'; # first row empty on the student fields + $Str2 .= '"'.&Apache::loncommon::csv_translate($field).'",'; + } elsif ($show eq 'all') { + $Str .= '"'.&Apache::loncommon::csv_translate($field).'",'; + } + } + foreach my $seq (&get_sequences_to_show) { + if ($show eq 'scores') { + $Str .= '"'.&Apache::loncommon::csv_translate($seq->{'title'}). + '",'; + } elsif ($show eq 'totals') { + $Str .= '"'.&Apache::loncommon::csv_translate($seq->{'title'}). + '","",'; + $Str2 .= '"score","total possible",'; + } elsif ($show eq 'all') { + $Str .= '"'.&Apache::loncommon::csv_translate($seq->{'title'}). + '",'; + $Str .= '"",'x($seq->{'num_assess_parts'}-1); + $Str .= '"score","total possible",'; + } + } + chop($Str); + $Str .= "\n"; + print $outputfile $Str; + if (defined($Str2)) { + chop($Str2); + $Str2 .= "\n"; + print $outputfile $Str2; + } + # + # Initialize progress window + my $studentcount = scalar(@Apache::lonstatistics::Students); + %prog_state=&Apache::lonhtmlcommon::Create_PrgWin + ($r,'CSV File Compilation Status', + 'CSV File Compilation Progress', $studentcount); return; } sub csv_outputstudent { my ($r,$student) = @_; + return if (! defined($outputfile)); + my $Str = ''; + # + # Output student fields + my @to_show = &get_student_fields_to_show(); + foreach my $field (@to_show) { + $Str .= '"'.&Apache::loncommon::csv_translate($student->{$field}).'",'; + } + # + # Get student assessment data + my %StudentsData; + my @tmp = &Apache::loncoursedata::get_current_state($student->{'username'}, + $student->{'domain'}, + undef, + $ENV{'request.course.id'}); + if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) { + %StudentsData = @tmp; + } + # + # Output performance data + foreach my $seq (&get_sequences_to_show) { + my ($performance,$score,$seq_max) = + &StudentPerformanceOnSequence($student,\%StudentsData, + $seq,'no'); + if ($show eq 'scores') { + $Str .= '"'.$score.'",'; + } elsif ($show eq 'totals') { + $Str .= '"'.$score.'","'.$seq_max.'",'; + } elsif ($show eq 'all') { + $Str .= '"'.join('","',(split(//,$performance),$score,$seq_max)). + '",'; + } + } + chop($Str); + $Str .= "\n"; + print $outputfile $Str; + # + # Update the progress window + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); + return; } sub csv_finish { my ($r) = @_; + return if (! defined($outputfile)); + close($outputfile); + # + my $c = $r->connection(); + return if ($c->aborted()); + # + # Close the progress window + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + # + # Tell the user where to get their csv file + $r->print('
'. + 'Your csv file.'."\n"); + $r->rflush(); + return; + } }