--- loncom/interface/statistics/lonstudentassessment.pm 2006/02/27 19:40:30 1.131 +++ loncom/interface/statistics/lonstudentassessment.pm 2010/01/14 17:20:51 1.159 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonstudentassessment.pm,v 1.131 2006/02/27 19:40:30 albertel Exp $ +# $Id: lonstudentassessment.pm,v 1.159 2010/01/14 17:20:51 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -50,16 +50,20 @@ Presents assessment data about a student package Apache::lonstudentassessment; use strict; -use Apache::lonstatistics; -use Apache::lonhtmlcommon; +use Apache::lonstatistics(); +use Apache::lonhtmlcommon(); use Apache::loncommon(); use Apache::loncoursedata; use Apache::lonnet; # for logging porpoises use Apache::lonlocal; -use Apache::grades; +use Apache::grades(); +use Apache::lonmsgdisplay(); use Time::HiRes; use Spreadsheet::WriteExcel; use Spreadsheet::WriteExcel::Utility(); +use lib '/home/httpd/lib/perl/'; +use LONCAPA; + ####################################################### ####################################################### @@ -146,6 +150,7 @@ sub BuildStudentAssessmentPage { 'chartoutputmode' => 'scalar', 'chartoutputdata' => 'scalar', 'Section' => 'array', + 'Groups' => 'array', 'StudentData' => 'array', 'Maps' => 'array'); &Apache::loncommon::store_course_settings('chart',\%Saveable_Parameters); @@ -243,14 +248,14 @@ sub next_and_previous_buttons { if (defined($previous)) { my $sname = $previous->{'username'}.':'.$previous->{'domain'}; $previousbutton .= ''; } else { $previousbutton .= ''; + &mt('Previous Student').'" disabled="disabled" />'; } # # Build the next student link @@ -259,19 +264,19 @@ sub next_and_previous_buttons { if (defined($next)) { my $sname = $next->{'username'}.':'.$next->{'domain'}; $nextbutton .= ''; } else { $nextbutton .= ''; + &mt('Next Student').'" disabled="disabled" />'; } # # Build the 'all students' button my $all = ''; - $all .= ''; $Str .= $previousbutton.(' 'x5).$all.(' 'x5).$nextbutton; @@ -313,14 +318,24 @@ the chart page. ####################################################### sub CreateInterface { my $Str = ''; - $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,'Chart'); + $Str .= &Apache::lonhtmlcommon::breadcrumbs('Chart','Chart_Description:Chart_Sections:Chart_Student_Data:Chart_Enrollment_Status:Chart_Sequences:Chart_Output_Formats:Chart_Output_Data'); # $Str .= &CreateLegend(); $Str .= '
'.&mt('Sections').' | '; - $Str .= ''.&mt('Student Data').' | '; - $Str .= ''.&mt('Enrollment Status').' | '; - $Str .= ''.&mt('Sequences and Folders').' | '; + $Str .= ''.&mt('Sections').''. + &Apache::loncommon::help_open_topic("Chart_Sections"). + ' | '; + $Str .= ''.&mt('Groups').''. + ' | '; + $Str .= ''.&mt('Student Data').''. + &Apache::loncommon::help_open_topic("Chart_Student_Data"). + ' | '; + $Str .= ''.&mt('Access Status').''. + &Apache::loncommon::help_open_topic("Chart_Enrollment_Status"). + ' | '; + $Str .= ''.&mt('Sequences and Folders').''. + &Apache::loncommon::help_open_topic("Chart_Sequences"). + ' | '; $Str .= ''.&mt('Output Format').''. &Apache::loncommon::help_open_topic("Chart_Output_Formats"). ' | '; @@ -332,6 +347,8 @@ sub CreateInterface { $Str .= '
'."\n"; $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5); $Str .= ' | '; + $Str .= &Apache::lonstatistics::GroupSelect('Group','multiple',5); + $Str .= ' | '; $Str .= &Apache::lonstatistics::StudentDataSelect('StudentData','multiple', 5,undef); $Str .= ' | '."\n"; @@ -344,19 +361,19 @@ sub CreateInterface { $Str .= &CreateAndParseOutputDataSelector(); $Str .= ' |
' + .&mt('Status:').' ' + .'' + .'
'; $Str .= ''; $Str .= ' 'x5; $Str .= ''; - $Str .= ' 'x5; - $Str .= - &mt('Status [_1]', - ''); - $Str .= '' + .'' + .'
'; return $Str; } @@ -529,7 +546,7 @@ my @OutputDataOptions = summary_table => 1, maximum_row => 0, ignore_weight => 1, - shortdesc => 'Number of Problem Parts completed successfully.', + shortdesc => 'Number of Problem Parts completed successfully', longdesc => 'The Number of Problem Parts completed successfully and '. 'the maximum possible for each student', }, @@ -537,7 +554,7 @@ my @OutputDataOptions = sub HTMLifyOutputDataDescriptions { my $Str = ''; - $Str .= "' + .&mt('Unable to retrieve course information.') + .'
'); + } + + # If we're showing links, show a checkbox to open in new + # windows. + if ($show_links ne 'no') { + my $labeltext = &mt('Show links in new window'); + $r->print(<\n"; # First, the @StudentData fields need to be listed @@ -683,8 +714,8 @@ sub html_initialize { $width{$symb}->{'width_sum'} += 1; } $total_count += &count_parts($navmap,$seq); - # Use 3 digits for the sum - $width{$symb}->{'width_sum'} += 3; + # Use 6 digits for the sum + $width{$symb}->{'width_sum'} += 6; } # Compute width of maximum if ($chosen_output->{'sequence_max'}) { @@ -692,8 +723,8 @@ sub html_initialize { # One digit for the '/' $width{$symb}->{'width_sum'} +=1; } - # Use 3 digits for the total - $width{$symb}->{'width_sum'}+=3; + # Use 6 digits for the total + $width{$symb}->{'width_sum'}+=6; } # if ($chosen_output->{'every_problem'}) { @@ -719,6 +750,58 @@ sub html_initialize { $Str .= ""; $r->print($Str); $r->rflush(); + + $r->print(<+// get the left offset of a given widget as an absolute position +function getLeftOffset (element) { + return collect(element, "offsetLeft"); +} + +// get the top offset of a given widget as an absolute position +function getTopOffset (element) { + return collect(element, "offsetTop"); +} + +function collect(element, att) { + var val = 0; + while(element) { + val += element[att]; + element = element.offsetParent; + } + return val; +} + +var currentDiv; +var currentElement; +function popup_score(element, score) { + popdown_score(); + var left = getLeftOffset(element); + var top = getTopOffset(element); + var div = document.createElement("div"); + div.className = "LC_chrt_popup"; + div.appendChild(document.createTextNode(score)); + div.style.position = "absolute"; + div.style.top = (top - 25) + "px"; + div.style.left = (left - 10) + "px"; + currentDiv = div; + document.body.insertBefore(div, document.body.childNodes[0]); + element.className = "LC_chrt_popup_up"; + currentElement = element; +} + +function popdown_score() { + if (currentDiv) { + document.body.removeChild(currentDiv); + } + if (currentElement) { + currentElement.className = 'LC_chrt_popup_exists'; + } + currentDiv = undefined; +} + +JS + # # Let the user know what we are doing my $studentcount = scalar(@Apache::lonstatistics::Students); @@ -743,7 +826,12 @@ sub html_outputstudent { return if (! defined($navmap)); # if($count++ % 5 == 0 && $count > 0) { - $r->print(" "); +# $r->print(""); + $r->print(''); + &Apache::lonhtmlcommon::Increment_PrgWin( + $r,\%prog_state,'last five students'); + $r->rflush(); + $r->print(''); } # First, the @StudentData fields need to be listed my @to_show = &get_student_fields_to_show(); @@ -762,12 +850,20 @@ sub html_outputstudent { my @tmp = &Apache::loncoursedata::get_current_state ($student->{'username'},$student->{'domain'},undef, $env{'request.course.id'}); - if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) { + if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:(.*)/)) { %StudentsData = @tmp; - } - if (scalar(@tmp) < 1) { + } else { + my $error = $1; + if (scalar(@tmp) < 1) { + $Str .= '' + .&mt('No Course Data') + .''."\n"; + } else { + $Str .= '' + .&mt('Error getting student data ([_1])',$error) + .''."\n"; + } $nodata_count++; - $Str .= 'No Course Data'."\n"; $r->print($Str); $r->rflush(); return; @@ -795,16 +891,17 @@ sub html_outputstudent { $ratio .= ' '; } if ($chosen_output->{'sequence_sum'} && $score ne ' ') { - my $score .= sprintf("%3.0f",$score); - $ratio .= (' 'x(3-length($score))).$score; + my $score .= sprintf("%3.2f",$score); + $ratio .= (' 'x(6-length($score))).$score; } elsif($chosen_output->{'sequence_sum'}) { - $ratio .= ' 'x3; + $ratio .= ' 'x6; } if ($chosen_output->{'sequence_max'}) { if ($chosen_output->{'sequence_sum'}) { $ratio .= '/'; } - $ratio .= sprintf("%3.0f",$seq_max); + my $sequence_total=sprintf("%3.2f",$seq_max); + $ratio .= $sequence_total.(' 'x(6-length($sequence_total))); } # if (! $chosen_output->{'every_problem'}) { @@ -838,16 +935,16 @@ sub html_outputstudent { if (! defined($score)) { $score = ' ' x $total_sum_width; } else { - $score = sprintf("%.0f",$score); - $score = (' 'x(3-length($score))).$score; + $score = sprintf("%.2f",$score); + $score = (' 'x(6-length($score))).$score; } $Str .= ' '.' 'x($total_sum_width-length($score)).$score.' / '.$max; $Str .= " \n"; # $r->print($Str); # - $r->rflush(); - &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); +# $r->rflush(); +# &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); return; } @@ -872,12 +969,12 @@ sub html_finish { sub StudentAverageTotal { my $Str = ''.&mt('Summary Tables').'
'.$/; - $Str .= '
'.&mt('Title').' | '. ''.&mt('Average').' | '. ''.&mt('Maximum').' | '. - '|
---|---|---|---|
'.$seq->compTitle.' | '. + $Str .= &Apache::loncommon::start_data_table_row(). + ''.$seq->compTitle.' | '. ''.$ave.' | '. - ''.$max.' '.' | '.$max.' '.' | '. + &Apache::loncommon::end_data_table_row()."\n"; } - $Str .= "
'.&mt('Sequence or Folder').' | '; if ($chosen_output->{'base'} eq 'tries') { $Str .= ''.&mt('Parts Correct').' | '; } else { $Str .= ''.&mt('Score').' | '; } - $Str .= ''.&mt('Maximum').' | '."'.&mt('Maximum').' | '. + &Apache::loncommon::end_data_table_header_row()."\n"; my $total = 0; my $total_max = 0; foreach my $seq (@sequences) { my $value = $Statistics->{$seq->symb}->{'score'}; my $max = $Statistics->{$seq->symb}->{'max'}; - $Str .= '
---|---|---|---|
'.&HTML::Entities::encode($seq->compTitle).' | '. + $Str .= &Apache::loncommon::start_data_table_row(). + ''.&HTML::Entities::encode($seq->compTitle).' | '. ''.$value.' | '. - ''.$max.' | '.$max.' | '. + &Apache::loncommon::end_data_table_row()."\n"; $total += $value; $total_max +=$max; } - $Str .= '
'.&mt('Total').' | '. + $Str .= &Apache::loncommon::start_data_table_row(). + ''.&mt('Total').' | '. ''.$total.' | '. - ''.$total_max." |
' + .&mt('Compiling Excel spreadsheet for [quant,_1,student]...',$studentcount) + ."
\n" + ); $r->rflush(); # # Initialize progress window @@ -1374,7 +1474,7 @@ sub excel_outputstudent { foreach my $field (@to_show) { my $value = $student->{$field}; if ($field eq 'comments') { - $value = &Apache::lonmsg::retrieve_instructor_comments + $value = &Apache::lonmsgdisplay::retrieve_instructor_comments ($student->{'username'},$student->{'domain'}); } $excel_sheet->write($rows_output,$cols_output++,$value); @@ -1496,7 +1596,7 @@ sub excel_finish { # # Tell the user where to get their excel file $r->print('