--- loncom/interface/statistics/lonstudentassessment.pm 2002/08/05 20:53:38 1.7 +++ loncom/interface/statistics/lonstudentassessment.pm 2002/08/13 00:37:18 1.8 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # (Publication Handler # -# $Id: lonstudentassessment.pm,v 1.7 2002/08/05 20:53:38 stredwic Exp $ +# $Id: lonstudentassessment.pm,v 1.8 2002/08/13 00:37:18 stredwic Exp $ # # Copyright Michigan State University Board of Trustees # @@ -104,35 +104,59 @@ sub BuildStudentAssessmentPage { my $selected=0; $r->print('
'."\n");
     foreach (@$students) {
-        if($c->aborted()) {  return $Str; }
+        if($c->aborted()) { return $Str; }
         next if ($_ ne $selectedName && 
                  $selectedName ne 'All Students');
         $selected = 1;
-        my $courseData; 
-        my $downloadTime='';
-        if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
-            $downloadTime = $cache{$_.':lastDownloadTime'};
-            untie(%cache);
-        }
-        if($downloadTime eq 'Not downloaded') {
-            $courseData = 
-                &Apache::loncoursedata::DownloadCourseInformation($_, 
-                                                                  $courseID);
-            unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) {
-                next;
-            }
-            &Apache::loncoursedata::ProcessStudentData(\%cache, 
-                                                       $courseData, $_);
-            untie(%cache);
-        }
 
+        my @who = ($_);
+        next if(&Apache::loncoursedata::DownloadStudentCourseData(\@who, 'true', 
+                                                             $cacheDB, 'true', 
+                                                             'false', $courseID,
+                                                             $r, $c) ne 'OK');
         next if($c->aborted());
 
         if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
+            my @before=();
+            my @after=();
+            my @updateColumn=();
+            my $foundUpdate = 0;
+            foreach(@$infoKeys) {
+                if(/updateTime/) {
+                    $foundUpdate=1;
+                    push(@updateColumn, $_);
+                    next;
+                }
+                if($foundUpdate) {
+                    push(@after, $_);
+                } else {
+                    push(@before, $_);
+                }
+            }
             my $displayString = 'DISPLAYDATA'.$spacing;
             $r->print(&Apache::lonhtmlcommon::FormatStudentInformation(
                                                          \%cache, $_,
-                                                         $infoKeys,
+                                                         \@before,
+                                                         $displayString,
+                                                         'preformatted'));
+
+            if($foundUpdate) {
+                $displayString = '';
+                $displayString .= '';
+                $displayString .= 'DISPLAYDATA'.$spacing;
+                $r->print(&Apache::lonhtmlcommon::FormatStudentInformation(
+                                                                   \%cache, $_,
+                                                                   \@updateColumn,
+                                                                   $displayString,
+                                                                   'preformatted'));
+            }
+
+            $displayString = 'DISPLAYDATA'.$spacing;
+            $r->print(&Apache::lonhtmlcommon::FormatStudentInformation(
+                                                         \%cache, $_,
+                                                         \@after,
                                                          $displayString,
                                                          'preformatted'));
             $r->print(&StudentReport(\%cache, $_, $spacing, $sequenceKeys));
@@ -214,7 +238,7 @@ sub CreateTableHeadings {
                                                    $displayString,
                                                    'preformatted');
 
-    $displayString  = '
DISPLAYDATA'.$spacing;
+    $displayString  = '
DISPLAYDATAFORMATTING'.$spacing;
     $displayString .= '
'."\n"; $Str .= &Apache::lonhtmlcommon::CreateHeadings($cache, $sequenceKeys, @@ -265,109 +289,42 @@ 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'})) { foreach my $sequence (@$showSequences) { 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++; - } - - $Str .= $partData{$_.':code'}; $characterCount++; - - if($partData{$_.':code'} ne 'x') { - $totalProblems++; + if(defined($cache->{$name.':'.$problemID.':NoVersion'}) || + $cache->{$name.':'.$problemID.':'.$_.':code'} eq ' ') { + $Str .= ' '; + next; } + $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.=''; } - $Str.=''; } # Output the number of correct answers for the current sequence. @@ -377,19 +334,17 @@ sub StudentReport { $spacesNeeded -= 3; $Str .= (' 'x$spacesNeeded); - my $outputProblemsCorrect = sprintf( "%3d", $problemsCorrect ); + my $outputProblemsCorrect = sprintf("%3d", $cache->{$name.':'.$sequence. + ':problemsCorrect'}); $Str .= ''.$outputProblemsCorrect.''; - $problemsSolved += $problemsCorrect; - $problemsCorrect=0; - $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 ); + my $outputProblemsSolved = sprintf("%4d", $cache->{$name.':problemsSolved'}); + my $outputTotalProblems = sprintf("%4d", $cache->{$name.':totalProblems'}); $Str .= ''.$outputProblemsSolved. ' / '.$outputTotalProblems.'';