Diff for /loncom/interface/Attic/lonchart.pm between versions 1.46 and 1.54

version 1.46, 2002/06/28 21:12:46 version 1.54, 2002/07/03 14:11:14
Line 46 Line 46
 #  #
 ###  ###
   
   =pod
   
   =cut
   
 package Apache::lonchart;  package Apache::lonchart;
   
 use strict;  use strict;
Line 55  use Apache::loncommon(); Line 59  use Apache::loncommon();
 use HTML::TokeParser;  use HTML::TokeParser;
 use GDBM_File;  use GDBM_File;
   
 my $jr;   #my $jr; 
 # ----- FORMAT PRINT DATA ----------------------------------------------  # ----- FORMAT PRINT DATA ----------------------------------------------
   
 sub FormatStudentInformation {  sub FormatStudentInformation {
     my ($cache,$name,$studentInformation,$spacePadding)=@_;      my ($cache,$name,$studentInformation,$spacePadding)=@_;
     my $Str='<pre>';      my $Str='';
   
     foreach (@$studentInformation) {      for(my $index=0; $index<(scalar @$studentInformation); $index++) {
  my $data=$cache->{$name.':'.$_};          if(!&ShouldShowColumn($cache, 'heading'.$index)) {
               next;
           }
    my $data=$cache->{$name.':'.$studentInformation->[$index]};
  $Str .= $data;   $Str .= $data;
   
  my @dataLength=split(//,$data);   my @dataLength=split(//,$data);
  my $length=scalar @dataLength;   my $length=scalar @dataLength;
  $Str .= (' 'x($cache->{$_.'Length'}-$length));   $Str .= (' 'x($cache->{$studentInformation->[$index].'Length'}-
                         $length));
  $Str .= $spacePadding;   $Str .= $spacePadding;
     }      }
   
Line 91  sub FormatStudentData { Line 99  sub FormatStudentData {
   
     # Handle errors      # Handle errors
     if($CacheData{$name.':error'} =~ /environment/) {      if($CacheData{$name.':error'} =~ /environment/) {
           $Str .= '<br>';
         untie(%CacheData);          untie(%CacheData);
         $Str .= '</pre>';  
         return $Str;          return $Str;
 # my $errorMessage = $CacheData{$name.':error'};  
 # return '<td>'.$sname.'</td><td>'.$sdom.  
 #    '</td><td><font color="#000088">'.$errorMessage.'</font></td>';  
     }      }
   
     if($CacheData{$name.':error'} =~ /course/) {      if($CacheData{$name.':error'} =~ /course/) {
           $Str .= '<br>';
         untie(%CacheData);          untie(%CacheData);
         $Str .= '</pre>';          return $Str;
  return $Str;  
 # my $errorMessage = 'May have no course data or '.  
 #                   $CacheData{$name.':error'};  
 # return '<td>'.$sname.'</td><td>'.$sdom.  
 #    '</td><td><font color="#000088">'.$errorMessage.'</font></td>';  
     }      }
   
     # Handle problem data ------------------------------------------------      # Handle problem data ------------------------------------------------
Line 116  sub FormatStudentData { Line 117  sub FormatStudentData {
     my $problemsSolved  = 0;      my $problemsSolved  = 0;
     my $numberOfParts   = 0;      my $numberOfParts   = 0;
     foreach my $sequence (split(/\:/,$CacheData{'orderedSequences'})) {      foreach my $sequence (split(/\:/,$CacheData{'orderedSequences'})) {
           if(!&ShouldShowColumn(\%CacheData, 'sequence'.$sequence)) {
               next;
           }
   
  my $characterCount=0;   my $characterCount=0;
  foreach my $problemID (split(/\:/,$CacheData{$sequence.':problems'})) {   foreach my $problemID (split(/\:/,$CacheData{$sequence.':problems'})) {
     my $problem = $CacheData{$problemID.':problem'};      my $problem = $CacheData{$problemID.':problem'};
Line 207  sub FormatStudentData { Line 212  sub FormatStudentData {
         $Str .= $spacePadding;          $Str .= $spacePadding;
     }      }
   
     $Str .= '<font color="#000088">'.$problemsSolved.      my $outputProblemsSolved = sprintf( "%4d", $problemsSolved );
     ' / '.$totalProblems.'</font></pre>';      my $outputTotalProblems  = sprintf( "%4d", $totalProblems );
       $Str .= '<font color="#000088">'.$outputProblemsSolved.
       ' / '.$outputTotalProblems.'</font><br>';
   
     untie(%CacheData);      untie(%CacheData);
     return $Str;      return $Str;
Line 216  sub FormatStudentData { Line 223  sub FormatStudentData {
   
 sub CreateTableHeadings {  sub CreateTableHeadings {
     my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;      my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;
     my $Str='<pre>';      my $Str='<tr>';
   
     for(my $index=0; $index<(scalar @$headings); $index++) {      for(my $index=0; $index<(scalar @$headings); $index++) {
           if(!&ShouldShowColumn($CacheData, 'heading'.$index)) {
               next;
           }
   
           $Str .= '<td align="left"><pre>';
  my $data=$$headings[$index];   my $data=$$headings[$index];
  $Str .= $data;   $Str .= $data;
   
Line 227  sub CreateTableHeadings { Line 239  sub CreateTableHeadings {
  $Str .= (' 'x($CacheData->{$$studentInformation[$index].'Length'}-   $Str .= (' 'x($CacheData->{$$studentInformation[$index].'Length'}-
                       $length));                        $length));
  $Str .= $spacePadding;   $Str .= $spacePadding;
           $Str .= '</pre></td>';
     }      }
   
     foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {      foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {
  $Str .= $CacheData->{$sequence.':title'};          if(!&ShouldShowColumn($CacheData, 'sequence'.$sequence)) {
               next;
           }
   
           $Str .= '<td align="left"><pre>';
           my $name = $CacheData->{$sequence.':title'};
    $Str .= $name;
  my @titleLength=split(//,$CacheData->{$sequence.':title'});   my @titleLength=split(//,$CacheData->{$sequence.':title'});
  my $leftover=$CacheData->{$sequence.':columnWidth'}-   my $leftover=$CacheData->{$sequence.':columnWidth'}-
                      (scalar @titleLength);                       (scalar @titleLength);
  $Str .= (' 'x$leftover);   $Str .= (' 'x$leftover);
  $Str .= $spacePadding;   $Str .= $spacePadding;
           $Str .= '</pre></td>';
     }      }
   
     $Str .= 'Total Solved/Total Problems';      $Str .= '<td><pre>Total Solved/Total Problems</pre></td>';
     $Str .= '</pre>';      $Str .= '</tr></tbody></table>';
   
     return $Str;      return $Str;
 }  }
   
 sub CreateColumnSelectors {  sub CreateColumnSelectionBox {
     my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;      my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;
     my $Str='';  
   
     $Str .= '<form name="stat" method="post" action="/adm/chart" >'."\n";      my $missing=0;
     $Str .= '<input type="submit" name="sort" value="Refresh Chart"/>';      my $notThere='<tr><td align="right"><b>Select column to view:</b>';
     $Str .= '</form>'."\n";      my $name;
     return $Str;      $notThere .= '<td align="left">';
       $notThere .= '<select name="reselect" size="4" multiple="true">'."\n";
   
     for(my $index=0; $index<(scalar @$headings); $index++) {      for(my $index=0; $index<(scalar @$headings); $index++) {
  my $data=$$headings[$index];          if(&ShouldShowColumn($CacheData, 'heading'.$index)) {
  $Str .= $data;              next;
           }
           $name = $headings->[$index];
           $notThere .= '<option value="heading'.$index.'">';
           $notThere .= $name.'</option>'."\n";
           $missing++;
       }
   
  my @dataLength=split(//,$data);      foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {
  my $length=scalar @dataLength;          if(&ShouldShowColumn($CacheData, 'sequence'.$sequence)) {
  $Str .= (' 'x($CacheData->{$$studentInformation[$index].'Length'}-              next;
                       $length));          }
  $Str .= $spacePadding;          $name = $CacheData->{$sequence.':title'};
           $notThere .= '<option value="sequence'.$sequence.'">';
           $notThere .= $name.'</option>'."\n";
           $missing++;
       }
   
       if($missing) {
           $notThere .= '</select>';
       } else {
           $notThere='<tr><td>';
       }
   
       return $notThere.'</td></tr></tbody></table>';
   }
   
   sub CreateColumnSelectors {
       my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;
   
       my $found=0;
       my ($name, $length, $position);
   
       my $present='<pre><b>Note: Uncheck the boxes above a column to ';
       $present .= 'remove that column from the display.</b></pre>'."\n";
   
       $present .= '<table border="0" cellpadding="0" cellspacing="0">';
       $present .= '<tbody><tr>';
       for(my $index=0; $index<(scalar @$headings); $index++) {
           if(!&ShouldShowColumn($CacheData, 'heading'.$index)) {
               next;
           }
           $present .= '<td align="left">';
           $present .= '<input type="checkbox" checked="on" ';
           $present .= 'name="heading'.$index.'" />';
           $present .= '</td>';
           $found++;
     }      }
   
     foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {      foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {
  $Str .= $CacheData->{$sequence.':title'};          if(!&ShouldShowColumn($CacheData, 'sequence'.$sequence)) {
  my @titleLength=split(//,$CacheData->{$sequence.':title'});              next;
  my $leftover=$CacheData->{$sequence.':columnWidth'}-          }
                      (scalar @titleLength);          $present .= '<td align="left">';
  $Str .= (' 'x$leftover);          $present .= '<input type="checkbox" checked="on" ';
  $Str .= $spacePadding;          $present .= 'name="sequence'.$sequence.'" />';
           $present .= '</td>';
           $found++;
     }      }
   
     return $Str;      if(!$found) {
           $present = '';
       }
   
       return $present.'<td></td></tr></form>'."\n";;
 }  }
   
 sub CreateForm {  sub CreateForm {
       my ($CacheData)=@_;
     my $OpSel1='';      my $OpSel1='';
     my $OpSel2='';      my $OpSel2='';
     my $OpSel3='';      my $OpSel3='';
     my $Status = $ENV{'form.status'};      my $Status = $CacheData->{'form.status'};
     if ( $Status eq 'Any' ) { $OpSel3='selected'; }      if ( $Status eq 'Any' ) { $OpSel3='selected'; }
     elsif ($Status eq 'Expired' ) { $OpSel2 = 'selected'; }      elsif ($Status eq 'Expired' ) { $OpSel2 = 'selected'; }
     else { $OpSel1 = 'selected'; }      else { $OpSel1 = 'selected'; }
   
     my $Ptr = '<form name="stat" method="post" action="/adm/chart" >'."\n";      my $Ptr .= '<form name="stat" method="post" action="/adm/chart" >'."\n";
     $Ptr .= '<b> Sort by: &nbsp; </b>'."\n";      $Ptr .= '<table border="0"><tbody>';
       $Ptr .= '<tr><td align="right">';
       $Ptr .= '</td><td align="left">';
       $Ptr .= '<input type="submit" name="recalculate" ';
       $Ptr .= 'value="Recalculate Chart"/>'."\n";
       $Ptr .= '&nbsp;&nbsp;&nbsp;';
       $Ptr .= '<input type="submit" name="refresh" ';
       $Ptr .= 'value="Refresh Chart"/>'."\n";
     $Ptr .= '&nbsp;&nbsp;&nbsp;';      $Ptr .= '&nbsp;&nbsp;&nbsp;';
       $Ptr .= '<input type="submit" name="reset" ';
       $Ptr .= 'value="Reset Selections"/></td>'."\n";
       $Ptr .= '</tr><tr><td align="right">';
       $Ptr .= '<b> Sort by: </b>'."\n";
       $Ptr .= '</td><td align="left">';
     $Ptr .= '<input type="submit" name="sort" value="User Name" />'."\n";      $Ptr .= '<input type="submit" name="sort" value="User Name" />'."\n";
     $Ptr .= '&nbsp;&nbsp;&nbsp;';      $Ptr .= '&nbsp;&nbsp;&nbsp;';
     $Ptr .= '<input type="submit" name="sort" value="Last Name" />'."\n";      $Ptr .= '<input type="submit" name="sort" value="Last Name" />'."\n";
     $Ptr .= '&nbsp;&nbsp;&nbsp;';      $Ptr .= '&nbsp;&nbsp;&nbsp;';
     $Ptr .= '<input type="submit" name="sort" value="Section"/>'."\n";      $Ptr .= '<input type="submit" name="sort" value="Section"/>'."\n";
     $Ptr .= '<br><br>';      $Ptr .= '</td></tr><tr><td align="right">';
     $Ptr .= '<b> Student Status: &nbsp; </b>'."\n".      $Ptr .= '<b> Student Status: &nbsp; </b>'."\n".
               '</td><td align="left">'.
             '<select name="status">'.               '<select name="status">'. 
             '<option '.$OpSel1.' >Active</option>'."\n".              '<option '.$OpSel1.' >Active</option>'."\n".
             '<option '.$OpSel2.' >Expired</option>'."\n".              '<option '.$OpSel2.' >Expired</option>'."\n".
     '<option '.$OpSel3.' >Any</option> </select> '."\n";      '<option '.$OpSel3.' >Any</option> </select> '."\n";
     $Ptr .= '<br><br>';      $Ptr .= '</td></tr>';
     $Ptr .= '<input type="submit" name="sort" value="Recalculate Chart"/>';  
     $Ptr .= "\n";  
     $Ptr .= '&nbsp;&nbsp;&nbsp;';  
     $Ptr .= '<input type="submit" name="sort" value="Refresh Chart"/>';  
     $Ptr .= "\n";  
     $Ptr .= '</form>'."\n";  
   
     return $Ptr;      return $Ptr;
 }  }
   
 sub CreateLegend {  sub CreateLegend {
     my $Str = '<h1>'.$ENV{'course.'.$ENV{'request.course.id'}.'.description'}.      my $Str = "<p><pre>".
               '</h1><h3>'.localtime().                "1..9: correct by student in 1..9 tries\n".
               "</h3><p><pre>1..9: correct by student in 1..9 tries\n".  
               "   *: correct by student in more than 9 tries\n".                "   *: correct by student in more than 9 tries\n".
       "   +: correct by override\n".        "   +: correct by override\n".
               "   -: incorrect by override\n".                "   -: incorrect by override\n".
       "   .: incorrect attempted\n".        "   .: incorrect attempted\n".
       "   #: ungraded attempted\n".        "   #: ungraded attempted\n".
               "    : not attempted\n".                "    : not attempted\n".
       "   x: excused</pre><p>";         "   x: excused".
                 "</pre><p>"; 
     return $Str;      return $Str;
 }  }
   
Line 333  sub StartDocument { Line 407  sub StartDocument {
     $Str .= '<script>window.focus();</script>';      $Str .= '<script>window.focus();</script>';
     $Str .= '<img align=right src=/adm/lonIcons/lonlogos.gif>';      $Str .= '<img align=right src=/adm/lonIcons/lonlogos.gif>';
     $Str .= '<h1>Assessment Chart</h1>';      $Str .= '<h1>Assessment Chart</h1>';
       $Str .= '<h1>'.$ENV{'course.'.$ENV{'request.course.id'}.'.description'};
       $Str .= '</h1>';
   
     return $Str;      return $Str;
 }  }
Line 442  sub ProcessTopResourceMap { Line 518  sub ProcessTopResourceMap {
     push(@finishResource, $lastResourceID);      push(@finishResource, $lastResourceID);
   
     $currentSequence=$hash{'map_pc_'.$hash{'src_'.$currentResourceID}};      $currentSequence=$hash{'map_pc_'.$hash{'src_'.$currentResourceID}};
   
               # Mark sequence as containing problems.  If it doesn't, then
               # it will be removed when processing for this sequence is
               # complete.  This allows the problems in a sequence
               # to be outputed before problems in the subsequences
               if(!defined($CacheData{'orderedSequences'})) {
                   $CacheData{'orderedSequences'}=$currentSequence;
               } else {
                   $CacheData{'orderedSequences'}.=':'.$currentSequence;
               }
   
     $lastResourceID=$hash{'map_finish_'.      $lastResourceID=$hash{'map_finish_'.
   $hash{'src_'.$currentResourceID}};    $hash{'src_'.$currentResourceID}};
     $currentResourceID=$hash{'map_start_'.      $currentResourceID=$hash{'map_start_'.
Line 503  sub ProcessTopResourceMap { Line 590  sub ProcessTopResourceMap {
   
     if(defined($CacheData{$currentSequence.':problems'})) {      if(defined($CacheData{$currentSequence.':problems'})) {
  # Capture sequence information here   # Capture sequence information here
  if(!defined($CacheData{'orderedSequences'})) {  
     $CacheData{'orderedSequences'}=$currentSequence;  
  } else {  
     $CacheData{'orderedSequences'}.=':'.$currentSequence;  
  }  
   
  $CacheData{$currentSequence.':title'}=   $CacheData{$currentSequence.':title'}=
     $hash{'title_'.$currentResourceID};      $hash{'title_'.$currentResourceID};
   
                 my $totalProblems=0;                  my $totalProblems=0;
                 foreach (split(/\:/,$CacheData{$currentSequence.                  foreach my $currentProblem (split(/\:/,
                                                  $CacheData{$currentSequence.
                                                ':problems'})) {                                                 ':problems'})) {
                     foreach ($CacheData{$currentSequence.':'.$_.':parts'}) {                      foreach (split(/\:/,$CacheData{$currentSequence.':'.
                                                      $currentProblem.
                                                      ':parts'})) {
                         $totalProblems++;                          $totalProblems++;
                     }                      }
                 }                  }
Line 531  sub ProcessTopResourceMap { Line 615  sub ProcessTopResourceMap {
     $CacheData{$currentSequence.':columnWidth'}=      $CacheData{$currentSequence.':columnWidth'}=
                         (scalar @titleLength);                          (scalar @titleLength);
  }   }
     }      } else {
                   $CacheData{'orderedSequences'}=~s/$currentSequence//;
                   $CacheData{'orderedSequences'}=~s/::/:/g;
                   $CacheData{'orderedSequences'}=~s/^:|:$//g;
               }
   
     $currentSequence=pop(@sequences);      $currentSequence=pop(@sequences);
     if($currentSequence eq $topLevelSequenceNumber) {      if($currentSequence eq $topLevelSequenceNumber) {
  last;   last;
     }      }
  #else  
  }   }
   
  # MOVE!!!   # MOVE!!!
Line 648  sub ProcessStudentInformation { Line 735  sub ProcessStudentInformation {
     }      }
   
     # Get student's section number      # Get student's section number
     my $sec=&ProcessSection($section, $courseID, $ENV{'form.status'});      my $sec=&ProcessSection($section, $courseID, $CacheData->{'form.status'});
     if($sec != -1) {      if($sec != -1) {
  $CacheData->{$name.':section'}=$sec;   $CacheData->{$name.':section'}=$sec;
     } else {      } else {
Line 665  sub ProcessClassList { Line 752  sub ProcessClassList {
     my %CacheData;      my %CacheData;
     if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) {      if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) {
         foreach my $name (keys(%$classlist)) {          foreach my $name (keys(%$classlist)) {
             if($name =~ /\:section/ || $name =~ /\:studentInformation/) {              if($name =~ /\:section/ || $name =~ /\:studentInformation/ ||
                  $name eq '') {
                 next;                  next;
             }              }
             if($c->aborted()) {              if($c->aborted()) {
Line 680  sub ProcessClassList { Line 768  sub ProcessClassList {
                                     $name,$courseID,$c);                                      $name,$courseID,$c);
         }          }
   
         $CacheData{'NamesOfStudents'}=join(":::",@names);          # Time of download
 #        $CacheData{'NamesOfStudents'}=&Apache::lonnet::arrayref2str(\@names);          $CacheData{'time'}=localtime();
  untie(%CacheData);   untie(%CacheData);
     }      }
   
Line 760  sub ProcessFullName { Line 848  sub ProcessFullName {
 }  }
   
 sub SortStudents {  sub SortStudents {
     my ($CacheData)=@_;      my ($students,$CacheData)=@_;
     my @students = split(/:::/,$CacheData->{'NamesOfStudents'});  
 #    my @students=&Apache::lonnet::str2array($CacheData->{'NamesOfStudents'});  
   
     my @sorted1Students=();      my @sorted1Students=();
     foreach (@students) {      foreach (@$students) {
         my ($end,$start)=split(/\:/,$CacheData->{$_.':date'});          my ($end,$start)=split(/\:/,$CacheData->{$_.':date'});
         my $active=1;          my $active=1;
         my $now=time;          my $now=time;
         my $Status=$ENV{'form.status'};          my $Status=$CacheData->{'form.status'};
         $Status = ($Status) ? $Status : 'Active';          $Status = ($Status) ? $Status : 'Active';
         if((($end) && $now > $end) && (($Status eq 'Active'))) {           if((($end) && $now > $end) && (($Status eq 'Active'))) { 
             $active=0;               $active=0; 
Line 782  sub SortStudents { Line 868  sub SortStudents {
         }          }
     }      }
   
     my $Pos = $ENV{'form.sort'};      my $Pos = $CacheData->{'form.sort'};
     my %sortData;      my %sortData;
     if($Pos eq 'Last Name') {      if($Pos eq 'Last Name') {
  for(my $index=0; $index<scalar @sorted1Students; $index++) {   for(my $index=0; $index<scalar @sorted1Students; $index++) {
Line 802  sub SortStudents { Line 888  sub SortStudents {
     }      }
   
     my @order = ();      my @order = ();
     foreach my $key (sort keys(%sortData)) {      foreach my $key (sort(keys(%sortData))) {
  push (@order,$sortData{$key});   push (@order,$sortData{$key});
     }      }
   
Line 815  sub TestCacheData { Line 901  sub TestCacheData {
     my %testData;      my %testData;
     my $tieTries=0;      my $tieTries=0;
   
     if ((-e "$ChartDB") && ($ENV{'form.sort'} ne 'Recalculate Chart')) {      if ((-e "$ChartDB") && (!defined($ENV{'form.recalculate'}))) {
  $isCached = 1;   $isCached = 1;
     } else {      } else {
  $isCached = 0;   $isCached = 0;
     }      }
   
     while($tieTries < 3) {      while($tieTries < 10) {
         my $result=0;          my $result=0;
         if($isCached) {          if($isCached) {
             $result=tie(%testData,'GDBM_File',$ChartDB,&GDBM_READER,0640);              $result=tie(%testData,'GDBM_File',$ChartDB,&GDBM_READER,0640);
Line 834  sub TestCacheData { Line 920  sub TestCacheData {
         $tieTries++;          $tieTries++;
         sleep 1;          sleep 1;
     }      }
     if($tieTries >= 3) {      if($tieTries >= 10) {
         return -1;          return -1;
     }      }
   
Line 855  sub ExtractStudentData { Line 941  sub ExtractStudentData {
             foreach my $key (keys (%$courseData)) {              foreach my $key (keys (%$courseData)) {
                 $CacheData{$name.':'.$key}=$courseData->{$key};                  $CacheData{$name.':'.$key}=$courseData->{$key};
             }              }
               if(defined($CacheData{'NamesOfStudents'})) {
                   $CacheData{'NamesOfStudents'}.=':::'.$name;
               } else {
                   $CacheData{'NamesOfStudents'}=$name;
               }
         }          }
         untie(%CacheData);          untie(%CacheData);
     }      }
Line 862  sub ExtractStudentData { Line 953  sub ExtractStudentData {
     return;      return;
 }  }
   
   sub ShouldShowColumn {
       my ($cache,$test)=@_;
   
       if($cache->{'form.reset'} eq 'true') {
           return 1;
       }
   
       my $headings=$cache->{'form.headings'};
       my $sequences=$cache->{'form.sequences'};
       if($headings eq 'ALLHEADINGS' || $sequences eq 'ALLSEQUENCES' ||
          $headings=~/$test/ || $sequences=~/$test/) {
           return 1;
       }
   
   #    my $reselected=$cache->{'form.reselect'};
   #    if($reselected=~/$test/) {
   #        return 1;
   #    }
   
       return 0;
   }
   
   sub ProcessFormData {
       my ($ChartDB)=@_;
       my %CacheData;
   
       if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) {
           if(defined($ENV{'form.sort'})) {
               $CacheData{'form.sort'}=$ENV{'form.sort'};
           } elsif(!defined($CacheData{'form.sort'})) {
               $CacheData{'form.sort'}='username';
           }
   
           # Ignore $ENV{'form.refresh'}
           # Ignore $ENV{'form.recalculate'}
   
           if(defined($ENV{'form.status'})) {
               $CacheData{'form.status'}=$ENV{'form.status'};
           } elsif(!defined($CacheData{'form.status'})) {
               $CacheData{'form.status'}='Active';
           }
   
           my @headings=();
           my @sequences=();
           my $found=0;
           foreach (keys(%ENV)) {
               if(/form\.heading/) {
                   $found++;
                   push(@headings, $_);
               } elsif(/form\.sequence/) {
                   $found++;
                   push(@sequences, $_);
               } elsif(/form\./) {
                   $found++;
               }
           }
   
           if($found) {
               $CacheData{'form.headings'}=join(":::",@headings);
               $CacheData{'form.sequences'}=join(":::",@sequences);
           }
   
           if(defined($ENV{'form.reselect'})) {
               my @reselected = (ref($ENV{'form.reselect'}) ? 
                                 @{$ENV{'form.reselect'}}
                                 : ($ENV{'form.reselect'}));
               foreach (@reselected) {
                   if(/heading/) {
                       $CacheData{'form.headings'}.=":::".$_;
                   } elsif(/sequence/) {
                       $CacheData{'form.sequences'}.=":::".$_;
                   }
               }
           }
   
           if(defined($ENV{'form.reset'})) {
               $CacheData{'form.reset'}='true';
               $CacheData{'form.status'}='Active';
               $CacheData{'form.sort'}='username';
               $CacheData{'form.headings'}='ALLHEADINGS';
               $CacheData{'form.sequences'}='ALLSEQUENCES';
           } else {
               $CacheData{'form.reset'}='false';
           }
   
           untie(%CacheData);
       }
   
       return;
   }
   
 # ----- END HELPER FUNCTIONS --------------------------------------------  # ----- END HELPER FUNCTIONS --------------------------------------------
   
 sub BuildChart {  sub BuildChart {
Line 886  sub BuildChart { Line 1068  sub BuildChart {
         $r->rflush();          $r->rflush();
         return;          return;
     }      }
       &ProcessFormData($ChartDB);
   
     # Download class list information if not using cached data      # Download class list information if not using cached data
       my %CacheData;
     my @students=();      my @students=();
     my @studentInformation=('username','domain','section','id','fullname');      my @studentInformation=('username','domain','section','id','fullname');
     my @headings=('User Name','Domain','Section','PID','Full Name');      my @headings=('User Name','Domain','Section','PID','Full Name');
Line 911  sub BuildChart { Line 1095  sub BuildChart {
         &SpaceColumns(\@students,\@studentInformation,\@headings,          &SpaceColumns(\@students,\@studentInformation,\@headings,
                       $ChartDB);                        $ChartDB);
         if($c->aborted()) { return; }          if($c->aborted()) { return; }
       } else {
           if(!$c->aborted() && tie(%CacheData,'GDBM_File',$ChartDB,
                                    &GDBM_READER,0640)) {
               @students=split(/:::/,$CacheData{'NamesOfStudents'});
           }
     }      }
   
     # Sort students and print out table desciptive data      # Sort students and print out table desciptive data
     my %CacheData;  
     if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_READER,0640)) {      if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_READER,0640)) {
         if(!$c->aborted()) { @students=&SortStudents(\%CacheData); }          if(!$c->aborted()) { @students=&SortStudents(\@students,\%CacheData); }
  if(!$c->aborted()) { $r->print(&CreateLegend()); }          my $downloadTime=0;
  if(!$c->aborted()) { $r->print(&CreateForm()); }          if(defined($CacheData{'time'})) { $downloadTime=$CacheData{'time'}; }
  if(!$c->aborted()) { $r->print('<h3>'.(scalar @students).          else { $downloadTime=localtime(); }
                                        ' students</h3>'); }          if(!$c->aborted()) { $r->print('<h3>'.$downloadTime.'</h3>'); }
           if(!$c->aborted()) { $r->print('<h1>'.(scalar @students).
                                          ' students</h1>'); }
  if(!$c->aborted()) { $r->rflush(); }   if(!$c->aborted()) { $r->rflush(); }
 # if(!$c->aborted()) { $r->print(&CreateColumnSelectors(   if(!$c->aborted()) { $r->print(&CreateLegend()); }
 #                                                         \%CacheData,   if(!$c->aborted()) { $r->print(&CreateForm(\%CacheData)); }
 #                                                         \@studentInformation,    if(!$c->aborted()) { $r->print(&CreateColumnSelectionBox(
 # \@headings,                                                          \%CacheData,
 # $spacePadding)); }                                                         \@studentInformation, 
          \@headings, 
                                                          $spacePadding)); }
    if(!$c->aborted()) { $r->print(&CreateColumnSelectors(
                                                          \%CacheData,
                                                          \@studentInformation, 
          \@headings, 
                                                          $spacePadding)); }
  if(!$c->aborted()) { $r->print(&CreateTableHeadings(   if(!$c->aborted()) { $r->print(&CreateTableHeadings(
                                                          \%CacheData,                                                           \%CacheData,
                                                          \@studentInformation,                                                            \@studentInformation, 
  \@headings,    \@headings, 
  $spacePadding)); }   $spacePadding)); }
    if(!$c->aborted()) { $r->rflush(); }
  untie(%CacheData);   untie(%CacheData);
     } else {      } else {
  $r->print("Init2: Unable to tie hash to db file");   $r->print("Init2: Unable to tie hash to db file");
Line 940  sub BuildChart { Line 1138  sub BuildChart {
   
     my @updateStudentList = ();      my @updateStudentList = ();
     my $courseData;      my $courseData;
       $r->print('<pre>');
     foreach (@students) {      foreach (@students) {
         if($c->aborted()) {          if($c->aborted()) {
             if(!$isCached &&   
                tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) {  
                 $CacheData{'NamesOfStudents'}=join(":::", @updateStudentList);  
 #    $CacheData{'NamesOfStudents'}=  
 #            &Apache::lonnet::arrayref2str(\@updateStudentList);  
                 untie(%CacheData);  
             }  
             last;              last;
         }          }
   
         if(!$isCached) {          if(!$isCached) {
             $courseData=&DownloadStudentCourseInformation($_, $cid);              $courseData=&DownloadStudentCourseInformation($_, $cid);
             if($c->aborted()) { next; }              if($c->aborted()) { last; }
             push(@updateStudentList, $_);              push(@updateStudentList, $_);
             &ExtractStudentData($courseData, $_, $ChartDB);              &ExtractStudentData($courseData, $_, $ChartDB);
         }          }
Line 963  sub BuildChart { Line 1155  sub BuildChart {
         $r->rflush();          $r->rflush();
     }      }
   
     $r->print('</body></html>');      if(!$isCached && tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) {
           $CacheData{'NamesOfStudents'}=join(":::", @updateStudentList);
   #    $CacheData{'NamesOfStudents'}=
   #            &Apache::lonnet::arrayref2str(\@updateStudentList);
           untie(%CacheData);
       }
   
       $r->print('</pre></body></html>');
     $r->rflush();      $r->rflush();
   
     return;      return;
Line 973  sub BuildChart { Line 1172  sub BuildChart {
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
     $jr=$r;  #    $jr=$r;
     unless(&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {      unless(&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
  $ENV{'user.error.msg'}=   $ENV{'user.error.msg'}=
         $r->uri.":vgr:0:0:Cannot view grades for complete course";          $r->uri.":vgr:0:0:Cannot view grades for complete course";

Removed from v.1.46  
changed lines
  Added in v.1.54


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>