################################################################################ # WeBWorK Online Homework Delivery System # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/ # $CVSHeader: webwork-modperl/lib/WeBWorK/ContentGenerator/Instructor/ShowAnswers.pm,v 1.6 2004/06/01 14:50:38 gage Exp $ # # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version, or (b) the "Artistic License" which comes with this package. # # This program 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 either the GNU General Public License or the # Artistic License for more details. ################################################################################ package WeBWorK::ContentGenerator::Instructor::ShowAnswers; use base qw(WeBWorK::ContentGenerator::Instructor); =head1 NAME WeBWorK::ContentGenerator::Instructor::howAnswers.pm -- display past answers of students =cut use strict; use warnings; use CGI qw(); use WeBWorK::Utils qw(formatDateTime); sub initialize { my $self = shift; my $r = $self->r; my $urlpath = $r->urlpath; my $db = $r->db; my $ce = $r->ce; my $authz = $r->authz; my $courseName = $urlpath->arg("courseID"); my $user = $r->param('user'); unless ($authz->hasPermissions($user, "access_instructor_tools")) { $self->{submitError} = "You aren't authorized to create or delete problems"; return; } } sub body { my $self = shift; my $r = $self->r; my $urlpath = $r->urlpath; my $db = $r->db; my $ce = $r->ce; my $authz = $r->authz; my $root = $ce->{webworkURLs}->{root}; my $courseName = $urlpath->arg('courseID'); my $setName = $r->param('setID'); # these are passed in the search args in this case my $problemNumber = $r->param('problemID'); my $user = $r->param('user'); my $key = $r->param('key'); my $studentUser = $r->param('studentUser') if ( defined($r->param('studentUser')) ); return CGI::em("You are not authorized to access the instructor tools") unless $authz->hasPermissions($user, "access_instructor_tools"); my $showAnswersPage = $urlpath->newFromModule($urlpath->module, courseID => $courseName); my $showAnswersURL = $self->systemLink($showAnswersPage,authen => 0 ); my ($safeUser,$safeCourse) = (showHTML($studentUser),showHTML($courseName)); my ($safeSet,$safeProb) = (showHTML($setName),showHTML($problemNumber)); ##################################################################### # print form ##################################################################### print "

\n\n


\n"; print '
'; print CGI::start_form("POST", $showAnswersURL,-target=>'information'), CGI::submit(-name => 'action', -value=>'Past Answers for'), "\n", "   \n", $self->hidden_authen_fields, # qq{}, # "    \n", # qq{Set: }, # "    \n", # qq{Problem: }, CGI::textfield(-name => 'studentUser', -value => $safeUser, -size =>10 ), "   \n Set:  ", CGI::textfield( -name => 'setID', -value => $safeSet, -size =>10 ), "   \n Problem:  ", CGI::textfield(-name => 'problemID', -value => $safeProb,-size =>10 ), "   \n", CGI::end_form(),"\n\n"; print "
"; if (defined($setName) and defined($problemNumber) ) { ##################################################################### # print result table of answers ##################################################################### my $answer_log = $self->{ce}->{courseFiles}->{logs}->{'answer_log'}; $studentUser = $r->param('studentUser') if ( defined($r->param('studentUser')) ); my ($safeUser,$safeCourse) = (showHTML($studentUser),showHTML($courseName)); my ($safeSet,$safeProb) = (showHTML($setName),showHTML($problemNumber)); print CGI::h3( "Past Answers for $safeUser, set $safeSet, problem$safeProb" ); $studentUser = "[^|]*" if ($studentUser eq "" or $studentUser eq "*"); $setName = "[^|]*" if ($setName eq "" or $setName eq "*"); $problemNumber = "[^|]*" if ($problemNumber eq "" or $problemNumber eq "*"); # had to change the pattern a little to match # the initial time stamp: [Fri Feb 28 22:05:11 2003]. my $pattern = "^[[^]]*]|$studentUser\\|$setName\\|$problemNumber\\|"; #my $pattern = "^\\|$studentUser\\|$setName\\|$problemNumber\\|"; our ($lastdate,$lasttime,$lastID,$lastn); if (open(LOG,"$answer_log")) { my $line; local ($lastdate,$lasttime,$lastID,$lastn) = ("",0,"",0); $self->{lastdate} = ''; $self->{lasttime} = ''; $self->{lastID} = ''; $self->{lastn} = ''; # get data from file my @lines = grep(/$pattern/,); close(LOG); chomp(@lines); print "
\n"; print '',"\n"; print "No entries for $safeUser set $safeSet, problem $safeProb" unless @lines; # warn if there are no answers foreach $line (sort(@lines)) { print $self->tableRow(split("\t",substr($line,27),-1)); } print qq{\n

\n} if ($self->{lastn}); print "\n
\n\n"; } else { print "Can't open the access log $answer_log"; } } return ""; } sub tableRow { my $self = shift; my $lastID = $self->{lastID}; my $lastn = $self->{lastn}; my $lasttime = $self->{lasttime}; my $lastdate = $self->{lastdate}; my ($out,$answer,$studentUser,$set,$prob) = ""; my ($ID,$rtime,@answers) = @_; pop(@answers); my $date = scalar(localtime($rtime)); $date =~ s/\s+/ /g; my ($day,$month,$mdate,$time,$year) = split(" ",$date); $date = "$mdate $month $year"; my $n = 2*(scalar(@answers)+1); if ($lastID ne $ID) { if ($lastn) { print qq{
\n

\n\n}; print '',"\n"; } ($studentUser,$set,$prob) = (split('\|',$ID))[1,2,3]; $out .= qq{\n}; $self->{lastID} = $lastID = $ID; $self->{lasttime} = $lasttime = 0; $self->{lastdate} = $lastdate = ""; } $out .= qq{\n} if ($rtime - $lasttime > 30*60); $self->{lasttime} = $lasttime = $rtime; $self->{lastn} = $lastn = $n; if ($lastdate ne $date) { $out .= qq{\n}; $self->{lastdate} = $lastdate = $date; } $out .= ''. ''; foreach $answer (@answers) { $answer =~ s/(^\s+|\s+$)//g; $answer = showHTML($answer); $answer = "empty" if ($answer eq ""); $out .= qq{}; } $out .= "\n"; $out; } ################################################## # # Make HTML symbols printable # sub showHTML { my $string = shift; return '' unless $string; $string =~ s/&/\&/g; $string =~ s//\>/g; $string =~ s//,/g; $string; } 1;

User: $studentUser   Set: $set   Problem: $prob

$date
'.$time.'$answer