version 1.37, 2003/03/06 22:45:04
|
version 1.50, 2003/05/29 21:41:10
|
Line 85 my $Statistics;
|
Line 85 my $Statistics;
|
|
|
=item $show 'all', 'totals', or 'scores' determines how much data is output |
=item $show 'all', 'totals', or 'scores' determines how much data is output |
|
|
|
=item $single_student_mode evaluates to true if we are showing only one |
|
student. |
|
|
=cut |
=cut |
|
|
####################################################### |
####################################################### |
Line 92 my $Statistics;
|
Line 95 my $Statistics;
|
my $show_links; |
my $show_links; |
my $output_mode; |
my $output_mode; |
my $show; |
my $show; |
|
my $single_student_mode; |
|
|
####################################################### |
####################################################### |
####################################################### |
####################################################### |
Line 127 Inputs:
|
Line 131 Inputs:
|
sub BuildStudentAssessmentPage { |
sub BuildStudentAssessmentPage { |
my ($r,$c)=@_; |
my ($r,$c)=@_; |
undef($Statistics); |
undef($Statistics); |
|
$single_student_mode = 1 if ($ENV{'form.SelectedStudent'}); |
# |
# |
# Print out the HTML headers for the interface |
# Print out the HTML headers for the interface |
# This also parses the output mode selector |
# This also parses the output mode selector |
# This step must always be done. |
# This step must always be done. |
$r->print(&CreateInterface()); |
$r->print(&CreateInterface()); |
$r->print('<input type="hidden" name="notfirstrun" value="true" />'); |
$r->print('<input type="hidden" name="notfirstrun" value="true" />'); |
|
$r->print('<input type="hidden" name="sort" value="'. |
|
$ENV{'form.sort'}.'" />'); |
$r->rflush(); |
$r->rflush(); |
if (! exists($ENV{'form.notfirstrun'})) { |
if (! exists($ENV{'form.notfirstrun'}) && ! $single_student_mode) { |
$r->print(<<ENDMSG); |
$r->print(<<ENDMSG); |
<p> |
<p> |
<font size="+1"> |
<font size="+2"> |
Please make your selections in the boxes above and hit |
Please make your selections in the boxes above and hit |
the button marked "Update Display". |
the button marked "Update Display". |
</font> |
</font> |
Line 156 ENDMSG
|
Line 163 ENDMSG
|
$initialize = \&excel_initialize; |
$initialize = \&excel_initialize; |
$output_student = \&excel_outputstudent; |
$output_student = \&excel_outputstudent; |
$finish = \&excel_finish; |
$finish = \&excel_finish; |
} elsif ($output_mode eq 'multi-sheet excel') { |
# } elsif ($output_mode eq 'multi-sheet excel') { |
$initialize = \&multi_sheet_excel_initialize; |
# $initialize = \&multi_sheet_excel_initialize; |
$output_student = \&multi_sheet_excel_outputstudent; |
# $output_student = \&multi_sheet_excel_outputstudent; |
$finish = \&multi_sheet_excel_finish; |
# $finish = \&multi_sheet_excel_finish; |
} elsif ($output_mode eq 'csv') { |
} elsif ($output_mode eq 'csv') { |
$initialize = \&csv_initialize; |
$initialize = \&csv_initialize; |
$output_student = \&csv_outputstudent; |
$output_student = \&csv_outputstudent; |
Line 168 ENDMSG
|
Line 175 ENDMSG
|
# |
# |
if($c->aborted()) { return ; } |
if($c->aborted()) { return ; } |
# |
# |
|
# Determine which students we want to look at |
|
my @Students; |
|
if ($single_student_mode) { |
|
@Students = (&Apache::lonstatistics::current_student()); |
|
$r->print(&next_and_previous_buttons()); |
|
$r->rflush(); |
|
} else { |
|
@Students = @Apache::lonstatistics::Students; |
|
} |
|
# |
# Call the initialize routine selected above |
# Call the initialize routine selected above |
$initialize->($r); |
$initialize->($r); |
foreach my $student (@Apache::lonstatistics::Students) { |
foreach my $student (@Students) { |
if($c->aborted()) { |
if($c->aborted()) { |
$finish->($r); |
$finish->($r); |
return ; |
return ; |
Line 186 ENDMSG
|
Line 203 ENDMSG
|
|
|
####################################################### |
####################################################### |
####################################################### |
####################################################### |
|
sub next_and_previous_buttons { |
|
my $Str = ''; |
|
$Str .= '<input type="hidden" name="SelectedStudent" value="'. |
|
$ENV{'form.SelectedStudent'}.'" />'; |
|
# |
|
# Build the previous student link |
|
my $previous = &Apache::lonstatistics::previous_student(); |
|
my $previousbutton = ''; |
|
if (defined($previous)) { |
|
my $sname = $previous->{'username'}.':'.$previous->{'domain'}; |
|
$previousbutton .= '<input type="button" value="'. |
|
'Previous Student ('. |
|
$previous->{'username'}.'@'.$previous->{'domain'}.')'. |
|
'" onclick="document.Statistics.SelectedStudent.value='. |
|
"'".$sname."'".';'. |
|
'document.Statistics.submit();" />'; |
|
} else { |
|
$previousbutton .= '<input type="button" value="'. |
|
'Previous student (none)'.'" />'; |
|
} |
|
# |
|
# Build the next student link |
|
my $next = &Apache::lonstatistics::next_student(); |
|
my $nextbutton = ''; |
|
if (defined($next)) { |
|
my $sname = $next->{'username'}.':'.$next->{'domain'}; |
|
$nextbutton .= '<input type="button" value="'. |
|
'Next Student ('. |
|
$next->{'username'}.'@'.$next->{'domain'}.')'. |
|
'" onclick="document.Statistics.SelectedStudent.value='. |
|
"'".$sname."'".';'. |
|
'document.Statistics.submit();" />'; |
|
} else { |
|
$nextbutton .= '<input type="button" value="'. |
|
'Next student (none)'.'" />'; |
|
} |
|
# |
|
# Build the 'all students' button |
|
my $all = ''; |
|
$all .= '<input type="button" value="All Students" '. |
|
'" onclick="document.Statistics.SelectedStudent.value='. |
|
"''".';'.'document.Statistics.submit();" />'; |
|
$Str .= $previousbutton.(' 'x5).$all.(' 'x5).$nextbutton; |
|
return $Str; |
|
} |
|
|
|
####################################################### |
|
####################################################### |
|
|
sub get_student_fields_to_show { |
sub get_student_fields_to_show { |
my @to_show = @Apache::lonstatistics::SelectedStudentData; |
my @to_show = @Apache::lonstatistics::SelectedStudentData; |
Line 198 sub get_student_fields_to_show {
|
Line 263 sub get_student_fields_to_show {
|
return @to_show; |
return @to_show; |
} |
} |
|
|
sub get_sequences_to_show { |
|
my @Sequences; |
|
foreach my $map_symb (@Apache::lonstatistics::SelectedMaps) { |
|
foreach my $sequence (@Apache::lonstatistics::Sequences) { |
|
next if ($sequence->{'symb'} ne $map_symb && $map_symb ne 'all'); |
|
next if ($sequence->{'num_assess'} < 1); |
|
push (@Sequences,$sequence); |
|
} |
|
} |
|
return @Sequences; |
|
} |
|
|
|
|
|
####################################################### |
####################################################### |
####################################################### |
####################################################### |
|
|
Line 237 sub CreateInterface {
|
Line 289 sub CreateInterface {
|
$Str .= '<tr>'; |
$Str .= '<tr>'; |
$Str .= '<td align="center"><b>Sections</b></td>'; |
$Str .= '<td align="center"><b>Sections</b></td>'; |
$Str .= '<td align="center"><b>Student Data</b></td>'; |
$Str .= '<td align="center"><b>Student Data</b></td>'; |
$Str .= '<td align="center"><b>Problem Sets</b></td>'; |
$Str .= '<td align="center"><b>Enrollment Status</b></td>'; |
|
$Str .= '<td align="center"><b>Sequences and Folders</b></td>'; |
$Str .= '<td align="center"><b>Output Format</b></td>'; |
$Str .= '<td align="center"><b>Output Format</b></td>'; |
$Str .= '</tr>'."\n"; |
$Str .= '</tr>'."\n"; |
# |
# |
Line 255 sub CreateInterface {
|
Line 308 sub CreateInterface {
|
$Str .= &Apache::lonstatistics::StudentDataSelect('StudentData','multiple', |
$Str .= &Apache::lonstatistics::StudentDataSelect('StudentData','multiple', |
5,undef); |
5,undef); |
$Str .= '</td><td>'."\n"; |
$Str .= '</td><td>'."\n"; |
|
$Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5); |
|
$Str .= '</td><td>'."\n"; |
$Str .= &Apache::lonstatistics::MapSelect('Maps','multiple,all',5, |
$Str .= &Apache::lonstatistics::MapSelect('Maps','multiple,all',5, |
$only_seq_with_assessments); |
$only_seq_with_assessments); |
$Str .= '</td><td>'."\n"; |
$Str .= '</td><td>'."\n"; |
Line 284 my @OutputOptions =
|
Line 339 my @OutputOptions =
|
show => 'all', |
show => 'all', |
show_links => 'yes', |
show_links => 'yes', |
}, |
}, |
|
{ name => 'HTML, with all links', |
|
value => 'html, with all links', |
|
description => 'Output HTML with each symbol linked to the problem '. |
|
'which generated it. '. |
|
'This includes links for unattempted problems.', |
|
mode => 'html', |
|
show => 'all', |
|
show_links => 'all', |
|
}, |
{ name => 'HTML, without links', |
{ name => 'HTML, without links', |
value => 'html, without links', |
value => 'html, without links', |
description => 'Output HTML. By not including links, the size of the'. |
description => 'Output HTML. By not including links, the size of the'. |
Line 305 my @OutputOptions =
|
Line 369 my @OutputOptions =
|
{ name => 'HTML, totals', |
{ name => 'HTML, totals', |
value => 'html, totals', |
value => 'html, totals', |
description => 'Output HTML, but only the summary statistics for each'. |
description => 'Output HTML, but only the summary statistics for each'. |
' sequence selected.', |
' sequence selected for each student.', |
mode => 'html', |
mode => 'html', |
show => 'totals', |
show => 'totals', |
show_links => 'no', |
show_links => 'no', |
}, |
}, |
|
{ name => 'HTML, summary table only', |
|
value => 'html summary table only', |
|
description => 'Output HTML, but only the final summary table for '. |
|
'all students across all sequences.', |
|
mode => 'html', |
|
show => 'final table', |
|
show_links => 'no', |
|
}, |
{ name => 'Excel, scores only', |
{ name => 'Excel, scores only', |
value => 'excel, scores only', |
value => 'excel, scores only', |
description => 'Output an Excel file (compatable with Excel 95), '. |
description => 'Output an Excel file (compatable with Excel 95), '. |
Line 328 my @OutputOptions =
|
Line 400 my @OutputOptions =
|
show => 'totals', |
show => 'totals', |
show_links => 'no', |
show_links => 'no', |
}, |
}, |
{ name => 'multi-sheet Excel', |
# { name => 'multi-sheet Excel', |
value => 'multi-sheet excel', |
# value => 'multi-sheet excel', |
description => 'Output an Excel file (compatable with Excel 95), '. |
# description => 'Output an Excel file (compatable with Excel 95), '. |
'with a seperate worksheet for each sequence you have selected '. |
# 'with a seperate worksheet for each sequence you have selected '. |
'the data for each problem part '. |
# 'the data for each problem part '. |
'(number of tries, status, points awarded) will be listed.', |
# '(number of tries, status, points awarded) will be listed.', |
mode => 'multi-sheet excel', |
# mode => 'multi-sheet excel', |
show => 'totals', |
# show => 'totals', |
show_links => 'no', |
# show_links => 'no', |
}, |
# }, |
{ name => 'multi-sheet Excel, by section', |
# { name => 'multi-sheet Excel, by section', |
value => 'multi-sheet excel, by section', |
# value => 'multi-sheet excel, by section', |
description => 'Output an Excel file (compatable with Excel 95), '. |
# description => 'Output an Excel file (compatable with Excel 95), '. |
'with a seperate worksheet for each sequence you have selected '. |
# 'with a seperate worksheet for each sequence you have selected '. |
'the data for each problem part '. |
# 'the data for each problem part '. |
'(number of tries, status, points awarded) will be listed. '. |
# '(number of tries, status, points awarded) will be listed. '. |
'There will be one Excel workbook for each section selected.', |
# 'There will be one Excel workbook for each section selected.', |
mode => 'multi-sheet excel', |
# mode => 'multi-sheet excel', |
show => 'by section', |
# show => 'by section', |
show_links => 'no', |
# show_links => 'no', |
}, |
# }, |
{ name => 'CSV, everything', |
{ name => 'CSV, everything', |
value => 'csv, everything', |
value => 'csv, everything', |
description => '', |
description => '', |
Line 386 sub OutputDescriptions {
|
Line 458 sub OutputDescriptions {
|
|
|
sub CreateAndParseOutputSelector { |
sub CreateAndParseOutputSelector { |
my $Str = ''; |
my $Str = ''; |
my $elementname = 'outputmode'; |
my $elementname = 'chartoutputmode'; |
# |
# |
# Format for output options is 'mode, restrictions'; |
# Format for output options is 'mode, restrictions'; |
my $selected = 'html, with links'; |
my $selected = 'html, without links'; |
if (exists($ENV{'form.'.$elementname})) { |
if (exists($ENV{'form.'.$elementname})) { |
if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) { |
if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) { |
$selected = $ENV{'form.'.$elementname}->[0]; |
$selected = $ENV{'form.'.$elementname}->[0]; |
Line 446 Return a line of the chart for a student
|
Line 518 Return a line of the chart for a student
|
my $padding; |
my $padding; |
my $count; |
my $count; |
|
|
|
my $nodata_count; # The number of students for which there is no data |
|
my %prog_state; # progress state used by loncommon PrgWin routines |
|
|
sub html_initialize { |
sub html_initialize { |
my ($r) = @_; |
my ($r) = @_; |
# |
# |
$padding = ' 'x3; |
$padding = ' 'x3; |
$count = 0; |
$count = 0; |
|
$nodata_count = 0; |
|
# |
|
$r->print("<h3>".$ENV{'course.'.$ENV{'request.course.id'}.'.description'}. |
|
" ".localtime(time)."</h3>"); |
|
|
# |
# |
|
# Set up progress window for 'final table' display only |
|
if ($show eq 'final table') { |
|
my $studentcount = scalar(@Apache::lonstatistics::Students); |
|
%prog_state=&Apache::lonhtmlcommon::Create_PrgWin |
|
($r,'Summary Table Status', |
|
'Summary Table Compilation Progress', $studentcount); |
|
} |
my $Str = "<pre>\n"; |
my $Str = "<pre>\n"; |
# First, the @StudentData fields need to be listed |
# First, the @StudentData fields need to be listed |
my @to_show = &get_student_fields_to_show(); |
my @to_show = &get_student_fields_to_show(); |
Line 462 sub html_initialize {
|
Line 549 sub html_initialize {
|
$Str .= $title.' 'x($width-$base).$padding; |
$Str .= $title.' 'x($width-$base).$padding; |
} |
} |
# Now the selected sequences need to be listed |
# Now the selected sequences need to be listed |
foreach my $sequence (&get_sequences_to_show) { |
foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()){ |
my $title = $sequence->{'title'}; |
my $title = $sequence->{'title'}; |
my $base = $sequence->{'base_width'}; |
my $base = $sequence->{'base_width'}; |
my $width = $sequence->{'width'}; |
my $width = $sequence->{'width'}; |
Line 470 sub html_initialize {
|
Line 557 sub html_initialize {
|
} |
} |
$Str .= "total (of shown problems)</pre>\n"; |
$Str .= "total (of shown problems)</pre>\n"; |
$Str .= "<pre>"; |
$Str .= "<pre>"; |
|
# |
|
# Check for suppression of output |
|
if ($show eq 'final table') { |
|
$Str = ''; |
|
} |
$r->print($Str); |
$r->print($Str); |
$r->rflush(); |
$r->rflush(); |
return; |
return; |
Line 499 sub html_outputstudent {
|
Line 591 sub html_outputstudent {
|
%StudentsData = @tmp; |
%StudentsData = @tmp; |
} |
} |
if (scalar(@tmp) < 1) { |
if (scalar(@tmp) < 1) { |
|
$nodata_count++; |
|
return if ($show eq 'final table'); |
$Str .= '<font color="blue">No Course Data</font>'."\n"; |
$Str .= '<font color="blue">No Course Data</font>'."\n"; |
$r->print($Str); |
$r->print($Str); |
$r->rflush(); |
$r->rflush(); |
Line 508 sub html_outputstudent {
|
Line 602 sub html_outputstudent {
|
# By sequence build up the data |
# By sequence build up the data |
my $studentstats; |
my $studentstats; |
my $PerformanceStr = ''; |
my $PerformanceStr = ''; |
foreach my $seq (&get_sequences_to_show) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
my ($performance,$score,$seq_max) = |
my ($performance,$score,$seq_max) = |
&StudentPerformanceOnSequence($student,\%StudentsData, |
&StudentPerformanceOnSequence($student,\%StudentsData, |
$seq,$show_links); |
$seq,$show_links); |
Line 543 sub html_outputstudent {
|
Line 637 sub html_outputstudent {
|
} |
} |
$Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max; |
$Str .= ' '.' 'x(length($max)-length($score)).$score.'/'.$max; |
$Str .= " \n"; |
$Str .= " \n"; |
|
# |
|
# Check for suppressed output and update the progress window if so... |
|
if ($show eq 'final table') { |
|
$Str = ''; |
|
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, |
|
'last student'); |
|
} |
|
# |
$r->print($Str); |
$r->print($Str); |
# |
# |
$r->rflush(); |
$r->rflush(); |
Line 551 sub html_outputstudent {
|
Line 653 sub html_outputstudent {
|
|
|
sub html_finish { |
sub html_finish { |
my ($r) = @_; |
my ($r) = @_; |
$r->print("</pre>\n"); |
# |
|
# Check for suppressed output and close the progress window if so |
|
if ($show eq 'final table') { |
|
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
} else { |
|
$r->print("</pre>\n"); |
|
} |
|
if ($single_student_mode) { |
|
$r->print(&SingleStudentTotal()); |
|
} else { |
|
$r->print(&StudentAverageTotal()); |
|
} |
$r->rflush(); |
$r->rflush(); |
return; |
return; |
} |
} |
|
|
|
sub StudentAverageTotal { |
|
my $Str = "<h3>Summary Tables</h3>\n"; |
|
my $num_students = scalar(@Apache::lonstatistics::Students); |
|
my $total_ave = 0; |
|
my $total_max = 0; |
|
$Str .= '<table border=2 cellspacing="1">'."\n"; |
|
$Str .= "<tr><th>Title</th><th>Average</th><th>Maximum</th></tr>\n"; |
|
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
|
my $ave; |
|
if ($num_students > $nodata_count) { |
|
$ave = int(100*($Statistics->{$seq->{'symb'}}->{'score'}/ |
|
($num_students-$nodata_count)))/100; |
|
} else { |
|
$ave = 0; |
|
} |
|
$total_ave += $ave; |
|
my $max = $seq->{'num_assess_parts'}; |
|
$total_max += $max; |
|
if ($ave == 0) { |
|
$ave = "0.00"; |
|
} |
|
$ave .= ' '; |
|
$max .= ' '; |
|
$Str .= '<tr><td>'.$seq->{'title'}.'</td>'. |
|
'<td align="right">'.$ave.'</td>'. |
|
'<td align="right">'.$max.'</td></tr>'."\n"; |
|
} |
|
$total_ave = int(100*$total_ave)/100; # only two digit |
|
$Str .= "</table>\n"; |
|
$Str .= '<table border=2 cellspacing="1">'."\n"; |
|
$Str .= '<tr><th>Number of Students</th><th>Average</th>'. |
|
"<th>Maximum</th></tr>\n"; |
|
$Str .= '<tr><td>'.($num_students-$nodata_count).'</td>'. |
|
'<td>'.$total_ave.'</td><td>'.$total_max.'</td>'; |
|
$Str .= "</table>\n"; |
|
return $Str; |
|
} |
|
|
|
sub SingleStudentTotal { |
|
my $student = &Apache::lonstatistics::current_student(); |
|
my $Str = "<h3>Summary Table For ".$student->{'username'}.'@'. |
|
$student->{'domain'}."</h3>\n"; |
|
$Str .= '<table border=2 cellspacing="1">'."\n"; |
|
$Str .= |
|
"<tr><th>Sequence or Folder</th><th>Score</th><th>Maximum</th></tr>\n"; |
|
my $total = 0; |
|
my $total_max = 0; |
|
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
|
my $value = $Statistics->{$seq->{'symb'}}->{'score'}; |
|
my $max = $Statistics->{$seq->{'symb'}}->{'max'}; |
|
$Str .= '<tr><td>'.$seq->{'title'}.'</td>'. |
|
'<td align="right">'.$value.'</td>'. |
|
'<td align="right">'.$max.'</td></tr>'."\n"; |
|
$total += $value; |
|
$total_max +=$max; |
|
} |
|
$Str .= '<tr><td><b>Total</b></td>'. |
|
'<td align="right">'.$total.'</td>'. |
|
'<td align="right">'.$total_max."</td></tr>\n"; |
|
$Str .= "</table>\n"; |
|
return $Str; |
|
} |
|
|
} |
} |
|
|
####################################################### |
####################################################### |
Line 588 sub multi_sheet_excel_initialize {
|
Line 764 sub multi_sheet_excel_initialize {
|
my $num_data_per_part = 2; # 'status' and 'numtries' |
my $num_data_per_part = 2; # 'status' and 'numtries' |
my $fields_per_student = scalar(&get_student_fields_to_show()); |
my $fields_per_student = scalar(&get_student_fields_to_show()); |
my $bytes_per_field = 20; # Back of the envelope calculation |
my $bytes_per_field = 20; # Back of the envelope calculation |
foreach my $seq (&get_sequences_to_show) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
$num_sequences++ if ($seq->{'num_assess'} > 0); |
$num_sequences++ if ($seq->{'num_assess'} > 0); |
$fields_per_student += $num_data_per_part * $seq->{'num_assess_parts'}; |
$fields_per_student += $num_data_per_part * $seq->{'num_assess_parts'}; |
} |
} |
Line 734 sub excel_initialize {
|
Line 910 sub excel_initialize {
|
} |
} |
# |
# |
# Add the Sequence Headers |
# Add the Sequence Headers |
foreach my $seq (&get_sequences_to_show) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
$excel_sheet->write($rows_output,$cols_output,$seq->{'title'}); |
$excel_sheet->write($rows_output,$cols_output,$seq->{'title'}); |
if ($show eq 'totals') { |
if ($show eq 'totals') { |
$excel_sheet->write($rows_output+1,$cols_output,'score'); |
$excel_sheet->write($rows_output+1,$cols_output,'score'); |
Line 752 sub excel_initialize {
|
Line 928 sub excel_initialize {
|
$rows_output += 1; |
$rows_output += 1; |
} |
} |
# |
# |
|
# Output a row for MAX |
|
if ($show ne 'totals') { |
|
$cols_output = 0; |
|
foreach my $field (&get_student_fields_to_show()) { |
|
if ($field eq 'username' || $field eq 'fullname' || |
|
$field eq 'id') { |
|
$excel_sheet->write($rows_output,$cols_output++,'Maximum'); |
|
} else { |
|
$excel_sheet->write($rows_output,$cols_output++,''); |
|
} |
|
} |
|
# |
|
# Add the Sequence Headers |
|
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
|
$excel_sheet->write($rows_output,$cols_output++, |
|
$seq->{'num_assess_parts'}); |
|
} |
|
$rows_output++; |
|
} |
|
# |
# Let the user know what we are doing |
# Let the user know what we are doing |
my $studentcount = scalar(@Apache::lonstatistics::Students); |
my $studentcount = scalar(@Apache::lonstatistics::Students); |
$r->print("<h1>Compiling Excel spreadsheet for ". |
$r->print("<h1>Compiling Excel spreadsheet for ". |
Line 790 sub excel_outputstudent {
|
Line 986 sub excel_outputstudent {
|
} |
} |
# |
# |
# Write out sequence scores and totals data |
# Write out sequence scores and totals data |
foreach my $seq (&get_sequences_to_show) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
my ($performance,$score,$seq_max) = |
my ($performance,$score,$seq_max) = |
&StudentPerformanceOnSequence($student,\%StudentsData, |
&StudentPerformanceOnSequence($student,\%StudentsData, |
$seq,'no'); |
$seq,'no'); |
Line 876 sub csv_initialize{
|
Line 1072 sub csv_initialize{
|
$outputfile = undef; |
$outputfile = undef; |
} |
} |
# |
# |
|
# Datestamp |
|
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 out the headings |
# Print out the headings |
my $Str = ''; |
my $Str = ''; |
my $Str2 = undef; |
my $Str2 = undef; |
Line 889 sub csv_initialize{
|
Line 1092 sub csv_initialize{
|
$Str .= '"'.&Apache::loncommon::csv_translate($field).'",'; |
$Str .= '"'.&Apache::loncommon::csv_translate($field).'",'; |
} |
} |
} |
} |
foreach my $seq (&get_sequences_to_show) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
if ($show eq 'scores') { |
if ($show eq 'scores') { |
$Str .= '"'.&Apache::loncommon::csv_translate($seq->{'title'}). |
$Str .= '"'.&Apache::loncommon::csv_translate($seq->{'title'}). |
'",'; |
'",'; |
Line 943 sub csv_outputstudent {
|
Line 1146 sub csv_outputstudent {
|
} |
} |
# |
# |
# Output performance data |
# Output performance data |
foreach my $seq (&get_sequences_to_show) { |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
my ($performance,$score,$seq_max) = |
my ($performance,$score,$seq_max) = |
&StudentPerformanceOnSequence($student,\%StudentsData, |
&StudentPerformanceOnSequence($student,\%StudentsData, |
$seq,'no'); |
$seq,'no'); |
Line 1049 sub StudentPerformanceOnSequence {
|
Line 1252 sub StudentPerformanceOnSequence {
|
$symbol = ' '; |
$symbol = ' '; |
} |
} |
$sum++; |
$sum++; |
|
} elsif (exists($resource_data->{'resource.'. |
|
$partnum.'.tries'})){ |
|
$symbol = '.'; |
} else { |
} else { |
$symbol = ' '; |
$symbol = ' '; |
} |
} |
Line 1061 sub StudentPerformanceOnSequence {
|
Line 1267 sub StudentPerformanceOnSequence {
|
} |
} |
} |
} |
# |
# |
if ($links eq 'yes' && $symbol ne ' ') { |
if ( ($links eq 'yes' && $symbol ne ' ') || |
|
($links eq 'all')) { |
|
if (length($symbol) > 1) { |
|
&Apache::lonnet::logthis('length of symbol "'.$symbol.'" > 1'); |
|
} |
$symbol = '<a href="/adm/grades'. |
$symbol = '<a href="/adm/grades'. |
'?symb='.&Apache::lonnet::escape($resource->{'symb'}). |
'?symb='.&Apache::lonnet::escape($resource->{'symb'}). |
'&student='.$student->{'username'}. |
'&student='.$student->{'username'}. |
Line 1076 sub StudentPerformanceOnSequence {
|
Line 1286 sub StudentPerformanceOnSequence {
|
} |
} |
|
|
####################################################### |
####################################################### |
####################################################### |
|
sub StudentAverageTotal { |
|
my ($cache, $students, $sequenceKeys)=@_; |
|
my $Str = "\n<b>Summary Tables:</b>\n"; |
|
my %Correct = (); |
|
my $ProblemsSolved = 0; |
|
my $TotalProblems = 0; |
|
my $StudentCount = 0; |
|
|
|
foreach my $name (@$students) { |
|
$StudentCount++; |
|
foreach my $sequence (@$sequenceKeys) { |
|
$Correct{$sequence} += |
|
$cache->{$name.':'.$sequence.':problemsCorrect'}; |
|
} |
|
$ProblemsSolved += $cache->{$name.':problemsSolved'}; |
|
$TotalProblems += $cache->{$name.':totalProblems'}; |
|
} |
|
if ($StudentCount) { |
|
$ProblemsSolved = sprintf( "%.2f", |
|
$ProblemsSolved/$StudentCount); |
|
$TotalProblems /= $StudentCount; |
|
} else { |
|
$ProblemsSolved = 0; |
|
$TotalProblems = 0; |
|
} |
|
|
|
$Str .= '<table border=2 cellspacing="1">'."\n"; |
|
$Str .= '<tr><td><b>Students Count</b></td><td><b>'. |
|
$StudentCount.'</b></td></tr>'."\n"; |
|
$Str .= '<tr><td><b>Total Problems</b></td><td><b>'. |
|
$TotalProblems.'</b></td></tr>'."\n"; |
|
$Str .= '<tr><td><b>Average Correct</b></td><td><b>'. |
|
$ProblemsSolved.'</b></td></tr>'."\n"; |
|
$Str .= '</table>'."\n"; |
|
|
|
$Str .= '<table border=2 cellspacing="1">'."\n"; |
|
$Str .= '<tr><th>Title</th><th>Total Problems</th>'. |
|
'<th>Average Correct</th></tr>'."\n"; |
|
foreach my $S(@$sequenceKeys) { |
|
my $title=$cache->{$S.':title'}; |
|
#$Str .= $cache->{$S.':problems'}; |
|
#my @problems=split(':', $cache->{$S.':problems'}); |
|
#my $pCount=scalar @problems; |
|
my $pCount=MaxSeqPr($cache,@$students[0],$S); |
|
my $crr; |
|
if ($StudentCount) { |
|
$crr=sprintf( "%.2f", $Correct{$S}/$StudentCount ); |
|
} else { |
|
$crr="0.00"; |
|
} |
|
$Str .= '<tr><td>'.$title. |
|
'</td><td align=center>'.$pCount. |
|
'</td><td align=center>'.$crr. |
|
'</td></tr>'."\n"; |
|
} |
|
|
|
$Str .= '</table>'."\n"; |
|
|
|
return $Str; |
|
} |
|
|
|
####################################################### |
|
####################################################### |
####################################################### |
|
|
=pod |
=pod |