# The LearningOnline Network with CAPA # # $Id: lontrackstudent.pm,v 1.2 2004/08/11 23:37:36 matthew Exp $ # # 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/ # ### =pod =head1 NAME lontrackstudent =head1 SYNOPSIS Track student progress through course materials =over 4 =cut package Apache::lontrackstudent; use strict; use Apache::Constants qw(:common :http); use Apache::lonnet(); use Apache::lonlocal; use Time::HiRes; ################################################################### ################################################################### sub get_all_data { my ($r,$prog_state,$navmap) = @_; ## ## Compose the query &Apache::lonhtmlcommon::Update_PrgWin ($r,$prog_state,&mt('Composing Query')); # my $query; 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 $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'; # $query = qq{ select B.resource,A.time,C.student,D.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 $action_table AS D ON D.action_id=A.action_id LEFT JOIN $machine_table AS E ON E.machine_id=A.machine_id }; $query =~ s|$/||g; # &Apache::lonnet::logthis($query); ## ## Send it along my $reply=&Apache::lonnet::metadata_query($query,undef,undef,[$home]); if (ref($reply) ne 'HASH') { $r->print('

'. &mt('Error contacting home server for course: [_1]', $reply). '

'); return; } 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)) { sleep(1); &Apache::lonhtmlcommon::Update_PrgWin ($r,$prog_state,&mt('Waiting for results')); } if (! -e $endfile) { $r->print('

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

'); $r->print(&mt('Please try again in a few minutes.')); return; } &Apache::lonhtmlcommon::Update_PrgWin ($r,$prog_state,&mt('Parsing results')); if (! open(ACTIVITYDATA,$results_file)) { $r->print('

'. &mt('Unable to read results file. This is a serious error and has been logged. You should contact your system administrator to resolve this issue. If you are the system administrator, I feel sorry for you.'). '

'); return; } my $tableheader = ''. ''. ''. ''. ''. ''. ''. ''.$/; my $count =0; $r->print($tableheader); $r->rflush(); while (my $line = ) { $line = &Apache::lonnet::unescape($line); if (++$count % 50 == 0) { $r->print('
'.&mt('Resource').''.&mt('Time').''.&mt('Student').''.&mt('Action').''.&mt('Originating Server').''.&mt('Data').'
'.$/); $r->rflush(); $r->print($tableheader); } my ($symb,$timestamp,$student,$action,$machine,$values) = map { &Apache::lonnet::unescape($_); } split(',',$line,6); my ($title,$src); if ($symb =~ m:^/(res|adm)/:) { $title = $symb; $src = $symb; } else { # We may need to add 'uploaded/' to the symb # # Hey, guess what - navmaps->getBySymb # does not work with uploaded resources/new style courses/something # The fact that our symbs do not have uploaded/ prepended to them # then they (most often but not always) should, is likely to be # a puzzle too. #my $nav_res = $navmap->getBySymb($symb); $title = 'resource title goes here'; # $nav_res->title(); $src = '/dev/null'; # $nav_res->src(); } $r->print(''. ''.''.$title.''.''. ''.$timestamp.''. ''.$student.''. ''.$action.''. ''.$machine.''. ''.$values.''.''.$/); } $r->print(''.$/); close(ACTIVITYDATA); &Apache::lonhtmlcommon::Update_PrgWin ($r,$prog_state,&mt('Finished!')); return; } sub get_student_data {} sub html_output_student_data {} sub html_output_class_data {} sub request_data_update { my $command = 'prepare activity log'; my $cid = $ENV{'request.course.id'}; my $domain = $ENV{'course.'.$cid.'.domain'}; my $home = $ENV{'course.'.$cid.'.home'}; my $course = $ENV{'course.'.$cid.'.num'}; &Apache::lonnet::logthis($command.' '.$course.' '.$domain.' '.$home); my $result = &Apache::lonnet::metadata_query($command,$course,$domain, [$home]); return $result; } ################################################################### ################################################################### ################################################################### ################################################################### sub handler { my $r=shift; my $c = $r->connection(); # # Check for overloading here and on the course home server my $loaderror=&Apache::lonnet::overloaderror($r); if ($loaderror) { return $loaderror; } $loaderror= &Apache::lonnet::overloaderror ($r, $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); if ($loaderror) { return $loaderror; } # # Check for access if (! &Apache::lonnet::allowed('vsa',$ENV{'request.course.id'})) { $ENV{'user.error.msg'}= $r->uri.":vsa:0:0:Cannot student activity for complete course"; if (! &Apache::lonnet::allowed('vsa', $ENV{'request.course.id'}.'/'. $ENV{'request.course.sec'})) { $ENV{'user.error.msg'}= $r->uri.":vsa:0:0:Cannot view student activity with given role"; return HTTP_NOT_ACCEPTABLE; } } # # Send the header &Apache::loncommon::no_cache($r); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; if ($r->header_only) { return OK; } # # Extract form elements from query string &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['selected_student']); # # We will almost always need this... my $navmap = Apache::lonnavmaps::navmap->new(); # &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/studentactivity', title=>'Student Activity', text =>'Student Activity', faq=>139, bug=>'instructor interface'}); # # Give the LON-CAPA page header $r->print(''. &mt('Student Activity'). "\n". &Apache::loncommon::bodytag('Student Activity'). &Apache::lonhtmlcommon::breadcrumbs(undef,'Student Activity')); $r->rflush(); # # Begin form output $r->print('
'); $r->print('
'); $r->print('
'. &mt('Status:[_1]', ''). '
'); $r->rflush(); my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin ($r,&mt('Student Activity Retrieval'), &mt('Student Activity Retrieval'),undef,'inline',undef, 'trackstudent','status'); &Apache::lonhtmlcommon::Update_PrgWin ($r,\%prog_state,&mt('Contacting course home server')); # my $result = &request_data_update(); if (ref($result) eq 'HASH') { $result = join(' ',map { $_.'=>'.$result->{$_}; } keys(%$result)); } $r->print('

'.$result.'

'); # if (! exists($ENV{'form.selected_student'})) { # Choose a student $r->print('If you worked here you would be done by now'); } else { # Show a students activity $r->print('I would like to have something to show you but I do not.'); } # &get_all_data($r,\%prog_state,$navmap); # &Apache::lonhtmlcommon::Update_PrgWin # ($r,\%prog_state,&mt('Done')); # $r->print("
\n"); $r->print("\n\n"); $r->rflush(); # return OK; } 1; ####################################################### ####################################################### =pod =back =cut ####################################################### ####################################################### __END__