--- loncom/interface/statistics/lonstudentsubmissions.pm 2004/02/19 20:17:01 1.1 +++ 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.1 2004/02/19 20:17:01 matthew Exp $ +# $Id: lonstudentsubmissions.pm,v 1.18 2004/09/15 21:08:50 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -38,19 +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 => 'ClearCache', - text => 'Clear Caches' }, - { name => 'updatecaches', - text => 'Update Student Data' }, - { name => 'SelectAnother', +my @SubmitButtons = ({ name => 'SelectAnother', text => 'Choose a different Problem' }, { name => 'Generate', - text => 'Generate Spreadsheet'}, + text => 'Generate Report'}, ); sub BuildStudentSubmissionsPage { @@ -67,7 +58,6 @@ sub BuildStudentSubmissionsPage { # &Apache::lonstatistics::PrepareClasslist(); # - $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$/|g; + $submission =~ s|\\||g; + $submission = '
'.$submission.'
'; + # + my $Str = ''. + &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(''); + } # - &GetStudentAnswers($r,$problem,$Students); - # - my @Columns = ( 'username','domain','attempt','time', - 'submission','correct', 'grading','awarded','weight', - 'score'); - my $awarded_col = 7; - my $weight_col = 8; + $r->rflush(); + + + + + + + + + + + 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/'. @@ -206,16 +904,24 @@ 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 ($student,$resource->{'symb'},$respid); my %row; $row{'username'} = $student->{'username'}; $row{'domain'} = $student->{'domain'}; - $row{'correct'} = $student->{'answer'}; + $row{'id'} = $student->{'id'}; + $row{'correct'} = $student->{'answer'}; $row{'weight'} = &Apache::lonnet::EXT ('resource.'.$partid.'.weight',$resource->{'symb'}, undef,undef,undef); @@ -228,15 +934,21 @@ 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 { - foreach my $response (@$results) { + for (my $i=0;$i'. &mt('Your Excel spreadsheet.'). '
'."\n"); -} - -sub GetStudentAnswers { - my ($r,$problem,$Students) = @_; - my %Answers; - my ($resource,$partid,$respid) = ($problem->{'resource'}, - $problem->{'part'}, - $problem->{'respid'}); - # Open progress window - my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin - ($r,'Student Answer Compilation Status', - 'Student Answer Compilation Progress', scalar(@$Students)); - $r->print("'; $Str .= '
'.&mt('Sections').' | '; - $Str .= ''.&mt('Enrollment Status').' | '; - $Str .= ''; + $Str .= ' | '.&mt('Sections').' | '; + $Str .= ''.&mt('Enrollment Status').' | '; + $Str .= ''.&mt('Output Options').' | '; $Str .= '
---|---|---|---|---|---|
'."\n"; $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5); $Str .= ' | '; @@ -344,29 +1050,58 @@ sub CreateInterface { $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5); $Str .= ''; # - my $only_seq_with_assessments = sub { - my $s=shift; - if ($s->{'num_assess'} < 1) { - return 0; - } else { - return 1; - } - }; - ## - ## + # Render problem checkbox + my $prob_checkbox = ''; + # + # Concise view checkbox + my $concise_view_checkbox = ''.&mt('Output Format: [_1]',$OutputSelector).'