[LON-CAPA-cvs] cvs: loncom /interface lontrackstudent.pm

matthew lon-capa-cvs@mail.lon-capa.org
Thu, 16 Dec 2004 22:04:42 -0000


matthew		Thu Dec 16 17:04:42 2004 EDT

  Modified files:              
    /loncom/interface	lontrackstudent.pm 
  Log:
  Added display of the maximum date in the course activity table.
  
  
Index: loncom/interface/lontrackstudent.pm
diff -u loncom/interface/lontrackstudent.pm:1.9 loncom/interface/lontrackstudent.pm:1.10
--- loncom/interface/lontrackstudent.pm:1.9	Mon Dec 13 16:08:09 2004
+++ loncom/interface/lontrackstudent.pm	Thu Dec 16 17:04:41 2004
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lontrackstudent.pm,v 1.9 2004/12/13 21:08:09 matthew Exp $
+# $Id: lontrackstudent.pm,v 1.10 2004/12/16 22:04:41 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -47,6 +47,7 @@
 use Apache::lonnet();
 use Apache::lonlocal;
 use Time::HiRes;
+use Time::Local;
 
 sub get_data {
     my ($r,$prog_state,$navmap,$mode) = @_;
@@ -55,10 +56,20 @@
     &Apache::lonhtmlcommon::Update_PrgWin
         ($r,$prog_state,&mt('Composing Query'));
     #
-    my $query = &build_query($mode);
     # Allow the other server to begin processing the data before we ask for it.
     sleep(5);
-    &Apache::lonnet::logthis('sending query '.$query);
+    #
+    my $max_time = &get_max_time_in_db($r,$prog_state);
+    if (defined($max_time)) {
+        $r->print('<h3>'.&mt('Activity data goes to [_1]',
+                             &Apache::lonlocal::locallocaltime($max_time)).
+                  '</h3>');
+        $r->rflush();
+    } else {
+        $r->print('<h3>'.&mt('Unable to retrieve any data.  Please reload this page and try again.').'</h3>');
+        return;
+    }
+    my $query = &build_query($mode);
     ##
     ## Send it along
     my $home = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};
@@ -90,19 +101,93 @@
         $r->print(&mt('Please try again in a few minutes.'));
         return;
     }
-#    $r->print('<h2>'.&mt('Elapsed Time = [_1] seconds',
-#                         time-$starttime).'</h2>');
     $r->rflush();
+    #
     &Apache::lonhtmlcommon::Update_PrgWin
         ($r,$prog_state,&mt('Parsing results'));
-#    $r->print('<h2>'.
-#              &mt('Reloading this page may result in newer data').
-#              '</h2>');
+    #
     &output_results($r,$results_file,$navmap,$mode);
     &Apache::lonhtmlcommon::Update_PrgWin($r,$prog_state,&mt('Finished!'));
     return;
 }
 
+sub table_names {
+    my $cid = $ENV{'request.course.id'};
+    my $domain = $ENV{'course.'.$cid.'.domain'};
+    my $home = $ENV{'course.'.$cid.'.home'};
+    my $course = $ENV{'course.'.$cid.'.num'};
+    my $prefix = $course.'_'.$domain.'_';
+    #
+    my %tables = 
+        ( student => $prefix.'students',
+          res     => $prefix.'resource',
+          machine => $prefix.'machine_table',
+          activity=> $prefix.'activity',
+          );
+    return %tables;
+}
+
+sub get_max_time_in_db {
+    my ($r,$prog_state) = @_;
+    my %table = &table_names();
+    my $query = qq{SELECT MAX(time) FROM $table{'activity'} };
+    #
+    my $home = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};
+    my $reply=&Apache::lonnet::metadata_query($query,undef,undef,[$home]);
+    if (ref($reply) ne 'HASH') {
+        return undef;
+    }
+    my $results_file = $r->dir_config('lonDaemons').'/tmp/'.$reply->{$home};
+    my $endfile = $results_file.'.end';
+    ##
+    ## Check for the results
+    &Apache::lonhtmlcommon::Update_PrgWin
+        ($r,$prog_state,&mt('Waiting for results'));
+    my $maxtime = 500;
+    my $starttime = time;
+    while (! -e $endfile && (time-$starttime < $maxtime)) {
+        &Apache::lonhtmlcommon::Update_PrgWin
+            ($r,$prog_state,&mt('Waiting up to [_1] seconds for results',
+                                $starttime+$maxtime-time));
+        sleep(1);
+    }
+    if (! -e $endfile) {
+        $r->print('<h2>'.
+                  &mt('Unable to retrieve data.').'</h2>');
+        $r->print(&mt('Please try again in a few minutes.'));
+        return undef;
+    }
+    $r->rflush();
+    #
+    &Apache::lonhtmlcommon::Update_PrgWin
+        ($r,$prog_state,&mt('Parsing results'));
+    #
+    if (! open(TIMEDATA,$results_file)) {
+        $r->print('<h2>'.&mt('Unable to read results file.').'</h2>'.
+                  '<p>'.
+                  &mt('This is a serious error and has been logged.  '.
+                      'You should contact your system administrator '.
+                      'to resolve this issue.').
+                  '</p>');
+        return;
+    }
+    #
+    my $timestr = '';
+    while (my $line = <TIMEDATA>) {
+        chomp($line);
+        $timestr = &Apache::lonnet::unescape($line);
+    }
+    close(TIMEDATA);
+    my ($year,$month,$day,$hour,$min,$sec) = 
+        ($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 {
     my ($mode) = @_;
     my $cid = $ENV{'request.course.id'};
@@ -111,21 +196,16 @@
     my $course = $ENV{'course.'.$cid.'.num'};
     my $prefix = $course.'_'.$domain.'_';
     #
-    my $student_table  = $prefix.'students';
-    my $res_table      = $prefix.'resource';
-    my $action_table   = $prefix.'actions';
-    my $machine_table  = $prefix.'machine_table';
-    my $activity_table = $prefix.'activity';
+    my %table = &table_names();
     #
     my $query;
     if ($mode eq 'full_class') {
         $query = qq{
         SELECT B.resource,A.time,C.student,A.action,E.machine,A.action_values 
-            FROM $activity_table AS A
-            LEFT JOIN $res_table      AS B ON B.res_id=A.res_id 
-            LEFT JOIN $student_table  AS C ON C.student_id=A.student_id 
-            LEFT JOIN $machine_table  AS E ON E.machine_id=A.machine_id
-            WHERE A.student_id>10
+            FROM $table{'activity'} AS A
+            LEFT JOIN $table{'res'}      AS B ON B.res_id=A.res_id 
+            LEFT JOIN $table{'student'}  AS C ON C.student_id=A.student_id 
+            LEFT JOIN $table{'machine'}  AS E ON E.machine_id=A.machine_id
             ORDER BY A.time DESC
             LIMIT 500
         };
@@ -133,10 +213,10 @@
         my $student = $1.':'.$2;
         $query = qq{
             SELECT B.resource,A.time,A.action,E.machine,A.action_values 
-                FROM $activity_table AS A
-                LEFT JOIN $res_table      AS B ON B.res_id=A.res_id 
-                LEFT JOIN $student_table  AS C ON C.student_id=A.student_id 
-                LEFT JOIN $machine_table  AS E ON E.machine_id=A.machine_id
+                FROM $table{'activity'} AS A
+                LEFT JOIN $table{'res'}      AS B ON B.res_id=A.res_id 
+                LEFT JOIN $table{'student'}  AS C ON C.student_id=A.student_id 
+                LEFT JOIN $table{'machine'}  AS E ON E.machine_id=A.machine_id
                 WHERE C.student='$student'
                 ORDER BY A.time DESC
                 LIMIT 500
@@ -189,6 +269,7 @@
     ##
     ##
     while (my $line = <ACTIVITYDATA>) {
+        # FIXME: does not pass symbs along :(
         chomp($line);
         $line = &Apache::lonnet::unescape($line);
         if (++$count % 50 == 0) {