--- loncom/homework/lonhomework.pm 2004/09/29 06:51:25 1.181 +++ loncom/homework/lonhomework.pm 2005/01/28 21:08:45 1.195 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.181 2004/09/29 06:51:25 albertel Exp $ +# $Id: lonhomework.pm,v 1.195 2005/01/28 21:08:45 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -53,12 +53,31 @@ use HTML::Entities(); use Apache::loncommon(); use Apache::lonlocal; use Time::HiRes qw( gettimeofday tv_interval ); +use Apache::lonnet(); + +# FIXME - improve commenting + BEGIN { &Apache::lonxml::register_insert(); } + +# +# Decides what targets to render for. +# Implicit inputs: +# Various session environment variables: +# request.state - published - is a /res/ resource +# uploaded - is a /uploaded/ resource +# contruct - is a /priv/ resource +# form.grade_target - a form parameter requesting a specific target sub get_target { + &Apache::lonxml::debug("request.state = $ENV{'request.state'}"); + if( defined($ENV{'form.grade_target'})) { + &Apache::lonxml::debug("form.grade_target= $ENV{'form.grade_target'}"); + } else { + &Apache::lonxml::debug("form.grade_target "); + } if (($ENV{'request.state'} eq "published") || ($ENV{'request.state'} eq "uploaded")) { if ( defined($ENV{'form.grade_target'} ) @@ -96,7 +115,8 @@ sub get_target { } else { return ('web','answer'); } - } elsif ( $ENV{'form.problemmode'} eq &mt('Edit') ) { + } elsif ( $ENV{'form.problemmode'} eq &mt('Edit') || + $ENV{'form.problemmode'} eq 'Edit') { if ( $ENV{'form.submitted'} eq 'edit' ) { if ( $ENV{'form.submit'} eq &mt('Submit Changes and View') ) { return ('modified','web','answer'); @@ -300,7 +320,7 @@ sub check_access { &Apache::lonxml::debug("looking for accesstime $first_access"); if (!$first_access) { $status='NOT_YET_VIEWED'; - $datemsg=' '.$interval.' seconds'; + $datemsg=&seconds_to_human_length($interval); } else { my $newdate=localtime($first_access+$interval); if (time > ($first_access+$interval)) { @@ -328,6 +348,25 @@ sub check_access { return ($status,$datemsg); } +sub seconds_to_human_length { + my ($length)=@_; + + my $seconds=$length%60; $length=int($length/60); + my $minutes=$length%60; $length=int($length/60); + my $hours=$length%24; $length=int($length/24); + my $days=$length; + + my $timestr; + if ($days > 0) { $timestr.=&mt('[quant,_1,day]',$days); } + if ($hours > 0) { $timestr.=($timestr?", ":""). + &mt('[quant,_1,hour]',$hours); } + if ($minutes > 0) { $timestr.=($timestr?", ":""). + &mt('[quant,_1,minute]',$minutes); } + if ($seconds > 0) { $timestr.=($timestr?", ":""). + &mt('[quant,_1,second]',$seconds); } + return $timestr; +} + sub showhash { my (%hash) = @_; &showhashsubset(\%hash,'.'); @@ -338,10 +377,11 @@ sub showarray { my ($array)=@_; my $string="("; foreach my $elm (@{ $array }) { - if (ref($elm)) { - if ($elm =~ /ARRAY/ ) { - $string.=&showarray($elm); - } + if (ref($elm) eq 'ARRAY') { + $string.=&showarray($elm); + } elsif (ref($elm) eq 'HASH') { + $string.= "HASH --- \n
"; + $string.= &showhashsubset($elm,'.'); } else { $string.="$elm," } @@ -355,20 +395,15 @@ 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}"); - } + if ($resultkey !~ /$keyre/) { next; } + if (ref($$hash{$resultkey}) eq 'ARRAY' ) { + &Apache::lonxml::debug("$resultkey ---- ". + &showarray($$hash{$resultkey})); + } elsif (ref($$hash{$resultkey}) eq 'HASH' ) { + &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}"); + &showhashsubset($$hash{$resultkey},'.'); + } else { + &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}"); } } &Apache::lonxml::debug("\n
restored values^
\n"); @@ -384,7 +419,13 @@ sub setuppermissions { $viewgrades = &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}. '/'.$ENV{'request.course.sec'}); } - $Apache::lonhomework::viewgrades = $viewgrades; + $Apache::lonhomework::viewgrades = $viewgrades; # File global variable...dirt. + if ($Apache::lonhomework::browse eq 'F' && + $ENV{'form.devalidatecourseresdata'} eq 'on') { + my (undef,$courseid) = &Apache::lonxml::whichuser(); + &Apache::lonnet::devalidatecourseresdata($ENV{"course.$courseid.num"}, + $ENV{"course.$courseid.domain"}); + } return '' } @@ -398,6 +439,8 @@ sub setupheader { if (!$Apache::lonxml::debug && ($ENV{'REQUEST_METHOD'} eq 'GET')) { &Apache::loncommon::no_cache($request); } + $request->set_last_modified(&Apache::lonnet::metadata($request->uri, + 'lastrevisiondate')); $request->send_http_header; return OK if $request->header_only; return '' @@ -449,9 +492,13 @@ sub handle_save_or_undo { sub analyze_header { my ($request) = @_; + my $bodytag=''; + if ($ENV{'environment.remote'} eq 'off') { + $bodytag=&Apache::loncommon::bodytag(); + } my $result.=' '.&mt("Analyzing a problem").' - '.&Apache::lonxml::message_location().' + '.$bodytag.&Apache::lonxml::message_location().'
'. &Apache::structuretags::remember_problem_state().' @@ -489,6 +536,7 @@ sub analyze { for(my $i=1;$i<$ENV{'form.numtoanalyze'}+1;$i++) { &Apache::lonhtmlcommon::Increment_PrgWin($request,\%prog_state, &mt('last problem')); + if (&Apache::loncommon::connection_aborted($request)) { return; } my $subresult=&Apache::lonnet::ssi($request->uri, ('grade_target' => 'analyze'), ('rndseed' => $i+$rndseed)); @@ -514,12 +562,12 @@ sub analyze { foreach my $part (sort(keys(%allparts))) { if (defined(@{ $overall{$part.'.answer'} })) { my $num_cols=scalar(@{ $overall{$part.'.answer'}->[0] }); - $request->print(''); + $request->print('
'.&mt('Part').' '.$part.'
'); my %frequency; foreach my $answer (sort {$a->[0] <=> $b->[0]} (@{ $overall{$part.'.answer'} })) { $frequency{join("\0",@{ $answer })}++; } - $request->print(''); + $request->print(''); foreach my $answer (sort {(split("\0",$a))[0] <=> (split("\0",$b))[0]} (keys(%frequency))) { $request->print('
'.&mt('Part').' '.$part.'
'.&mt('Answer').''.&mt('Frequency').'
'.&mt('Answer').''.&mt('Frequency').'
'. join('',split("\0",$answer)). @@ -571,8 +619,11 @@ sub editxmlmode { if ($cols > 80) { $cols = 80; } if ($cols < 70) { $cols = 70; } if ($rows < 20) { $rows = 20; } - $result.=''. - &Apache::lonxml::message_location().' + my $bodytag=''; + if ($ENV{'environment.remote'} eq 'off') { + $bodytag=&Apache::loncommon::bodytag(); + } + $result.=''.$bodytag.&Apache::lonxml::message_location().' '. &Apache::structuretags::remember_problem_state().' @@ -594,6 +645,9 @@ sub editxmlmode { return ''; } +# +# Render the page in whatever target desired. +# sub renderpage { my ($request,$file) = @_; @@ -602,6 +656,13 @@ sub renderpage { &Apache::lonxml::debug("Running targets ".join(':',@targets)); my $overall_result; foreach my $target (@targets) { + # FIXME need to do something intelligent when a problem goes + # from viewable to not viewable due to map conditions + #&setuppermissions(); + #if ( $Apache::lonhomework::browse ne '2' + # && $Apache::lonhomework::browse ne 'F' ) { + # $request->print(" You most likely shouldn't see me."); + #} #my $t0 = [&gettimeofday()]; my $problem=&Apache::lonnet::getfile($file); if ($problem eq -1) { @@ -699,7 +760,8 @@ sub newproblem { $errormsg='

'.&mt('You did not select a template.').'

'."\n"; } my $instructions; - my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1); + my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef, + ($ENV{'environment.remote'} ne 'off')); if ($templatelist) { $instructions=&mt(", select a template from the pull-down menu below.").'
'.&mt("Then");} my %lt=&Apache::lonlocal::texthash( 'create' => 'Creating a new', 'resource' => 'resource', @@ -752,22 +814,16 @@ sub handler { my $request=$_[0]; $Apache::lonxml::debug=$ENV{'user.debug'}; - if (&setupheader($request)) { return OK; } $ENV{'request.uri'}=$request->uri; - &setuppermissions(); - &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:"); # some times multiple problemmodes are submitted, need to select # the last one - &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'}); - if ( defined($ENV{'form.problemmode'}) && - ref($ENV{'form.problemmode'}) ) { - &Apache::lonxml::debug("Problem Mode ".join(",",@$ENV{'form.problemmode'})); + if ( defined($ENV{'form.problemmode'}) && ref($ENV{'form.problemmode'}) ) { my $mode=$ENV{'form.problemmode'}->[-1]; undef $ENV{'form.problemmode'}; $ENV{'form.problemmode'}=$mode; } - &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'}); + my $file=&Apache::lonnet::filelocation("",$request->uri); #check if we know where we are @@ -779,10 +835,13 @@ sub handler { if ( &Apache::lonnet::mod_perl_version() == 2 ) { &Apache::lonnet::cleanenv(); } - $request->internal_redirect('/adm/ambiguous'); return; + &Apache::lonnet::logthis(&Apache::lonnet::mod_perl_version()); + $request->internal_redirect('/adm/ambiguous'); return OK; } } - + if (&setupheader($request)) { return OK; } + &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:"); + &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'}); my ($symb) = &Apache::lonxml::whichuser(); &Apache::lonxml::debug('symb is '.$symb); if ($ENV{'request.state'} eq "construct" || $symb eq '') { @@ -803,7 +862,8 @@ sub handler { #&view_or_edit_menu($request); $ENV{'form.problemmode'}='View'; &renderpage($request,$file); - } elsif ($ENV{'form.problemmode'} eq &mt('EditXML')) { + } elsif ($ENV{'form.problemmode'} eq &mt('EditXML') || + $ENV{'form.problemmode'} eq 'EditXML') { &editxmlmode($request,$file); } elsif ($ENV{'form.problemmode'} eq &mt('Calculate answers')) { &analyze($request,$file); 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.