--- loncom/interface/statistics/lonstudentsubmissions.pm 2004/03/12 21:13:11 1.8 +++ loncom/interface/statistics/lonstudentsubmissions.pm 2004/09/08 14:58:33 1.17 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstudentsubmissions.pm,v 1.8 2004/03/12 21:13:11 matthew Exp $ +# $Id: lonstudentsubmissions.pm,v 1.17 2004/09/08 14:58:33 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -43,14 +43,10 @@ my @SubmitButtons = ({ name => 'PrevProb { name => 'NextProblem', text => 'Next Problem' }, { name => 'break'}, - { name => 'ClearCache', - text => 'Clear Caches' }, - { name => 'updatecaches', - text => 'Update Student Data' }, { name => 'SelectAnother', text => 'Choose a different Problem' }, { name => 'Generate', - text => 'Generate Spreadsheet'}, + text => 'Generate Report'}, ); sub BuildStudentSubmissionsPage { @@ -75,18 +71,8 @@ sub BuildStudentSubmissionsPage { $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(); # if (exists($ENV{'form.problemchoice'}) && @@ -100,6 +86,9 @@ sub BuildStudentSubmissionsPage { $r->print(' 'x5); } } + foreach my $html (@CacheButtonHTML) { + $r->print($html.(' 'x5)); + } # $r->print('
'); $r->rflush(); @@ -133,26 +122,478 @@ sub BuildStudentSubmissionsPage { my $resource = $current_problem->{'resource'}; $r->print('

'.$resource->{'title'}.'

'); $r->print('

'.$resource->{'src'}.'

'); - $r->print(&Apache::lonstathelpers::render_resource($resource)); + if ($ENV{'form.renderprob'} eq 'true') { + $r->print(&Apache::lonstathelpers::render_resource($resource)); + } $r->rflush(); my %Data = &Apache::lonstathelpers::get_problem_data ($resource->{'src'}); my $ProblemData = $Data{$current_problem->{'part'}. '.'. $current_problem->{'respid'}}; - &prepare_excel_output($r,$current_problem, - $ProblemData,\@Students); + if ($ENV{'form.output'} eq 'excel') { + &prepare_excel_output($r,$current_problem, + $ProblemData,\@Students); + } elsif ($ENV{'form.output'} eq 'csv') { + &prepare_csv_output($r,$current_problem, + $ProblemData,\@Students); + } else { + &prepare_html_output($r,$current_problem, + $ProblemData,\@Students); + } } $r->print('
'); } else { $r->print(''); + &mt('Prepare Report').'" />'); $r->print(' 'x5); $r->print('

'.&mt('Please select a problem to analyze').'

'); $r->print(&Apache::lonstathelpers::ProblemSelector('.')); } } +######################################################### +######################################################### + +my @DefaultColumns = + ( + {name=>'username', + display=>'Student'}, + {name=>'domain', + display=>'Domain'}, + {name => 'id', + display => 'Id'}, + {name => 'time', + display =>'Time'}, + {name => 'attempt', + display =>'Attempt'}, + {name => 'awarddetail', + display =>'Awarddetail'}, + {name => 'awarded', + display =>'Award'}, + # FIXME: Probably need to add score + ); + +sub get_response_type { + my ($resource,$partid,$respid) = @_; + my $response_type = ''; + for (my $i=0; + $i{'partdata'}->{$partid}->{'ResponseIds'}}); + $i++) { + if($resource->{'partdata'}->{$partid}->{'ResponseIds'}->[$i] eq $respid){ + $response_type = + $resource->{'partdata'}->{$partid}->{'ResponseTypes'}->[$i]; + last; + } + } + return $response_type; +} + + +######################################################### +######################################################### +## +## prepare_html_output +## +######################################################### +######################################################### +sub prepare_html_output { + my ($r,$problem,$ProblemData,$Students) = @_; + my $c = $r->connection(); + my ($resource,$respid,$partid) = ($problem->{'resource'}, + $problem->{'respid'}, + $problem->{'part'}); + # + if ($ENV{'form.correctans'} eq 'true') { + $r->print('

'.&mt('Generating Correct Answers').'

'); + &Apache::lonstathelpers::GetStudentAnswers($r,$problem,$Students, + 'Statistics', + 'stats_status'); + } + # + $r->print('

'.&mt('Student Responses').'

'); + # + $r->rflush(); + my $response_type = &get_response_type($resource,$partid,$respid); + if (! defined($response_type)) { + $r->print('

'.&mt('Unable to determine response type').'

'); + return; + } + my $count = 0; + my @Columns; + if (exists($ENV{'form.concise'}) && $ENV{'form.concise'} eq 'true') { + foreach (@DefaultColumns) { + if ($_->{'name'} =~ /^(username|domain|id)$/){ + push(@Columns,$_); + } + } + } else { + @Columns = @DefaultColumns; + } + my $header = ''.$/.&html_headers(\@Columns); + if ($response_type eq 'essay') { + $header .= &html_essay_headers(); + } elsif ($response_type eq 'option') { + $header .= &html_option_headers(); + } else { + $header .= &html_generic_headers(); + } + $header = ''.$header.''; + # + $r->print($/.$header.$/); + foreach my $student (@$Students) { + if ($count >= 50) { + $r->print('
'.$/.$header.$/); + $count = 0; + } + last if ($c->aborted()); + my $results = &Apache::loncoursedata::get_response_data_by_student + ($student,$resource->{'symb'},$respid); + next if (! defined($results) || ref($results) ne 'ARRAY'); + for (my $i=0;$i[$i]; + if ($ENV{'form.last_sub_only'} eq 'true' && + $i < (scalar(@$results)-1)) { + next; + } + my $data; + $data->{'username'} = $student->{'username'}; + $data->{'domain'} = $student->{'domain'}; + $data->{'id'} = $student->{'id'}; + $data->{'fullname'} = $student->{'fullanem'}; + $data->{'status'} = $student->{'status'}; + $data->{'time'} = &Apache::lonlocal::locallocaltime + ($response->[&Apache::loncoursedata::RDs_timestamp()]); + $data->{'attempt'} = + $response->[&Apache::loncoursedata::RDs_tries()]; + $data->{'awarded'} = + $response->[&Apache::loncoursedata::RDs_awarded()]; + $data->{'awarddetail'} = + $response->[&Apache::loncoursedata::RDs_awarddetail()]; + my $rowextra = 'bgcolor="#CCCCCC"'; + if ($count % 2 == 1) { + $rowextra = 'bgcolor="#EEEEEE"'; + } + my $row = ''; + foreach my $col (@Columns) { + $row .= ''. + $data->{$col->{'name'}}.''; + } + if ($response_type eq 'essay') { + $row .= &html_essay_results + ($response->[&Apache::loncoursedata::RDs_submission()], + $student->{'answer'}, + scalar(@Columns),$rowextra); + } elsif ($response_type eq 'option') { + $row .= &html_option_results + ($response->[&Apache::loncoursedata::RDs_submission()], + $student->{'answer'}, + scalar(@Columns),$rowextra); + } else { + $row .= &html_generic_results + ($response->[&Apache::loncoursedata::RDs_submission()], + $student->{'answer'}, + scalar(@Columns),$rowextra); + } + $row .= ''; + $r->print($row.$/); + $count++; + } + } + $r->print(''.$/); + return; +} + +##################################################### +## +## HTML helper routines +## +##################################################### +sub html_headers { + my ($Columns) = @_; + my $Str; + foreach my $column (@$Columns) { + $Str .= ''.$column->{'display'}.''; + } + return $Str; +} + +sub html_essay { + my ($submission,$correct,$tablewidth,$rowextra)=@_; + # + $submission =~ s|\\r\\n|$/|g; + $submission = &HTML::Entities::encode($submission,'<>&"'); + $submission =~ s|$/\s*$/|$/

$/|g; + $submission =~ s|\\||g; + $submission = '

'.$submission.'

'; + # + my $Str = ''. + ''.$submission.''; + if ($ENV{'form.correctans'} eq 'true') { + $Str .= ''; + if (defined($correct) && $correct !~ /^\s*$/) { + $Str .= ''. + ''.&mt('Correct Answer:').''.$correct.''; + } + } + $Str .= ''; + # + return $Str; +} + +sub html_essay_headers { + return ''; +} + +sub html_generic_headers { + my $header =''.&mt('Submission').''; + if ($ENV{'form.correctans'} eq 'true') { + $header .= ''.&mt('Correct').''; + } + return $header; +} + +sub html_option_headers { + return &html_generic_headers(); +} + +sub html_radiobutton_results { + my ($submission,$correct,$tablewidth,$rowclass)=@_; + $submission =~ s/=([^=])$//; + return &html_generic_results($submission,$correct,$tablewidth,$rowclass); +} + +sub html_generic_results { + my ($submission,$correct,$tablewidth,$rowclass)=@_; + my $Str .= ''.$submission.''; + if ($ENV{'form.correctans'} eq 'true') { + $Str .= ''.$correct.''; + } + $Str .= ''; + return $Str; +} + +sub html_option_results { + my ($submission,$correct,$tablewidth,$rowclass)=@_; + $submission = + '