--- loncom/interface/statistics/longradinganalysis.pm 2006/02/14 16:05:46 1.1 +++ loncom/interface/statistics/longradinganalysis.pm 2014/02/26 16:01:56 1.14 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: longradinganalysis.pm,v 1.1 2006/02/14 16:05:46 albertel Exp $ +# $Id: longradinganalysis.pm,v 1.14 2014/02/26 16:01:56 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,7 +34,8 @@ use Apache::loncoursedata(); use Apache::lonstatistics; use Apache::lonlocal; use Apache::lonstathelpers(); -use Apache::lonstudentsubmissions(); +use Spreadsheet::WriteExcel; +use Spreadsheet::WriteExcel::Utility(); use HTML::Entities(); use Time::Local(); use Data::Dumper; @@ -54,6 +55,7 @@ sub build_grading_analysis_page { # my %saveable_parameters = ('Status' => 'scalar', 'Section' => 'array', + 'Group' => 'array', ); &Apache::loncommon::store_course_settings('grading_analysis', \%saveable_parameters); @@ -67,7 +69,10 @@ sub build_grading_analysis_page { my @students = @Apache::lonstatistics::Students; # if (@students < 1 && exists($env{'form.firstrun'})) { - $r->print('

There are no students in the sections selected

'); + $r->print( + '

' + .&mt('There are no students in the sections/groups selected.') + .'

'); } # #my @cache_button_HTML = @@ -118,7 +123,7 @@ sub build_grading_analysis_page { $env{'form.problemchoice'}.'" />'); # if (! defined($current_problem->{'resource'})) { - $r->print('resource is undefined'); + $r->print('

'.&mt('resource is undefined').'

'); } else { my $resource = $current_problem->{'resource'}; $r->print('

'.$resource->compTitle.'

'); @@ -128,7 +133,10 @@ sub build_grading_analysis_page { if ($resource->is_task()) { &task_analysis($r,$resource,\@students); } else { - $r->print('

Analysis of '.$resource->src().' is not supported

'); + $r->print( + '

' + .&mt('Analysis of [_1] is not supported.',$resource->src()) + .'

'); } } $r->print('
'); @@ -147,10 +155,7 @@ sub build_grading_analysis_page { sub task_analysis { my ($r,$problem,$students) = @_; - my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin - ($r,'Student Answer Compilation Status', - 'Student Answer Compilation Progress', scalar(@$students), - 'inline',undef,'Statistics','stats_status'); + my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@$students)); my %graders; foreach my $student (@$students) { my $sname = $student->{'username'}; @@ -158,31 +163,130 @@ sub task_analysis { my %data = &Apache::lonnet::restore($problem->symb(), $env{'request.course.id'}, $sdom,$sname); + my $last_grader; foreach my $ver (0..$data{'version'}) { if (exists($data{"$ver:resource.0.regrader"}) && $data{"$ver:resource.0.regrader"} =~ /\S/) { - $graders{$data{"$ver:resource.0.regrader"}}++; + $last_grader=$data{"$ver:resource.0.regrader"}; } + if (exists($data{"$ver:resource.0.version"}) + && $last_grader =~ /\S/) { + $graders{$last_grader}++; + } + } + if ($last_grader =~ /\S/) { + $graders{$last_grader}++; } + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, - &mt('last student')); + 'last student'); + + } + my @output; + foreach my $grader (sort(keys(%graders))) { + my ($gname,$gdom) = split(/(?:\:|\@)/,$grader,2); + my $name = &Apache::loncommon::plainname($gname,$gdom); + push(@output,[$name,$gname."@".$gdom,$graders{$grader}]); } + if ($env{'form.output'} eq 'csv') { + my ($outputfile,$filename) = &init_csv_output($r); + foreach my $line (@output) { + print $outputfile + ('"'.join(q{","}, + map {&Apache::loncommon::csv_translate($_)} @{$line}) + .'"'."\n"); + } + close($outputfile); + $r->print('
'. + ''.&mt('Your CSV file.')."\n"); } elsif ($env{'form.output'} eq 'excel') { + my ($excel_workbook,$excel_sheet,$filename,$format,$rows_output) = + &init_excel_output($r); + foreach my $line (@output) { + my $cols_output = 0; + foreach my $item (@{ $line }) { + $excel_sheet->write($rows_output,$cols_output++,$item); + } + $rows_output++; + } + # Write the excel file + $excel_workbook->close(); + + # Tell the user where to get their excel file + $r->print('
'. + ''. + &mt('Your Excel spreadsheet.').''."\n"); } else { - $r->print(''); - foreach my $grader (sort(keys(%graders))) { - my ($gname,$gdom) = split('@',$grader,2); - my $name = &Apache::loncommon::plainname($gname,$gdom); - my $link = &Apache::loncommon::aboutmewrapper($name,$gname,$gdom); - $r->print(""); + $r->print(&Apache::loncommon::start_data_table()); + $r->print(&Apache::loncommon::start_data_table_header_row(). + ''. + &Apache::loncommon::end_data_table_header_row() ); + foreach my $line (@output) { + $r->print(&Apache::loncommon::start_data_table_row(). + sprintf("", + @{$line}). + &Apache::loncommon::end_data_table_row()); } - $r->print('
$link ($grader)$graders{$grader}
'.&mt('Name (username)').''.&mt('Grades Assigned').'%s (%s)%s
'); + $r->print(&Apache::loncommon::end_data_table()); } &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); } +sub init_csv_output { + my ($r) = @_; + my ($outputfile,$filename) = + &Apache::loncommon::create_text_file($r,'csv'); + my $description = $env{'course.'.$env{'request.course.id'}.'.description'}; + print $outputfile ('"'.&Apache::loncommon::csv_translate($description). + '","'.&Apache::loncommon::csv_translate(scalar(localtime(time))). + '"'."\n"); + print $outputfile ('"'. + &Apache::loncommon::csv_translate(&Apache::lonstatistics::section_and_enrollment_description()). + '"'."\n"); + print $outputfile ('"' .&Apache::loncommon::csv_translate('Grader Name')); + print $outputfile ('","'.&Apache::loncommon::csv_translate('Username')); + print $outputfile ('","'.&Apache::loncommon::csv_translate('Grades Assigned'). + '"'."\n"); + return ($outputfile,$filename); +} + +sub init_excel_output { + my ($r) = @_; + my ($excel_workbook,$filename,$format)= + &Apache::loncommon::create_workbook($r); + return if (! defined($excel_workbook)); + my $rows_output = 0; + my $cols_output = 0; + my $header_row = $rows_output++; + my $description_row = $rows_output++; + $rows_output++; # blank row + + my $sheetname = $env{'course.'.$env{'request.course.id'}.'.description'}; + $sheetname = &Apache::loncommon::clean_excel_name($sheetname); + my $excel_sheet = $excel_workbook->addworksheet($sheetname); + $excel_sheet->write($header_row,$cols_output++, + $env{'course.'.$env{'request.course.id'}.'.description'}, + $format->{'h1'}); + $cols_output += 3; + my $sectionstring = ''; +# my @Sections = &Apache::lonstatistics::get_selected_sections(); #This is never used + $excel_sheet->write($header_row,$cols_output++, + &Apache::lonstatistics::section_and_enrollment_description('plaintext'), + $format->{'h3'}); + + $excel_sheet->write($header_row,$cols_output++, + &mt('Compiled on [_1]',&Apache::lonlocal::locallocaltime(time)), + $format->{'h3'}); + $cols_output = 0; + foreach my $field ('Grader Name','Username','Grades Assigned') { + $excel_sheet->write($description_row,$cols_output++,&mt($field), + $format->{'bold'}); + } + return ($excel_workbook,$excel_sheet,$filename,$format,$rows_output); +} + ######################################################### ######################################################### ## @@ -197,20 +301,20 @@ sub create_interface { foreach ('HTML','Excel','CSV') { $output_selector .= '