# The LON-CAPA Homework handler # Guy Albertelli # 11/30 Gerd Kortemeyer # 6/1,8/17,8/18 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); #use Time::HiRes qw( gettimeofday tv_interval ); sub BEGIN { &Apache::lonxml::register_insert(); } 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 { if ( $ENV{'form.problemmode'} eq 'View' ) { if ( defined $ENV{'form.submitted'}) { return ('grade', 'web'); } else { return ('web'); } } elsif ( $ENV{'form.problemmode'} eq 'Edit' ) { if ( $ENV{'form.submitted'} eq 'edit' ) { return ('modified','edit'); } else { return ('edit'); } } else { return ('web'); } } } return (); } sub setup_vars { my ($target) = @_; return ';' # return ';$external::target='.$target.';'; } sub send_header { my ($request)= @_; $request->print(&Apache::lontexconvert::header()); # $request->print('
'); $request->print(&Apache::lontexconvert::footer()); } $Apache::lonxml::browse=''; sub check_access { 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'; } } if (($status ne 'CLOSED') && ($Apache::lonhomework::type eq 'exam') && (!$Apache::lonhomework::history{"resource.0.outtoken"})) { return ('UNCHECKEDOUT','needs to be checked out'); } &Apache::lonxml::debug("sending back :$status:$datemsg:"); if (($Apache::lonhomework::browse eq 'F') && ($status eq 'CLOSED')) { &Apache::lonxml::debug("should be allowed to browse a resource when closed"); $status='CAN_ANSWER'; $datemsg='is closed but you are allowed to view it'; } if ($ENV{'request.state'} eq "construct") { &Apache::lonxml::debug("in construction ignoring dates"); $status='CAN_ANSWER'; $datemsg='is in under construction'; } return ($status,$datemsg); } # ----------------------------------------------------------------- whichuser # returns a list of $symb, $courseid, $domain, $name that is correct for # calls to lonnet functions for this setup. # - looks for form.grade_ parameters sub whichuser { my $symb=&Apache::lonnet::symbread(); my $courseid=$ENV{'request.course.id'}; my $domain=$ENV{'user.domain'}; my $name=$ENV{'user.name'}; if (defined($ENV{'form.grade_symb'})) { my $tmp_courseid=$ENV{'form.grade_courseid'}; my $allowed=&Apache::lonnet::allowed('mgr',$tmp_courseid); if ($allowed) { $symb=$ENV{'form.grade_symb'}; $courseid=$ENV{'form.grade_courseid'}; $domain=$ENV{'form.grade_domain'}; $name=$ENV{'form.grade_username'}; } } return ($symb,$courseid,$domain,$name); } sub showhash { my (%hash) = @_; my $resultkey; foreach $resultkey (sort keys %hash) { &Apache::lonxml::debug("$resultkey ---- $hash{$resultkey}"); } &Apache::lonxml::debug("\n