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 (19 years, 9 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>