--- loncom/interface/statistics/lonstudentassessment.pm 2004/02/12 21:15:47 1.90 +++ loncom/interface/statistics/lonstudentassessment.pm 2004/04/01 18:49:39 1.100 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstudentassessment.pm,v 1.90 2004/02/12 21:15:47 matthew Exp $ +# $Id: lonstudentassessment.pm,v 1.100 2004/04/01 18:49:39 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -153,6 +153,8 @@ sub BuildStudentAssessmentPage { # $single_student_mode = 0; $single_student_mode = 1 if ($ENV{'form.SelectedStudent'}); + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['selectstudent']); if ($ENV{'form.selectstudent'}) { &Apache::lonstatistics::DisplayClasslist($r); return; @@ -306,6 +308,7 @@ the chart page. ####################################################### sub CreateInterface { my $Str = ''; + $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,'Chart'); # $Str .= &CreateLegend(); $Str .= ''."\n"; $Str .= ''; @@ -401,7 +404,7 @@ my @OutputOptions = }, { name => 'CSV', value => 'csv', - description => 'Output a comma seperated values file suitable for '. + description => 'Output a comma separated values file suitable for '. 'import into a spreadsheet program. Using this method as opposed '. 'to Excel output allows you to organize your data before importing'. ' it into a spreadsheet program.', @@ -631,8 +634,12 @@ sub html_initialize { # Comptue column widths $sequence->{'width_sum'} = 0; if ($chosen_output->{'sequence_sum'}) { + if ($chosen_output->{'every_problem'}) { + # Use 1 digit for a space + $sequence->{'width_sum'} += 1; + } # Use 3 digits for the sum - $sequence->{'width_sum'} = 3; + $sequence->{'width_sum'} += 3; } if ($chosen_output->{'sequence_max'}) { if ($sequence->{'width_sum'}>0) { @@ -642,6 +649,7 @@ sub html_initialize { # Use 3 digits for the total $sequence->{'width_sum'}+=3; } + # if ($chosen_output->{'every_problem'}) { # one problem per digit $sequence->{'width_problem'} = $sequence->{'num_assess_parts'}; @@ -650,10 +658,8 @@ sub html_initialize { } $sequence->{'width_total'} = $sequence->{'width_problem'} + $sequence->{'width_sum'}; - if ($sequence->{'width_total'} < length($sequence->{'title'})) { - $sequence->{'width_total'} = length($sequence->{'title'}); - $sequence->{'width_problem'} = - $sequence->{'width_total'} - $sequence->{'width_sum'}; + if ($sequence->{'width_total'} < length(&HTML::Entities::decode($sequence->{'title'}))) { + $sequence->{'width_total'} = length(&HTML::Entities::decode($sequence->{'title'})); } # # Output the sequence titles @@ -715,20 +721,26 @@ sub html_outputstudent { $seq,$show_links); } my $ratio=''; - if ($chosen_output->{'sequence_sum'}) { - $ratio .= sprintf("%3d",$score); + if ($chosen_output->{'every_problem'}) { + $ratio .= ' '; + } + if ($chosen_output->{'sequence_sum'} && $score ne ' ') { + $ratio .= sprintf("%3.0f",$score); + } elsif($chosen_output->{'sequence_sum'}) { + $ratio .= ' 'x3; } if ($chosen_output->{'sequence_max'}) { if ($chosen_output->{'sequence_sum'}) { $ratio .= '/'; } - $ratio .= sprintf("%3d",$seq_max); + $ratio .= sprintf("%3.0f",$seq_max); } # if (! $chosen_output->{'every_problem'}) { $performance = ''; + $performance_length=0; } - $performance .= ' 'x($seq->{'width_problem'}-$performance_length). + $performance .= ' 'x($seq->{'width_total'}-$performance_length-$seq->{'width_sum'}). $ratio; # $Str .= $performance.$padding; @@ -738,15 +750,21 @@ sub html_outputstudent { } # # Total it up and store the statistics info. - my ($score,$max) = (0,0); + my ($score,$max); while (my ($symb,$seq_stats) = each (%{$studentstats})) { $Statistics->{$symb}->{'score'} += $seq_stats->{'score'}; if ($Statistics->{$symb}->{'max'} < $seq_stats->{'max'}) { $Statistics->{$symb}->{'max'} = $seq_stats->{'max'}; } - $score += $seq_stats->{'score'}; + if ($seq_stats->{'score'} ne ' ') { + $score += $seq_stats->{'score'}; + $Statistics->{$symb}->{'num_students'}++; + } $max += $seq_stats->{'max'}; } + if (! defined($score)) { + $score = ' 'x3; + } $Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max; $Str .= " \n"; # @@ -774,37 +792,42 @@ sub html_finish { sub StudentAverageTotal { my $Str = "

Summary Tables

\n"; - my $num_students = scalar(@Apache::lonstatistics::Students); - my $total_ave = 0; - my $total_max = 0; +# my $max_students; +# my $total_ave = 0; +# my $total_max = 0; $Str .= '
'."\n"; $Str .= "\n"; foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { my $ave; - if ($num_students > $nodata_count) { - $ave = int(100*($Statistics->{$seq->{'symb'}}->{'score'}/ - ($num_students-$nodata_count)))/100; + my $num_students = $Statistics->{$seq->{'symb'}}->{'num_students'}; +# if ($num_students > $max_students) { +# $max_students = $num_students; +# } + if ($num_students > 0) { + $ave = int(100* + ($Statistics->{$seq->{'symb'}}->{'score'}/$num_students) + )/100; } else { $ave = 0; } - $total_ave += $ave; +# $total_ave += $ave; my $max = $Statistics->{$seq->{'symb'}}->{'max'}; - $total_max += $max; +# $total_max += $max; $ave = sprintf("%.2f",$ave); $Str .= ''. ''. ''."\n"; } - $total_ave = sprintf('%.2f',$total_ave); # only two digit - $Str .= "
TitleAverageMaximum
'.$seq->{'title'}.''.$ave.' '.$max.' '.'
\n"; - $Str .= ''."\n"; - $Str .= ''. - "\n"; - $Str .= ''. - ''. - ''. - ''; +# $total_ave = sprintf('%.2f',$total_ave); # only two digit $Str .= "
Number of StudentsAverageMaximum
'.($num_students-$nodata_count).''.$total_ave.' '.''.$total_max.' '.'
\n"; +# $Str .= ''."\n"; +# $Str .= ''. +# "\n"; +# $Str .= ''. +# ''. +# ''. +# ''; +# $Str .= "
Number of StudentsAverageMaximum
'.$max_students.''.$total_ave.' '.''.$total_max.' '.'
\n"; return $Str; } @@ -970,23 +993,13 @@ END # File::Temp is used to determine the temporary directory. $excel_workbook->set_tempdir($Apache::lonnet::tmpdir); # + my $format = &Apache::loncommon::define_excel_formats($excel_workbook); + # # Add a worksheet my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; $sheetname = &Apache::loncommon::clean_excel_name($sheetname); $excel_sheet = $excel_workbook->addworksheet($sheetname); # - # Define some potentially useful formats - my $format; - $format->{'header'} = $excel_workbook->add_format(bold => 1, - bottom => 1, - align => 'center'); - $format->{'bold'} = $excel_workbook->add_format(bold=>1); - $format->{'h1'} = $excel_workbook->add_format(bold=>1, size=>18); - $format->{'h2'} = $excel_workbook->add_format(bold=>1, size=>16); - $format->{'h3'} = $excel_workbook->add_format(bold=>1, size=>14); - $format->{'date'} = $excel_workbook->add_format(num_format=> - 'mmm d yyyy hh:mm AM/PM'); - # # Put the course description in the header $excel_sheet->write($header_row,$cols_output++, $ENV{'course.'.$ENV{'request.course.id'}.'.description'}, @@ -1320,7 +1333,12 @@ sub excel_outputstudent { } } else { foreach my $value (@$rawdata) { - $excel_sheet->write($rows_output,$cols_output++,$value); + if ($score eq ' ' || !defined($value)) { + $cols_output++; + } else { + $excel_sheet->write($rows_output,$cols_output++, + $value); + } } } } @@ -1345,7 +1363,11 @@ sub excel_outputstudent { %replaceCells); } } elsif ($chosen_output->{'sequence_sum'}) { - $excel_sheet->write($rows_output,$cols_output++,$score); + if ($score eq ' ') { + $cols_output++; + } else { + $excel_sheet->write($rows_output,$cols_output++,$score); + } } if ($chosen_output->{'sequence_max'}) { $excel_sheet->write($rows_output,$cols_output++,$seq_max); @@ -1595,7 +1617,7 @@ sub csv_finish { # # Tell the user where to get their csv file $r->print('
'. - 'Your csv file.'."\n"); + ''.&mt('Your csv file.').''."\n"); $r->rflush(); return; @@ -1636,6 +1658,7 @@ sub StudentTriesOnSequence { my $performance_length = 0; my @TriesData = (); my $tries; + my $hasdata = 0; # flag - true if the student has any data on the sequence foreach my $resource (@{$seq->{'contents'}}) { next if ($resource->{'type'} ne 'assessment'); my $resource_data = $studentdata->{$resource->{'symb'}}; @@ -1660,6 +1683,7 @@ sub StudentTriesOnSequence { my $tries = 0; if(exists($resource_data->{'resource.'.$partnum.'.tries'})) { $tries = $resource_data->{'resource.'.$partnum.'.tries'}; + $hasdata =1; } # if ($awarded > 0) { @@ -1722,6 +1746,9 @@ sub StudentTriesOnSequence { if ($seq->{'randompick'}) { $max = $seq->{'randompick'}; } + if (! $hasdata && $sum == 0) { + $sum = ' '; + } return ($Str,$performance_length,$sum,$max,\@TriesData); } @@ -1759,6 +1786,7 @@ sub StudentPerformanceOnSequence { my $symbol; my @ScoreData = (); my $partscore; + my $hasdata = 0; # flag, 0 if there were no submissions on the sequence foreach my $resource (@{$seq->{'contents'}}) { next if ($resource->{'type'} ne 'assessment'); my $resource_data = $studentdata->{$resource->{'symb'}}; @@ -1777,13 +1805,17 @@ sub StudentPerformanceOnSequence { $performance_length++; # one character per part $symbol = ' '; # default to space # - my $awarded = 0; + my $awarded; if (exists($resource_data->{'resource.'.$part.'.awarded'})) { $awarded = $resource_data->{'resource.'.$part.'.awarded'}; $awarded = 0 if (! $awarded); + $hasdata = 1; } # $partscore = $weight*$awarded; + if (! defined($awarded)) { + $partscore = undef; + } $score += $partscore; $symbol = $partscore; if (abs($symbol - sprintf("%.0f",$symbol)) < 0.001) { @@ -1798,10 +1830,12 @@ sub StudentPerformanceOnSequence { $symbol = 'x'; $max -= $weight; # Do not count 'excused' problems. } + $hasdata = 1; } else { # Unsolved. Did they try? if (exists($resource_data->{'resource.'.$part.'.tries'})){ $symbol = '.'; + $hasdata = 1; } else { $symbol = ' '; } @@ -1822,6 +1856,9 @@ sub StudentPerformanceOnSequence { $Str .= $symbol; } } + if (! $hasdata && $score == 0) { + $score = ' '; + } return ($Str,$performance_length,$score,$max,\@ScoreData); }