Diff for /loncom/interface/Attic/lonchart.pm between versions 1.48 and 1.50

version 1.48, 2002/07/01 15:39:55 version 1.50, 2002/07/02 15:13:06
Line 59  my $jr; Line 59  my $jr;
 # ----- FORMAT PRINT DATA ----------------------------------------------  # ----- FORMAT PRINT DATA ----------------------------------------------
   
 sub FormatStudentInformation {  sub FormatStudentInformation {
     my ($cache,$name,$studentInformation,$spacePadding)=@_;      my ($cache,$name,$studentInformation,$reselected,$spacePadding)=@_;
     my $Str='<pre>';      my $Str='';
   
     foreach (@$studentInformation) {      for(my $index=0; $index<(scalar @$studentInformation); $index++) {
  my $data=$cache->{$name.':'.$_};          if(!&ShouldShowColumn($reselected, '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 76  sub FormatStudentInformation { Line 80  sub FormatStudentInformation {
 }  }
   
 sub FormatStudentData {  sub FormatStudentData {
     my ($name,$coid,$studentInformation,$spacePadding,$ChartDB)=@_;      my ($reselected,$name,$coid,$studentInformation,$spacePadding,$ChartDB)=@_;
     my ($sname,$sdom) = split(/\:/,$name);      my ($sname,$sdom) = split(/\:/,$name);
     my $Str;      my $Str;
     my %CacheData;      my %CacheData;
Line 87  sub FormatStudentData { Line 91  sub FormatStudentData {
     # Handle Student information ------------------------------------------      # Handle Student information ------------------------------------------
     # Handle user data      # Handle user data
     $Str=&FormatStudentInformation(\%CacheData, $name, $studentInformation,       $Str=&FormatStudentInformation(\%CacheData, $name, $studentInformation, 
                                    $spacePadding);                                     $reselected, $spacePadding);
   
     # 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 113  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($reselected, '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 208  sub FormatStudentData { Line 209  sub FormatStudentData {
     }      }
   
     $Str .= '<font color="#000088">'.$problemsSolved.      $Str .= '<font color="#000088">'.$problemsSolved.
     ' / '.$totalProblems.'</font></pre>';      ' / '.$totalProblems.'</font><br>';
   
     untie(%CacheData);      untie(%CacheData);
     return $Str;      return $Str;
 }  }
   
 sub CreateTableHeadings {  sub CreateTableHeadings {
     my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;      my ($CacheData,$studentInformation,$headings,$reselected,$spacePadding)=@_;
     my $Str='<pre>';      my $Str='<pre>';
   
     for(my $index=0; $index<(scalar @$headings); $index++) {      for(my $index=0; $index<(scalar @$headings); $index++) {
           if(!&ShouldShowColumn($reselected, 'heading', $index)) {
               next;
           }
   
  my $data=$$headings[$index];   my $data=$$headings[$index];
  $Str .= $data;   $Str .= $data;
   
Line 230  sub CreateTableHeadings { Line 235  sub CreateTableHeadings {
     }      }
   
     foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {      foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {
  $Str .= $CacheData->{$sequence.':title'};          if(!&ShouldShowColumn($reselected, 'sequence', $sequence)) {
               next;
           }
   
           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);
Line 244  sub CreateTableHeadings { Line 254  sub CreateTableHeadings {
     return $Str;      return $Str;
 }  }
   
 sub CreateColumnSelectors {  sub CreateColumnSelectionBox {
     my ($CacheData,$studentInformation,$headings,$spacePadding)=@_;      my ($CacheData,$studentInformation,$headings,$reselected,$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($reselected, '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($reselected, '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,$reselected,$spacePadding)=@_;
   
       my $found=0;
       my ($name, $length, $position);
       my $present='<pre>';
       for(my $index=0; $index<(scalar @$headings); $index++) {
           if(!&ShouldShowColumn($reselected, 'heading', $index)) {
               next;
           }
           $name = $headings->[$index];
           $length=$CacheData->{$$studentInformation[$index].'Length'};
           $position=int($length/2);
    $present .= (' 'x($position));
           $present .= '<input type="checkbox" checked="on" ';
           $present .= 'name="heading'.$index.'">';
           $position+=2;
    $present .= (' 'x($length-$position));
    $present .= $spacePadding;
           $found++;
     }      }
   
     foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {      foreach my $sequence (split(/\:/,$CacheData->{'orderedSequences'})) {
  $Str .= $CacheData->{$sequence.':title'};          if(!&ShouldShowColumn($reselected, 'sequence', $sequence)) {
  my @titleLength=split(//,$CacheData->{$sequence.':title'});              next;
  my $leftover=$CacheData->{$sequence.':columnWidth'}-          }
                      (scalar @titleLength);          $name = $CacheData->{$sequence.':title'};
  $Str .= (' 'x$leftover);          $length=$CacheData->{$sequence.':columnWidth'};
  $Str .= $spacePadding;          $position=int($length/2);
    $present .= (' 'x($position));
           $present .= '<input type="checkbox" checked="on" ';
           $present .= 'name="sequence'.$sequence.'">';
           $position+=2;
    $present .= (' 'x($length-$position));
    $present .= $spacePadding;
           $found++;
     }      }
   
     return $Str;      if($found) {
           $present .= '</pre>';
           $present  = $present;
       } else {
           $present = '';
       }
   
       return $present.'</form>'."\n";;
 }  }
   
 sub CreateForm {  sub CreateForm {
Line 285  sub CreateForm { Line 349  sub CreateForm {
     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="sort" ';
       $Ptr .= 'value="Recalculate Chart"/>'."\n";
     $Ptr .= '&nbsp;&nbsp;&nbsp;';      $Ptr .= '&nbsp;&nbsp;&nbsp;';
       $Ptr .= '<input type="submit" name="refresh" ';
       $Ptr .= 'value="Refresh Chart"/></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 332  sub StartDocument { Line 400  sub StartDocument {
     $Str .= '<body bgcolor="#FFFFFF">';      $Str .= '<body bgcolor="#FFFFFF">';
     $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><pre>Assessment Chart'.(' 'x8).localtime();
       $Str .= '</pre></h1>';
       $Str .= '<h1>'.$ENV{'course.'.$ENV{'request.course.id'}.'.description'};
       $Str .= '</h1>';
   #    $Str .= '<h3>'.localtime().'</h3>';
   
     return $Str;      return $Str;
 }  }
Line 867  sub ExtractStudentData { Line 939  sub ExtractStudentData {
     return;      return;
 }  }
   
   sub ShouldShowColumn {
       my ($reselected,$type,$value)=@_;
   
       if($ENV{'form.sort'} eq 'Recalculate Chart') {
           return 1;
       }
   
       if(defined($ENV{'form.'.$type.$value})) {
           return 1;
       }
   
       return &CheckForStringInArray($reselected, $type.$value);
   }
   
   sub CheckForStringInArray {
       my ($inputArray,$checkString)=@_;
       foreach (@$inputArray) {
           if($_ eq $checkString) {
               return 1;
           }
       }
       return 0;
   }
   
 # ----- END HELPER FUNCTIONS --------------------------------------------  # ----- END HELPER FUNCTIONS --------------------------------------------
   
 sub BuildChart {  sub BuildChart {
Line 884  sub BuildChart { Line 980  sub BuildChart {
     my $cid=$ENV{'request.course.id'};      my $cid=$ENV{'request.course.id'};
     my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}".      my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}".
                   "_$ENV{'user.domain'}_$cid\_chart.db";                    "_$ENV{'user.domain'}_$cid\_chart.db";
       # $ENV{'form.domains'} can be either a scalar or an array reference.
       # We need an array.
       my @reselected = (ref($ENV{'form.reselect'}) ? @{$ENV{'form.reselect'}}
                         : ($ENV{'form.reselect'}));
   
     $isCached=&TestCacheData($ChartDB);      $isCached=&TestCacheData($ChartDB);
     if($isCached < 0) {      if($isCached < 0) {
Line 927  sub BuildChart { Line 1027  sub BuildChart {
     # Sort students and print out table desciptive data      # Sort students and print out table desciptive data
     if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_READER,0640)) {      if(tie(%CacheData,'GDBM_File',$ChartDB,&GDBM_READER,0640)) {
         if(!$c->aborted()) { @students=&SortStudents(\@students,\%CacheData); }          if(!$c->aborted()) { @students=&SortStudents(\@students,\%CacheData); }
           if(!$c->aborted()) { $r->print('<h1>'.(scalar @students).
                                          ' students</h1>'); }
    if(!$c->aborted()) { $r->rflush(); }
  if(!$c->aborted()) { $r->print(&CreateLegend()); }   if(!$c->aborted()) { $r->print(&CreateLegend()); }
  if(!$c->aborted()) { $r->print(&CreateForm()); }   if(!$c->aborted()) { $r->print(&CreateForm()); }
  if(!$c->aborted()) { $r->print('<h3>'.(scalar @students).   if(!$c->aborted()) { $r->print(&CreateColumnSelectionBox(
                                        ' students</h3>'); }                                                         \%CacheData,
  if(!$c->aborted()) { $r->rflush(); }                                                         \@studentInformation, 
 # if(!$c->aborted()) { $r->print(&CreateColumnSelectors(         \@headings, 
 #                                                         \%CacheData,                                                         \@reselected,
 #                                                         \@studentInformation,                                                          $spacePadding)); }
 # \@headings,    if(!$c->aborted()) { $r->print(&CreateColumnSelectors(
 # $spacePadding)); }                                                         \%CacheData,
                                                          \@studentInformation, 
          \@headings, 
                                                          \@reselected,
                                                          $spacePadding)); }
  if(!$c->aborted()) { $r->print(&CreateTableHeadings(   if(!$c->aborted()) { $r->print(&CreateTableHeadings(
                                                          \%CacheData,                                                           \%CacheData,
                                                          \@studentInformation,                                                            \@studentInformation, 
  \@headings,    \@headings, 
                                                            \@reselected,
  $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 950  sub BuildChart { Line 1059  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);
         }          }
         $r->print(&FormatStudentData($_, $cid, \@studentInformation,          $r->print(&FormatStudentData(\@reselected, $_, $cid, 
                                        \@studentInformation,
                                      $spacePadding, $ChartDB));                                       $spacePadding, $ChartDB));
         $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;

Removed from v.1.48  
changed lines
  Added in v.1.50


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