Diff for /loncom/interface/Attic/lonchart.pm between versions 1.11 and 1.42

version 1.11, 2001/11/22 17:05:07 version 1.42, 2002/06/04 19:59:34
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
   # (Publication Handler
   #
   # $Id$
   #
   # Copyright Michigan State University Board of Trustees
   #
   # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
   #
   # LON-CAPA is distributed in the hope that it will be useful,
   # but WITHOUT ANY WARRANTY; without even the implied warranty of
   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
 # Homework Performance Chart  # Homework Performance Chart
 #  #
 # (Navigate Maps Handler  # (Navigate Maps Handler
Line 6 Line 32
 # (Page Handler  # (Page Handler
 #  #
 # (TeX Content Handler  # (TeX Content Handler
 #  # YEAR=2000
 # 05/29/00,05/30 Gerd Kortemeyer)  # 05/29/00,05/30 Gerd Kortemeyer)
 # 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23,  # 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23,
 # 10/02,10/10,10/14,10/16,10/18,10/19,10/31,11/6,11/14,11/16 Gerd Kortemeyer)  # 10/02,10/10,10/14,10/16,10/18,10/19,10/31,11/6,11/14,11/16 Gerd Kortemeyer)
 #  # YEAR=2001
 # 3/1/1,6/1,17/1,29/1,30/1 Gerd Kortemeyer)  # 3/1/1,6/1,17/1,29/1,30/1,31/1 Gerd Kortemeyer)
 #  
 # 1/31 Gerd Kortemeyer  
 #  
 # 7/10/01 Behrouz Minaei  # 7/10/01 Behrouz Minaei
 # 9/8 Gerd Kortemeyer  # 9/8 Gerd Kortemeyer
 # 10/18/01, 10/19/01 Behrouz Minaei  # 10/1, 10/19, 11/17, 11/22, 11/24, 11/28 12/18 Behrouz Minaei
 # 11/17/01, 11/22/01 Behrouz Minaei  # YEAR=2002
   # 2/1, 2/6, 2/19, 2/28 Behrouz Minaei
   #
   ###
   
 package Apache::lonchart;  package Apache::lonchart;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonnet();  use Apache::lonnet();
   use Apache::loncommon();
 use HTML::TokeParser;  use HTML::TokeParser;
 use GDBM_File;  use GDBM_File;
   
 # -------------------------------------------------------------- Module Globals  # -------------------------------------------------------------- Module Globals
 my %hash;  my %hash;
   my %CachData;
 my @cols;  my @cols;
 my @rowlabels;  my @rowlabels;
 my @students;  my @students;
   my @PreCol;
 my $r;  my $r;
    
 # ------------------------------------------------------------- Find out status  # ------------------------------------------------------------- Find out status
   
 sub ExtractStudentData {  sub ExtractStudentData {
     my ($index,$coid)=@_;      my ($index,$coid)=@_;
     my ($sname,$sdom) = split( /\:/, $students[$index] );      my ($sname,$sdom) = split( /\:/, $students[$index] );
     my $shome=&Apache::lonnet::homeserver( $sname,$sdom );                my %result=&Apache::lonnet::dump($coid,$sdom,$sname);
     my $reply=&Apache::lonnet::reply('dump:'.$sdom.':'.$sname.':'.$coid,$shome );  
     my %result=();  
     my $ResId;      my $ResId;
     my $Code;      my $Code;
     my $Tries;      my $Tries;
Line 50  sub ExtractStudentData { Line 77  sub ExtractStudentData {
     my %TempHash;      my %TempHash;
     my $Version;      my $Version;
     my $ProbNo;      my $ProbNo;
     my $PrTotal;      my $ProbSolved;
     my $LatestVersion;                  my $ProbTotal;
                       my $LatestVersion;                     
     my $Str=substr($students[$index].      my $Str=substr($students[$index].
             '                                                        ',0,14).' ! '.              '                                                        ',0,14).' ! '.
             substr($rowlabels[$index].              substr($rowlabels[$index].
             '                                                        ',0,45).' ! ';              '                                                        ',0,45).' ! ';
     unless ($reply=~/^error\:/) {  
         map {  
             my ($name,$value)=split(/\=/,&Apache::lonnet::unescape($_));  
             $result{$name}=$value;  
         } split(/\&/,$reply);  
  $ProbNo = 0;  
  $PrTotal = 0;  
  my $IterationNo = 0;  
         foreach $ResId (@cols) {  
     if ($IterationNo == 0) {$IterationNo++; next;}  
     if (!$ResId) {   
  my $PrNo = sprintf( "%3d", $ProbNo );  
  $Str .= ' '.'<font color="#007700">'.$PrNo.'</font> ';  
  $PrTotal += $ProbNo;  
  $ProbNo=0;  
  next;   
     }  
             $ResId=~/(\d+)\.(\d+)/;  
     my $meta=$hash{'src_'.$ResId};  
 # $r->print($m.'<br>');  
 #    $r->rflush();  
     my $PartNo = 0;  
     undef %TempHash;  
     map {  
  if ($_=~/^stores\_(\d+)\_tries$/) {  
                     my $Part=&Apache::lonnet::metadata($meta,$_.'.part');  
     if ( $TempHash{"$Part"} eq '' ) {   
  $TempHash{"$Part"} = $Part;  
  $TempHash{$PartNo}=$Part;  
  $TempHash{"$Part.Code"} = ' ';    
  $PartNo++;  
     }  
  }  
             } split(/\,/,&Apache::lonnet::metadata($meta,'keys'));  
   
 #    foreach my $Key (%TempHash) {      my($checkForError)=keys (%result);
 # $r->print($Key.' = '.$TempHash{$Key}.'<br>');      if($checkForError =~ /^(con_lost|error|no_such_host)/i) {
 # $r->rflush();   my $PrTot = sprintf( "%5d", $ProbTotal );
 #    }   my $PrSvd = sprintf( "%5d", $ProbSolved );
    $Str .= ' '.'<font color="#000088">'.$PrSvd.'  /'.$PrTot.'</font> ';
    return $Str;
       }
   
 $r->print($PartNo.'<br>');$r->rflush();      $ProbNo = 0;
       $ProbTotal = 0;
       $ProbSolved = 0;
       my $IterationNo = 0;
       foreach $ResId (@cols) {
    if ($IterationNo == 0) {$IterationNo++; next;}
    if (!$ResId) { 
       my $PrNo = sprintf( "%3d", $ProbNo );
       $Str .= ' '.'<font color="#007700">'.$PrNo.'</font> ';
       $ProbSolved += $ProbNo;
       $ProbNo=0;
       next; 
    }
    $ResId=~/(\d+)\.(\d+)/;
    my $meta=$hash{'src_'.$ResId};
    my $PartNo = 0;
    undef %TempHash;
    foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) {
       if ($_=~/^stores\_(\d+)\_tries$/) {
    my $Part=&Apache::lonnet::metadata($meta,$_.'.part');
    if ( $TempHash{"$Part"} eq '' ) { 
       $TempHash{"$Part"} = $Part;
       $TempHash{$PartNo}=$Part;
       $TempHash{"$Part.Code"} = ' ';  
       $PartNo++;
    }
       }
    }
   
             my $Prob = &Apache::lonnet::declutter( $hash{'map_id_'.$1} ).   my $Prob = &Apache::lonnet::symbclean(
          &Apache::lonnet::declutter($hash{'map_id_'.$1} ).
                        '___'.$2.'___'.                         '___'.$2.'___'.
                        &Apache::lonnet::declutter( $hash{'src_'.$ResId} );                         &Apache::lonnet::declutter( $hash{'src_'.$ResId} ));
             $Code=' ';   $Code=' ';
             $Tries = 0;   $Tries = 0;
      $LatestVersion = $result{"version:$Prob"};   $LatestVersion = $result{"version:$Prob"};
   
     #undef %TempHash;   if ( $LatestVersion ) {
     #my $PartNo = 0;      for ( my $Version=1; $Version<=$LatestVersion; $Version++ ) {
                my $vkeys = $result{"$Version:keys:$Prob"};
             if ( $LatestVersion ) {   my @keys = split(/\:/,$vkeys);  
  for ( my $Version=1; $Version<=$LatestVersion; $Version++ ) {  
     my $vkeys = $result{"$Version:keys:$Prob"};   foreach my $Key (@keys) {  
     my @keys = split(/\:/,$vkeys);        if (($Key=~/\.(\w+)\.solved$/) && ($Key!~/^\d+\:/)) {
     foreach my $Key (@keys) {     my $Part = $1;
  if (($Key=~/\.(\w+)\.solved$/) && ($Key!~/^\d+\:/)) {   $Tries = $result{"$Version:$Prob:resource.$Part.tries"};
     my $Part = $1;   $TempHash{"$Part.Tries"}=($Tries) ? $Tries : 0;
     #if ( $TempHash{"$Part"} eq '' ) {    my $Val = $result{"$Version:$Prob:resource.$Part.solved"};
  # $TempHash{"$Part"} = $Part;   if ($Val eq 'correct_by_student'){$Code='*';} 
  #$TempHash{$PartNo}=$Part;   elsif ($Val eq 'correct_by_override'){$Code = '+';}
  #$TempHash{"$Part.Code"} = ' ';     elsif ($Val eq 'incorrect_attempted'){$Code = '.';} 
  #$PartNo++;   elsif ($Val eq 'incorrect_by_override'){$Code = '-';}
     #}   elsif ($Val eq 'excused'){$Code = 'x';}
     $TempHash{"$Part.Tries"} = $result{"$Version:$Prob:resource.$Part.tries"};   elsif ($Val eq 'ungraded_attempted'){$Code = '#';}
     $Tries = $result{"$Version:$Prob:resource.$Part.tries"};   else {$Code = ' ';}
     my $Val = $result{"$Version:$Prob:$Key"};  
     if ($Val eq 'correct_by_student'){$Code='*';}    $TempHash{"$Part.Code"} = $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';}  # Actually append problem to output (all parts)
     $TempHash{"$Part.Code"} = $Code;      $Str.='<a href="/adm/grades?symb='.
  }                  &Apache::lonnet::escape($Prob).
          }                  '&student='.$sname.'&domain='.$sdom.'&command=submission">'; 
                 }       for ( my $n = 0; $n < $PartNo; $n++ ) {  
    my $part = $TempHash{$n};
  for ( my $n = 0; $n < $PartNo; $n++ ) {     my $Code = $TempHash{"$part.Code"};
     my $part = $TempHash{$n};   if ( $Code eq '*') {
                     if ($TempHash{$part.'.Code'} eq '*') {      $ProbNo++;
  $ProbNo++;      if (($TempHash{"$part.Tries"}<10) ||
                         if ($TempHash{$part.'.Tries'}<10) {   ($TempHash{"$part.Tries"} eq '')) {
     $TempHash{$part.'.Code'}=$Tries;   $TempHash{"$part.Code"}=$TempHash{"$part.Tries"};
  }      }
                     }  
     $Str .= $TempHash{$part.'.Code'};  
  }   }
             }      elsif ( $Code eq '+' ) {$ProbNo++;}
     else {for(my $n=0; $n<$PartNo; $n++) {$Str.=' ';}}   $Str .= $TempHash{"$part.Code"};
         }    if ( $Code ne 'x' ) {$ProbTotal++;}
       }
       $Str.='</a>';
    } else {
       for(my $n=0; $n<$PartNo; $n++) {
    $Str.=' ';
    $ProbTotal++;
       }
    }
     }      }
     my $PrTot = sprintf( "%5d", $PrTotal );  
     $Str .= ' '.'<font color="#000088">'.$PrTot.'</font> ';      my $PrTot = sprintf( "%5d", $ProbTotal );
       my $PrSvd = sprintf( "%5d", $ProbSolved );
       $Str .= ' '.'<font color="#000088">'.$PrSvd.'  /'.$PrTot.'</font> ';
   
     return $Str ;      return $Str ;
 }  }
Line 192  sub tracetable { Line 224  sub tracetable {
           }            }
        }         }
        if (defined($hash{'to_'.$rid})) {         if (defined($hash{'to_'.$rid})) {
           map {            foreach (split(/\,/,$hash{'to_'.$rid})){
               &tracetable($hash{'goesto_'.$_},$beenhere);                &tracetable($hash{'goesto_'.$_},$beenhere);
           } split(/\,/,$hash{'to_'.$rid});            }
        }         }
     }      }
 }  }
   
 # ================================================================ Main Handler  sub usection {
       my ($udom,$unam,$courseid,$ActiveFlag)=@_;
 sub handler {      $courseid=~s/\_/\//g;
   $r=shift;      $courseid=~s/^(\w)/\/$1/;
   
   if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {      my %result=&Apache::lonnet::dump('roles',$udom,$unam);
 # ------------------------------------------- Set document type for header only  
       my($checkForError)=keys (%result);
   if ($r->header_only) {      if($checkForError =~ /^(con_lost|error|no_such_host)/i) {
        if ($ENV{'browser.mathml'}) {   return -1;
            $r->content_type('text/xml');      }
        } else {      my $cursection='-1';
            $r->content_type('text/html');      my $oldsection='-1';
        }      my $status='Expired';
        $r->send_http_header;      foreach my $key (keys (%result)) {
        return OK;   my $value = $result{$key};
    }          if ($key=~/^$courseid(?:\/)*(\w+)*\_st$/) {
               my $section=$1;
   my $requrl=$r->uri;              if ($key eq $courseid.'_st') { $section=''; }
 # ----------------------------------------------------------------- Tie db file      my ($dummy,$end,$start)=split(/\_/,$value);
   if ($ENV{'request.course.fn'}) {      my $now=time;
       my $fn=$ENV{'request.course.fn'};      my $notactive=0;
       if (-e "$fn.db") {      if ($start) { if ($now<$start) { $notactive=1; } }
           if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) {      if ($end) { if ($now>$end) { $notactive=1; } }
 # ------------------------------------------------------------------- Hash tied      if ($notactive == 0) { $status='Active';$cursection=$section;}
       if ($notactive == 1) { $oldsection=$section;}
           }
 # ------------------------------------------------------------------ Build page      }
       if ($status eq $ActiveFlag) {
 # ---------------------------------------------------------------- Send headers        if ($cursection eq '-1') { return $oldsection; }
         return $cursection;
              $r->content_type('text/html');      }
              $r->send_http_header;      if ($ActiveFlag eq 'Any') { 
              $r->print(        if ($cursection eq '-1') { return $oldsection; }
   '<html><head><title>LON-CAPA Assessment Chart</title></head>');        return $cursection;
       }
      $r->print('<body bgcolor="#FFFFFF">'.      return '-1';
                                     '<script>window.focus();</script>'.  }
                            '<img align=right src=/adm/lonIcons/lonlogos.gif>'.  
                                     '<h1>Assessment Chart</h1>');  
   
 # ---------------------------------------------------------------- Course title  
   
     $r->print('<h1>'.  
     $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1><h3>'.  
     localtime()."</h3><p><pre>1..9: correct by student in 1..9 tries\n".  
                             "   *: correct by student in more than 9 tries\n".  
                     "   +: correct by override\n".  
                             "   -: incorrect by override\n".  
                     "   .: incorrect attempted\n".  
                             "    : not attempted\n".  
                     "   x: excused</pre><p>");  
     
 # ------------------------------- This is going to take a while, produce output  
   
              $r->rflush();  
   
   sub BuildChart {
 # ----------------------- Get first and last resource, see if there is anything  # ----------------------- Get first and last resource, see if there is anything
       my $firstres=$hash{'map_start_/res/'.$ENV{'request.course.uri'}};
       my $lastres=$hash{'map_finish_/res/'.$ENV{'request.course.uri'}};
               my $firstres=$hash{'map_start_/res/'.$ENV{'request.course.uri'}};      if (($firstres) && ($lastres)) {
               my $lastres=$hash{'map_finish_/res/'.$ENV{'request.course.uri'}};  
               if (($firstres) && ($lastres)) {  
 # ----------------------------------------------------------------- Render page  # ----------------------------------------------------------------- Render page
    my $cid=$ENV{'request.course.id'};
                  my $cid=$ENV{'request.course.id'};          my $chome=$ENV{'course.'.$cid.'.home'};
                  my $chome=$ENV{'course.'.$cid.'.home'};          my ($cdom,$cnum)=split(/\_/,$cid);
                  my ($cdom,$cnum)=split(/\_/,$cid);  
   
 # ---------------------------------------------- Read class list and row labels  # ---------------------------------------------- Read class list and row labels
    my %classlist=&Apache::lonnet::dump('classlist',$cdom,$cnum);
   
     undef @rowlabels;   my($checkForError)=keys (%classlist);
     undef @students;   if($checkForError =~ /^(con_lost|error|no_such_host)/i) {
       $r->print('<h1>Could not access course data</h1>');
    } else {
       my $now=time;
       foreach my $name (sort(keys(%classlist))) {
    my $value=$classlist{$name};
    my ($end,$start)=split(/\:/,$value);
    my $active=1;
    my $Status=$ENV{'form.status'};
    $Status = ($Status) ? $Status : 'Active';
    if ( ( ($end) && $now > $end ) && 
        ( ($Status eq 'Active') ) ) { $active=0; }
    if ( ($Status eq 'Expired') && 
        ($end == 0 || $now < $end) ) { $active=0; }
    if ($active) {
       my $thisindex=$#students+1;
       $students[$thisindex]=$name;
       my ($sname,$sdom)=split(/\:/,$name);
       $PreCol[$thisindex]=$sname.':';
       my $ssec=&usection($sdom,$sname,$cid,$Status);
       if ($ssec==-1) {
    $rowlabels[$thisindex]=
       'Data not available: '.$name;
       } else {
    my %reply=&Apache::lonnet::idrget($sdom,$sname);
    my %name=&Apache::lonnet::get('environment',
          ['lastname','generation'
          ,'firstname'
          ,'middlename'],
          $sdom,$sname);
    my $name=$name{'lastname'};
    if ($name{'generation'}) {$name.=" $name{generation}";}
    $name.=',';
    if ($name{'firstname'}) {$name.=" $name{firstname}";}
    if ($name{'middlename'}) {$name.=" $name{middlename}";}
    if ($name eq ',') {$name='';}
    #$ssec=(int($ssec)) ? int($ssec) : $ssec;
    my $sec=sprintf('%3s',$ssec);
    $rowlabels[$thisindex]=$sec.' '.$reply{$sname}.' ';
    $PreCol[$thisindex] .= $name.':'.$sec;
    $rowlabels[$thisindex].=$name.' ';
       }
    }
       }
    }
   
     my $classlst=&Apache::lonnet::reply   my $allstudents=$#students+1;
                                  ('dump:'.$cdom.':'.$cnum.':classlist',$chome);   $r->print('<h3>'.$allstudents.' students</h3>');
     my $now=time;   &CreateForm();
     unless ($classlst=~/^error\:/) {   $r->rflush();
         map {  
             my ($name,$value)=split(/\=/,$_);  # --------------- Find all assessments and put them into some linear-like order
             my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value));   &tracetable($firstres,'&'.$lastres.'&');
             my $active=1;  # ----------------------------------------------------------------- Start table
             if (($end) && ($now>$end)) { $active=0; }  
             if ($active) {  
                 my $thisindex=$#students+1;  
                 $name=&Apache::lonnet::unescape($name);  
                 $students[$thisindex]=$name;  
                 my ($sname,$sdom)=split(/\:/,$name);  
                 my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid);  
                 if ($ssec==-1) {  
                     $rowlabels[$thisindex]=  
                       'Data not available: '.$name;  
                 } else {  
                     my %reply=&Apache::lonnet::idrget($sdom,$sname);  
     my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname.  
                                                      ':environment:lastname&generation&firstname&middlename',  
                                                      &Apache::lonnet::homeserver($sname,$sdom));  
                     $rowlabels[$thisindex]=  
                       sprintf('%3s',$ssec).' '.$reply{$sname}.' ';  
                     my $i=0;  
                     map {  
                       $i++;  
                       if ( $_ ne '') {  
                         $rowlabels[$thisindex].=&Apache::lonnet::unescape($_).' ';  
                       }  
                       if ($i == 2) {  
                         chop($rowlabels[$thisindex]);  
                         $rowlabels[$thisindex].=', ';  
                       }  
                     } split(/\&/,$reply);  
   
                 }  
             }  
         } sort split(/\&/,$classlst);  
   
           $r->print('<p><pre>');
     my $index;
           for ($index=0;$index<=$#students;$index++) {
       my $Str=&ExtractStudentData($index,$cid);
       $r->print($Str.'<br>');
               $r->rflush();
       $CachData{$PreCol[$index]}=$Str;
           }
           $r->print('</pre>');
     } else {      } else {
         $r->print('<h1>Could not access course data</h1>');   $r->print('<h3>Undefined course sequence</h3>');
     }      }
   }
   
   sub CreateForm {
       my $OpSel1='';
       my $OpSel2='';
       my $OpSel3='';
       my $Status = $ENV{'form.status'};
       if ( $Status eq 'Any' ) { $OpSel3='selected'; }
       elsif ($Status eq 'Expired' ) { $OpSel2 = 'selected'; }
       else { $OpSel1 = 'selected'; }
   
       my $Ptr = '<form name=stat method=post action="/adm/chart" >'."\n";
       $Ptr .= '<b> Sort by: &nbsp; </b>'."\n";
       $Ptr .= '&nbsp;&nbsp;&nbsp;';
       $Ptr .= '<input type=submit name=sort value="User Name" />'."\n";
       $Ptr .= '&nbsp;&nbsp;&nbsp;';
       $Ptr .= '<input type=submit name=sort value="Last Name" />'."\n";
       $Ptr .= '&nbsp;&nbsp;&nbsp;';
       $Ptr .= '<input type=submit name=sort value="Section"/>'."\n";
       $Ptr .= '<br><br>';
       $Ptr .= '<b> Student Status: &nbsp; </b>'."\n".
               '<select name="status">'. 
               '<option '.$OpSel1.' >Active</option>'."\n".
               '<option '.$OpSel2.' >Expired</option>'."\n".
       '<option '.$OpSel3.' >Any</option> </select> '."\n";
       $Ptr .= '&nbsp;&nbsp;&nbsp;';
       $Ptr .= '<input type=submit name=sort value="Recalculate Chart"/>'."\n";
       $Ptr .= '</form>'."\n";
       $r->print( $Ptr );
   }
   
     my $allstudents=$#students+1;  sub CacheChart {
     $r->print('<h3>'.$allstudents.' students</h3>');      my %list = ();
       my $count=0;
   
       my $Pos = $ENV{'form.sort'};
       if ( $Pos eq 'Last Name' ) {$Pos=1;}
       elsif ( $Pos eq 'Section' ) {$Pos=2;}
       else {$Pos=0;}
   
       foreach my $key( keys %CachData) { 
    my @Temp=split(/\:/,$key);
    my $Use = $Temp[$Pos];
    $list{$Use.$key}=$key;
    $count++;
       }
   
       my @order = sort(keys(%list));
   
       $r->print('<h3>'.$count.' students</h3>');
       &CreateForm();
     $r->rflush();      $r->rflush();
       
       $r->print('<p><pre>');
       for ( my $n; $n < $count; $n++) {
    $r->print($CachData{$list{$order[$n]}}.'<br>');
       }
       $r->print('</pre>');
   }
   
 # --------------- Find all assessments and put them into some linear-like order  sub Start {
       undef %hash;
       undef %CachData;
       undef @students;
       undef @cols;
       undef @rowlabels;
       undef @PreCol;
   
    &tracetable($firstres,'&'.$lastres.'&');      $r->print('<html><head><title>'.
                 'LON-CAPA Assessment Chart</title></head>');
       $r->print('<body bgcolor="#FFFFFF">'.
                 '<script>window.focus();</script>'.
                 '<img align=right src=/adm/lonIcons/lonlogos.gif>'.
                 '<h1>Assessment Chart</h1>');
   # ---------------------------------------------------------------- Course title
       $r->print('<h1>'.$ENV{'course.'.$ENV{'request.course.id'}.
                 '.description'}.'</h1><h3>'.localtime().
                 "</h3><p><pre>1..9: correct by student in 1..9 tries\n".
                 "   *: correct by student in more than 9 tries\n".
         "   +: correct by override\n".
                 "   -: incorrect by override\n".
         "   .: incorrect attempted\n".
         "   #: ungraded attempted\n".
                 "    : not attempted\n".
         "   x: excused</pre><p>"); 
   # ------------------------------- This is going to take a while, produce output
       $r->rflush();
   
 # ----------------------------------------------------------------- Start table      my $cid=$ENV{'request.course.id'};
       my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}".
                     "_$ENV{'user.domain'}_$cid\_chart.db";
   
       if ((-e "$ChartDB") && ($ENV{'form.sort'} ne 'Recalculate Chart')) {
    if (tie(%CachData,'GDBM_File',"$ChartDB",&GDBM_READER,0640)) {
       &CacheChart();
    }
    else {
       $r->print("Unable to tie hash to db file");
    }
       }
       else {
    if (tie(%CachData,'GDBM_File',$ChartDB,&GDBM_WRCREAT,0640)) {
       foreach (keys %CachData) {delete $CachData{$_};}
       &BuildChart();
    }
    else {
       $r->print("Unable to tie hash to db file");
    }
       }
       untie(%CachData);
   }
   
                           $r->print('<p><pre>');  # ================================================================ Main Handler
    my $index;  
                            for ($index=0;$index<=$#students;$index++) {  
                               $r->print(&ExtractStudentData($index,$cid).'<br>');  
                               $r->rflush();  
                           }  
                           $r->print('</pre>');  
   
      } else {  sub handler {
                  $r->print('<h3>Undefined course sequence</h3>');      $r=shift;
              }      if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
   # ------------------------------------------- Set document type for header only
    if ($r->header_only) {
       if ($ENV{'browser.mathml'}) {
    $r->content_type('text/xml');
       } else {
    $r->content_type('text/html');
       }
       &Apache::loncommon::no_cache($r);
       $r->send_http_header;
       return OK;
    }
   
                       $r->print('</body></html>');   my $requrl=$r->uri;
                                        # ----------------------------------------------------------------- Tie db file
    if ($ENV{'request.course.fn'}) {
       my $fn=$ENV{'request.course.fn'};
       if (-e "$fn.db") {
    if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) {
   # ------------------------------------------------------------------- Hash tied
   # ---------------------------------------------------------------- Send headers
       $r->content_type('text/html');
       $r->send_http_header;
       &Start();
       $r->print('</body></html>');                 
 # ------------------------------------------------------------- End render page  # ------------------------------------------------------------- End render page
               } else {   } else {
                   $r->content_type('text/html');      $r->content_type('text/html');
                   $r->send_http_header;      $r->send_http_header;
   $r->print('<html><body>Coursemap undefined.</body></html>');      $r->print('<html><body>Coursemap undefined.</body></html>');
               }   }
 # ------------------------------------------------------------------ Untie hash  # ------------------------------------------------------------------ Untie hash
               unless (untie(%hash)) {   unless (untie(%hash)) {
                    &Apache::lonnet::logthis("<font color=blue>WARNING: ".      &Apache::lonnet::logthis("<font color=blue>WARNING: ".
                        "Could not untie coursemap $fn (browse).</font>");        "Could not untie coursemap $fn (browse).</font>"); 
               }   }
   
 # -------------------------------------------------------------------- All done  # -------------------------------------------------------------------- All done
       return OK;   return OK;
 # ----------------------------------------------- Errors, hash could no be tied  # ----------------------------------------------- Errors, hash could no be tied
       }      }
   } else {   } else {
   $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";      $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
   return HTTP_NOT_ACCEPTABLE;       return HTTP_NOT_ACCEPTABLE; 
 }   }
 } else {      } else {
       $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";
       return HTTP_NOT_ACCEPTABLE;    return HTTP_NOT_ACCEPTABLE; 
       }
 }  
 }  }
 1;  1;
 __END__  __END__
   
   
   
   
   
   
   

Removed from v.1.11  
changed lines
  Added in v.1.42


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