[LON-CAPA-cvs] cvs: loncom /interface lonstatistics.pm /interface/statistics lonproblemstatistics.pm

stredwic lon-capa-cvs@mail.lon-capa.org
Wed, 14 Aug 2002 17:45:19 -0000


This is a MIME encoded message

--stredwic1029347119
Content-Type: text/plain

stredwic		Wed Aug 14 13:45:19 2002 EDT

  Modified files:              
    /loncom/interface	lonstatistics.pm 
    /loncom/interface/statistics	lonproblemstatistics.pm 
  Log:
  Now problem statistics will display its problems in tables based on its
  sequence with a sequence title.  It can also display the problems all
  together, based on the new button Sort All Problems/Sort Within Sequence.
  This button also allows the user to sort within the sequence or sort
  all the problems as one group.
  
  The second thing is that now problem statistics uses an initialization
  function as does the chart from its page.  This allows the data
  to be updated (like a change in status) to be seen while still in chart
  mode instead of having to go back to problem statistics main page to
  get the statistics data updated.
  
  
--stredwic1029347119
Content-Type: text/plain
Content-Disposition: attachment; filename="stredwic-20020814134519.txt"

Index: loncom/interface/lonstatistics.pm
diff -u loncom/interface/lonstatistics.pm:1.44 loncom/interface/lonstatistics.pm:1.45
--- loncom/interface/lonstatistics.pm:1.44	Wed Aug 14 12:18:55 2002
+++ loncom/interface/lonstatistics.pm	Wed Aug 14 13:45:19 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # (Publication Handler
 #
-# $Id: lonstatistics.pm,v 1.44 2002/08/14 16:18:55 stredwic Exp $
+# $Id: lonstatistics.pm,v 1.45 2002/08/14 17:45:19 stredwic Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -123,6 +123,8 @@
     &CheckFormElement($cache, 'ProblemStatisticsSort',
                       'ProblemStatisticsSort', 'Homework Sets Order');
     &CheckFormElement($cache, 'DisplayLegend', 'DisplayLegend', 'Hide Legend');
+    &CheckFormElement($cache, 'SortProblems', 'SortProblems', 
+                      'Sort Within Sequence');
 
     # Search only form elements
     my @headingColumns=();
@@ -580,7 +582,8 @@
         $courseDescription =~ s/\ /"_"/eg;
         &Apache::lonproblemstatistics::BuildGraphicChart($GoToPage, $cacheDB,
                                                          $courseDescription,
-                                                         $r);
+                                                         $students, $courseID,
+                                                         $r, $c);
     } elsif($GoToPage eq 'Class list') {
         &BuildClasslist($cacheDB, $students, \@studentInformation,
                         \@headings, $r);
Index: loncom/interface/statistics/lonproblemstatistics.pm
diff -u loncom/interface/statistics/lonproblemstatistics.pm:1.25 loncom/interface/statistics/lonproblemstatistics.pm:1.26
--- loncom/interface/statistics/lonproblemstatistics.pm:1.25	Wed Aug 14 12:18:55 2002
+++ loncom/interface/statistics/lonproblemstatistics.pm	Wed Aug 14 13:45:19 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # (Publication Handler
 #
-# $Id: lonproblemstatistics.pm,v 1.25 2002/08/14 16:18:55 stredwic Exp $
+# $Id: lonproblemstatistics.pm,v 1.26 2002/08/14 17:45:19 stredwic Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -45,7 +45,7 @@
 
 my $jr;
 
-sub BuildProblemStatisticsPage {
+sub InitializeProblemStatistics {
     my ($cacheDB, $students, $courseID, $c, $r)=@_;
     my %cache;
 
@@ -53,7 +53,7 @@
 
     unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
         $r->print('Unable to tie database.');
-        return;
+        return ('ERROR', undef);
     }
 
     # Remove students who don't have the proper section.
@@ -80,42 +80,6 @@
         }
     }
 
-    my $Ptr = '';
-    $Ptr .= '<table border="0"><tbody>';
-    $Ptr .= '<tr><td align="right"><b>Select Map</b></td>'."\n";
-    $Ptr .= '<td align="left">';
-    $Ptr .= &Apache::lonhtmlcommon::MapOptions(\%cache, 'ProblemStatistics',
-                                               'Statistics');
-    $Ptr .= '</td></tr>'."\n";
-    $Ptr .= '<tr><td align="right"><b>Sorting Type:</b></td>'."\n";
-    $Ptr .= '<td align="left">'."\n";
-    $Ptr .= &Apache::lonhtmlcommon::AscendOrderOptions(
-                                            $cache{'ProblemStatisticsAscend'}, 
-                                            'ProblemStatistics',
-                                            'Statistics');
-    $Ptr .= '</td></tr>'."\n";
-    $Ptr .= '<tr><td align="right"><b>Select Sections</b>';
-    $Ptr .= '</td>'."\n";
-    $Ptr .= '<td align="left">'."\n";
-    my @sections = split(':',$cache{'sectionList'});
-    $Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections,
-                                                          \@sectionsSelected,
-                                                          'Statistics');
-    $Ptr .= '</td></tr>'."\n";
-    $Ptr .= &ProblemStatisticsButtons($cache{'DisplayFormat'}, 
-                                      $cache{'DisplayLegend'});
-    $Ptr .= '</table>';
-    if($cache{'DisplayLegend'} eq 'Show Legend') {
-        $Ptr .= &ProblemStatisticsLegend();
-    }
-    $r->print($Ptr);
-    $r->rflush();
-
-    my @Header = ("Homework Sets Order","#Stdnts","Tries","Mod",
-                  "Mean","#YES","#yes","%Wrng","DoDiff",
-                  "S.D.","Skew.","D.F.1st","D.F.2nd","Disc.");
-    my $color=&setbgcolor(0);
-
 #    my %Discuss=&Apache::loncoursedata::LoadDiscussion($courseID);
     my $lastStatus = (defined($cache{'StatisticsLastStatus'})) ?
                      $cache{'StatisticsLastStatus'} : 'Nothing';
@@ -127,7 +91,7 @@
             untie(%cache);
             unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) {
                 $r->print('Unable to tie database.');
-                return;
+                return ('ERROR', undef);
             }
             my @statkeys = split(':::', $cache{'StatisticsKeys'});
             delete $cache{'StatisticsKeys'};
@@ -144,11 +108,11 @@
                                                                   'true',
                                                                   $courseID,
                                                                   $r, $c);
-        if($c->aborted()) { return; }
+        if($c->aborted()) { return ('ERROR', undef); }
 
         unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
             $r->print('Unable to tie database.');
-            return;
+            return ('ERROR', undef);
         }
         my ($problemData) = &ExtractStudentData(\%cache, $students);
         &CalculateStatistics($problemData, \%cache);
@@ -156,7 +120,7 @@
 
         unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) {
             $r->print('Unable to tie database.');
-            return;
+            return ('ERROR', undef);
         }
         foreach(keys(%$problemData)) {
             $cache{$_} = $problemData->{$_};
@@ -169,14 +133,76 @@
 
         unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
             $r->print('Unable to tie database.');
-            return;
+            return ('ERROR', undef);
         }
     }
 
     my $orderedProblems = &SortProblems(\%cache, 
                                         $cache{'ProblemStatisticsSort'},
+                                        $cache{'SortProblems'},
                                         $cache{'ProblemStatisticsAscend'});
-    &BuildStatisticsTable(\%cache, $cache{'DisplayFormat'}, $orderedProblems, 
+    return ('OK', $orderedProblems);
+}
+
+sub BuildProblemStatisticsPage {
+    my ($cacheDB, $students, $courseID, $c, $r)=@_;
+
+    my @Header = ("Homework Sets Order","#Stdnts","Tries","Mod",
+                  "Mean","#YES","#yes","%Wrng","DoDiff",
+                  "S.D.","Skew.","D.F.1st","D.F.2nd","Disc.");
+    my $color=&setbgcolor(0);
+    my %cache;
+
+    unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
+        $r->print('Unable to tie database.');
+        return;
+    }
+    my $Ptr = '';
+    $Ptr .= '<table border="0"><tbody>';
+    $Ptr .= '<tr><td align="right"><b>Select Map</b></td>'."\n";
+    $Ptr .= '<td align="left">';
+    $Ptr .= &Apache::lonhtmlcommon::MapOptions(\%cache, 'ProblemStatistics',
+                                               'Statistics');
+    $Ptr .= '</td></tr>'."\n";
+    $Ptr .= '<tr><td align="right"><b>Sorting Type:</b></td>'."\n";
+    $Ptr .= '<td align="left">'."\n";
+    $Ptr .= &Apache::lonhtmlcommon::AscendOrderOptions(
+                                            $cache{'ProblemStatisticsAscend'}, 
+                                            'ProblemStatistics',
+                                            'Statistics');
+    $Ptr .= '</td></tr>'."\n";
+    $Ptr .= '<tr><td align="right"><b>Select Sections</b>';
+    $Ptr .= '</td>'."\n";
+    $Ptr .= '<td align="left">'."\n";
+    my @sections = split(':',$cache{'sectionList'});
+    my @sectionsSelected = split(':',$cache{'sectionsSelected'});
+    $Ptr .= &Apache::lonhtmlcommon::MultipleSectionSelect(\@sections,
+                                                          \@sectionsSelected,
+                                                          'Statistics');
+    $Ptr .= '</td></tr>'."\n";
+    $Ptr .= &ProblemStatisticsButtons($cache{'DisplayFormat'}, 
+                                      $cache{'DisplayLegend'},
+                                      $cache{'SortProblems'});
+    $Ptr .= '</table>';
+    if($cache{'DisplayLegend'} eq 'Show Legend') {
+        $Ptr .= &ProblemStatisticsLegend();
+    }
+    $r->print($Ptr);
+    $r->rflush();
+    untie(%cache);
+
+    my ($result, $orderedProblems) =
+        &InitializeProblemStatistics($cacheDB, $students, $courseID, $c, $r);
+    if($result ne 'OK') {
+        return;
+    }
+
+    unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
+        $r->print('Unable to tie database.');
+        return;
+    }
+    &BuildStatisticsTable(\%cache, $cache{'DisplayFormat'}, 
+                          $cache{'SortProblems'}, $orderedProblems, 
                           \@Header, $r, $color);
     untie(%cache);
 
@@ -184,12 +210,18 @@
 }
 
 sub BuildGraphicChart {
-    my ($graph,$cacheDB,$courseDescription,$r)=@_;
+    my ($graph,$cacheDB,$courseDescription,$students,$courseID,$r,$c)=@_;
     my %cache;
     my $max = 0;
 
+    my ($result, undef) = 
+        &InitializeProblemStatistics($cacheDB, $students, $courseID, $c, $r);
+    if($result ne 'OK') {
+        return;
+    }
+
     unless(tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
-        return '<html><body>Unable to tie database.</body></html>';
+        return 'Unable to tie database.';
     }
    
     my @problems = split(':::', $cache{'problemList'});
@@ -221,7 +253,8 @@
                  $sendValues);
 
     $r->print('</form>'."\n");
-    $r->print('<IMG src="/cgi-bin/graph.gif?'.(join('&', @GData)).'" border="1" />');
+    $r->print('<IMG src="/cgi-bin/graph.gif?'.(join('&', @GData)).
+              '" border="1" />');
     $r->print('<form>'."\n");
 
     return;
@@ -247,7 +280,8 @@
 }
 
 sub BuildStatisticsTable {
-    my ($cache,$displayFormat,$orderedProblems,$headings,$r,$color)=@_;
+    my ($cache,$displayFormat,$sortProblems,$orderedProblems,$headings,
+        $r,$color)=@_;
 
 #6666666
 #    my $file="/home/httpd/perl/tmp/183d.txt";
@@ -263,15 +297,8 @@
 ##777777
 ##    $Str .= &Classify($discriminantFactor, $students);
 
-     if($displayFormat ne 'Display CSV Format') {
-        $r->print('<table border="0"><tr><td bgcolor="#777777">'."\n");
-        $r->print('<table border="0" cellpadding="3">'."\n");
-        $r->print(&CreateProblemStatisticsTableHeading($headings, $r));
-    } else {
-        $r->print('<br>');
-    }
-
     my $count = 1;
+    my $currentSequence = -1;
     foreach(@$orderedProblems) {
         my ($sequence,$problem,$part)=split(':', $_);
         if($cache->{'StatisticsMaps'} ne 'All Maps'  &&
@@ -279,11 +306,33 @@
             next;
         }
 
+        if($currentSequence == -1 || 
+           ($sortProblems eq 'Sort Within Sequence' && 
+            $currentSequence != $sequence)) {
+            if($displayFormat ne 'Display CSV Format') {
+                if($currentSequence ne -1) {
+                    $r->print('</table>');
+                    $r->print('</td></tr></table><br>');
+                }
+                if($sortProblems eq 'Sort Within Sequence') {
+                    $r->print('<b>'.$cache->{$sequence.':title'}.'</b>');
+                }
+                $r->print('<table border="0"><tr><td bgcolor="#777777">'."\n");
+                $r->print('<table border="0" cellpadding="3">'."\n");
+                $r->print(&CreateProblemStatisticsTableHeading($headings, $r));
+            } else {
+                if($sortProblems eq 'Sort Within Sequence') {
+                    $r->print('"'.$cache->{$sequence.':title'}.'"');
+                }
+                $r->print('<br>');
+            }
+            $currentSequence = $sequence;
+        }
+
         my $ref = '<a href="'.$cache->{$problem.':source'}.
                   '" target="_blank">'.$cache->{$problem.':title'}.'</a>';
-#        my $ref = $cache->{$problem.':title'};
         my $title = $cache->{$problem.':title'};
-        my $source = 'source';
+        my $source = $cache->{$problem.':source'};
         my $tableData = join('&', $ref, $title, $source,
                        $cache->{$_.':studentCount'},
                        $cache->{$_.':totalTries'},
@@ -300,12 +349,15 @@
                        0); # 0 is for discussion, need to figure out
 
         &TableRow($displayFormat,$tableData,$count,$r,$color);
+
         $count++;
     }
-    if($cache->{'DisplayFormat'} ne 'Display CSV Format') {
+    if($displayFormat ne 'Display CSV Format') {
         $r->print('</table>'."\n");
+        $r->print('</td></tr></table>');
+    } else {
+        $r->print('<br>');
     }
-    $r->print('</td></tr></table>');
 #6666666
 #	    $r->print('<br>'.$out.'&'.$DoD);
 #            print (OUT $out.'@'.$DoD.'&');
@@ -323,43 +375,43 @@
        $Wrng,$DoD,$SD,$Sk,$_D1,$_D2,$DiscNo,$Prob)=split(/\&/,$Str);	
     my $Ptr;
     if($displayFormat eq 'Display CSV Format') {
-        $Ptr="\n".'<br>'.
-             "\n".'"'.$RealIdx.'",'.
-             "\n".'"'.$title.'",'.
-             "\n".'"'.$source.'",'.
-             "\n".'"'.$StdNo.'",'.
-             "\n".'"'.$TotalTries.'",'.
-             "\n".'"'.$MxTries.'",'.
-             "\n".'"'.$Avg.'",'.
-             "\n".'"'.$YES.'",'.
-             "\n".'"'.$Override.'",'.
-             "\n".'"'.$Wrng.'",'.
-             "\n".'"'.$DoD.'",'.
-             "\n".'"'.$SD.'",'.
-             "\n".'"'.$Sk.'",'.
-             "\n".'"'.$_D1.'",'.
-	     "\n".'"'.$_D2.'"'.
-	     "\n".'"'.$DiscNo.'"';
+        $Ptr='"'.$RealIdx.'",'."\n".
+             '"'.$title.'",'."\n".
+             '"'.$source.'",'."\n".
+             '"'.$StdNo.'",'."\n".
+             '"'.$TotalTries.'",'."\n".
+             '"'.$MxTries.'",'."\n".
+             '"'.$Avg.'",'."\n".
+             '"'.$YES.'",'."\n".
+             '"'.$Override.'",'."\n".
+             '"'.$Wrng.'",'."\n".
+             '"'.$DoD.'",'."\n".
+             '"'.$SD.'",'."\n".
+             '"'.$Sk.'",'."\n".
+             '"'.$_D1.'",'."\n".
+             '"'.$_D2.'"'."\n".
+             '"'.$DiscNo.'"'."\n".
+             "<br>\n";
 
         $r->print("\n".$Ptr);
     } else {
-        $Ptr="\n".'<tr>'.
-             "\n".'<td bgcolor="#ffffe6">'.$RealIdx.'</td>'.
-             "\n".'<td bgcolor="#ffffe6">'.$ref.'</td>'.
-             "\n".'<td bgcolor='.$color->{"yellow"}.'> '.$StdNo.'</td>'.
-             "\n".'<td bgcolor='.$color->{"yellow"}.'>'.$TotalTries.'</td>'.
-             "\n".'<td bgcolor='.$color->{"yellow"}.'>'.$MxTries.'</td>'.
-             "\n".'<td bgcolor='.$color->{"gb"}.'>'.$Avg.'</td>'.
-             "\n".'<td bgcolor='.$color->{"gb"}.'> '.$YES.'</td>'.
-             "\n".'<td bgcolor='.$color->{"gb"}.'> '.$Override.'</td>'.
-             "\n".'<td bgcolor='.$color->{"red"}.'> '.$Wrng.'</td>'.
-             "\n".'<td bgcolor='.$color->{"red"}.'> '.$DoD.'</td>'.
-             "\n".'<td bgcolor='.$color->{"green"}.'> '.$SD.'</td>'.
-             "\n".'<td bgcolor='.$color->{"green"}.'> '.$Sk.'</td>'.
-             "\n".'<td bgcolor='.$color->{"purple"}.'> '.$_D1.'</td>'.
-	     "\n".'<td bgcolor='.$color->{"purple"}.'> '.$_D2.'</td>'.
-             "\n".'<td bgcolor='.$color->{"yellow"}.'> '.$DiscNo.'</td>';
-        $r->print("\n".$Ptr.'</tr>' );
+        $Ptr='<tr>'."\n".
+             '<td bgcolor="#ffffe6">'.$RealIdx.'</td>'."\n".
+             '<td bgcolor="#ffffe6">'.$ref.'</td>'."\n".
+             '<td bgcolor='.$color->{"yellow"}.'> '.$StdNo.'</td>'."\n".
+             '<td bgcolor='.$color->{"yellow"}.'>'.$TotalTries.'</td>'."\n".
+             '<td bgcolor='.$color->{"yellow"}.'>'.$MxTries.'</td>'."\n".
+             '<td bgcolor='.$color->{"gb"}.'>'.$Avg.'</td>'."\n".
+             '<td bgcolor='.$color->{"gb"}.'> '.$YES.'</td>'."\n".
+             '<td bgcolor='.$color->{"gb"}.'> '.$Override.'</td>'."\n".
+             '<td bgcolor='.$color->{"red"}.'> '.$Wrng.'</td>'."\n".
+             '<td bgcolor='.$color->{"red"}.'> '.$DoD.'</td>'."\n".
+             '<td bgcolor='.$color->{"green"}.'> '.$SD.'</td>'."\n".
+             '<td bgcolor='.$color->{"green"}.'> '.$Sk.'</td>'."\n".
+             '<td bgcolor='.$color->{"purple"}.'> '.$_D1.'</td>'."\n".
+	     '<td bgcolor='.$color->{"purple"}.'> '.$_D2.'</td>'."\n".
+             '<td bgcolor='.$color->{"yellow"}.'> '.$DiscNo.'</td>'."\n";
+        $r->print($Ptr.'</tr>'."\n");
     }
 
     return;
@@ -387,7 +439,7 @@
 }
 
 sub ProblemStatisticsButtons {
-    my ($displayFormat, $displayLegend)=@_;
+    my ($displayFormat, $displayLegend, $sortProblems)=@_;
 
     my $Ptr = '<tr><td></td><td align="left">';
     $Ptr .= '<input type="submit" name="DoDiffGraph" ';
@@ -396,6 +448,13 @@
     $Ptr .= '<input type="submit" name="PercentWrongGraph" ';
     $Ptr .= 'value="%Wrong Graph" />'."\n";
     $Ptr .= '</td></tr><tr><td></td><td>'."\n";
+    $Ptr .= '<input type="submit" name="SortProblems" ';
+    if($sortProblems eq 'Sort All Problems') {
+        $Ptr .= 'value="Sort Within Sequence" />'."\n";
+    } else {
+        $Ptr .= 'value="Sort All Problems" />'."\n";
+    }
+    $Ptr .= '&nbsp;&nbsp;&nbsp;';
     $Ptr .= '<input type="submit" name="DisplayLegend" ';
     if($displayLegend eq 'Show Legend') {
         $Ptr .= 'value="Hide Legend" />'."\n";
@@ -590,7 +649,7 @@
 }
 
 sub SortProblems {
-    my ($problemData,$sortBy,$ascend)=@_;
+    my ($problemData,$sortBy,$sortProblems,$ascend)=@_;
 
     my @problems = split(':::', $problemData->{'problemList'});
     if($sortBy eq "Homework Sets Order") {
@@ -614,9 +673,24 @@
     elsif($sortBy eq "Disc.")   { $data = ''; }
     else                        { return \@problems; }
 
-    my @orderedProblems = 
-        sort { $problemData->{$a.$data} <=> $problemData->{$b.$data} }
-             @problems;
+    my %temp;
+    foreach(@problems) {
+        my ($sequence) = split(':', $_);
+        $temp{$_} = $sequence;
+    }
+
+    my @orderedProblems;
+    if($sortProblems eq "Sort Within Sequence") {
+        @orderedProblems = 
+            sort { $temp{$a} cmp $temp{$b} ||
+                   $problemData->{$a.$data} <=> $problemData->{$b.$data} }
+        @problems;
+    } else {
+        @orderedProblems = 
+            sort { $problemData->{$a.$data} <=> $problemData->{$b.$data} }
+        @problems;
+    }
+
     if($ascend eq 'Descending') {
         @orderedProblems = reverse(@orderedProblems);
     }

--stredwic1029347119--