# The LON-CAPA Homework handler
# Guy Albertelli
# 11/30 Gerd Kortemeyer
# 6/1 Gerd Kortemeyer
package Apache::lonhomework;
use strict;
use Apache::style;
use Apache::lonxml;
use Apache::lonnet;
use Apache::inputtags;
use Apache::structuretags;
use Apache::response;
use Apache::hint;
use Apache::outputtags;
use Apache::Constants qw(:common);
sub get_target {
if ( $ENV{'request.state'} eq "published") {
if ( defined $ENV{'form.submitted'}) {
return ('grade', 'web');
} else {
return ('web');
}
} elsif ($ENV{'request.state'} eq "construct") {
if ( defined $ENV{'form.preview'}) {
if ( defined $ENV{'form.submitted'}) {
return ('grade', 'web');
} else {
return ('web');
}
} else {
#return ('edit');
#edit is currently broken
return ('web');
}
}
return ();
}
sub setup_vars {
my ($target) = @_;
return ';'
# return ';$external::target='.$target.';';
}
sub send_header {
my ($request)= @_;
$request->print(&Apache::lontexconvert::header());
$ENV{'request.uri'}=$request->uri;
# $request->print('<form name='.$ENV{'form.request.prefix'}.'lonhomework method="POST" action="'.$request->uri.'">');
}
sub send_footer {
my ($request)= @_;
# $request->print('</form>');
$request->print(&Apache::lontexconvert::footer());
}
#@Apache::lonhomework::date_status=();
#@Apache::lonhomework::date_msg=();
sub check_date {
my ($id) = @_;
my $date ='';
my $status = '';
my $datemsg = '';
my $lastdate = '';
my $temp;
my $type;
my $passed;
&Apache::lonxml::debug("checking for part :$id:");
foreach $temp ("opendate","duedate","answerdate") {
$lastdate = $date;
$date = &Apache::lonnet::EXT("resource.$id.$temp");
&Apache::lonxml::debug("found :$date: for :$temp:");
if ($date eq '') {
$date = "an unknown date"; $passed = 0;
} elsif ($date eq 'con_lost') {
$date = "an indeterminate date"; $passed = 0;
} else {
if (time < $date) { $passed = 0; } else { $passed = 1; }
$date = localtime $date;
}
if (!$passed) { $type=$temp; last; }
}
&Apache::lonxml::debug("have :$type:$passed:");
if ($passed) {
$status='SHOW_ANSWER';
$datemsg=$date;
} elsif ($type eq 'opendate') {
$status='CLOSED';
$datemsg = "will open on $date";
} elsif ($type eq 'duedate') {
$status='CAN_ANSWER';
$datemsg = "is due at $date";
} elsif ($type eq 'answerdate') {
$status='CLOSED';
$datemsg = "was due on $lastdate, and answers will be available on $date";
}
if ($status eq 'CAN_ANSWER') {
#check #tries
my $tries = $Apache::lonhomework::history{"resource.$id.tries"};
my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
if ( $tries eq '' ) { $tries = '0'; }
if ( $maxtries eq '' ) { $maxtries = '2'; }
if ($tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }
}
&Apache::lonxml::debug("sending back :$status:$datemsg:");
if ($ENV{'request.state'} eq "construct") {
&Apache::lonxml::debug("in construction ignoring dates");
$status='CAN_ANSWER';
$datemsg='is in under construction';
}
return ($status,$datemsg);
}
sub handler {
my $request=$_[0];
if ( $ENV{'user.name'} eq 'albertel' ) {$Apache::lonxml::debug=1;} else {$Apache::lonxml::debug=0;}
my (@targets) = &get_target();
if ($ENV{'browser.mathml'}) {
$request->content_type('text/xml');
} else {
$request->content_type('text/html');
}
$request->send_http_header;
return OK if $request->header_only;
&Apache::lonhomework::send_header($request);
#check if allowed to see
foreach my $target (@targets) {
my $file=&Apache::lonnet::filelocation("",$request->uri);
my $problem=&Apache::lonnet::getfile($file);
if ($problem == -1) {
&Apache::lonxml::error("<b> Unable to find <i>$file</i></b>");
$problem='';
}
my %mystyle;
my $result = '';
&Apache::inputtags::initialize_inputtags;
%Apache::lonhomework::results=();
%Apache::lonhomework::history=&Apache::lonnet::restore;
#ignore error conditions
my ($temp)=keys %Apache::lonhomework::history ;
if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
if ($target eq 'web' && &Apache::lonnet::symbread() eq '') {
$request->print("Vieiwing this problem as not a student, submissions will be ignored.");
}
if ($target eq 'grade') {
my $resultkey;
foreach $resultkey (sort keys %Apache::lonhomework::history) {
&Apache::lonxml::debug("$resultkey ---- $Apache::lonhomework::history{$resultkey}");
}
&Apache::lonxml::debug("\n<br>restored values^</br>\n");
}
my $default=&Apache::lonnet::getfile('/home/httpd/html/res/adm/includes/default_homework.lcpm');
if ($default == -1) {
&Apache::lonxml::error("<b>Unable to find <i>default_homework.lcpm</i></b>");
$default='';
}
$result = &Apache::lonxml::xmlparse($target, $problem,
$default.&setup_vars($target),%mystyle);
#$request->print("Result follows:");
$request->print($result);
#$request->print(":Result ends");
if ($target eq 'grade') {
my $resultkey;
foreach $resultkey (sort keys %Apache::lonhomework::results) {
&Apache::lonxml::debug("$resultkey ---- $Apache::lonhomework::results{$resultkey}");
}
&Apache::lonxml::debug("\n<br>storing values^</br>\n");
}
my ($temp) = keys %Apache::lonhomework::results;
if ( $temp ne '' ) {
&Apache::lonxml::debug("Store return message:".&Apache::lonnet::cstore(%Apache::lonhomework::results));
}
}
&Apache::lonhomework::send_footer($request);
return OK;
}
1;
__END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>