Diff for /loncom/interface/lontrackstudent.pm between versions 1.10 and 1.15

version 1.10, 2004/12/16 22:04:41 version 1.15, 2005/04/07 06:56:23
Line 44  package Apache::lontrackstudent; Line 44  package Apache::lontrackstudent;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonnet();  use Apache::lonmysql;
   use Apache::lonnet;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Time::HiRes;  use Time::HiRes;
 use Time::Local;  
   
 sub get_data {  sub get_data {
     my ($r,$prog_state,$navmap,$mode) = @_;      my ($r,$prog_state,$navmap,$mode) = @_;
Line 72  sub get_data { Line 72  sub get_data {
     my $query = &build_query($mode);      my $query = &build_query($mode);
     ##      ##
     ## Send it along      ## Send it along
     my $home = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};      my $home = $env{'course.'.$env{'request.course.id'}.'.home'};
     my $reply=&Apache::lonnet::metadata_query($query,undef,undef,[$home]);      my $reply=&Apache::lonnet::metadata_query($query,undef,undef,[$home]);
     if (ref($reply) ne 'HASH') {      if (ref($reply) ne 'HASH') {
         $r->print('<h2>'.          $r->print('<h2>'.
Line 112  sub get_data { Line 112  sub get_data {
 }  }
   
 sub table_names {  sub table_names {
     my $cid = $ENV{'request.course.id'};      my $cid = $env{'request.course.id'};
     my $domain = $ENV{'course.'.$cid.'.domain'};      my $domain = $env{'course.'.$cid.'.domain'};
     my $home = $ENV{'course.'.$cid.'.home'};      my $home = $env{'course.'.$cid.'.home'};
     my $course = $ENV{'course.'.$cid.'.num'};      my $course = $env{'course.'.$cid.'.num'};
     my $prefix = $course.'_'.$domain.'_';      my $prefix = $course.'_'.$domain.'_';
     #      #
     my %tables =       my %tables = 
         ( student => $prefix.'students',          ( student =>&Apache::lonmysql::fix_table_name($prefix.'students'),
           res     => $prefix.'resource',            res     =>&Apache::lonmysql::fix_table_name($prefix.'resource'),
           machine => $prefix.'machine_table',            machine =>&Apache::lonmysql::fix_table_name($prefix.'machine_table'),
           activity=> $prefix.'activity',            activity=>&Apache::lonmysql::fix_table_name($prefix.'activity'),
           );            );
     return %tables;      return %tables;
 }  }
Line 132  sub get_max_time_in_db { Line 132  sub get_max_time_in_db {
     my %table = &table_names();      my %table = &table_names();
     my $query = qq{SELECT MAX(time) FROM $table{'activity'} };      my $query = qq{SELECT MAX(time) FROM $table{'activity'} };
     #      #
     my $home = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};      my $home = $env{'course.'.$env{'request.course.id'}.'.home'};
     my $reply=&Apache::lonnet::metadata_query($query,undef,undef,[$home]);      my $reply=&Apache::lonnet::metadata_query($query,undef,undef,[$home]);
     if (ref($reply) ne 'HASH') {      if (ref($reply) ne 'HASH') {
         return undef;          return undef;
Line 178  sub get_max_time_in_db { Line 178  sub get_max_time_in_db {
         $timestr = &Apache::lonnet::unescape($line);          $timestr = &Apache::lonnet::unescape($line);
     }      }
     close(TIMEDATA);      close(TIMEDATA);
     my ($year,$month,$day,$hour,$min,$sec) =       return &Apache::lonmysql::unsqltime($timestr);
         ($timestr =~ /^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/);  
     $month -= 1; # Good old timelocal  
     my $max_time = undef;  
     if (eval("&timelocal($sec,$min,$hour,$day,$month,$year)")) {  
         $max_time = &timelocal($sec,$min,$hour,$day,$month,$year);  
     }  
     return $max_time;  
 }  }
   
 sub build_query {  sub build_query {
     my ($mode) = @_;      my ($mode) = @_;
     my $cid = $ENV{'request.course.id'};      my $cid = $env{'request.course.id'};
     my $domain = $ENV{'course.'.$cid.'.domain'};      my $domain = $env{'course.'.$cid.'.domain'};
     my $home = $ENV{'course.'.$cid.'.home'};      my $home = $env{'course.'.$cid.'.home'};
     my $course = $ENV{'course.'.$cid.'.num'};      my $course = $env{'course.'.$cid.'.num'};
     my $prefix = $course.'_'.$domain.'_';      my $prefix = $course.'_'.$domain.'_';
     #      #
     my %table = &table_names();      my %table = &table_names();
Line 232  sub output_results { Line 225  sub output_results {
     my ($r,$results_file,$navmap,$mode) = @_;      my ($r,$results_file,$navmap,$mode) = @_;
     ##      ##
     ##      ##
       if (! -s $results_file) {
           # results file is empty, just let them know there is no data
           $r->print('<h2>'.&mt('No data was returned for your request').'</h2>');
           return;
       }
     if (! open(ACTIVITYDATA,$results_file)) {      if (! open(ACTIVITYDATA,$results_file)) {
         $r->print('<h2>'.&mt('Unable to read results file.').'</h2>'.          $r->print('<h2>'.&mt('Unable to read results file.').'</h2>'.
                   '<p>'.                    '<p>'.
Line 281  sub output_results { Line 279  sub output_results {
         }          }
         my ($symb,$timestamp,$student,$action,$machine,$values);          my ($symb,$timestamp,$student,$action,$machine,$values);
         if ($mode eq 'full_class') {          if ($mode eq 'full_class') {
             ($symb,$timestamp,$student,$action,$machine,$values) =              ($symb,$timestamp,$student,$action,$machine,$values) = split(',',$line,6);
                 map { &Apache::lonnet::unescape($_); } split(',',$line,6);  
         } else {          } else {
             ($symb,$timestamp,$action,$machine,$values) =              ($symb,$timestamp,$action,$machine,$values) = split(',',$line,5);
                 map { &Apache::lonnet::unescape($_); } split(',',$line,5);  
         }          }
    foreach ($symb,$timestamp,$student,$action,$machine) {
       $_=&Apache::lonnet::unescape($_);
    }
         my ($title,$src);          my ($title,$src);
         if ($symb =~ m:^/adm/:) {          if ($symb =~ m:^/adm/:) {
             $title = $symb;              $title = $symb;
Line 294  sub output_results { Line 293  sub output_results {
         } else {          } else {
             my $nav_res = $navmap->getBySymb($symb);              my $nav_res = $navmap->getBySymb($symb);
             if (defined($nav_res)) {              if (defined($nav_res)) {
                 $title = $nav_res->title();                  $title = $nav_res->compTitle();
                 $src   = $nav_res->src();                  $src   = $nav_res->src();
             } else {              } else {
                 if ($src =~ m|^/res|) {                  if ($src =~ m|^/res|) {
Line 334  sub output_results { Line 333  sub output_results {
             $class = 'warning';              $class = 'warning';
         }          }
         # Clean up the values          # Clean up the values
         $values =~ s/counter=\d+$//;   $values = &display_values($action,$values);
         #          #
         # Build the row for output          # Build the row for output
         my $tablerow = qq{<tr class="$class">};          my $tablerow = qq{<tr class="$class">};
         if ($src =~ m|^/adm/|) {          if ($src =~ m|^/adm/|) {
             $tablerow .=               $tablerow .= 
                 '<td><nobr>'.$title.'</td>';                  '<td valign="top"><nobr>'.$title.'</nobr></td>';
         } else {          } else {
             $tablerow .=               $tablerow .= 
                 '<td><nobr>'.                  '<td valign="top"><nobr>'.
                 '<a href="'.$src.'">'.$title.'</a>'.                  '<a href="'.$src.'">'.$title.'</a>'.
                 '</nobr></td>';                  '</nobr></td>';
         }          }
         $tablerow .= '<td><nobr>'.$timestamp.'</nobr></td>';          $tablerow .= '<td valign="top"><nobr>'.$timestamp.'</nobr></td>';
         if ($mode eq 'full_class') {          if ($mode eq 'full_class') {
             $tablerow.='<td>'.$student.'</td>';              $tablerow.='<td valign="top">'.$student.'</td>';
         }          }
         $tablerow .=           $tablerow .= 
             '<td>'.$action.'</td>'.              '<td valign="top">'.$action.'</td>'.
 #            '<td>'.$machine.'</td>'.  #            '<td>'.$machine.'</td>'.
             '<td>'.$values.'</td>'.              '<td valign="top">'.$values.'</td>'.
             '</tr>';              '</tr>';
         $r->print($tablerow.$/);          $r->print($tablerow.$/);
     }      }
Line 365  sub output_results { Line 364  sub output_results {
   
 ###################################################################  ###################################################################
 ###################################################################  ###################################################################
   sub display_values {
       my ($action,$values)=@_;
       my $result='<table>';
       if ($action eq 'CSTORE') {
    my %values=map {split('=',$_,-1)} split(/\&/,$values);
    foreach my $key (sort(keys(%values))) {
       $result.='<tr><td align="right">'.
    &Apache::lonnet::unescape($key).
    '</td><td>=</td><td align="left">'.
    &Apache::lonnet::unescape($values{$key}).'</td></tr>';
    }
    $result.='</table>';
       } elsif ($action eq 'POST') {
    my %values=
       map {split('=',&Apache::lonnet::unescape($_),-1)} split(/\&/,$values);
    foreach my $key (sort(keys(%values))) {
       if ($key eq 'counter') { next; }
       $result.='<tr><td align="right">'.$key.'</td>'.
    '<td>=</td><td align="left">'.$values{$key}.'</td></tr>';
    }
    $result.='</table>';
       } else {
    $result=&Apache::lonnet::unescape($values)
       }
       return $result;
   }
   ###################################################################
   ###################################################################
 sub request_data_update {  sub request_data_update {
     my $command = 'prepare activity log';      my $command = 'prepare activity log';
     my $cid = $ENV{'request.course.id'};      my $cid = $env{'request.course.id'};
     my $domain = $ENV{'course.'.$cid.'.domain'};      my $domain = $env{'course.'.$cid.'.domain'};
     my $home = $ENV{'course.'.$cid.'.home'};      my $home = $env{'course.'.$cid.'.home'};
     my $course = $ENV{'course.'.$cid.'.num'};      my $course = $env{'course.'.$cid.'.num'};
 #    &Apache::lonnet::logthis($command.' '.$course.' '.$domain.' '.$home);  #    &Apache::lonnet::logthis($command.' '.$course.' '.$domain.' '.$home);
     my $result = &Apache::lonnet::metadata_query($command,$course,$domain,      my $result = &Apache::lonnet::metadata_query($command,$course,$domain,
                                                  [$home]);                                                   [$home]);
Line 436  sub handler { Line 463  sub handler {
     $loaderror=      $loaderror=
         &Apache::lonnet::overloaderror          &Apache::lonnet::overloaderror
         ($r,          ($r,
          $ENV{'course.'.$ENV{'request.course.id'}.'.home'});           $env{'course.'.$env{'request.course.id'}.'.home'});
     if ($loaderror) { return $loaderror; }      if ($loaderror) { return $loaderror; }
     #      #
     # Check for access      # Check for access
     if (! &Apache::lonnet::allowed('vsa',$ENV{'request.course.id'})) {      if (! &Apache::lonnet::allowed('vsa',$env{'request.course.id'})) {
         $ENV{'user.error.msg'}=          $env{'user.error.msg'}=
             $r->uri.":vsa:0:0:Cannot student activity for complete course";              $r->uri.":vsa:0:0:Cannot student activity for complete course";
         if (!           if (! 
             &Apache::lonnet::allowed('vsa',              &Apache::lonnet::allowed('vsa',
                                      $ENV{'request.course.id'}.'/'.                                       $env{'request.course.id'}.'/'.
                                      $ENV{'request.course.sec'})) {                                       $env{'request.course.sec'})) {
             $ENV{'user.error.msg'}=              $env{'user.error.msg'}=
                 $r->uri.":vsa:0:0:Cannot view student activity with given role";                  $r->uri.":vsa:0:0:Cannot view student activity with given role";
             return HTTP_NOT_ACCEPTABLE;              return HTTP_NOT_ACCEPTABLE;
         }          }
Line 474  sub handler { Line 501  sub handler {
                                             bug=>'instructor interface'});                                              bug=>'instructor interface'});
     #      #
     # Give the LON-CAPA page header      # Give the LON-CAPA page header
     $r->print('<html><head>'.&styles.'<title>'.      my $html=&Apache::lonxml::xmlbegin();
       $r->print($html.'<head>'.&styles().'<title>'.
               &mt('Student Activity').                &mt('Student Activity').
               "</title></head>\n".                "</title></head>\n".
               &Apache::loncommon::bodytag('Student Activity').                &Apache::loncommon::bodytag('Student Activity').
Line 497  sub handler { Line 525  sub handler {
         ($r,\%prog_state,&mt('Contacting course home server'));          ($r,\%prog_state,&mt('Contacting course home server'));
     #      #
     my $result = &request_data_update();      my $result = &request_data_update();
     if (ref($result) eq 'HASH') {  
         $result = join(' ',map { $_.'=>'.$result->{$_}; } keys(%$result));  
     }  
     #      #
     if (exists($ENV{'form.selected_student'})) {      if (exists($env{'form.selected_student'})) {
         # For now, just show all the data, in the future allow selection of          # For now, just show all the data, in the future allow selection of
         # a student          # a student
         my ($sname,$sdom) = split(':',$ENV{'form.selected_student'});          my ($sname,$sdom) = split(':',$env{'form.selected_student'});
         if ($sname =~ /^\w*$/ && $sdom =~ /^\w*$/) {          if ($sname =~ /^\w*$/ && $sdom =~ /^\w*$/) {
             $r->print('<h2>'.              $r->print('<h2>'.
                       &mt('Recent activity of [_1]@[_2]',$sname,$sdom).                        &mt('Recent activity of [_1]@[_2]',$sname,$sdom).
Line 514  Compiling student activity data can take Line 539  Compiling student activity data can take
 It may be necessary to reload this page to get the most current information.  It may be necessary to reload this page to get the most current information.
 END  END
             &get_data($r,\%prog_state,$navmap,              &get_data($r,\%prog_state,$navmap,
                       'student:'.$ENV{'form.selected_student'});                        'student:'.$env{'form.selected_student'});
         } else {          } else {
             $r->print('<h2>'.&mt('Unable to process for [_1]@[_2]',              $r->print('<h2>'.&mt('Unable to process for [_1]@[_2]',
                                  $sname,$sdom).'</h2>');                                   $sname,$sdom).'</h2>');

Removed from v.1.10  
changed lines
  Added in v.1.15


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