Diff for /loncom/interface/Attic/lonchart.pm between versions 1.29 and 1.30

version 1.29, 2002/02/06 16:59:50 version 1.30, 2002/02/19 18:58:10
Line 43 Line 43
 # 9/8 Gerd Kortemeyer  # 9/8 Gerd Kortemeyer
 # 10/1, 10/19, 11/17, 11/22, 11/24, 11/28 12/18 Behrouz Minaei  # 10/1, 10/19, 11/17, 11/22, 11/24, 11/28 12/18 Behrouz Minaei
 # YEAR=2002  # YEAR=2002
 # 2/1 Behrouz Minaei  # 2/1, 2/6, 2/19 Behrouz Minaei
 #  #
 ###  ###
   
Line 58  use GDBM_File; Line 58  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;
   
 # ------------------------------------------------------------- Find out status  # ------------------------------------------------------------- Find out status
   
Line 221  sub tracetable { Line 224  sub tracetable {
     }      }
 }  }
   
 # ================================================================ Main Handler  
   
 sub handler {  
   
   undef %hash;  
   undef @students;  
   undef @cols;  
   undef @rowlabels;  
   
   my $r=shift;  sub BuildChart {
   # ----------------------- 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'}};
       if (($firstres) && ($lastres)) {
   # ----------------------------------------------------------------- Render page
    my $cid=$ENV{'request.course.id'};
           my $chome=$ENV{'course.'.$cid.'.home'};
           my ($cdom,$cnum)=split(/\_/,$cid);
   # ---------------------------------------------- Read class list and row labels
    my $classlst=&Apache::lonnet::reply
                               ('dump:'.$cdom.':'.$cnum.':classlist',$chome);
    my $now=time;
    unless ($classlst=~/^error\:/) {
       map {
    my ($name,$value)=split(/\=/,$_);
    my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value));
    my $active=1;
    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);
       $PreCol[$thisindex]=$sname.':';
       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));
    #$ssec=(int($ssec)) ? int($ssec) : $ssec;
    $rowlabels[$thisindex]=
       sprintf('%3s',$ssec).' '.$reply{$sname}.' ';
    $PreCol[$thisindex] .= $reply.':'.$ssec;
    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);
   
   if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {   } else {
 # ------------------------------------------- Set document type for header only      $r->print('<h1>Could not access course data</h1>');
    }
   
    my $allstudents=$#students+1;
    $r->print('<h3>'.$allstudents.' students</h3>');
    &CreateForm();
    $r->rflush();
   
   if ($r->header_only) {  # --------------- Find all assessments and put them into some linear-like order
        if ($ENV{'browser.mathml'}) {   &tracetable($firstres,'&'.$lastres.'&');
            $r->content_type('text/xml');  # ----------------------------------------------------------------- Start table
        } else {  
            $r->content_type('text/html');  
        }  
        &Apache::loncommon::no_cache($r);  
        $r->send_http_header;  
        return OK;  
    }  
   
   my $requrl=$r->uri;          $r->print('<p><pre>');
 # ----------------------------------------------------------------- Tie db file    my $index;
   if ($ENV{'request.course.fn'}) {          for ($index=0;$index<=$#students;$index++) {
       my $fn=$ENV{'request.course.fn'};      my $Str=&ExtractStudentData($index,$cid);
       if (-e "$fn.db") {      $r->print($Str.'<br>');
           if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER,0640)) {              $r->rflush();
 # ------------------------------------------------------------------- Hash tied      $CachData{$PreCol[$index]}=$Str;
           }
           $r->print('</pre>');
       } else {
    $r->print('<h3>Undefined course sequence</h3>');
       }
   }
   
   sub CreateForm {
       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="Email 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>';
       $Ptr .= '<input type=submit name=sort value="Recalculate Chart"/>'."\n";
       $Ptr .= '</form>'."\n";
       $r->print( $Ptr );
   }
   
 # ------------------------------------------------------------------ Build page  sub CacheChart {
       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[$count]=$Use.$key.'*'.$CachData{$key};
    $count++;
       }
   
 # ---------------------------------------------------------------- Send headers      @list = sort (@list);
   
              $r->content_type('text/html');      $r->print('<h3>'.$count.' students</h3>');
              $r->send_http_header;      &CreateForm();
              $r->print(      $r->rflush();
   '<html><head><title>LON-CAPA Assessment Chart</title></head>');      
       $r->print('<p><pre>');
      $r->print('<body bgcolor="#FFFFFF">'.      for ( my $n; $n < $count; $n++) {
                                     '<script>window.focus();</script>'.   my ($dummy, $Line) = split(/\*/,$list[$n]);
                            '<img align=right src=/adm/lonIcons/lonlogos.gif>'.   $r->print($Line.'<br>');
                                     '<h1>Assessment Chart</h1>');      }
       $r->print('</pre>');
   }
   
   sub Start {
       undef %hash;
       undef %CachData;
       undef @students;
       undef @cols;
       undef @rowlabels;
       undef @PreCol;
   
       $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  # ---------------------------------------------------------------- Course title
       $r->print('<h1>'.$ENV{'course.'.$ENV{'request.course.id'}.
     $r->print('<h1>'.                '.description'}.'</h1><h3>'.localtime().
     $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1><h3>'.                "</h3><p><pre>1..9: correct by student in 1..9 tries\n".
     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 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>");  
     
 # ------------------------------- This is going to take a while, produce output  # ------------------------------- This is going to take a while, produce output
   
              $r->rflush();  
   
 # ----------------------- 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'}};  
               if (($firstres) && ($lastres)) {  
 # ----------------------------------------------------------------- Render page  
   
                  my $cid=$ENV{'request.course.id'};  
                  my $chome=$ENV{'course.'.$cid.'.home'};  
                  my ($cdom,$cnum)=split(/\_/,$cid);  
   
 # ---------------------------------------------- Read class list and row labels  
   
     my $classlst=&Apache::lonnet::reply  
                                  ('dump:'.$cdom.':'.$cnum.':classlist',$chome);  
     my $now=time;  
     unless ($classlst=~/^error\:/) {  
         map {  
             my ($name,$value)=split(/\=/,$_);  
             my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value));  
             my $active=1;  
             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));  
   
                     #$ssec=(int($ssec)) ? int($ssec) : $ssec;  
   
                     $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);  
   
     } else {  
         $r->print('<h1>Could not access course data</h1>');  
     }  
   
     my $allstudents=$#students+1;  
     $r->print('<h3>'.$allstudents.' students</h3>');  
     $r->rflush();      $r->rflush();
   
 # --------------- Find all assessments and put them into some linear-like order      my $cid=$ENV{'request.course.id'};
       my $ChartDB = "/home/httpd/perl/tmp/$ENV{'user.name'}".
    &tracetable($firstres,'&'.$lastres.'&');                    "_$ENV{'user.domain'}_$cid\_chart.db";
   
 # ----------------------------------------------------------------- Start table      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.29  
changed lines
  Added in v.1.30


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