File:
[LON-CAPA] /
loncom /
interface /
lontrackstudent.pm
Revision
1.2:
download - view:
text,
annotated -
select for diffs
Wed Aug 11 23:37:36 2004 UTC (20 years, 7 months ago) by
matthew
Branches:
MAIN
CVS tags:
HEAD
&get_all_data is getting to be fleshed out. Requests, receives, and
displays activity log data in an ugly table. Found bugs in navmaps so
resource titles and links are not working. Head to /adm/trackstudent to
see it in action (once most development servers have updated).
# 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('<h2>'.
&mt('Error contacting home server for course: [_1]',
$reply).
'</h2>');
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('<h2>'.
&mt('Unable to retrieve data.').'</h2>');
$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('<h2>'.
&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.').
'</h2>');
return;
}
my $tableheader =
'<table><tr>'.
'<th>'.&mt('Resource').'</th>'.
'<th>'.&mt('Time').'</th>'.
'<th>'.&mt('Student').'</th>'.
'<th>'.&mt('Action').'</th>'.
'<th>'.&mt('Originating Server').'</th>'.
'<th>'.&mt('Data').'</th>'.
'</tr>'.$/;
my $count =0;
$r->print($tableheader);
$r->rflush();
while (my $line = <ACTIVITYDATA>) {
$line = &Apache::lonnet::unescape($line);
if (++$count % 50 == 0) {
$r->print('</table>'.$/);
$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('<tr>'.
'<td>'.'<a href="'.$src.'">'.$title.'</a>'.'</td>'.
'<td><nobr>'.$timestamp.'</nobr></td>'.
'<td>'.$student.'</td>'.
'<td>'.$action.'</td>'.
'<td>'.$machine.'</td>'.
'<td>'.$values.'</td>'.'</tr>'.$/);
}
$r->print('</table>'.$/);
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('<html><head><title>'.
&mt('Student Activity').
"</title></head>\n".
&Apache::loncommon::bodytag('Student Activity').
&Apache::lonhtmlcommon::breadcrumbs(undef,'Student Activity'));
$r->rflush();
#
# Begin form output
$r->print('<form name="trackstudent" method="post" action="/adm/trackstudent">');
$r->print('<br />');
$r->print('<div name="statusline">'.
&mt('Status:[_1]',
'<input type="text" name="status" size="60" value="" />').
'</div>');
$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('<h2>'.$result.'</h2>');
#
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("</form>\n");
$r->print("</body>\n</html>\n");
$r->rflush();
#
return OK;
}
1;
#######################################################
#######################################################
=pod
=back
=cut
#######################################################
#######################################################
__END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>