--- loncom/interface/statistics/lonstudentsubmissions.pm 2004/09/01 21:13:04 1.15 +++ loncom/interface/statistics/lonstudentsubmissions.pm 2004/09/15 21:08:50 1.18 @@ -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.18 2004/09/15 21:08:50 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -38,15 +38,10 @@ use HTML::Entities(); use Time::Local(); use Spreadsheet::WriteExcel(); -my @SubmitButtons = ({ name => 'PrevProblem', - text => 'Previous Problem' }, - { name => 'NextProblem', - text => 'Next Problem' }, - { name => 'break'}, - { name => 'SelectAnother', +my @SubmitButtons = ({ name => 'SelectAnother', text => 'Choose a different Problem' }, { name => 'Generate', - text => 'Generate Spreadsheet'}, + text => 'Generate Report'}, ); sub BuildStudentSubmissionsPage { @@ -90,62 +85,311 @@ sub BuildStudentSubmissionsPage { $r->print($html.(' 'x5)); } # - $r->print('
'.&mt("Unable to create new Excel file. ". + "This error has been logged. ". + "Please alert your LON-CAPA administrator"). + '
'); + return undef; + } + # + $workbook->set_tempdir('/home/httpd/perl/tmp'); + # + my $format = &Apache::loncommon::define_excel_formats($workbook); + my $worksheet = $workbook->addworksheet('Student Submission Data'); + # + # Add headers to the worksheet + my $rows_output = 0; + $worksheet->write($rows_output++,0, + $ENV{'course.'.$ENV{'request.course.id'}.'.description'}, + $format->{'h1'}); + $rows_output++; + my $cols_output = 0; + my $title_row = $rows_output++; + my $partid_row = $rows_output++; + my $respid_row = $rows_output++; + my $header_row = $rows_output++; + $worksheet->write($title_row ,0,'Problem Title',$format->{'bold'}); + $worksheet->write($partid_row,0,'Part ID',$format->{'bold'}); + $worksheet->write($respid_row,0,'Response ID',$format->{'bold'}); + # Student headers + my @StudentColumns = ('username','domain','id'); + foreach (@StudentColumns) { + $worksheet->write($header_row,$cols_output++,$_,$format->{'bold'}); + } + # Problem headers + foreach my $prob (@$Problems) { + my $title = &get_title($prob->title,$prob->src); + $worksheet->write($title_row,$cols_output, + $title,$format->{'h3'}); + foreach my $partid (@{$prob->parts}) { + $worksheet->write($partid_row,$cols_output,$partid); + my $responses = [$prob->responseIds($partid)]; + my $resptypes = [$prob->responseType($partid)]; + for (my $i=0;$i'. + &mt('Your Excel spreadsheet.'). + '
'."\n"); + $r->print(''); + $r->rflush(); + return; +} + +sub get_title { + my ($title,$src) = @_; + if ($title eq '') { + ($title) = ($src =~ m|/([^/]+)$|); + } else { + $title =~ s/\:/:/g; + } + return $title; +} + +sub excel_format_response { + my ($answer,$responsetype) = @_; + if ($responsetype eq 'radiobutton') { + $answer =~ s/=([^=])$//; + } elsif ($responsetype eq 'option') { + $answer = join("\n", + map { + &Apache::lonnet::unescape($_) ; + } sort split('&',$answer) + ); } + if ($answer =~ m/^=/) { + $answer = ' '.$answer; + } + return $answer; } + +=pod + + + + + + + + + + + + + + + + + + +######################################################### +######################################################### + +my @DefaultColumns = + ( + {name=>'username', + display=>'Student'}, + {name=>'domain', + display=>'Domain'}, + {name => 'id', + display => 'Id'}, + # FIXME: Probably need to add score + ); + +my @PartColumns = + ( + {name => 'time', + display =>'Time'}, + {name => 'attempt', + display =>'Attempt'}, + {name => 'awarded', + display =>'Award'}, + {name => 'weight', + display =>'Part Weight'}, + {name => 'score', + display =>'Score'}, + ); + +my @ResponseColumns = + ( + {name => 'submission', + display =>'Submission'}, + {name => 'answer', + display =>'Correct Answer'}, + {name => 'awarddetail', + display =>'Awarddetail'}, + ); + +sub get_response_type { + my ($resource,$partid,$respid) = @_; + my $response_type = ''; + for (my $i=0; + $i'. + $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 .= '
$/|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 = ''.&mt("Unable to create new Excel file. ". - "This error has been logged. ". - "Please alert your LON-CAPA administrator"). - '
'); - return undef; + time.'_'.rand(1000000000).'.csv'; + unless ($outputfile = Apache::File->new('>/home/httpd'.$filename)) { + $r->log_error("Couldn't open $filename for output $!"); + $r->print("Problems occured in writing the csv file. ". + "This error has been logged. ". + "Please alert your LON-CAPA administrator."); + $outputfile = undef; } # - $workbook->set_tempdir('/home/httpd/perl/tmp'); # - my $format = &Apache::loncommon::define_excel_formats($workbook); - my $worksheet = $workbook->addworksheet('Student Submission Data'); + my @Columns; + if (exists($ENV{'form.concise'}) && $ENV{'form.concise'} eq 'true') { + foreach (@DefaultColumns) { + if ($_->{'name'} =~ /^(username|domain|id)$/){ + push(@Columns,$_); + } + } + } else { + @Columns = @DefaultColumns; + } # - # Make sure we get new weight data instead of data on a 10 minute delay - &Apache::lonnet::clear_EXT_cache_status(); + my $response_type = &get_response_type($resource,$partid,$respid); + if (! defined($response_type) || $response_type eq '') { + $r->print(''. - &mt('Your Excel spreadsheet.'). - '
'."\n"); - $r->print(''); + # Tell the user where to get their csv file + $r->print(''. - &mt('See the status bar above for student answer computation progress'). - '
'); - # + ''); if ($ENV{'form.correctans'} eq 'true') { - &Apache::lonstathelpers::GetStudentAnswers($r,$problem,$Students, - 'Statistics', - 'stats_status'); + $r->print(''. + &mt('See the status bar above for student answer computation progress'). + '
'); + foreach my $problem (@$Problems) { + my ($resource,$respid,$partid) = ($problem->{'resource'}, + $problem->{'respid'}, + $problem->{'part'}); + # + &Apache::lonstathelpers::GetStudentAnswers($r,$problem,$Students, + 'Statistics', + 'stats_status'); + } + $r->print(''); } # - $r->print(''); $r->rflush(); - my @Columns; - push(@Columns,'username'); - push(@Columns,'domain'); - push(@Columns,'attempt'); - push(@Columns,'time'); - push(@Columns,'submission'); - if ($ENV{'form.correctans'} eq 'true') { push(@Columns,'correct'); } - push(@Columns,'grading'); - push(@Columns,'awarded'); - my $awarded_col = $#Columns; - push(@Columns,'weight'); - my $weight_col = $#Columns; - push(@Columns,'score'); + + + + + + + + + + + my @ColumnLabels; + my @Columns = @DefaultColumns; + my %seen; + foreach my $problem (@$Problems) { + my ($resource,$respid,$partid) = ($problem->{'resource'}, + $problem->{'respid'}, + $problem->{'part'}); + my $partkey = $resource->{'symb'}.':'.$partid; + if (! $seen{$partkey}) { + $ColumnLabels[$#Columns]=$resource->{'title'}; + push(@ColumnLabels,$partid); + push(@Columns,@PartColumns); + } + push(@Column + if ($ENV{'form.correctans'} eq 'true') { + push(@Columns,'Computers answer'); + } + $seen{$resource->{'symb'}.':'.$partid} .= ':'.$respid; + + } + +# my ($awarded_col,$weight_col); +# for (my $i=0;$i<=$#Columns;$i++) { +# if ($Columns[$i]->{'name'} eq 'weight' ) { $weight_col = $i; } +# if ($Columns[$i]->{'name'} eq 'awarded') { $awarded_col = $i; } +# } + # # Create excel worksheet my $filename = '/prtspool/'. @@ -644,9 +904,15 @@ sub prepare_excel_output { $worksheet->write($rows_output++,0,$resource->{'title'},$format->{'h1'}); $worksheet->write($rows_output++,0,$resource->{'src'},$format->{'h3'}); $rows_output++; - $worksheet->write_row($rows_output++,0,\@Columns,$format->{'bold'}); + $worksheet->write_row($rows_output++,0, + [map {$_->{'display'}} @Columns], + $format->{'bold'}); # # Populate the worksheet with the student data + my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin + ($r,'Excel File Compilation Status', + 'Excel File Compilation Progress', + scalar(@$Students),'inline',undef,'Statistics','stats_status'); foreach my $student (@$Students) { last if ($c->aborted()); my $results = &Apache::loncoursedata::get_response_data_by_student @@ -654,6 +920,7 @@ sub prepare_excel_output { my %row; $row{'username'} = $student->{'username'}; $row{'domain'} = $student->{'domain'}; + $row{'id'} = $student->{'id'}; $row{'correct'} = $student->{'answer'}; $row{'weight'} = &Apache::lonnet::EXT ('resource.'.$partid.'.weight',$resource->{'symb'}, @@ -667,11 +934,12 @@ sub prepare_excel_output { ($rows_output,$weight_col); my $cols_output = 0; foreach my $col (@Columns) { - if (! exists($row{$col})) { + if (! exists($row{$col->{'name'}})) { $cols_output++; next; } - $worksheet->write($rows_output,$cols_output++,$row{$col}); + $worksheet->write($rows_output,$cols_output++, + $row{$col->{'name'}}); } $rows_output++; } else { @@ -702,7 +970,7 @@ sub prepare_excel_output { # This will be interpreted as a formula. That is bad! $row{'submission'} = " ".$row{'submission'}; } - $row{'grading'} = $response->[ + $row{'awarddetail'} = $response->[ &Apache::loncoursedata::RDs_awarddetail()]; $row{'awarded'} = $response->[ &Apache::loncoursedata::RDs_awarded()]; @@ -714,13 +982,16 @@ sub prepare_excel_output { ($rows_output,$weight_col); my $cols_output = 0; foreach my $col (@Columns) { - $worksheet->write($rows_output,$cols_output++,$row{$col}, - $row_format{$col}); + $worksheet->write($rows_output,$cols_output++,$row{$col->{'name'}}, + $row_format{$col->{'name'}}); } $rows_output++; } } # End of else clause on if (! defined($results) .... + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, + 'last student'); } + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); # # Close the excel file $workbook->close(); @@ -737,6 +1008,8 @@ sub prepare_excel_output { return; } +=cut + ######################################################### ######################################################### ## @@ -746,6 +1019,17 @@ sub prepare_excel_output { ######################################################### sub CreateInterface { ## + ## Output Selection + my $OutputSelector = $/.''.$/; + ## ## Environment variable initialization my $Str = ''; $Str .= &Apache::lonhtmlcommon::breadcrumbs @@ -753,9 +1037,9 @@ sub CreateInterface { $Str .= ''; $Str .= '
'.&mt('Sections').' | '; - $Str .= ''.&mt('Enrollment Status').' | '; - $Str .= ''; + $Str .= ' | '.&mt('Sections').' | '; + $Str .= ''.&mt('Enrollment Status').' | '; + $Str .= ''.&mt('Output Options').' | '; $Str .= '
---|---|---|---|---|---|
'."\n"; @@ -788,22 +1072,23 @@ sub CreateInterface { } $last_sub_checkbox.= 'value="true" />'; # - # extra submission data checkbox - my $subdata_checkbox = ''; + $concise_view_checkbox .= 'value="true" />'; # - $Str .= ' | '.' |