--- loncom/homework/lonhomework.pm 2001/01/11 15:20:58 1.31
+++ loncom/homework/lonhomework.pm 2003/01/19 08:11:38 1.106
@@ -1,38 +1,110 @@
+# The LearningOnline Network with CAPA
# The LON-CAPA Homework handler
+#
+# $Id: lonhomework.pm,v 1.106 2003/01/19 08:11:38 albertel 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/
+#
# Guy Albertelli
# 11/30 Gerd Kortemeyer
-# 6/1 Gerd Kortemeyer
+# 6/1,8/17,8/18 Gerd Kortemeyer
+# 7/18 Jeremy Bowers
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::style();
+use Apache::lonxml();
+use Apache::lonnet();
+use Apache::lonplot();
+use Apache::inputtags();
+use Apache::structuretags();
+use Apache::randomlabel();
+use Apache::response();
+use Apache::hint();
+use Apache::outputtags();
+use Apache::caparesponse();
+use Apache::radiobuttonresponse();
+use Apache::optionresponse();
+use Apache::imageresponse();
+use Apache::essayresponse();
+use Apache::externalresponse();
+use Apache::rankresponse();
use Apache::Constants qw(:common);
+use HTML::Entities();
+use Apache::loncommon();
+#use Time::HiRes qw( gettimeofday tv_interval );
+
+BEGIN {
+ &Apache::lonxml::register_insert();
+}
sub get_target {
if ( $ENV{'request.state'} eq "published") {
- if ( defined $ENV{'form.submit'}) {
+ if ( defined($ENV{'form.grade_target'} )
+ && ($ENV{'form.grade_target'} eq 'tex')) {
+ return ($ENV{'form.grade_target'});
+ } elsif ( defined($ENV{'form.grade_target'} )
+ && ($Apache::lonhomework::viewgrades == 'F' )) {
+ return ($ENV{'form.grade_target'});
+ }
+
+ 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.submit'}) {
+ if ( defined($ENV{'form.grade_target'}) ) {
+ return ($ENV{'form.grade_target'});
+ }
+ 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');
+ if ( $ENV{'form.problemmode'} eq 'View' ||
+ $ENV{'form.problemmode'} eq 'Discard Edits and View') {
+ if ( defined($ENV{'form.submitted'}) &&
+ (!defined($ENV{'form.resetdata'})) ) {
+ return ('grade', 'web','answer');
+ } else {
+ return ('web','answer');
+ }
+ } elsif ( $ENV{'form.problemmode'} eq 'Edit' ) {
+ if ( $ENV{'form.submitted'} eq 'edit' ) {
+ if ( $ENV{'form.submit'} eq 'Submit Changes and View' ) {
+ return ('modified','web','answer');
+ } else {
+ return ('modified','edit');
+ }
+ } else {
+ return ('edit');
+ }
+ } else {
+ return ('web');
+ }
}
}
return ();
@@ -47,31 +119,66 @@ sub setup_vars {
sub send_header {
my ($request)= @_;
$request->print(&Apache::lontexconvert::header());
- $ENV{'request.uri'}=$request->uri;
# $request->print('
');
$request->print(&Apache::lontexconvert::footer());
}
-#@Apache::lonhomework::date_status=();
-#@Apache::lonhomework::date_msg=();
-sub check_date {
+$Apache::lonxml::browse='';
+
+# JB, 9/24/2002: Any changes in this function may require a change
+# in lonnavmaps::resource::getDateStatus.
+sub check_access {
my ($id) = @_;
my $date ='';
- my $status = '';
+ my $status;
my $datemsg = '';
my $lastdate = '';
my $temp;
my $type;
my $passed;
+
+ if ($ENV{'request.state'} eq "construct") {
+ &Apache::lonxml::debug("in construction ignoring dates");
+ $status='CAN_ANSWER';
+ $datemsg='is in under construction';
+ return ($status,$datemsg);
+ }
+
&Apache::lonxml::debug("checking for part :$id:");
+ &Apache::lonxml::debug("time:".time);
foreach $temp ("opendate","duedate","answerdate") {
$lastdate = $date;
$date = &Apache::lonnet::EXT("resource.$id.$temp");
+ my $thistype = &Apache::lonnet::EXT("resource.$id.$temp.type");
+ if ($thistype =~ /^(con_lost|no_such_host)/ ||
+ $date =~ /^(con_lost|no_such_host)/) {
+ $status='UNAVAILABLE';
+ $date="may open later.";
+ return($status,$date);
+ }
+ if ($thistype eq 'date_interval') {
+ if ($temp eq 'opendate') {
+ $date=&Apache::lonnet::EXT("resource.$id.duedate")-$date;
+ }
+ if ($temp eq 'answerdate') {
+ $date=&Apache::lonnet::EXT("resource.$id.duedate")+$date;
+ }
+ }
&Apache::lonxml::debug("found :$date: for :$temp:");
if ($date eq '') {
$date = "an unknown date"; $passed = 0;
@@ -95,7 +202,7 @@ sub check_date {
$datemsg = "is due at $date";
} elsif ($type eq 'answerdate') {
$status='CLOSED';
- $datemsg = "was due as $lastdate, and answers will be available at $date";
+ $datemsg = "was due on $lastdate, and answers will be available on $date";
}
if ($status eq 'CAN_ANSWER') {
#check #tries
@@ -105,87 +212,421 @@ sub check_date {
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 ($ENV{'request.state'} eq "construct") {
- &Apache::lonxml::debug("in construction ignoring dates");
+ 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 in under construction';
+ $datemsg='is closed but you are allowed to view it';
}
+
return ($status,$datemsg);
}
-sub handler {
- my $request=$_[0];
+sub showhash {
+ my (%hash) = @_;
+ &showhashsubset(\%hash,'.');
+ return '';
+}
- if ( $ENV{'user.name'} eq 'albertel' ) { $Apache::lonxml::debug=1; }
-
- my (@targets) = &get_target();
+sub showarray {
+ my ($array)=@_;
+ my $string="(";
+ foreach my $elm (@{ $array }) {
+ if (ref($elm)) {
+ if ($elm =~ /ARRAY/ ) {
+ $string.=&showarray($elm);
+ }
+ } else {
+ $string.="$elm,"
+ }
+ }
+ chop($string);
+ $string.=")";
+ return $string;
+}
+
+sub showhashsubset {
+ my ($hash,$keyre) = @_;
+ my $resultkey;
+ foreach $resultkey (sort keys %$hash) {
+ if ($resultkey =~ /$keyre/) {
+ if (ref($$hash{$resultkey})) {
+ if ($$hash{$resultkey} =~ /ARRAY/ ) {
+ &Apache::lonxml::debug("$resultkey ---- ".
+ &showarray($$hash{$resultkey}));
+ } elsif ($$hash{$resultkey} =~ /HASH/ ) {
+ &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");
+ &showhashsubset($$hash{$resultkey},'.');
+ } else {
+ &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");
+ }
+ } else {
+ &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");
+ }
+ }
+ }
+ &Apache::lonxml::debug("\n restored values^\n");
+ return '';
+}
+sub setuppermissions {
+ $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$ENV{'request.filename'});
+ $Apache::lonhomework::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});
+ return ''
+}
+
+sub setupheader {
+ my $request=$_[0];
if ($ENV{'browser.mathml'}) {
$request->content_type('text/xml');
} else {
$request->content_type('text/html');
}
+ if (!$Apache::lonxml::debug && ($ENV{'REQUEST_METHOD'} eq 'GET')) {
+ &Apache::loncommon::no_cache($request);
+ }
$request->send_http_header;
return OK if $request->header_only;
-
- &Apache::lonhomework::send_header($request);
-
- #check if allowed to see
-
+ return ''
+}
+
+sub handle_save_or_undo {
+ my ($request,$problem,$result) = @_;
+ my $file = &Apache::lonnet::filelocation("",$request->uri);
+ my $filebak =$file.".bak";
+ my $filetmp =$file.".tmp";
+ my $error=0;
+
+ if ($ENV{'form.Undo'} eq 'undo') {
+ my $error=0;
+ if (!copy($file,$filetmp)) { $error=1; }
+ if ((!$error) && (!copy($filebak,$file))) { $error=1; }
+ if ((!$error) && (!move($filetmp,$filebak))) { $error=1; }
+ if (!$error) {
+ $request->print("
Undid changes, Switched $filebak and $file
");
+ } else {
+ $request->print("
Unable to undo, unable to switch $filebak and $file
");
+ $error=1;
+ }
+ } else {
+ my $fs=Apache::File->new(">$filebak");
+ if (defined($fs)) {
+ print $fs $$problem;
+ $request->print("Making Backup to $filebak ");
+ } else {
+ $request->print("Unable to make backup $filebak");
+ $error=2;
+ }
+ my $fh=Apache::File->new(">$file");
+ if (defined($fh)) {
+ print $fh $$result;
+ $request->print("Saving Modifications to $file ");
+ } else {
+ $request->print("Unable to write to $file");
+ $error|=4;
+ }
+ }
+ return $error;
+}
+
+sub analyze_header {
+ my ($request) = @_;
+ my $result.='
+ ';
+ $request->print($result);
+ $request->rflush();
+}
+
+sub analyze {
+ my ($request,$file) = @_;
+ &Apache::lonxml::debug("Analyze");
+ my $result;
+ my %overall;
+ my %allparts;
+ my $rndseed=$ENV{'form.rndseed'};
+ &analyze_header($request);
+ for(my $i=1;$i<$ENV{'form.numtoanalyze'}+1;$i++) {
+ my $subresult=&Apache::lonnet::ssi($request->uri,
+ ('grade_target' => 'analyze'),
+ ('rndseed' => $i));
+ &Apache::lonxml::debug(":$subresult:");
+ (my $garbage,$subresult)=split(/_HASH_REF__/,$subresult,2);
+ my %analyze=&Apache::lonnet::str2hash($subresult);
+ &Apache::lonhomework::showhash(%analyze);
+ my @parts = @{ $analyze{'parts'} };
+ foreach my $part (@parts) {
+ if (!exists($allparts{$part})) {$allparts{$part}=1;};
+ if ($analyze{$part.'.type'} eq 'numericalresponse') {
+ push( @{ $overall{$part.'.answer'} },
+ [@{ $analyze{$part.'.answer'} }]);
+ }
+ }
+ }
+ foreach my $part (keys(%allparts)) {
+ $request->print('