--- loncom/interface/statistics/lonstudentsubmissions.pm 2004/09/01 21:13:04 1.15 +++ 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.15 2004/09/01 21:13:04 matthew Exp $ +# $Id: lonstudentsubmissions.pm,v 1.17 2004/09/08 14:58:33 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -46,7 +46,7 @@ my @SubmitButtons = ({ name => 'PrevProb { name => 'SelectAnother', text => 'Choose a different Problem' }, { name => 'Generate', - text => 'Generate Spreadsheet'}, + text => 'Generate Report'}, ); sub BuildStudentSubmissionsPage { @@ -131,15 +131,21 @@ sub BuildStudentSubmissionsPage { my $ProblemData = $Data{$current_problem->{'part'}. '.'. $current_problem->{'respid'}}; - &prepare_html_output($r,$current_problem, - $ProblemData,\@Students); -# &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('.')); @@ -148,6 +154,44 @@ sub BuildStudentSubmissionsPage { ######################################################### ######################################################### + +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 ## @@ -159,83 +203,104 @@ sub prepare_html_output { my ($resource,$respid,$partid) = ($problem->{'resource'}, $problem->{'respid'}, $problem->{'part'}); - $r->print('

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

'); # 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; - 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; - } - } + 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 { - my $count = 0; - my $header; - if ($response_type eq 'essay') { - $header = &html_essay_header(); - } elsif ($response_type eq 'radiobutton') { - $header = &html_radiobutton_header(); - } elsif ($response_type eq 'option') { - $header = &html_option_header(); - } else { - $header = &html_generic_header(); + @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; } - $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->{'sname'} = $student->{'username'}.'@'. - $student->{'domain'}; - $data->{'time'} = &Apache::lonlocal::locallocaltime - ($response->[&Apache::loncoursedata::RDs_timestamp()]); - $data->{'attempt'} = - $response->[&Apache::loncoursedata::RDs_tries()]; - $data->{'submission'} = - $response->[&Apache::loncoursedata::RDs_submission()]; - $data->{'correct'} = $student->{'answer'}; - my $row; - if ($response_type eq 'essay') { - $row = &html_essay($data); - } elsif ($response_type eq 'radiobutton') { - $row = &html_radiobutton($data); - } elsif ($response_type eq 'option') { - $row = &html_option($data); - } else { - $row = &html_generic($data); - } - $r->print($row.$/); - $count++; + 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 .= ''; } + 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('
'. + $data->{$col->{'name'}}.'
'.$/); } + $r->print(''.$/); return; } @@ -244,59 +309,31 @@ sub prepare_html_output { ## HTML helper routines ## ##################################################### -my @FullHeaders = ( - {name=>'sname', - display=>'Student'}, - {name => 'id', - display => 'Id'}, - {name => 'time', - display =>'Time'}, - {name => 'attempt', - display =>'Attempt'}, - {name => 'grading', - display =>'Grading'}, - ); - -sub html_essay_header { - my $header; - if ($ENV{'form.subdata'} eq 'true') { - foreach (@FullHeaders) { - $header .= ''.&mt($_->{'display'}).''; - } - } else { - $header = ''.&mt('Username and Submission').''; +sub html_headers { + my ($Columns) = @_; + my $Str; + foreach my $column (@$Columns) { + $Str .= ''.$column->{'display'}.''; } - return $header; + return $Str; } sub html_essay { - my ($data)=@_; + my ($submission,$correct,$tablewidth,$rowextra)=@_; # - $data->{'submission'} =~ s|\\r\\n|$/|g; - $data->{'submission'} = - &HTML::Entities::encode($data->{'submission'},'<>&"'); - $data->{'submission'} =~ s|$/\s*$/|$/

$/|g; - $data->{'submission'} =~ s|\\||g; - $data->{'submission'} = '

'.$data->{'submission'}.'

'; + $submission =~ s|\\r\\n|$/|g; + $submission = &HTML::Entities::encode($submission,'<>&"'); + $submission =~ s|$/\s*$/|$/

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

'.$submission.'

'; # - my $Str = ''; - if ($ENV{'form.subdata'} eq 'true') { - $Str .= - ''.$data->{'sname'}.''. - ''.$data->{'time'}.''. - ''.$data->{'attempt'}.''; - $Str .= ''; - $Str .= ''. - $data->{'submission'}.''; - } else { - $Str .= ''.$data->{'sname'}.''. - $data->{'submission'}.''; - } + my $Str = ''. + ''.$submission.''; if ($ENV{'form.correctans'} eq 'true') { $Str .= ''; - if (defined($data->{'correct'}) && $data->{'correct'} !~ /^\s*$/) { - $Str .= ''. - ''.&mt('Correct Answer:').''.$data->{'correct'}.''; + if (defined($correct) && $correct !~ /^\s*$/) { + $Str .= ''. + ''.&mt('Correct Answer:').''.$correct.''; } } $Str .= ''; @@ -304,273 +341,259 @@ sub html_essay { return $Str; } -sub html_radiobutton_header { - my $header; - if ($ENV{'form.subdata'} eq 'true') { - foreach (@FullHeaders) { - $header .= ''.&mt($_->{'display'}).''; - } - } else { - $header = - ''.&mt('Username').''; - } - $header .=''.&mt('Submission').''; +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_radiobutton { - my ($data)=@_; - # - $data->{'submission'} =~ s/=([^=])$//; - # - my $Str = ''; - if ($ENV{'form.subdata'} eq 'true') { - $Str .= - ''.''.$data->{'sname'}.''. - ''.$data->{'time'}.''. - ''.$data->{'attempt'}.''; - $Str .= ''.$data->{'submission'}.''; - if ($ENV{'form.correctans'} eq 'true') { - $Str .= ''.$data->{'correct'}.''; - } - } else { - $Str .= ''.$data->{'sname'}.''; - $Str .= ''.$data->{'submission'}.''; - if ($ENV{'form.correctans'} eq 'true') { - $Str .= ''.$data->{'correct'}.''; - } - } - $Str .= ''; - # - return $Str; +sub html_option_headers { + return &html_generic_headers(); } -sub html_generic_header { - my $header; - if ($ENV{'form.subdata'} eq 'true') { - foreach (@FullHeaders) { - $header .= ''.&mt($_->{'display'}).''; - } - } else { - $header = - ''.&mt('Username').''; - } - $header .= ''.&mt('Submission').''; - if ($ENV{'form.correctans'} eq 'true') { - $header .= ''.&mt('Correct').''; - } - return $header; +sub html_radiobutton_results { + my ($submission,$correct,$tablewidth,$rowclass)=@_; + $submission =~ s/=([^=])$//; + return &html_generic_results($submission,$correct,$tablewidth,$rowclass); } -sub html_generic { - my ($data)=@_; - $data->{'submission'} = &Apache::lonnet::unescape($data->{'submission'}); - my $Str = ''; - if ($ENV{'form.subdata'} eq 'true') { - $Str .= - ''.$data->{'sname'}.''. - ''.$data->{'time'}.''. - ''.$data->{'attempt'}.''; - } else { - $Str .= ''.$data->{'sname'}.''; - } - $Str .= ''.$data->{'submission'}.''; +sub html_generic_results { + my ($submission,$correct,$tablewidth,$rowclass)=@_; + my $Str .= ''.$submission.''; if ($ENV{'form.correctans'} eq 'true') { - $Str .= ''.$data->{'correct'}.''; + $Str .= ''.$correct.''; } $Str .= ''; return $Str; } -sub html_option_header { - my $header; - if ($ENV{'form.subdata'} eq 'true') { - foreach (@FullHeaders) { - $header .= ''.&mt($_->{'display'}).''; - } - } else { - $header = - ''.&mt('Username').''; - } - $header .= ''.&mt('Submission').''; - if ($ENV{'form.correctans'} eq 'true') { - $header .= ''.&mt('Correct').''; - } - return $header; -} - -sub html_option { - my ($data)=@_; - $data->{'submission'} = '