'."\n";
- $Ptr .= '{'sectionList'});
+ my @selectedSections = split(':',$cache->{'sectionsSelected'});
+ $Str .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections,
+ \@selectedSections,
+ 'Statistics');
+ $Str .= ' | ';
+ $Str .= &CreateColumnSelectionBox($doNotShow);
+ $Str .= ' | '."\n";
+ $Str .= 'DISPLAYDATAFORMATTING';
$displayString .= $spacing.' | '."\n";
@@ -162,7 +238,7 @@ sub CreateTableHeadings {
$displayString,
'preformatted');
- $displayString = 'DISPLAYDATA'.$spacing;
+ $displayString = 'DISPLAYDATAFORMATTING'.$spacing;
$displayString .= ' | '."\n";
$Str .= &Apache::lonhtmlcommon::CreateHeadings($cache,
$sequenceKeys,
@@ -213,109 +289,49 @@ sub StudentReport {
my ($username,$domain)=split(':',$name);
my $Str = '';
+ if(defined($cache->{$name.':error'})) {
+ return $Str;
+ }
if($cache->{$name.':error'} =~ /course/) {
$Str .= 'No course data for student ';
$Str .= ''.$username.'. ';
return $Str;
}
- my $Version;
- my $problemsCorrect = 0;
- my $totalProblems = 0;
- my $problemsSolved = 0;
- my $numberOfParts = 0;
-# foreach my $sequence (split(':', $cache->{'orderedSequences'})) {
+ my $hasVersion = 'false';
+ my $hasFinalData = 'false';
foreach my $sequence (@$showSequences) {
+ my $hasData = 'false';
my $characterCount=0;
foreach my $problemID (split(':', $cache->{$sequence.':problems'})) {
my $problem = $cache->{$problemID.':problem'};
- my $LatestVersion = $cache->{$name.':version:'.$problem};
-
- # Output dashes for all the parts of this problem if there
- # is no version information about the current problem.
- if(!$LatestVersion) {
- foreach my $part (split(/\:/,$cache->{$sequence.':'.
- $problemID.
- ':parts'})) {
- $Str .= ' ';
- $totalProblems++;
- $characterCount++;
- }
- next;
- }
-
- my %partData=undef;
- # Initialize part data, display skips correctly
- # Skip refers to when a student made no submissions on that
- # part/problem.
- foreach my $part (split(/\:/,$cache->{$sequence.':'.
- $problemID.
- ':parts'})) {
- $partData{$part.':tries'}=0;
- $partData{$part.':code'}=' ';
- }
-
- # Looping through all the versions of each part, starting with the
- # oldest version. Basically, it gets the most recent
- # set of grade data for each part.
- for(my $Version=1; $Version<=$LatestVersion; $Version++) {
- foreach my $part (split(/\:/,$cache->{$sequence.':'.
- $problemID.
- ':parts'})) {
-
- if(!defined($cache->{$name.":$Version:$problem".
- ":resource.$part.solved"})) {
- # No grade for this submission, so skip
- next;
- }
-
- my $tries=0;
- my $code=' ';
-
- $tries = $cache->{$name.':'.$Version.':'.$problem.
- ':resource.'.$part.'.tries'};
- $partData{$part.':tries'}=($tries) ? $tries : 0;
-
- my $val = $cache->{$name.':'.$Version.':'.$problem.
- ':resource.'.$part.'.solved'};
- if ($val eq 'correct_by_student') {$code = '*';}
- elsif ($val eq 'correct_by_override') {$code = '+';}
- elsif ($val eq 'incorrect_attempted') {$code = '.';}
- elsif ($val eq 'incorrect_by_override'){$code = '-';}
- elsif ($val eq 'excused') {$code = 'x';}
- elsif ($val eq 'ungraded_attempted') {$code = '#';}
- else {$code = ' ';}
- $partData{$part.':code'}=$code;
- }
- }
-
# All grades (except for versionless parts) are displayed as links
# to their submission record. Loop through all the parts for the
# current problem in the correct order and prepare the output links
- $Str .= '';
foreach(split(/\:/,$cache->{$sequence.':'.$problemID.
':parts'})) {
- if($partData{$_.':code'} eq '*') {
- $problemsCorrect++;
- if (($partData{$_.':tries'}<10) &&
- ($partData{$_.':tries'} ne '')) {
- $partData{$_.':code'}=$partData{$_.':tries'};
- }
- } elsif($partData{$_.':code'} eq '+') {
- $problemsCorrect++;
+ if($cache->{$name.':'.$problemID.':NoVersion'} eq 'true' ||
+ $cache->{$name.':'.$problemID.':'.$_.':code'} eq ' ' ||
+ $cache->{$name.':'.$problemID.':'.$_.':code'} eq '') {
+ $Str .= ' ';
+ $characterCount++;
+ next;
}
-
- $Str .= $partData{$_.':code'};
- $characterCount++;
-
- if($partData{$_.':code'} ne 'x') {
- $totalProblems++;
+ $hasVersion = 'true';
+ $hasData = 'true';
+ $Str .= '';
+ my $code = $cache->{$name.':'.$problemID.':'.$_.':code'};
+ my $tries = $cache->{$name.':'.$problemID.':'.$_.':tries'};
+ if($code eq '*' && $tries < 10 && $tries ne '') {
+ $code = $tries;
}
+ $Str .= $code;
+ $Str .= '';
+ $characterCount++;
}
- $Str.='';
}
# Output the number of correct answers for the current sequence.
@@ -325,21 +341,32 @@ sub StudentReport {
$spacesNeeded -= 3;
$Str .= (' 'x$spacesNeeded);
- my $outputProblemsCorrect = sprintf( "%3d", $problemsCorrect );
- $Str .= ''.$outputProblemsCorrect.'';
- $problemsSolved += $problemsCorrect;
- $problemsCorrect=0;
-
+ my $outputProblemsCorrect = sprintf("%3d", $cache->{$name.':'.$sequence.
+ ':problemsCorrect'});
+ if($hasData eq 'true') {
+ $Str .= ''.$outputProblemsCorrect.'';
+ $hasFinalData = 'true';
+ } else {
+ $Str .= ' ';
+ }
$Str .= $spacing;
}
# Output the total correct problems over the total number of problems.
# I don't like this type of formatting, but it is a solution. Need
# a way to dynamically determine the space requirements.
- my $outputProblemsSolved = sprintf( "%4d", $problemsSolved );
- my $outputTotalProblems = sprintf( "%4d", $totalProblems );
- $Str .= ''.$outputProblemsSolved.
+ my $outputProblemsSolved = sprintf("%4d", $cache->{$name.':problemsSolved'});
+ my $outputTotalProblems = sprintf("%4d", $cache->{$name.':totalProblems'});
+ if($hasFinalData eq 'true') {
+ $Str .= ''.$outputProblemsSolved.
' / '.$outputTotalProblems.'';
+ } else {
+ $Str .= ' ';
+ }
+
+ if($hasVersion eq 'false') {
+ $Str = 'No course data.';
+ }
return $Str;
}
@@ -398,41 +425,22 @@ which has a size of four.
=cut
sub CreateColumnSelectionBox {
- my ($CacheData,$headings)=@_;
+ my ($doNotShow)=@_;
- my $missing=0;
- my $notThere='Select column to view:';
- my $name;
- $notThere .= ' | ';
- $notThere .= ' | |