Diff for /loncom/interface/statistics/lonstudentassessment.pm between versions 1.120 and 1.127

version 1.120, 2005/03/21 19:47:54 version 1.127, 2006/01/22 21:11:59
Line 153  sub BuildStudentAssessmentPage { Line 153  sub BuildStudentAssessmentPage {
     &Apache::lonstatistics::PrepareClasslist();      &Apache::lonstatistics::PrepareClasslist();
     #      #
     $single_student_mode = 0;      $single_student_mode = 0;
     $single_student_mode = 1 if ($ENV{'form.SelectedStudent'});      $single_student_mode = 1 if ($env{'form.SelectedStudent'});
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['selectstudent']);                                              ['selectstudent']);
     if ($ENV{'form.selectstudent'}) {      if ($env{'form.selectstudent'}) {
         &Apache::lonstatistics::DisplayClasslist($r);          &Apache::lonstatistics::DisplayClasslist($r);
         return;          return;
     }      }
Line 167  sub BuildStudentAssessmentPage { Line 167  sub BuildStudentAssessmentPage {
     $r->print(&CreateInterface());      $r->print(&CreateInterface());
     $r->print('<input type="hidden" name="notfirstrun" value="true" />');      $r->print('<input type="hidden" name="notfirstrun" value="true" />');
     $r->print('<input type="hidden" name="sort" value="'.      $r->print('<input type="hidden" name="sort" value="'.
               $ENV{'form.sort'}.'" />');                $env{'form.sort'}.'" />');
     $r->rflush();      $r->rflush();
     #      #
     if (! exists($ENV{'form.notfirstrun'}) && ! $single_student_mode) {      if (! exists($env{'form.notfirstrun'}) && ! $single_student_mode) {
         return;          return;
     }      }
     $r->print('<h4>'.      $r->print('<h4>'.
Line 234  sub BuildStudentAssessmentPage { Line 234  sub BuildStudentAssessmentPage {
 sub next_and_previous_buttons {  sub next_and_previous_buttons {
     my $Str = '';      my $Str = '';
     $Str .= '<input type="hidden" name="SelectedStudent" value="'.      $Str .= '<input type="hidden" name="SelectedStudent" value="'.
         $ENV{'form.SelectedStudent'}.'" />';          $env{'form.SelectedStudent'}.'" />';
     #      #
     # Build the previous student link      # Build the previous student link
     my $previous = &Apache::lonstatistics::previous_student();      my $previous = &Apache::lonstatistics::previous_student();
Line 430  sub CreateAndParseOutputSelector { Line 430  sub CreateAndParseOutputSelector {
                                             [$elementname]);                                              [$elementname]);
     #      #
     # Format for output options is 'mode, restrictions';      # Format for output options is 'mode, restrictions';
     my $selected = 'html, without links';      my $selected = (&Apache::loncommon::get_env_multiple('form.'.$elementname))[0];
     if (exists($ENV{'form.'.$elementname})) {      $selected = 'html, without links' if (!$selected);
         if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) {  
             $selected = $ENV{'form.'.$elementname}->[0];  
         } else {  
             $selected = $ENV{'form.'.$elementname};  
         }  
     }  
     #      #
     # Set package variables describing output mode      # Set package variables describing output mode
     $show_links  = 'no';      $show_links  = 'no';
Line 551  sub CreateAndParseOutputDataSelector { Line 546  sub CreateAndParseOutputDataSelector {
     my $Str = '';      my $Str = '';
     my $elementname = 'chartoutputdata';      my $elementname = 'chartoutputdata';
     #      #
     my $selected = 'scores';      my $selected = (&Apache::loncommon::get_env_multiple('form.'.$elementname))[0];
     if (exists($ENV{'form.'.$elementname})) {      $selected = 'scores' if (!$selected);
         if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) {  
             $selected = $ENV{'form.'.$elementname}->[0];  
         } else {  
             $selected = $ENV{'form.'.$elementname};  
         }  
     }  
     #      #
     $chosen_output = $OutputDataOptions[0];      $chosen_output = $OutputDataOptions[0];
     foreach my $option (@OutputDataOptions) {      foreach my $option (@OutputDataOptions) {
Line 632  Return a line of the chart for a student Line 622  Return a line of the chart for a student
     my @sequences;      my @sequences;
     my $navmap; # Have to keep this around since weakref is a bit zealous      my $navmap; # Have to keep this around since weakref is a bit zealous
   
   sub html_cleanup {
       undef(%prog_state);
       undef(%width);
       #
       undef($navmap);
       undef(@sequences);
   }
   
 sub html_initialize {  sub html_initialize {
     my ($r) = @_;      my ($r) = @_;
     #      #
     $padding = ' 'x3;      $padding = ' 'x3;
     $count = 0;      $count = 0;
     $nodata_count = 0;      $nodata_count = 0;
     undef(%prog_state);      &html_cleanup();
     undef(%width);  
     #  
     undef($navmap);  
     undef(@sequences);  
     ($navmap,@sequences) =       ($navmap,@sequences) = 
         &Apache::lonstatistics::selected_sequences_with_assessments();          &Apache::lonstatistics::selected_sequences_with_assessments();
     if (! ref($navmap)) {      if (! ref($navmap)) {
Line 652  sub html_initialize { Line 646  sub html_initialize {
                   '</h3>');                    '</h3>');
     }      }
     #      #
     $r->print("<h3>".$ENV{'course.'.$ENV{'request.course.id'}.'.description'}.      $r->print("<h3>".$env{'course.'.$env{'request.course.id'}.'.description'}.
               "&nbsp;&nbsp;".localtime(time)."</h3>");                "&nbsp;&nbsp;".localtime(time)."</h3>");
     #      #
     if ($chosen_output->{'base'} !~ /^final table/) {      if ($chosen_output->{'base'} !~ /^final table/) {
Line 720  sub html_initialize { Line 714  sub html_initialize {
     $Str .= "<pre>";      $Str .= "<pre>";
     $r->print($Str);      $r->print($Str);
     $r->rflush();      $r->rflush();
       #
       # Let the user know what we are doing
       my $studentcount = scalar(@Apache::lonstatistics::Students); 
       if ($env{'form.SelectedStudent'}) {
           $studentcount = '1';
       }
       #
       # Initialize progress window
       %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
           ($r,'HTML Chart Status',
            'HTML Chart Progress', $studentcount,
            'inline',undef,'Statistics','stats_status');
       #
       &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,
                                             'Processing first student');
     return;      return;
 }  }
   
Line 747  sub html_outputstudent { Line 756  sub html_outputstudent {
     my %StudentsData;      my %StudentsData;
     my @tmp = &Apache::loncoursedata::get_current_state      my @tmp = &Apache::loncoursedata::get_current_state
         ($student->{'username'},$student->{'domain'},undef,          ($student->{'username'},$student->{'domain'},undef,
          $ENV{'request.course.id'});           $env{'request.course.id'});
     if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {      if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {
         %StudentsData = @tmp;          %StudentsData = @tmp;
     }      }
Line 832  sub html_outputstudent { Line 841  sub html_outputstudent {
     $r->print($Str);      $r->print($Str);
     #      #
     $r->rflush();      $r->rflush();
       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
     return;      return;
 }      }    
   
Line 849  sub html_finish { Line 859  sub html_finish {
         }          }
     }      }
     $r->rflush();      $r->rflush();
     undef($navmap);      &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
       &html_cleanup();
     return;      return;
 }  }
   
Line 956  my %formula_data; Line 967  my %formula_data;
 my $navmap;  my $navmap;
 my @sequences;  my @sequences;
   
 sub excel_initialize {  sub excel_cleanup {
     my ($r) = @_;  
     #      #
     undef ($excel_sheet);      undef ($excel_sheet);
     undef ($excel_workbook);      undef ($excel_workbook);
Line 973  sub excel_initialize { Line 983  sub excel_initialize {
     #      #
     undef($navmap);      undef($navmap);
     undef(@sequences);      undef(@sequences);
   }
   
   sub excel_initialize {
       my ($r) = @_;
   
       &excel_cleanup();
     ($navmap,@sequences) =       ($navmap,@sequences) = 
         &Apache::lonstatistics::selected_sequences_with_assessments();          &Apache::lonstatistics::selected_sequences_with_assessments();
     if (! ref($navmap)) {      if (! ref($navmap)) {
Line 1039  sub excel_initialize { Line 1055  sub excel_initialize {
     return if (! defined($excel_workbook));      return if (! defined($excel_workbook));
     #      #
     # Add a worksheet      # Add a worksheet
     my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};      my $sheetname = $env{'course.'.$env{'request.course.id'}.'.description'};
     $sheetname = &Apache::loncommon::clean_excel_name($sheetname);      $sheetname = &Apache::loncommon::clean_excel_name($sheetname);
     $excel_sheet = $excel_workbook->addworksheet($sheetname);      $excel_sheet = $excel_workbook->addworksheet($sheetname);
     #      #
     # Put the course description in the header      # Put the course description in the header
     $excel_sheet->write($header_row,$cols_output++,      $excel_sheet->write($header_row,$cols_output++,
                    $ENV{'course.'.$ENV{'request.course.id'}.'.description'},                     $env{'course.'.$env{'request.course.id'}.'.description'},
                         $format->{'h1'});                          $format->{'h1'});
     $cols_output += 3;      $cols_output += 3;
     #      #
Line 1053  sub excel_initialize { Line 1069  sub excel_initialize {
     my $sectionstring = '';      my $sectionstring = '';
     my @Sections = &Apache::lonstatistics::get_selected_sections();      my @Sections = &Apache::lonstatistics::get_selected_sections();
     $excel_sheet->write($header_row,$cols_output++,      $excel_sheet->write($header_row,$cols_output++,
                         &Apache::lonstatistics::section_and_enrollment_description('plain text'),                          &Apache::lonstatistics::section_and_enrollment_description('plaintext'),
                         $format->{'h3'});                          $format->{'h3'});
     #      #
     # Put the date in there too      # Put the date in there too
Line 1128  sub excel_initialize { Line 1144  sub excel_initialize {
             ! defined($formula_data{$symb}->{'Excel:endcell'})) {              ! defined($formula_data{$symb}->{'Excel:endcell'})) {
             $formula_data{$symb}->{'Excel:endcell'} = $formula_data{$symb}->{'Excel:startcell'};              $formula_data{$symb}->{'Excel:endcell'} = $formula_data{$symb}->{'Excel:startcell'};
         }          }
           # =IF(COUNT(B31:L31);SUM(B31:L31);"")
           my $start = $formula_data{$symb}->{'Excel:startcell'};
           my $end = $formula_data{$symb}->{'Excel:endcell'};
         $formula_data{$symb}->{'Excel:sum'}= $excel_sheet->store_formula          $formula_data{$symb}->{'Excel:sum'}= $excel_sheet->store_formula
             ('=SUM('.$formula_data{$symb}->{'Excel:startcell'}.              ("=IF(COUNT($start\:$end),SUM($start\:$end),\"\")");
              ':'.$formula_data{$symb}->{'Excel:endcell'}.')');  
         # Determine cell the score is held in          # Determine cell the score is held in
         $formula_data{$symb}->{'Excel:scorecell'} =           $formula_data{$symb}->{'Excel:scorecell'} = 
             &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell              &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
Line 1239  sub excel_initialize { Line 1257  sub excel_initialize {
      &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell($maximum_data_row,$formula_data{$symb}->{'Excel:endcol'}));       &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell($maximum_data_row,$formula_data{$symb}->{'Excel:endcol'}));
                 $excel_sheet->repeat_formula($maximum_data_row,$cols_output++,                  $excel_sheet->repeat_formula($maximum_data_row,$cols_output++,
                                              $formula_data{$symb}->{'Excel:sum'},undef,                                               $formula_data{$symb}->{'Excel:sum'},undef,
      %replaceCells);       %replaceCells, %replaceCells);
   
             } elsif ($chosen_output->{'sequence_sum'}) {              } elsif ($chosen_output->{'sequence_sum'}) {
                 $excel_sheet->write($maximum_data_row,$cols_output++,$max);                  $excel_sheet->write($maximum_data_row,$cols_output++,$max);
Line 1314  sub excel_initialize { Line 1332  sub excel_initialize {
     #      #
     # Let the user know what we are doing      # Let the user know what we are doing
     my $studentcount = scalar(@Apache::lonstatistics::Students);       my $studentcount = scalar(@Apache::lonstatistics::Students); 
     if ($ENV{'form.SelectedStudent'}) {      if ($env{'form.SelectedStudent'}) {
         $studentcount = '1';          $studentcount = '1';
     }      }
     if ($studentcount > 1) {      if ($studentcount > 1) {
Line 1361  sub excel_outputstudent { Line 1379  sub excel_outputstudent {
     my @tmp = &Apache::loncoursedata::get_current_state($student->{'username'},      my @tmp = &Apache::loncoursedata::get_current_state($student->{'username'},
                                                         $student->{'domain'},                                                          $student->{'domain'},
                                                         undef,                                                          undef,
                                                    $ENV{'request.course.id'});                                                     $env{'request.course.id'});
     if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {      if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {
         %StudentsData = @tmp;          %StudentsData = @tmp;
     }      }
Line 1395  sub excel_outputstudent { Line 1413  sub excel_outputstudent {
             if ($chosen_output->{'correct'}) {              if ($chosen_output->{'correct'}) {
                 # only indiciate if each item is correct or not                  # only indiciate if each item is correct or not
                 foreach my $value (@$rawdata) {                  foreach my $value (@$rawdata) {
                     # nonzero means correct                      # positive means correct, 0 or negative means
                     $value = 1 if ($value > 0);                      # incorrect
                       $value = $value > 0 ? 1 : 0;
                     $excel_sheet->write($rows_output,$cols_output++,$value);                      $excel_sheet->write($rows_output,$cols_output++,$value);
                 }                  }
             } else {              } else {
Line 1422  sub excel_outputstudent { Line 1441  sub excel_outputstudent {
             # The undef is for the format                  # The undef is for the format    
     $excel_sheet->repeat_formula($rows_output,$cols_output++,      $excel_sheet->repeat_formula($rows_output,$cols_output++,
  $formula_data{$symb}->{'Excel:sum'},undef,   $formula_data{$symb}->{'Excel:sum'},undef,
  %replaceCells);   %replaceCells, %replaceCells);
         } elsif ($chosen_output->{'sequence_sum'}) {          } elsif ($chosen_output->{'sequence_sum'}) {
             if ($score eq ' ') {              if ($score eq ' ') {
                 $cols_output++;                  $cols_output++;
Line 1458  sub excel_outputstudent { Line 1477  sub excel_outputstudent {
 sub excel_finish {  sub excel_finish {
     my ($r) = @_;      my ($r) = @_;
     if ($request_aborted || ! defined($navmap) || ! defined($excel_sheet)) {      if ($request_aborted || ! defined($navmap) || ! defined($excel_sheet)) {
    &excel_cleanup();
         return;          return;
     }      }
     #      #
     # Write the excel file      # Write the excel file
     $excel_workbook->close();      $excel_workbook->close();
     my $c = $r->connection();  
     #  
     return if($c->aborted());  
     #      #
     # Close the progress window      # Close the progress window
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
Line 1474  sub excel_finish { Line 1491  sub excel_finish {
     $r->print('<br />'.      $r->print('<br />'.
               '<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\n");                '<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\n");
     $r->rflush();      $r->rflush();
       &excel_cleanup();
     return;      return;
 }  }
   
Line 1504  my %prog_state; # progress window state Line 1522  my %prog_state; # progress window state
 my $navmap;  my $navmap;
 my @sequences;  my @sequences;
   
 sub csv_initialize{  sub csv_cleanup {
     my ($r) = @_;  
     #   
     # Clean up  
     undef($outputfile);      undef($outputfile);
     undef($filename);      undef($filename);
     undef($request_aborted);      undef($request_aborted);
Line 1515  sub csv_initialize{ Line 1530  sub csv_initialize{
     #      #
     undef($navmap);      undef($navmap);
     undef(@sequences);      undef(@sequences);
   }
   
   sub csv_initialize{
       my ($r) = @_;
   
       &csv_cleanup();
     ($navmap,@sequences) =       ($navmap,@sequences) = 
         &Apache::lonstatistics::selected_sequences_with_assessments();          &Apache::lonstatistics::selected_sequences_with_assessments();
     if (! ref($navmap)) {      if (! ref($navmap)) {
Line 1549  END Line 1570  END
     if (! defined($outputfile)) { return ''; }      if (! defined($outputfile)) { return ''; }
     #      #
     # Datestamp      # Datestamp
     my $description = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};      my $description = $env{'course.'.$env{'request.course.id'}.'.description'};
     print $outputfile '"'.&Apache::loncommon::csv_translate($description).'",'.      print $outputfile '"'.&Apache::loncommon::csv_translate($description).'",'.
         '"'.&Apache::loncommon::csv_translate(scalar(localtime(time))).'"'.          '"'.&Apache::loncommon::csv_translate(scalar(localtime(time))).'"'.
             "\n";              "\n";
Line 1639  sub csv_outputstudent { Line 1660  sub csv_outputstudent {
     my @tmp = &Apache::loncoursedata::get_current_state($student->{'username'},      my @tmp = &Apache::loncoursedata::get_current_state($student->{'username'},
                                                         $student->{'domain'},                                                          $student->{'domain'},
                                                         undef,                                                          undef,
                                                    $ENV{'request.course.id'});                                                     $env{'request.course.id'});
     if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {      if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {
         %StudentsData = @tmp;          %StudentsData = @tmp;
     }      }
Line 1700  sub csv_outputstudent { Line 1721  sub csv_outputstudent {
 sub csv_finish {  sub csv_finish {
     my ($r) = @_;      my ($r) = @_;
     if ($request_aborted || ! defined($navmap) || ! defined($outputfile)) {      if ($request_aborted || ! defined($navmap) || ! defined($outputfile)) {
    &csv_cleanup();
         return;          return;
     }      }
     close($outputfile);      close($outputfile);
     #      #
     my $c = $r->connection();  
     return if ($c->aborted());  
     #  
     # Close the progress window      # Close the progress window
     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
     #      #
Line 1714  sub csv_finish { Line 1733  sub csv_finish {
     $r->print('<br />'.      $r->print('<br />'.
               '<a href="'.$filename.'">'.&mt('Your csv file.').'</a>'."\n");                '<a href="'.$filename.'">'.&mt('Your csv file.').'</a>'."\n");
     $r->rflush();      $r->rflush();
       &csv_cleanup();
     return;      return;
           
 }  }
Line 1807  sub student_tries_on_sequence { Line 1827  sub student_tries_on_sequence {
                 } elsif ($status eq 'incorrect_by_override') {                  } elsif ($status eq 'incorrect_by_override') {
                     $symbol = '-';                      $symbol = '-';
                 } elsif ($status eq 'ungraded_attempted') {                  } elsif ($status eq 'ungraded_attempted') {
                     $symbol = '#';                      $symbol = 'u';
                 } elsif ($status eq 'incorrect_attempted' ||                  } elsif ($status eq 'incorrect_attempted' ||
                          $tries > 0)  {                           $tries > 0)  {
                     $symbol = '.';                      $symbol = '.';
Line 1924  sub student_performance_on_sequence { Line 1944  sub student_performance_on_sequence {
             if (length($symbol) > 1) {              if (length($symbol) > 1) {
                 $symbol = '*';                  $symbol = '*';
             }              }
             if (exists($resource_data->{'resource.'.$part.'.solved'})) {              if (exists($resource_data->{'resource.'.$part.'.solved'}) &&
                   $resource_data->{'resource.'.$part.'.solved'} ne '') {
                 my $status = $resource_data->{'resource.'.$part.'.solved'};                  my $status = $resource_data->{'resource.'.$part.'.solved'};
                 if ($status eq 'excused') {                  if ($status eq 'excused') {
                     $symbol = 'x';                      $symbol = 'x';
                     $max -= $weight; # Do not count 'excused' problems.                      $max -= $weight; # Do not count 'excused' problems.
                   } elsif ($status eq 'ungraded_attempted') {
                       $symbol = 'u';
                 }                  }
                 $hasdata = 1;                  $hasdata = 1;
               } elsif ($resource_data->{'resource.'.$part.'.award'} eq 'DRAFT') {
                   $symbol = 'd';
                   $hasdata = 1;
             } elsif (!exists($resource_data->{'resource.'.$part.'.awarded'})){              } elsif (!exists($resource_data->{'resource.'.$part.'.awarded'})){
                 # Unsolved.  Did they try?                  # Unsolved.  Did they try?
                 if (exists($resource_data->{'resource.'.$part.'.tries'})){                  if (exists($resource_data->{'resource.'.$part.'.tries'})){
Line 1979  problems. Line 2005  problems.
 #######################################################  #######################################################
 sub CreateLegend {  sub CreateLegend {
     my $Str = "<p><pre>".      my $Str = "<p><pre>".
               "   1  correct by student in 1 try\n".                " digit score or number of tries to get correct ".
               "   7  correct by student in 7 tries\n".  
               "   *  correct by student in more than 9 tries\n".                "   *  correct by student in more than 9 tries\n".
       "   +  correct by hand grading or override\n".        "   +  correct by hand grading or override\n".
               "   -  incorrect by override\n".                "   -  incorrect by override\n".
       "   .  incorrect attempted\n".        "   .  incorrect attempted\n".
       "   #  ungraded attempted\n".        "   u  ungraded attempted\n".
                 "   d  draft answer saved but not submitted\n".
               "      not attempted (blank field)\n".                "      not attempted (blank field)\n".
       "   x  excused".        "   x  excused".
               "</pre><p>";                "</pre><p>";

Removed from v.1.120  
changed lines
  Added in v.1.127


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>