--- loncom/interface/statistics/lonstudentassessment.pm 2005/04/08 13:44:43 1.123 +++ loncom/interface/statistics/lonstudentassessment.pm 2006/01/29 19:39:03 1.129 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstudentassessment.pm,v 1.123 2005/04/08 13:44:43 albertel Exp $ +# $Id: lonstudentassessment.pm,v 1.129 2006/01/29 19:39:03 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -472,6 +472,7 @@ my @OutputDataOptions = grand_maximum => 1, summary_table => 1, maximum_row => 1, + ignore_weight => 0, shortdesc => 'Total Score and Maximum Possible for each '. 'Sequence or Folder', longdesc => 'The score of each student as well as the '. @@ -490,6 +491,7 @@ my @OutputDataOptions = grand_maximum => 1, summary_table => 1, maximum_row => 1, + ignore_weight => 0, shortdesc => 'Score on each Problem Part', longdesc =>'The students score on each problem part, computed as'. 'the part weight * part awarded', @@ -507,6 +509,7 @@ my @OutputDataOptions = grand_maximum => 0, summary_table => 0, maximum_row => 0, + ignore_weight => 0, shortdesc => 'Number of Tries before success on each Problem Part', longdesc =>'The number of tries before success on each problem part.', non_html_notes => 'negative values indicate an incorrect problem', @@ -524,6 +527,7 @@ my @OutputDataOptions = grand_maximum => 1, summary_table => 1, maximum_row => 0, + ignore_weight => 1, shortdesc => 'Number of Problem Parts completed successfully.', longdesc => 'The Number of Problem Parts completed successfully and '. 'the maximum possible for each student', @@ -622,17 +626,21 @@ Return a line of the chart for a student my @sequences; 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 { my ($r) = @_; # $padding = ' 'x3; $count = 0; $nodata_count = 0; - undef(%prog_state); - undef(%width); - # - undef($navmap); - undef(@sequences); + &html_cleanup(); ($navmap,@sequences) = &Apache::lonstatistics::selected_sequences_with_assessments(); if (! ref($navmap)) { @@ -777,7 +785,8 @@ sub html_outputstudent { } else { ($performance,$performance_length,$score,$seq_max,$rawdata) = &student_performance_on_sequence($student,\%StudentsData, - $navmap,$seq,$show_links); + $navmap,$seq,$show_links, + $chosen_output->{ignore_weight}); } my $ratio=''; if ($chosen_output->{'every_problem'} && @@ -856,7 +865,7 @@ sub html_finish { } $r->rflush(); &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - undef($navmap); + &html_cleanup(); return; } @@ -963,8 +972,7 @@ my %formula_data; my $navmap; my @sequences; -sub excel_initialize { - my ($r) = @_; +sub excel_cleanup { # undef ($excel_sheet); undef ($excel_workbook); @@ -980,6 +988,12 @@ sub excel_initialize { # undef($navmap); undef(@sequences); +} + +sub excel_initialize { + my ($r) = @_; + + &excel_cleanup(); ($navmap,@sequences) = &Apache::lonstatistics::selected_sequences_with_assessments(); if (! ref($navmap)) { @@ -1060,7 +1074,7 @@ sub excel_initialize { my $sectionstring = ''; my @Sections = &Apache::lonstatistics::get_selected_sections(); $excel_sheet->write($header_row,$cols_output++, - &Apache::lonstatistics::section_and_enrollment_description('plain text'), + &Apache::lonstatistics::section_and_enrollment_description('plaintext'), $format->{'h3'}); # # Put the date in there too @@ -1135,9 +1149,11 @@ sub excel_initialize { ! defined($formula_data{$symb}->{'Excel:endcell'})) { $formula_data{$symb}->{'Excel:endcell'} = $formula_data{$symb}->{'Excel:startcell'}; } + + my $start = $formula_data{$symb}->{'Excel:startcell'}; + my $end = $formula_data{$symb}->{'Excel:endcell'}; $formula_data{$symb}->{'Excel:sum'}= $excel_sheet->store_formula - ('=SUM('.$formula_data{$symb}->{'Excel:startcell'}. - ':'.$formula_data{$symb}->{'Excel:endcell'}.')'); + ("=IF(COUNT($start\:$end),SUM($start\:$end),\"\")"); # Determine cell the score is held in $formula_data{$symb}->{'Excel:scorecell'} = &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell @@ -1222,7 +1238,7 @@ sub excel_initialize { $weight = 1; if ($chosen_output->{'scores'}) { $weight = &Apache::lonnet::EXT - ('resource.'.$part.'.weight',$resource->{'symb'}, + ('resource.'.$part.'.weight',$resource->symb, undef,undef,undef); if (!defined($weight) || ($weight eq '')) { $weight=1; @@ -1246,7 +1262,7 @@ sub excel_initialize { &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell($maximum_data_row,$formula_data{$symb}->{'Excel:endcol'})); $excel_sheet->repeat_formula($maximum_data_row,$cols_output++, $formula_data{$symb}->{'Excel:sum'},undef, - %replaceCells); + %replaceCells, %replaceCells); } elsif ($chosen_output->{'sequence_sum'}) { $excel_sheet->write($maximum_data_row,$cols_output++,$max); @@ -1396,14 +1412,16 @@ sub excel_outputstudent { } else { ($performance,$performance_length,$score,$seq_max,$rawdata) = &student_performance_on_sequence($student,\%StudentsData, - $navmap,$seq,'no'); + $navmap,$seq,'no', + $chosen_output->{ignore_weight}); } if ($chosen_output->{'every_problem'}) { if ($chosen_output->{'correct'}) { # only indiciate if each item is correct or not foreach my $value (@$rawdata) { - # nonzero means correct - $value = 1 if ($value > 0); + # positive means correct, 0 or negative means + # incorrect + $value = $value > 0 ? 1 : 0; $excel_sheet->write($rows_output,$cols_output++,$value); } } else { @@ -1429,7 +1447,7 @@ sub excel_outputstudent { # The undef is for the format $excel_sheet->repeat_formula($rows_output,$cols_output++, $formula_data{$symb}->{'Excel:sum'},undef, - %replaceCells); + %replaceCells, %replaceCells); } elsif ($chosen_output->{'sequence_sum'}) { if ($score eq ' ') { $cols_output++; @@ -1465,14 +1483,12 @@ sub excel_outputstudent { sub excel_finish { my ($r) = @_; if ($request_aborted || ! defined($navmap) || ! defined($excel_sheet)) { + &excel_cleanup(); return; } # # Write the excel file $excel_workbook->close(); - my $c = $r->connection(); - # - return if($c->aborted()); # # Close the progress window &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); @@ -1481,6 +1497,7 @@ sub excel_finish { $r->print('
'. 'Your Excel spreadsheet.'."\n"); $r->rflush(); + &excel_cleanup(); return; } @@ -1511,10 +1528,7 @@ my %prog_state; # progress window state my $navmap; my @sequences; -sub csv_initialize{ - my ($r) = @_; - # - # Clean up +sub csv_cleanup { undef($outputfile); undef($filename); undef($request_aborted); @@ -1522,6 +1536,12 @@ sub csv_initialize{ # undef($navmap); undef(@sequences); +} + +sub csv_initialize{ + my ($r) = @_; + + &csv_cleanup(); ($navmap,@sequences) = &Apache::lonstatistics::selected_sequences_with_assessments(); if (! ref($navmap)) { @@ -1663,7 +1683,8 @@ sub csv_outputstudent { } else { ($performance,$performance_length,$score,$seq_max,$rawdata) = &student_performance_on_sequence($student,\%StudentsData, - $navmap,$seq,'no'); + $navmap,$seq,'no', + $chosen_output->{ignore_weight}); } if ($chosen_output->{'every_problem'}) { if ($chosen_output->{'correct'}) { @@ -1707,13 +1728,11 @@ sub csv_outputstudent { sub csv_finish { my ($r) = @_; if ($request_aborted || ! defined($navmap) || ! defined($outputfile)) { + &csv_cleanup(); return; } close($outputfile); # - my $c = $r->connection(); - return if ($c->aborted()); - # # Close the progress window &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); # @@ -1721,6 +1740,7 @@ sub csv_finish { $r->print('
'. ''.&mt('Your csv file.').''."\n"); $r->rflush(); + &csv_cleanup(); return; } @@ -1814,7 +1834,7 @@ sub student_tries_on_sequence { } elsif ($status eq 'incorrect_by_override') { $symbol = '-'; } elsif ($status eq 'ungraded_attempted') { - $symbol = '#'; + $symbol = 'u'; } elsif ($status eq 'incorrect_attempted' || $tries > 0) { $symbol = '.'; @@ -1885,7 +1905,7 @@ Inputs: ####################################################### ####################################################### sub student_performance_on_sequence { - my ($student,$studentdata,$navmap,$seq,$links) = @_; + my ($student,$studentdata,$navmap,$seq,$links,$awarded_only) = @_; $links = 'no' if (! defined($links)); my $Str = ''; # final result string my ($score,$max) = (0,0); @@ -1899,11 +1919,14 @@ sub student_performance_on_sequence { my $resource_data = $studentdata->{$symb}; foreach my $part (@{$resource->parts()}) { $partscore = undef; - my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight', - $symb, - $student->{'domain'}, - $student->{'username'}, - $student->{'section'}); + my $weight; + if (!$awarded_only){ + $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight', + $symb, + $student->{'domain'}, + $student->{'username'}, + $student->{'section'}); + } if (!defined($weight) || ($weight eq '')) { $weight=1; } @@ -1931,13 +1954,19 @@ sub student_performance_on_sequence { if (length($symbol) > 1) { $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'}; if ($status eq 'excused') { $symbol = 'x'; $max -= $weight; # Do not count 'excused' problems. + } elsif ($status eq 'ungraded_attempted') { + $symbol = 'u'; } $hasdata = 1; + } elsif ($resource_data->{'resource.'.$part.'.award'} eq 'DRAFT') { + $symbol = 'd'; + $hasdata = 1; } elsif (!exists($resource_data->{'resource.'.$part.'.awarded'})){ # Unsolved. Did they try? if (exists($resource_data->{'resource.'.$part.'.tries'})){ @@ -1986,13 +2015,13 @@ problems. ####################################################### sub CreateLegend { my $Str = "

".
-              "   1  correct by student in 1 try\n".
-              "   7  correct by student in 7 tries\n".
+              " digit score or number of tries to get correct ".
               "   *  correct by student in more than 9 tries\n".
 	      "   +  correct by hand grading or override\n".
               "   -  incorrect by override\n".
 	      "   .  incorrect attempted\n".
-	      "   #  ungraded attempted\n".
+	      "   u  ungraded attempted\n".
+              "   d  draft answer saved but not submitted\n".
               "      not attempted (blank field)\n".
 	      "   x  excused".
               "

";