--- loncom/homework/lonhomework.pm 2004/02/16 20:30:34 1.168 +++ loncom/homework/lonhomework.pm 2004/12/22 22:05:40 1.190 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.168 2004/02/16 20:30:34 albertel Exp $ +# $Id: lonhomework.pm,v 1.190 2004/12/22 22:05:40 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -47,17 +47,37 @@ use Apache::externalresponse(); use Apache::rankresponse(); use Apache::matchresponse(); use Apache::chemresponse(); +use Apache::drawimage(); use Apache::Constants qw(:common); use HTML::Entities(); use Apache::loncommon(); use Apache::lonlocal; -#use Time::HiRes qw( gettimeofday tv_interval ); +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'} ) @@ -95,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'} ee 'Edit') { if ( $ENV{'form.submitted'} eq 'edit' ) { if ( $ENV{'form.submit'} eq &mt('Submit Changes and View') ) { return ('modified','web','answer'); @@ -206,11 +227,11 @@ sub check_access { if ( ! ($ENV{'form.problemstate'} eq 'CANNOT_ANSWER_correct' && lc($Apache::lonhomework::problemstatus) eq 'no')) { return ('CANNOT_ANSWER', - &mt('is in this state by royal decree.')); + &mt('is in this state due to author settings.')); } } else { return ($ENV{'form.problemstate'}, - &mt('is in this state by royal decree.')); + &mt('is in this state due to author settings.')); } } &Apache::lonxml::debug("in construction ignoring dates"); @@ -291,7 +312,26 @@ sub check_access { $status = 'CANNOT_ANSWER'; } } - + if ($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER') { + my $interval=&Apache::lonnet::EXT("resource.$id.interval"); + &Apache::lonxml::debug("looking for interval $interval"); + if ($interval) { + my $first_access=&Apache::lonnet::get_first_access('map'); + &Apache::lonxml::debug("looking for accesstime $first_access"); + if (!$first_access) { + $status='NOT_YET_VIEWED'; + $datemsg=' '.$interval.' seconds'; + } else { + my $newdate=localtime($first_access+$interval); + if (time > ($first_access+$interval)) { + $status='CLOSED'; + $datemsg = &mt("was due on")." $newdate".&mt(", and answers will be available on")." $date"; + } else { + $datemsg = &mt("is due at")." $newdate"; + } + } + } + } #if (($status ne 'CLOSED') && ($Apache::lonhomework::type eq 'exam') && # (!$Apache::lonhomework::history{"resource.0.outtoken"})) { # return ('UNCHECKEDOUT','needs to be checked out'); @@ -364,7 +404,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,29 +444,29 @@ sub handle_save_or_undo { if ((!$error) && (!copy($filebak,$file))) { $error=1; } if ((!$error) && (!move($filetmp,$filebak))) { $error=1; } if (!$error) { - $request->print("

".&mt("Undid changes, Switched")." $filebak ".&mt("and")." $file

"); + &Apache::lonxml::info("

".&mt("Undid changes, Switched")." $filebak ".&mt("and")." $file

"); } else { - $request->print("

".&mt("Unable to undo, unable to switch")." $filebak ".&mt("and")." $file

"); + &Apache::lonxml::info("

".&mt("Unable to undo, unable to switch")." $filebak ".&mt("and")." $file

"); $error=1; } } else { my $fs=Apache::File->new(">$filebak"); if (defined($fs)) { print $fs $$problem; - $request->print("".&mt("Making Backup to"). - " $filebak
"); + &Apache::lonxml::info("".&mt("Making Backup to"). + " $filebak"); } else { - $request->print("".&mt("Unable to make backup")." $filebak"); + &Apache::lonxml::info("".&mt("Unable to make backup")." $filebak"); $error=2; } my $fh=Apache::File->new(">$file"); if (defined($fh)) { print $fh $$result; - $request->print("".&mt("Saving Modifications to"). - " $file
"); + &Apache::lonxml::info("".&mt("Saving Modifications to"). + " $file"); } else { - $request->print("". - &mt("Unable to write to")." $file"); + &Apache::lonxml::info("". + &mt("Unable to write to")." $file"); $error|=4; } } @@ -429,18 +475,23 @@ 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").' - + '.$bodytag.&Apache::lonxml::message_location().'
+ &HTML::Entities::encode($ENV{'request.uri'},'<>&"').'">'. + &Apache::structuretags::remember_problem_state().'

- '.&mt('List of possible answers').':
'; + &Apache::lonxml::add_messages(\$result); $request->print($result); $request->rflush(); } @@ -463,10 +514,12 @@ sub analyze { my %prog_state= &Apache::lonhtmlcommon::Create_PrgWin($request,&mt('Analyze Progress'), &mt('Getting Problem Variants'), - $ENV{'form.numtoanalyze'}); + $ENV{'form.numtoanalyze'}, + 'inline',undef); 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)); @@ -488,15 +541,16 @@ sub analyze { } &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state, &mt('Analyzing Results')); + $request->print('
'.&mt('List of possible answers').': '); 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)). @@ -543,38 +597,55 @@ sub editxmlmode { &Apache::loncommon::helpLatexCheatsheet("Problem_Editor_XML_Index", "Problem Editing Help"). ''. - &Apache::loncommon::help_open_faq(5). - &Apache::loncommon::help_open_bug('Authoring').'
'; + &Apache::loncommon::help_open_menu('',undef,undef,undef,5,'Authoring'). + ''; if ($cols > 80) { $cols = 80; } if ($cols < 70) { $cols = 70; } if ($rows < 20) { $rows = 20; } - $result.=' + my $bodytag=''; + if ($ENV{'environment.remote'} eq 'off') { + $bodytag=&Apache::loncommon::bodytag(); + } + $result.=''.$bodytag.&Apache::lonxml::message_location().'
+ &HTML::Entities::encode($ENV{'request.uri'},'<>&"').'">'. + &Apache::structuretags::remember_problem_state().' - - + +
- - - + + +
' . $xml_help . ' + &HTML::Entities::encode($problem,'<>&"').'
'; + &Apache::lonxml::add_messages(\$result); $request->print($result); } return ''; } +# +# Render the page in whatever target desired. +# sub renderpage { my ($request,$file) = @_; my (@targets) = &get_target(); &Apache::lonhomework::showhashsubset(\%ENV,'form.'); &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) { @@ -605,12 +676,16 @@ sub renderpage { #$result =~ s:::; #$result.="
Spent $td seconds processing target $target\n"; #} - $request->print($result); - $request->rflush(); +# $request->print($result); + $overall_result.=$result; +# $request->rflush(); } #$request->print(":Result ends"); #my $td=&tv_interval($t0); } + &Apache::lonxml::add_messages(\$overall_result); + $request->print($overall_result); + $request->rflush(); } # with no arg it returns a HTML