#!/usr/bin/perl -w use AnApache; use Session; use Type; use Final; use Utils; use Choose; use Html; use strict; my $EXAMDIR="/the/exam/home" my $examdir="$EXAMDIR/exam"; my $thispage="http://THIS.PAGE.EDU/exam/check/index.html"; my $session = new Session; exit( 0 ) unless( defined $session ); my $r = $session->{request}; if( $r->method !~ /^get$/i ){ $r->status(Apache::FORBIDDEN); return; } my $you = $r->user(); # the user who is authenticated my $user=""; my $args= $session->{apr}->args; ##my $i = scalar (keys %{$args}); foreach my $arg( keys %{$args}){ $user = $arg if( $arg ne "email-text" ); } my $grant=$args->{$user}; my $granted=""; $r->content_type("text/html"); #---------------------------------------------------------------------- sub _attempt { # print out results from attempt $no my($no,$res)=@_; my $tmp; print "
Attempt $no"; $tmp=$res->{date}; print " [$tmp]" if( $tmp ne "" ); if($res->{time}){ printf " exam duration: %d min ", int(0.5+ $res->{time} /60); } print "
\n
"; _granted($res->{granted}); _filetest($res->{ftn},$res->{fterr}); _typetest($res->{ttno},$res->{tttime},$res->{tterr},$res->{ttt}); _choose("general","File management",$res->{gen}); _choose("groupwise","E-mail handling",$res->{grw}); _choose("word","Word processing",$res->{wrd}); print "
\n"; } sub _granted { my $g=shift; foreach my $what ( keys(%{$g}) ){ next if ( $g->{$what} !~ /^([^:]*):(.*)$/ ); my ($who,$when) = ($1,$2); print "
Granted "$what"
By $who, on [$when]
\n"; } } sub _filetest { my($n,$err)=@_; return if( ! $n ); $err =~ s/>/>/g; print "
File test
Errors: $n
$err
"; } sub _typetest { my ($n,$tm,$err,$txt)=@_; return if(! $n || ! $txt); my $corr=""; if($err<100){ my $e; ($e,$corr)=split(/::/,Type::_compare($txt,$n),2); $corr="" if($n<0); } print "
Typing test [$n]
Errors: $err, "; printf "time: %2d:%02d, speed: %d chars/min", int($tm/60), $tm%60, int( 0.5 + 60*length($txt)/$tm); print "
Typed text:
$txt

"; print "Corrected text:
$corr

" if($corr ne ""); print "
\n"; } sub _choose { my ($qa,$title,$ans) = @_; return if(! $ans); return if( $ans !~ /^([0-9]+):([0-9]+):[0-9]*:(.*)$/ ); my ($wrong,$total,$err)=($1,$2,$3); printf "
$title Correct: %d/%d
\n", $total-$wrong,$total; printf "
0); print ">\n"; foreach (split /,/,"$err," ){ next if( ! m#^([0-9]+)/([0-9]*)# ); Choose::question($qa,$1,$2); } printf "
\n"; } #---------------------------------------------------------------------- sub _userlist { ## generate full list of users my($ex,$th)=@_; Html::header("Checking - List","List"); print "
\n"; my $lastletter=""; open(DIR,"/bin/ls $ex |") || die "Cannot list exam directory\n"; while(){ chomp; my $next=$_; if($lastletter ne substr($next,0,1)){ ## new letter is coming; print "

\n" if($lastletter ne ""); $lastletter = substr($next,0,1); print "
$lastletter:
\n

"; } my $txt=$next; if( -e "$ex/$next/done" ){ $txt="$next"; } elsif ( -e "$ex/$next/choice" ){ $txt="$next"; } print "$txt\n"; } close(DIR); print "

\n" if($lastletter ne ""); print "
"; Html::tail(); } #---------------------------------------------------------------------- sub _red { my $txt=shift; return "  $txt "; } sub _green { my $txt=shift; return "  $txt "; } #---------------------------------------------------------------------- sub _errorpage { my $txt=shift; Html::header("Checking","Summary"); print $txt; print <
[back] Back to the checking page
[close] Close this window
TAIL Html::tail(); } #---------------------------------------------------------------------- ## now check whether $user exists at all if( $user eq "" ){ _userlist($examdir,$thispage); return; } my $userdir="$examdir/$user"; if(! -d "$userdir" ){ _errorpage("

You requested the results of the user with login name $user; but she/he never attempted to take the exam

"); return; } ## should we grant something to this user? if( $grant eq "exam" ){ if(! -e "$userdir/done"){ Utils::create_file("$userdir/done"); $granted=$grant; } } elsif( $grant eq "typing" ){ if(! -e "$userdir/typing"){ Utils::create_file("$userdir/typing"); $granted=$grant; } } elsif( $grant eq "test" ){ if(! -e "$userdir/choice"){ Utils::create_file("$userdir/choice"); $granted=$grant; } } if($granted ne ""){ my $datenow=localtime; Utils::append_file("$userdir/data","Granted:$granted:$you:$datenow\n"); } my $res={}; my ($email,$name)=("",""); Final::get_results($session,"$userdir/data",$res); if($res->{email} =~ /^([a-z0-9]+\@[a-z0-9\.]+):(.*)$/i ) { ($email,$name)=($1,$2); $name =~ s/\s+$//; } if($granted eq "exam" && $email ne "" ){ ## send an e-mail Utils::send_email($email,"Computer Exam -- you passed", "Dear $name, I am pleased to inform you, that you have passed all parts of the CEU Computer Proficiency Exam. Best wishes, and enjoy your stay at the CEU. Yours, the Computer Proficiency Exam Daemon " ); } if($grant eq "email" && $email ne "" ){ ## send the sorry e-mail Utils::send_email($email,"Computer Exam -- offline part failed", $args->{"email-text"} ); } Html::header("Exam: $user","Results for "$user""); ## we consult the exam/user directory print "

Name: $name ($user)\n"; print _red(" Incomplete ") if($res->{incomplete}); print _red("Failed") if($res->{failed}); print _green("Done") if (-e "$userdir/done" ); print _green("Typing") if( -e "$userdir/typing" ); print _green("Test") if( -e "$userdir/choice" ); print "

"; ## print "

You: [$you], user = $name [$user]

"; print $res->{html}; ## print <By clicking on the buttons, you can grant passing that part of the exam. If you grant "Exam", an e-mail is sent to the user informing that she passed the exam.

FORM if( -e "$userdir/choice" && ! -e "$userdir/done") { print "
"; } print "

Exam details

"; if( open(DATA,"$userdir/data") ){ print "
\n"; my $attempt=0; $res={}; $res->{granted}={}; while(){ chomp; if( /^Attempt:([0-9]+)*,/ ){ my $new=$1; _attempt($attempt,$res) if($attempt>0); $attempt=$new; $res={}; } if( /^Date: (.*)$/ ){ $res->{date}=$1; } if( /^Filetest Result:([0-9]+):(.*)$/ ) { $res->{ftn}=$1; $res->{fterr}=$2; } if( /^Typetest: ([0-9]+)$/ ){ $res->{ttno}=$1; } if( /^Typetest Result:([0-9]+):([0-9]+):(.*)$/ ){ $res->{tttime}=$1; $res->{tterr}=$2; $res->{ttt}=$3; } if( /^Totaltime:([0-9]+)$/ ){ $res->{time}=$1; } if( /^Granted:([^:]+):(.*)$/ ){ $res->{granted}->{$1}="$2"; } if( /^general:(.*)$/ ){ $res->{gen}=$1; } if( /^groupwise:(.*)$/ ){ $res->{grw}=$1; } if( /^word:(.*)$/ ){ $res->{wrd}=$1; } } close(DATA); _attempt($attempt,$res) if($attempt>0); print "
\n"; } Html::tail(); return;