--- loncom/homework/lonhomework.pm 2000/08/11 14:35:13 1.7 +++ loncom/homework/lonhomework.pm 2001/06/05 16:32:18 1.45 @@ -1,5 +1,7 @@ # The LON-CAPA Homework handler # Guy Albertelli +# 11/30 Gerd Kortemeyer +# 6/1 Gerd Kortemeyer package Apache::lonhomework; use strict; @@ -8,59 +10,339 @@ 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 handler { - my $request=shift; - my $target=&get_target(); - $request->content_type('text/html'); - $request->send_http_header; - &Apache::lonhomework::send_header($request); - my $file = $request->uri; - my %mystyle; - my $result = ''; - &Apache::inputtags::initialize_inputtags; - $result = Apache::lonxml::xmlparse($target, &getfile($file), - &getfile('/res/103/albertel/default_homework').&setup_vars($target),%mystyle); - #$request->print("Result follows:"); - $request->print($result); - #$request->print(":Result ends"); - &Apache::lonhomework::send_footer($request); +sub BEGIN { + &Apache::lonxml::register_insert(); } sub get_target { - return "web"; + 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 ';$external::target='.$target.';'; + return ';' +# return ';$external::target='.$target.';'; } sub send_header { my ($request)= @_; - $request->print(''); - $request->print('
'); + $request->print(&Apache::lontexconvert::header()); +# $request->print(''); +} + +sub createmenu { + my ($which,$request)=@_; + if ($which eq 'grade') { + $request->print(''); + } } sub send_footer { my ($request)= @_; - $request->print('
'); - $request->print(''); +# $request->print(''); + $request->print(&Apache::lontexconvert::footer()); +} + +$Apache::lonxml::browse=''; +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 (($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); +} + +sub showhash { + my (%hash) = @_; + my $resultkey; + foreach $resultkey (sort keys %hash) { + &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'); + } + $request->send_http_header; + return OK if $request->header_only; + return '' } -sub getfile { - my ($filename) = @_; - my $a=""; - &Apache::lonnet::repcopy($filename); - { - my $fh=Apache::File->new("/home/httpd/html".$filename); +sub renderpage { + my ($request,$file) = @_; + + my (@targets) = &get_target(); + foreach my $target (@targets) { + my $problem=&Apache::lonnet::getfile($file); + if ($problem == -1) { + &Apache::lonxml::error(" Unable to find $file"); + $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') { + if (&Apache::lonnet::symbread() eq '') { + if ($ENV{'request.state'} eq "construct") { + $request->print("In construction space, submissions ignored
"); + } else { + $request->print("Browsing or ambiguous reference, submissions ignored
"); + } + } + #if ($Apache::lonhomework::viewgrades eq 'F') {&createmenu('grade',$request); } + } + if ($target eq 'grade') { &showhash(%Apache::lonhomework::history); } - while (<$fh>) { - $a .=$_; + my $default=&Apache::lonnet::getfile('/home/httpd/html/res/adm/includes/default_homework.lcpm'); + if ($default == -1) { + &Apache::lonxml::error("Unable to find default_homework.lcpm"); + $default=''; + } + $result = &Apache::lonxml::xmlparse($target, $problem, + $default.&setup_vars($target),%mystyle); + + #$request->print("Result follows:"); + if ($target eq 'modified') { + my $fileout = &Apache::lonnet::filelocation("",$request->uri); + my $filesave=$fileout.".bak"; + + my $fs=Apache::File->new(">$filesave"); + print $fs $problem; + $request->print("Making Backup to $filesave
"); + + my $fh=Apache::File->new(">$fileout"); + print $fh $result; + $request->print("Saving Modifications to $fileout
"); + } else { + $request->print($result); + } + #$request->print(":Result ends"); + if ($target eq 'grade') { &showhash(%Apache::lonhomework::results); } + + #store new values + my ($temp) = keys %Apache::lonhomework::results; + if ( $temp ne '' ) { + &Apache::lonxml::debug("Store return message:". + &Apache::lonnet::cstore(\%Apache::lonhomework::results)); + } + } +} + +# with no arg it returns a HTML "; } } - return $a + return $result; +} + +sub newproblem { + my ($request) = @_; + + if ($ENV{'form.template'}) { + use File::Copy; + my $file = &get_template_list($ENV{'form.template'}); + my $dest = &Apache::lonnet::filelocation("",$request->uri); + copy($file,$dest); + &renderpage($request,$file); + } else { + my $templatelist=&get_template_list(); + my $url=$request->uri; + $request->print(< +The request file $url doesn\'t exist. You can create a new problem
+
+
+ +
+ +ENDNEWPROBLEM + } + + return ''; +} + +sub view_or_edit_menu { + my ($request) = @_; + my $url=$request->uri; + $request->print(< +
+Would you like to or + the problem. +
+ +EDITMENU +} + +sub handler { + my $request=$_[0]; + + #if ( $ENV{'user.name'} eq 'albertel' ) {$Apache::lonxml::debug=1;} + + if (&setupheader($request)) { return OK; } + $ENV{'request.uri'}=$request->uri; + + #setup permissions + $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$ENV{'request.filename'}); + $Apache::lonhomework::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}); + &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:"); + + my $file=&Apache::lonnet::filelocation("",$request->uri); + + #check if we know where we are + if ($ENV{'request.course.fn'} && !&Apache::lonnet::symbread()) { + # if we are browsing we might not be able to know where we are + if ($Apache::lonhomework::browse ne 'F') { + #should know where we are, so ask + $request->internal_redirect('/adm/ambiguous'); return; + } + } + + if ($ENV{'request.state'} eq "construct") { + if ( -e $file ) { + if (!(defined $ENV{'form.problemmode'})) { + #first visit to problem in construction space + &view_or_edit_menu($request); + #&renderpage($request,$file); + } else { + &renderpage($request,$file); + } + } else { + # requested file doesn't exist in contruction space + &newproblem($request); + } + } else { + # just render the page normally outside of construction space + &renderpage($request,$file); + } + + &Apache::lonhomework::send_footer($request); + # always turn off debug messages + $Apache::lonxml::debug=0; + return OK; + } 1; 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.