--- loncom/interface/statistics/lonproblemanalysis.pm 2004/03/16 16:41:26 1.81 +++ loncom/interface/statistics/lonproblemanalysis.pm 2004/06/23 20:51:14 1.86 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonproblemanalysis.pm,v 1.81 2004/03/16 16:41:26 matthew Exp $ +# $Id: lonproblemanalysis.pm,v 1.86 2004/06/23 20:51:14 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -51,10 +51,6 @@ my @SubmitButtons = ({ name => 'PrevProb { name => 'NextProblemAnalysis', text => 'Next Problem' }, { name => 'break'}, - { name => 'ClearCache', - text => 'Clear Caches' }, - { name => 'updatecaches', - text => 'Update Student Data' }, { name => 'SelectAnother', text => 'Choose a different Problem' }, { name => 'ExcelOutput', @@ -81,22 +77,12 @@ sub BuildProblemAnalysisPage { # my @Students = @Apache::lonstatistics::Students; # - if (@Students < 1) { + if (@Students < 1 && exists($ENV{'form.firstrun'})) { $r->print('

There are no students in the sections selected

'); } # - &Apache::loncoursedata::clear_internal_caches(); - if (exists($ENV{'form.ClearCache'}) || - exists($ENV{'form.updatecaches'}) || - (exists($ENV{'form.firstanalysis'}) && - $ENV{'form.firstanalysis'} ne 'no')) { - &Apache::lonstatistics::Gather_Full_Student_Data($r); - } - if (! exists($ENV{'form.firstanalysis'})) { - $r->print(''); - } else { - $r->print(''); - } + my @CacheButtonHTML = + &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status'); $r->rflush(); # my $problem_types = '(option|radiobutton|numerical)'; @@ -111,6 +97,9 @@ sub BuildProblemAnalysisPage { $r->print(' 'x5); } } + foreach my $html (@CacheButtonHTML) { + $r->print($html.(' 'x5)); + } # $r->print('
'); $r->rflush(); @@ -160,8 +149,17 @@ sub BuildProblemAnalysisPage { $ProblemData, \@Students); } elsif ($current_problem->{'resptype'} eq 'numerical') { - &NumericalResponseAnalysis($r,$current_problem, - $ProblemData,\@Students); + ## + ## analyze all responses of a problem at once + my $res = $current_problem->{'resource'}; + foreach my $partid (@{$res->{'parts'}}) { + $current_problem->{'part'} = $partid; + foreach my $respid (@{$res->{'partdata'}->{$partid}->{'ResponseIds'}}) { + $current_problem->{'respid'}=$respid; + &NumericalResponseAnalysis($r,$current_problem, + $ProblemData,\@Students); + } + } } else { $r->print('

This analysis is not supported

'); } @@ -188,13 +186,29 @@ sub BuildProblemAnalysisPage { sub NumericalResponseAnalysis { my ($r,$problem,$ProblemData,$Students) = @_; my $c = $r->connection(); - my ($resource,$respid) = ($problem->{'resource'}, - $problem->{'respid'}); - $r->print('Response '.$respid.'
'); + my ($resource,$partid,$respid) = ($problem->{'resource'}, + $problem->{'part'}, + $problem->{'respid'}); + # + if (scalar(@{$resource->{'parts'}})>1) { + if (@{$resource->{'partdata'}->{$partid}->{'ResponseIds'}}>1) { + $r->print('

'. + &mt('Part [_1], response [_2].',$partid,$respid). + '

'); + } else { + $r->print('

'. + &mt('Part [_1]',$partid,$respid). + '

'); + } + } elsif (@{$resource->{'partdata'}->{$partid}->{'ResponseIds'}}>1) { + $r->print('

'.&mt('Response [_1]',$respid).'

'); + } + # my $analysis_html; - my $PerformanceData = - &Apache::loncoursedata::get_response_data - ($Students,$resource->{'symb'},$respid); + my $PerformanceData = &Apache::loncoursedata::get_response_data + (\@Apache::lonstatistics::SelectedSections, + $Apache::lonstatistics::enrollment_status, + $resource->{'symb'},$respid); if (! defined($PerformanceData) || ref($PerformanceData) ne 'ARRAY' ) { $analysis_html = '

'. @@ -205,8 +219,10 @@ sub NumericalResponseAnalysis { } # # This next call causes all the waiting around that people complain about - my ($max,$min) = &Apache::lonstathelpers::GetStudentAnswers($r,$problem, - $Students); + my ($max,$min) = + &Apache::lonstathelpers::GetStudentAnswers($r,$problem,$Students, + 'Statistics', + 'stats_status'); return if ($c->aborted()); # # Collate the data @@ -232,6 +248,9 @@ sub one_dimensional_plot { # Compute data -> image scaling factors my $min = $Labels->[0]; my $max = $Labels->[-1]; + if ($max == $min) { + $max =$min+1; + } my $h_scale = ($width-10)/($max-$min); # my $max_y = 0; @@ -294,6 +313,17 @@ sub line { return qq{$/}; } +sub text { + my ($x,$y,$color,$text,$font,$direction) = @_; + if (! defined($font) || $font !~ /^(tiny|small|medium|large|giant)$/) { + $font = 'medium'; + } + if (! defined($direction) || $direction ne 'vertical') { + $direction = ''; + } + return qq{$text}; +} + sub rectangle { my ($x1,$y1,$x2,$y2,$color,$thickness,$filled) = @_; return qq{}; @@ -348,9 +378,10 @@ sub RadioResponseAnalysis { my ($resource,$respid) = ($problem->{'resource'}, $problem->{'respid'}); my $analysis_html; - my $PerformanceData = - &Apache::loncoursedata::get_response_data - ($Students,$resource->{'symb'},$respid); + my $PerformanceData = &Apache::loncoursedata::get_response_data + (\@Apache::lonstatistics::SelectedSections, + $Apache::lonstatistics::enrollment_status, + $resource->{'symb'},$respid); if (! defined($PerformanceData) || ref($PerformanceData) ne 'ARRAY' ) { $analysis_html = '

'. @@ -533,9 +564,10 @@ sub OptionResponseAnalysis { my ($resource,$respid) = ($problem->{'resource'}, $problem->{'respid'}); # Note: part data is not needed. - my $PerformanceData = - &Apache::loncoursedata::get_response_data - ($Students,$resource->{'symb'},$respid); + my $PerformanceData = &Apache::loncoursedata::get_response_data + (\@Apache::lonstatistics::SelectedSections, + $Apache::lonstatistics::enrollment_status, + $resource->{'symb'},$respid); if (! defined($PerformanceData) || ref($PerformanceData) ne 'ARRAY' ) { $r->print('

'. @@ -1279,18 +1311,18 @@ sub build_foil_index { if (@Concepts > 1) { $table .= ''. ''.$conceptindex.''. - ''.&HTML::Entities::encode($concept->{'name'}).''. + ''.&HTML::Entities::encode($concept->{'name'},'<>&"').''. ''.$foilindex++.''. - ''.&HTML::Entities::encode($Foildata{$firstfoil}->{'name'}).''. + ''.&HTML::Entities::encode($Foildata{$firstfoil}->{'name'},'<>&"').''. ''.$Foildata{$firstfoil}->{'text'}.''. - ''.&HTML::Entities::encode($Foildata{$firstfoil}->{'value'}).''. + ''.&HTML::Entities::encode($Foildata{$firstfoil}->{'value'},'<>&"').''. "\n"; } else { $table .= ''. ''.$foilindex++.''. - ''.&HTML::Entities::encode($Foildata{$firstfoil}->{'name'}).''. + ''.&HTML::Entities::encode($Foildata{$firstfoil}->{'name'},'<>&"').''. ''.$Foildata{$firstfoil}->{'text'}.''. - ''.&HTML::Entities::encode($Foildata{$firstfoil}->{'value'}).''. + ''.&HTML::Entities::encode($Foildata{$firstfoil}->{'value'},'<>&"').''. "\n"; } foreach my $foilid (@FoilsInConcept) { @@ -1299,16 +1331,16 @@ sub build_foil_index { ''. ''. ''.$foilindex.''. - ''.&HTML::Entities::encode($Foildata{$foilid}->{'name'}).''. + ''.&HTML::Entities::encode($Foildata{$foilid}->{'name'},'<>&"').''. ''.$Foildata{$foilid}->{'text'}.''. - ''.&HTML::Entities::encode($Foildata{$foilid}->{'value'}).''. + ''.&HTML::Entities::encode($Foildata{$foilid}->{'value'},'<>&"').''. "\n"; } else { $table .= ''. ''.$foilindex.''. - ''.&HTML::Entities::encode($Foildata{$foilid}->{'name'}).''. + ''.&HTML::Entities::encode($Foildata{$foilid}->{'name'},'<>&"').''. ''.$Foildata{$foilid}->{'text'}.''. - ''.&HTML::Entities::encode($Foildata{$foilid}->{'value'}).''. + ''.&HTML::Entities::encode($Foildata{$foilid}->{'value'},'<>&"').''. "\n"; } } continue { @@ -1333,7 +1365,7 @@ sub build_option_index { ''. ''. (' 'x4).''. - ''.&HTML::Entities::encode($option).''. + ''.&HTML::Entities::encode($option,'<>&"').''. "\n"); } shift(@Rows); # Throw away 'correct option chosen' color @@ -1427,7 +1459,7 @@ sub CreateInterface { $Str .= '
'; } { - $Str .= '
'.&mt('Number of Plots:'); + $Str .= ''.&mt('Number of Plots:'); $Str .= &Apache::loncommon::help_open_topic ('Analysis_num_plots'); $Str .= ''; + $Str .= '
'; + } + { + $Str .= ''.&mt('Status: [_1]', + '' + ). + '
'; } } $Str .= '';