version 1.68, 2004/02/16 20:50:03
|
version 1.70, 2004/02/18 19:16:55
|
Line 159 sub BuildProblemAnalysisPage {
|
Line 159 sub BuildProblemAnalysisPage {
|
$ProblemData, |
$ProblemData, |
\@Students); |
\@Students); |
} elsif ($current_problem->{'resptype'} eq 'numerical') { |
} elsif ($current_problem->{'resptype'} eq 'numerical') { |
&NumericalResponseAnalysis($r,$current_problem, |
# if (exists($ENV{'form.ExcelOutput'})) { |
$ProblemData,\@Students); |
&prepare_excel_output($r,$current_problem, |
|
$ProblemData,\@Students); |
|
# } else { |
|
# &NumericalResponseAnalysis($r,$current_problem, |
|
# $ProblemData,\@Students); |
|
# } |
} else { |
} else { |
$r->print('<h2>This analysis is not supported</h2>'); |
$r->print('<h2>This analysis is not supported</h2>'); |
} |
} |
Line 176 sub BuildProblemAnalysisPage {
|
Line 181 sub BuildProblemAnalysisPage {
|
} |
} |
} |
} |
|
|
|
|
|
######################################################### |
|
######################################################### |
|
## |
|
## Excel output of student answers and correct answers |
|
## |
|
######################################################### |
|
######################################################### |
|
sub prepare_excel_output { |
|
my ($r,$problem,$ProblemData,$Students) = @_; |
|
my ($resource,$respid,$partid) = ($problem->{'resource'}, |
|
$problem->{'respid'}, |
|
$problem->{'part'}); |
|
$r->print('<h2>'. |
|
&mt('Preparing Excel spreadsheet of student responses'). |
|
'</h2>'); |
|
# |
|
&GetStudentAnswers($r,$problem,$Students); |
|
# |
|
my @Columns = ( 'username','domain','attempt','time', |
|
'submission','correct', 'grading','awarded','weight', |
|
'score'); |
|
my $awarded_col = 7; |
|
my $weight_col = 8; |
|
# |
|
# Create excel worksheet |
|
my $filename = '/prtspool/'. |
|
$ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'. |
|
time.'_'.rand(1000000000).'.xls'; |
|
my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename); |
|
if (! defined($workbook)) { |
|
$r->log_error("Error creating excel spreadsheet $filename: $!"); |
|
$r->print('<p>'.&mt("Unable to create new Excel file. ". |
|
"This error has been logged. ". |
|
"Please alert your LON-CAPA administrator"). |
|
'</p>'); |
|
return undef; |
|
} |
|
# |
|
$workbook->set_tempdir('/home/httpd/perl/tmp'); |
|
# |
|
my $format = &Apache::loncommon::define_excel_formats($workbook); |
|
my $worksheet = $workbook->addworksheet('Student Submission Data'); |
|
# |
|
# Make sure we get new weight data instead of data on a 10 minute delay |
|
&Apache::lonnet::clear_EXT_cache_status(); |
|
# |
|
# Put on the standard headers and whatnot |
|
my $rows_output=0; |
|
$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'}); |
|
# |
|
# Populate the worksheet with the student data |
|
foreach my $student (@$Students) { |
|
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{'weight'} = &Apache::lonnet::EXT |
|
('resource.'.$partid.'.weight',$resource->{'symb'}, |
|
undef,undef,undef); |
|
if (! defined($results) || ref($results) ne 'ARRAY') { |
|
$row{'score'} = '='. |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$awarded_col) |
|
.'*'. |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$weight_col); |
|
my $cols_output = 0; |
|
foreach my $col (@Columns) { |
|
if (! exists($row{$col})) { |
|
$cols_output++; |
|
next; |
|
} |
|
$worksheet->write($rows_output,$cols_output++,$row{$col}); |
|
} |
|
$rows_output++; |
|
} else { |
|
foreach my $response (@$results) { |
|
delete($row{'time'}); |
|
delete($row{'attempt'}); |
|
delete($row{'submission'}); |
|
delete($row{'awarded'}); |
|
delete($row{'grading'}); |
|
delete($row{'score'}); |
|
my %row_format; |
|
# |
|
# Time is handled differently |
|
$row{'time'} = &calc_serial( |
|
$response->[&Apache::loncoursedata::RDs_timestamp()]); |
|
$row_format{'time'}=$format->{'date'}; |
|
# |
|
$row{'attempt'} = $response->[ |
|
&Apache::loncoursedata::RDs_tries()]; |
|
$row{'submission'} = $response->[ |
|
&Apache::loncoursedata::RDs_submission()]; |
|
$row{'grading'} = $response->[ |
|
&Apache::loncoursedata::RDs_awarddetail()]; |
|
$row{'awarded'} = $response->[ |
|
&Apache::loncoursedata::RDs_awarded()]; |
|
$row{'score'} = '='. |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$awarded_col) |
|
.'*'. |
|
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell |
|
($rows_output,$weight_col); |
|
my $cols_output = 0; |
|
foreach my $col (@Columns) { |
|
$worksheet->write($rows_output,$cols_output++,$row{$col}, |
|
$row_format{$col}); |
|
} |
|
$rows_output++; |
|
} |
|
} # End of else clause on if (! defined($results) .... |
|
} |
|
# |
|
# Close the excel file |
|
$workbook->close(); |
|
# |
|
# Write a link to allow them to download it |
|
$r->print('<p><a href="'.$filename.'">'. |
|
&mt('Your Excel spreadsheet.'). |
|
'</a></p>'."\n"); |
|
|
|
} |
|
|
|
|
######################################################### |
######################################################### |
######################################################### |
######################################################### |
## |
## |
Line 246 sub GetStudentAnswers {
|
Line 382 sub GetStudentAnswers {
|
'Student Answer Compilation Progress', scalar(@$Students)); |
'Student Answer Compilation Progress', scalar(@$Students)); |
$r->print("<table>\n"); |
$r->print("<table>\n"); |
$r->rflush(); |
$r->rflush(); |
my ($min,$max); |
|
foreach my $student (@$Students) { |
foreach my $student (@$Students) { |
my $sname = $student->{'username'}; |
my $sname = $student->{'username'}; |
my $sdom = $student->{'domain'}; |
my $sdom = $student->{'domain'}; |
my $answer = analyze_problem_as_student($resource, |
my $answer = &analyze_problem_as_student($resource, |
$sname,$sdom, |
$sname,$sdom, |
$partid,$respid); |
$partid,$respid); |
if (! defined($min) || $min > $answer) { |
|
$min = $answer; |
|
} |
|
if (! defined($max) || $max < $answer) { |
|
$max = $answer; |
|
} |
|
# $r->print('<tr>'. |
|
# '<td>'.$sname.'</td>'. |
|
# '<td>'.$sdom.'</td>'. |
|
# '<td>'.$answer.'</td>'. |
|
# '</tr>'."\n"); |
|
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
&mt('last student')); |
&mt('last student')); |
$student->{'answer'} = $answer; |
$student->{'answer'} = $answer; |
} |
} |
$r->print("</table>\n"); |
$r->print("</table>\n"); |
$r->rflush(); |
$r->rflush(); |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
# close progress window |
# close progress window |
return ($max,$min); |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
return; |
} |
} |
|
|
sub build_student_data_worksheet { |
sub build_student_data_worksheet { |
Line 999 sub OR_excel_sheet {
|
Line 1123 sub OR_excel_sheet {
|
} |
} |
# |
# |
$workbook->set_tempdir('/home/httpd/perl/tmp'); |
$workbook->set_tempdir('/home/httpd/perl/tmp'); |
# |
my $format = &Apache::loncommon::define_excel_formats($workbook); |
# Define some potentially useful formats |
|
my $format; |
|
$format->{'header'} = $workbook->add_format(bold => 1, |
|
bottom => 1, |
|
align => 'center'); |
|
$format->{'bold'} = $workbook->add_format(bold=>1); |
|
$format->{'h1'} = $workbook->add_format(bold=>1, size=>18); |
|
$format->{'h2'} = $workbook->add_format(bold=>1, size=>16); |
|
$format->{'h3'} = $workbook->add_format(bold=>1, size=>14); |
|
$format->{'date'} = $workbook->add_format(num_format=> |
|
'mmm d yyyy hh:mm AM/PM'); |
|
# |
# |
# Create and populate main worksheets |
# Create and populate main worksheets |
my $problem_data_sheet = $workbook->addworksheet('Problem Data'); |
my $problem_data_sheet = $workbook->addworksheet('Problem Data'); |
my $student_data_sheet = $workbook->addworksheet('Student Data'); |
my $student_data_sheet = &build_student_data_worksheet($workbook,$format); |
my $response_data_sheet = $workbook->addworksheet('Response Data'); |
my $response_data_sheet = $workbook->addworksheet('Response Data'); |
foreach my $sheet ($problem_data_sheet,$student_data_sheet, |
foreach my $sheet ($problem_data_sheet,$student_data_sheet, |
$response_data_sheet) { |
$response_data_sheet) { |
Line 1028 sub OR_excel_sheet {
|
Line 1141 sub OR_excel_sheet {
|
if ($result ne 'okay') { |
if ($result ne 'okay') { |
# Do something useful |
# Do something useful |
} |
} |
$result = &OR_build_student_data_worksheet($student_data_sheet,$format); |
|
if ($result ne 'okay') { |
|
# Do something useful |
|
} |
|
$result = &OR_build_response_data_worksheet($response_data_sheet,$format, |
$result = &OR_build_response_data_worksheet($response_data_sheet,$format, |
$PerformanceData,$Foils, |
$PerformanceData,$Foils, |
$ORdata); |
$ORdata); |
Line 1120 sub OR_build_problem_data_worksheet {
|
Line 1229 sub OR_build_problem_data_worksheet {
|
return 'okay'; |
return 'okay'; |
} |
} |
|
|
sub OR_build_student_data_worksheet { |
|
my ($worksheet,$format) = @_; |
|
my $rows_output = 3; |
|
my $cols_output = 0; |
|
$worksheet->write($rows_output++,0,'Student Data',$format->{'h3'}); |
|
my @Headers = ('full name','username','domain','section', |
|
"student\nnumber",'identifier'); |
|
$worksheet->write_row($rows_output++,0,\@Headers,$format->{'header'}); |
|
my @Students = @Apache::lonstatistics::Students; |
|
my $studentrows = &Apache::loncoursedata::get_student_data(\@Students); |
|
my %ids; |
|
foreach my $row (@$studentrows) { |
|
my ($mysqlid,$student) = @$row; |
|
$ids{$student}=$mysqlid; |
|
} |
|
foreach my $student (@Students) { |
|
my $name_domain = $student->{'username'}.':'.$student->{'domain'}; |
|
$worksheet->write_row($rows_output++,0, |
|
[$student->{'fullname'}, |
|
$student->{'username'},$student->{'domain'}, |
|
$student->{'section'},$student->{'id'}, |
|
$ids{$name_domain}]); |
|
} |
|
return; |
|
} |
|
|
|
sub OR_build_response_data_worksheet { |
sub OR_build_response_data_worksheet { |
my ($worksheet,$format,$PerformanceData,$Foils,$ORdata)=@_; |
my ($worksheet,$format,$PerformanceData,$Foils,$ORdata)=@_; |
my $rows_output = 3; |
my $rows_output = 3; |