--- loncom/interface/lontrackstudent.pm 2004/12/13 21:08:09 1.9 +++ loncom/interface/lontrackstudent.pm 2004/12/16 22:04:41 1.10 @@ -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::Constants qw(:common :http); 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 @@ sub get_data { &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('

'.&mt('Activity data goes to [_1]', + &Apache::lonlocal::locallocaltime($max_time)). + '

'); + $r->rflush(); + } else { + $r->print('

'.&mt('Unable to retrieve any data. Please reload this page and try again.').'

'); + return; + } + my $query = &build_query($mode); ## ## Send it along my $home = $ENV{'course.'.$ENV{'request.course.id'}.'.home'}; @@ -90,19 +101,93 @@ sub get_data { $r->print(&mt('Please try again in a few minutes.')); return; } -# $r->print('

'.&mt('Elapsed Time = [_1] seconds', -# time-$starttime).'

'); $r->rflush(); + # &Apache::lonhtmlcommon::Update_PrgWin ($r,$prog_state,&mt('Parsing results')); -# $r->print('

'. -# &mt('Reloading this page may result in newer data'). -# '

'); + # &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('

'. + &mt('Unable to retrieve data.').'

'); + $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('

'.&mt('Unable to read results file.').'

'. + '

'. + &mt('This is a serious error and has been logged. '. + 'You should contact your system administrator '. + 'to resolve this issue.'). + '

'); + return; + } + # + my $timestr = ''; + while (my $line = ) { + 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 @@ sub build_query { 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 @@ sub build_query { 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 @@ sub output_results { ## ## while (my $line = ) { + # FIXME: does not pass symbs along :( chomp($line); $line = &Apache::lonnet::unescape($line); if (++$count % 50 == 0) {