';
return $Str;
}
@@ -430,14 +448,9 @@ sub CreateAndParseOutputSelector {
[$elementname]);
#
# Format for output options is 'mode, restrictions';
- my $selected = 'html, without links';
- if (exists($ENV{'form.'.$elementname})) {
- if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) {
- $selected = $ENV{'form.'.$elementname}->[0];
- } else {
- $selected = $ENV{'form.'.$elementname};
- }
- }
+ my $selected = (&Apache::loncommon::get_env_multiple('form.'.$elementname))[0];
+ $selected = 'html, without links' if (!$selected);
+
#
# Set package variables describing output mode
$show_links = 'no';
@@ -477,6 +490,7 @@ my @OutputDataOptions =
grand_maximum => 1,
summary_table => 1,
maximum_row => 1,
+ ignore_weight => 0,
shortdesc => 'Total Score and Maximum Possible for each '.
'Sequence or Folder',
longdesc => 'The score of each student as well as the '.
@@ -495,6 +509,7 @@ my @OutputDataOptions =
grand_maximum => 1,
summary_table => 1,
maximum_row => 1,
+ ignore_weight => 0,
shortdesc => 'Score on each Problem Part',
longdesc =>'The students score on each problem part, computed as'.
'the part weight * part awarded',
@@ -512,6 +527,7 @@ my @OutputDataOptions =
grand_maximum => 0,
summary_table => 0,
maximum_row => 0,
+ ignore_weight => 0,
shortdesc => 'Number of Tries before success on each Problem Part',
longdesc =>'The number of tries before success on each problem part.',
non_html_notes => 'negative values indicate an incorrect problem',
@@ -529,6 +545,7 @@ my @OutputDataOptions =
grand_maximum => 1,
summary_table => 1,
maximum_row => 0,
+ ignore_weight => 1,
shortdesc => 'Number of Problem Parts completed successfully.',
longdesc => 'The Number of Problem Parts completed successfully and '.
'the maximum possible for each student',
@@ -551,14 +568,9 @@ sub CreateAndParseOutputDataSelector {
my $Str = '';
my $elementname = 'chartoutputdata';
#
- my $selected = 'scores';
- if (exists($ENV{'form.'.$elementname})) {
- if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) {
- $selected = $ENV{'form.'.$elementname}->[0];
- } else {
- $selected = $ENV{'form.'.$elementname};
- }
- }
+ my $selected = (&Apache::loncommon::get_env_multiple('form.'.$elementname))[0];
+ $selected = 'scores' if (!$selected);
+
#
$chosen_output = $OutputDataOptions[0];
foreach my $option (@OutputDataOptions) {
@@ -632,17 +644,21 @@ Return a line of the chart for a student
my @sequences;
my $navmap; # Have to keep this around since weakref is a bit zealous
+sub html_cleanup {
+ undef(%prog_state);
+ undef(%width);
+ #
+ undef($navmap);
+ undef(@sequences);
+}
+
sub html_initialize {
my ($r) = @_;
#
$padding = ' 'x3;
$count = 0;
$nodata_count = 0;
- undef(%prog_state);
- undef(%width);
- #
- undef($navmap);
- undef(@sequences);
+ &html_cleanup();
($navmap,@sequences) =
&Apache::lonstatistics::selected_sequences_with_assessments();
if (! ref($navmap)) {
@@ -651,12 +667,25 @@ sub html_initialize {
&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(<new_window = true;
+
+NEW_WINDOW_CHECKBOX
+ }
+
#
- $r->print("
");
#
if ($chosen_output->{'base'} !~ /^final table/) {
- $r->print("
".$chosen_output->{'shortdesc'}."
");
+ $r->print("
".&mt($chosen_output->{'shortdesc'})."
");
}
my $Str = "
\n";
# First, the @StudentData fields need to be listed
@@ -684,8 +713,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'}) {
@@ -693,8 +722,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'}) {
@@ -720,6 +749,73 @@ 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);
+ if ($env{'form.SelectedStudent'}) {
+ $studentcount = '1';
+ }
+ #
+ # Initialize progress window
+ %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
+ ($r,'HTML Chart Status',
+ 'HTML Chart Progress', $studentcount,
+ 'inline',undef,'Statistics','stats_status');
+ #
+ &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,
+ 'Processing first student');
return;
}
@@ -747,13 +843,21 @@ sub html_outputstudent {
my %StudentsData;
my @tmp = &Apache::loncoursedata::get_current_state
($student->{'username'},$student->{'domain'},undef,
- $ENV{'request.course.id'});
- if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {
+ $env{'request.course.id'});
+ 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;
@@ -772,7 +876,8 @@ sub html_outputstudent {
} else {
($performance,$performance_length,$score,$seq_max,$rawdata) =
&student_performance_on_sequence($student,\%StudentsData,
- $navmap,$seq,$show_links);
+ $navmap,$seq,$show_links,
+ $chosen_output->{ignore_weight});
}
my $ratio='';
if ($chosen_output->{'every_problem'} &&
@@ -780,16 +885,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'}) {
@@ -823,8 +929,8 @@ 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";
@@ -832,6 +938,7 @@ sub html_outputstudent {
$r->print($Str);
#
$r->rflush();
+ &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
return;
}
@@ -849,18 +956,19 @@ sub html_finish {
}
}
$r->rflush();
- undef($navmap);
+ &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
+ &html_cleanup();
return;
}
sub StudentAverageTotal {
my $Str = '
'.
+ &Apache::loncommon::end_data_table_row()."\n";
+ $Str .= &Apache::loncommon::end_data_table()."\n";
return $Str;
}
@@ -956,8 +1071,7 @@ my %formula_data;
my $navmap;
my @sequences;
-sub excel_initialize {
- my ($r) = @_;
+sub excel_cleanup {
#
undef ($excel_sheet);
undef ($excel_workbook);
@@ -973,6 +1087,12 @@ sub excel_initialize {
#
undef($navmap);
undef(@sequences);
+}
+
+sub excel_initialize {
+ my ($r) = @_;
+
+ &excel_cleanup();
($navmap,@sequences) =
&Apache::lonstatistics::selected_sequences_with_assessments();
if (! ref($navmap)) {
@@ -1039,36 +1159,22 @@ sub excel_initialize {
return if (! defined($excel_workbook));
#
# Add a worksheet
- my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
+ my $sheetname = $env{'course.'.$env{'request.course.id'}.'.description'};
$sheetname = &Apache::loncommon::clean_excel_name($sheetname);
$excel_sheet = $excel_workbook->addworksheet($sheetname);
#
# Put the course description in the header
$excel_sheet->write($header_row,$cols_output++,
- $ENV{'course.'.$ENV{'request.course.id'}.'.description'},
+ $env{'course.'.$env{'request.course.id'}.'.description'},
$format->{'h1'});
$cols_output += 3;
#
# Put a description of the sections listed
my $sectionstring = '';
my @Sections = &Apache::lonstatistics::get_selected_sections();
- if (scalar(@Sections) > 1) {
- if (scalar(@Sections) > 2) {
- my $last = pop(@Sections);
- $sectionstring = "Sections ".join(', ',@Sections).', and '.$last;
- } else {
- $sectionstring = "Sections ".join(' and ',@Sections);
- }
- } else {
- if ($Sections[0] eq 'all') {
- $sectionstring = "All sections";
- } else {
- $sectionstring = "Section ".$Sections[0];
- }
- }
- $excel_sheet->write($header_row,$cols_output++,$sectionstring,
+ $excel_sheet->write($header_row,$cols_output++,
+ &Apache::lonstatistics::section_and_enrollment_description('plaintext'),
$format->{'h3'});
- $cols_output += scalar(@Sections);
#
# Put the date in there too
$excel_sheet->write($header_row,$cols_output++,
@@ -1142,9 +1248,11 @@ sub excel_initialize {
! defined($formula_data{$symb}->{'Excel:endcell'})) {
$formula_data{$symb}->{'Excel:endcell'} = $formula_data{$symb}->{'Excel:startcell'};
}
+
+ my $start = $formula_data{$symb}->{'Excel:startcell'};
+ my $end = $formula_data{$symb}->{'Excel:endcell'};
$formula_data{$symb}->{'Excel:sum'}= $excel_sheet->store_formula
- ('=SUM('.$formula_data{$symb}->{'Excel:startcell'}.
- ':'.$formula_data{$symb}->{'Excel:endcell'}.')');
+ ("=IF(COUNT($start\:$end),SUM($start\:$end),\"\")");
# Determine cell the score is held in
$formula_data{$symb}->{'Excel:scorecell'} =
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
@@ -1229,7 +1337,7 @@ sub excel_initialize {
$weight = 1;
if ($chosen_output->{'scores'}) {
$weight = &Apache::lonnet::EXT
- ('resource.'.$part.'.weight',$resource->{'symb'},
+ ('resource.'.$part.'.weight',$resource->symb,
undef,undef,undef);
if (!defined($weight) || ($weight eq '')) {
$weight=1;
@@ -1253,7 +1361,7 @@ sub excel_initialize {
&Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell($maximum_data_row,$formula_data{$symb}->{'Excel:endcol'}));
$excel_sheet->repeat_formula($maximum_data_row,$cols_output++,
$formula_data{$symb}->{'Excel:sum'},undef,
- %replaceCells);
+ %replaceCells, %replaceCells);
} elsif ($chosen_output->{'sequence_sum'}) {
$excel_sheet->write($maximum_data_row,$cols_output++,$max);
@@ -1328,17 +1436,13 @@ sub excel_initialize {
#
# Let the user know what we are doing
my $studentcount = scalar(@Apache::lonstatistics::Students);
- if ($ENV{'form.SelectedStudent'}) {
+ if ($env{'form.SelectedStudent'}) {
$studentcount = '1';
}
- if ($studentcount > 1) {
- $r->print('
'.&mt('Compiling Excel spreadsheet for [_1] students',
- $studentcount)."
\n");
- } else {
- $r->print('
'.
- &mt('Compiling Excel spreadsheet for 1 student').
- "
\n");
- }
+ $r->print('
'
+ .&mt('Compiling Excel spreadsheet for [quant,_1,student]...',$studentcount)
+ ."
\n"
+ );
$r->rflush();
#
# Initialize progress window
@@ -1364,7 +1468,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);
@@ -1375,7 +1479,7 @@ sub excel_outputstudent {
my @tmp = &Apache::loncoursedata::get_current_state($student->{'username'},
$student->{'domain'},
undef,
- $ENV{'request.course.id'});
+ $env{'request.course.id'});
if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {
%StudentsData = @tmp;
}
@@ -1403,14 +1507,16 @@ sub excel_outputstudent {
} else {
($performance,$performance_length,$score,$seq_max,$rawdata) =
&student_performance_on_sequence($student,\%StudentsData,
- $navmap,$seq,'no');
+ $navmap,$seq,'no',
+ $chosen_output->{ignore_weight});
}
if ($chosen_output->{'every_problem'}) {
if ($chosen_output->{'correct'}) {
# only indiciate if each item is correct or not
foreach my $value (@$rawdata) {
- # nonzero means correct
- $value = 1 if ($value > 0);
+ # positive means correct, 0 or negative means
+ # incorrect
+ $value = $value > 0 ? 1 : 0;
$excel_sheet->write($rows_output,$cols_output++,$value);
}
} else {
@@ -1436,7 +1542,7 @@ sub excel_outputstudent {
# The undef is for the format
$excel_sheet->repeat_formula($rows_output,$cols_output++,
$formula_data{$symb}->{'Excel:sum'},undef,
- %replaceCells);
+ %replaceCells, %replaceCells);
} elsif ($chosen_output->{'sequence_sum'}) {
if ($score eq ' ') {
$cols_output++;
@@ -1472,22 +1578,21 @@ sub excel_outputstudent {
sub excel_finish {
my ($r) = @_;
if ($request_aborted || ! defined($navmap) || ! defined($excel_sheet)) {
+ &excel_cleanup();
return;
}
#
# Write the excel file
$excel_workbook->close();
- my $c = $r->connection();
- #
- return if($c->aborted());
#
# Close the progress window
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
#
# Tell the user where to get their excel file
$r->print(' '.
- 'Your Excel spreadsheet.'."\n");
+ ''.&mt('Your Excel spreadsheet').''."\n");
$r->rflush();
+ &excel_cleanup();
return;
}
@@ -1518,10 +1623,7 @@ my %prog_state; # progress window state
my $navmap;
my @sequences;
-sub csv_initialize{
- my ($r) = @_;
- #
- # Clean up
+sub csv_cleanup {
undef($outputfile);
undef($filename);
undef($request_aborted);
@@ -1529,6 +1631,12 @@ sub csv_initialize{
#
undef($navmap);
undef(@sequences);
+}
+
+sub csv_initialize{
+ my ($r) = @_;
+
+ &csv_cleanup();
($navmap,@sequences) =
&Apache::lonstatistics::selected_sequences_with_assessments();
if (! ref($navmap)) {
@@ -1559,22 +1667,18 @@ END
'inline',undef,'Statistics','stats_status');
#
# Open a file
- $filename = '/prtspool/'.
- $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
- time.'_'.rand(1000000000).'.csv';
- unless ($outputfile = Apache::File->new('>/home/httpd'.$filename)) {
- $r->log_error("Couldn't open $filename for output $!");
- $r->print("Problems occured in writing the csv file. ".
- "This error has been logged. ".
- "Please alert your LON-CAPA administrator.");
- $outputfile = undef;
- }
+ ($outputfile,$filename) = &Apache::loncommon::create_text_file($r,'csv');
+ if (! defined($outputfile)) { return ''; }
#
# Datestamp
- my $description = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
+ 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";
foreach my $item ('shortdesc','non_html_notes') {
next if (! exists($chosen_output->{$item}));
print $outputfile
@@ -1646,7 +1750,7 @@ sub csv_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'});
}
$Str .= '"'.&Apache::loncommon::csv_translate($value).'",';
@@ -1657,7 +1761,7 @@ sub csv_outputstudent {
my @tmp = &Apache::loncoursedata::get_current_state($student->{'username'},
$student->{'domain'},
undef,
- $ENV{'request.course.id'});
+ $env{'request.course.id'});
if ((scalar @tmp > 0) && ($tmp[0] !~ /^error:/)) {
%StudentsData = @tmp;
}
@@ -1674,7 +1778,8 @@ sub csv_outputstudent {
} else {
($performance,$performance_length,$score,$seq_max,$rawdata) =
&student_performance_on_sequence($student,\%StudentsData,
- $navmap,$seq,'no');
+ $navmap,$seq,'no',
+ $chosen_output->{ignore_weight});
}
if ($chosen_output->{'every_problem'}) {
if ($chosen_output->{'correct'}) {
@@ -1718,26 +1823,37 @@ sub csv_outputstudent {
sub csv_finish {
my ($r) = @_;
if ($request_aborted || ! defined($navmap) || ! defined($outputfile)) {
+ &csv_cleanup();
return;
}
close($outputfile);
#
- my $c = $r->connection();
- return if ($c->aborted());
- #
# Close the progress window
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
#
# Tell the user where to get their csv file
$r->print(' '.
- ''.&mt('Your csv file.').''."\n");
+ ''.&mt('Your CSV file.').''."\n");
$r->rflush();
+ &csv_cleanup();
return;
}
}
+# This function will return an HTML string including a star, with
+# a mouseover popup showing the "real" value. An optional second
+# argument lets you show something other than a star.
+sub show_star {
+ my $popup = shift;
+ my $symbol = shift || '*';
+ # Escape the popup for JS.
+ $popup =~ s/([^-a-zA-Z0-9:;,._ ()|!\/?=&*])/'\\' . sprintf("%lo", ord($1))/ge;
+
+ return "$symbol";
+}
+
#######################################################
#######################################################
@@ -1803,12 +1919,12 @@ sub student_tries_on_sequence {
if ($status eq 'excused') {
$symbol = 'x';
$max--;
- } elsif ($status eq 'correct_by_override') {
+ } elsif ($status eq 'correct_by_override' && !$resource->is_task()) {
$symbol = '+';
$sum++;
} elsif ($tries > 0) {
if ($tries > 9) {
- $symbol = '*';
+ $symbol = show_star($tries);
} else {
$symbol = $tries;
}
@@ -1825,7 +1941,7 @@ sub student_tries_on_sequence {
} elsif ($status eq 'incorrect_by_override') {
$symbol = '-';
} elsif ($status eq 'ungraded_attempted') {
- $symbol = '#';
+ $symbol = 'u';
} elsif ($status eq 'incorrect_attempted' ||
$tries > 0) {
$symbol = '.';
@@ -1848,14 +1964,12 @@ sub student_tries_on_sequence {
#
if ( ($links eq 'yes' && $symbol ne ' ') ||
($links eq 'all')) {
- if (length($symbol) > 1) {
- &Apache::lonnet::logthis('length of symbol "'.$symbol.'" > 1');
- }
- $symbol = ''.$symbol.'';
+ '&command=submission';
+ $symbol = &link($symbol, $link);
}
$value .= $symbol;
}
@@ -1870,6 +1984,37 @@ sub student_tries_on_sequence {
return ($Str,$performance_length,$sum,$max,\@TriesData);
}
+=pod
+
+=item &link
+
+Inputs:
+
+=over 4
+
+=item $text
+
+=item $target
+
+=back
+
+Takes the text and creates a link to the $text that honors
+the value of 'new window' if clicked on, but uses a real
+'href' so middle and right clicks still work.
+
+$target and $text are assumed to be already correctly escaped; i.e., it
+can be dumped out directly into the output stream as-is.
+
+=cut
+
+sub link {
+ my ($text,$target) = @_;
+ return
+ "$text";
+}
+
#######################################################
#######################################################
@@ -1896,7 +2041,7 @@ Inputs:
#######################################################
#######################################################
sub student_performance_on_sequence {
- my ($student,$studentdata,$navmap,$seq,$links) = @_;
+ my ($student,$studentdata,$navmap,$seq,$links,$awarded_only) = @_;
$links = 'no' if (! defined($links));
my $Str = ''; # final result string
my ($score,$max) = (0,0);
@@ -1910,11 +2055,14 @@ sub student_performance_on_sequence {
my $resource_data = $studentdata->{$symb};
foreach my $part (@{$resource->parts()}) {
$partscore = undef;
- my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight',
- $symb,
- $student->{'domain'},
- $student->{'username'},
- $student->{'section'});
+ my $weight;
+ if (!$awarded_only){
+ $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight',
+ $symb,
+ $student->{'domain'},
+ $student->{'username'},
+ $student->{'section'});
+ }
if (!defined($weight) || ($weight eq '')) {
$weight=1;
}
@@ -1930,7 +2078,7 @@ sub student_performance_on_sequence {
$hasdata = 1;
}
#
- $partscore = $weight*$awarded;
+ $partscore = &Apache::grades::compute_points($weight,$awarded);
if (! defined($awarded)) {
$partscore = undef;
}
@@ -1940,15 +2088,21 @@ sub student_performance_on_sequence {
$symbol = sprintf("%.0f",$symbol);
}
if (length($symbol) > 1) {
- $symbol = '*';
+ $symbol = show_star($symbol);
}
- if (exists($resource_data->{'resource.'.$part.'.solved'})) {
+ if (exists($resource_data->{'resource.'.$part.'.solved'}) &&
+ $resource_data->{'resource.'.$part.'.solved'} ne '') {
my $status = $resource_data->{'resource.'.$part.'.solved'};
if ($status eq 'excused') {
$symbol = 'x';
$max -= $weight; # Do not count 'excused' problems.
+ } elsif ($status eq 'ungraded_attempted') {
+ $symbol = 'u';
}
$hasdata = 1;
+ } elsif ($resource_data->{'resource.'.$part.'.award'} eq 'DRAFT') {
+ $symbol = 'd';
+ $hasdata = 1;
} elsif (!exists($resource_data->{'resource.'.$part.'.awarded'})){
# Unsolved. Did they try?
if (exists($resource_data->{'resource.'.$part.'.tries'})){
@@ -1965,11 +2119,12 @@ sub student_performance_on_sequence {
push (@ScoreData,$partscore);
#
if ( ($links eq 'yes' && $symbol ne ' ') || ($links eq 'all')) {
- $symbol = ''.$symbol.'';
+ '&command=submission';
+ $symbol = &link($symbol, $link);
}
$Str .= $symbol;
}
@@ -1997,13 +2152,13 @@ problems.
#######################################################
sub CreateLegend {
my $Str = "
".
- " 1 correct by student in 1 try\n".
- " 7 correct by student in 7 tries\n".
+ " digit score or number of tries to get correct ".
" * correct by student in more than 9 tries\n".
" + correct by hand grading or override\n".
" - incorrect by override\n".
" . incorrect attempted\n".
- " # ungraded attempted\n".
+ " u ungraded attempted\n".
+ " d draft answer saved but not submitted\n".
" not attempted (blank field)\n".
" x excused".
"