--- loncom/homework/lonhomework.pm 2004/05/25 21:25:53 1.175 +++ loncom/homework/lonhomework.pm 2005/05/10 20:29:26 1.207 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.175 2004/05/25 21:25:53 albertel Exp $ +# $Id: lonhomework.pm,v 1.207 2005/05/10 20:29:26 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,7 +30,7 @@ package Apache::lonhomework; use strict; use Apache::style(); use Apache::lonxml(); -use Apache::lonnet(); +use Apache::lonnet; use Apache::lonplot(); use Apache::inputtags(); use Apache::structuretags(); @@ -52,53 +52,76 @@ 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 { - if (($ENV{'request.state'} eq "published") || - ($ENV{'request.state'} eq "uploaded")) { - if ( defined($ENV{'form.grade_target'} ) - && ($ENV{'form.grade_target'} eq 'tex')) { - return ($ENV{'form.grade_target'}); - } elsif ( defined($ENV{'form.grade_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'} ) + && ($env{'form.grade_target'} eq 'tex')) { + return ($env{'form.grade_target'}); + } elsif ( defined($env{'form.grade_target'} ) && ($Apache::lonhomework::viewgrades eq 'F' )) { - return ($ENV{'form.grade_target'}); + return ($env{'form.grade_target'}); } - - if ( defined($ENV{'form.submitted'}) && - ( !defined($ENV{'form.resetdata'})) && - ( !defined($ENV{'form.newrandomization'}))) { + if ($env{'form.webgrade'} && + $Apache::lonhomework::modifygrades eq 'F') { + return ('grade','webgrade'); + } + if ( defined($env{'form.submitted'}) && + ( !defined($env{'form.resetdata'})) && + ( !defined($env{'form.newrandomization'}))) { return ('grade', 'web'); } else { return ('web'); } - } elsif ($ENV{'request.state'} eq "construct") { - if ( defined($ENV{'form.grade_target'}) ) { - return ($ENV{'form.grade_target'}); + } elsif ($env{'request.state'} eq "construct") { + if ( defined($env{'form.grade_target'}) ) { + return ($env{'form.grade_target'}); } - if ( defined($ENV{'form.preview'})) { - if ( defined($ENV{'form.submitted'})) { + if ( defined($env{'form.preview'})) { + if ( defined($env{'form.submitted'})) { return ('grade', 'web'); } else { return ('web'); } } else { - if ( $ENV{'form.problemmode'} eq &mt('View') || - $ENV{'form.problemmode'} eq &mt('Discard Edits and View')) { - if ( defined($ENV{'form.submitted'}) && - (!defined($ENV{'form.resetdata'})) && - (!defined($ENV{'form.newrandomization'}))) { + if ( $env{'form.problemmode'} eq &mt('View') || + $env{'form.problemmode'} eq &mt('Discard Edits and View')) { + if ( defined($env{'form.submitted'}) && + (!defined($env{'form.resetdata'})) && + (!defined($env{'form.newrandomization'}))) { return ('grade', 'web','answer'); } else { return ('web','answer'); } - } elsif ( $ENV{'form.problemmode'} eq &mt('Edit') ) { - if ( $ENV{'form.submitted'} eq 'edit' ) { - if ( $ENV{'form.submit'} eq &mt('Submit Changes and View') ) { + } 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'); } else { return ('modified','edit'); @@ -123,7 +146,7 @@ sub setup_vars { sub send_header { my ($request)= @_; $request->print(&Apache::lontexconvert::header()); -# $request->print('
'); +# $request->print(''); } sub createmenu { @@ -142,8 +165,20 @@ sub send_footer { $request->print(&Apache::lontexconvert::footer()); } -$Apache::lonxml::browse=''; +sub proctor_checked_in { + my ($slot_name,$slot)=@_; + my @allowed=split(",",$slot->{'proctor'}); + foreach my $possible (@allowed) { + if ($Apache::lonhomework::history{'resource.checkedin'} eq $possible && + $Apache::lonhomework::history{'resource.checkedin.slot'} eq + $slot_name ) { + return 1; + } + } + return 0; +} +$Apache::lonxml::browse=''; sub check_ip_acc { my ($acc)=@_; if (!defined($acc) || $acc =~ /^\s*$/) { return 1; } @@ -189,6 +224,61 @@ sub check_ip_acc { } return $allowed; } + +sub check_task_access { + # does it pass normal muster + # yes we really do want the default args passing + my ($status,$datemsg)=&check_access; + if ($status eq 'SHOW_ANSWER' || + $status eq 'CLOSED' || + $status eq 'CANNOT_ANSWER' || + $status eq 'INVALID_ACCESS' || + $status eq 'UNAVAILABLE') { + return ($status,$datemsg); + } + if ($env{'request.state'} eq "construct") { + return ($status,$datemsg); + } + + if ($Apache::lonhomework::history{'resource.checkedin'}) { + if ($Apache::lonhomework::history{'resource.status'} eq 'pass' || + $Apache::lonhomework::history{'resource.status'} eq 'fail') { + return ('SHOW_ANSWER'); + } + } + my ($id)=@_; + my @slots=split(':',&Apache::lonnet::EXT("resource.$id.available")); +# if (!@slots) { +# return ($status,$datemsg); +# } + my $slotstatus='NOT_IN_A_SLOT'; + my ($returned_slot,$slot_name); + foreach my $slot (sort(@slots)) { + &Apache::lonxml::debug("getting $slot"); + my %slot=&Apache::lonnet::get_slot($slot); + &Apache::lonhomework::showhash(%slot); + if ($slot{'starttime'} < time && + $slot{'endtime'} > time && + &check_ip_acc($slot{'ip'})) { + &Apache::lonxml::debug("$slot is good"); + $slotstatus='NEEDS_CHECKIN'; + $returned_slot=\%slot; + $slot_name=$slot; + last; + } + } + if ($slotstatus eq 'NEEDS_CHECKIN' && + &proctor_checked_in($slot_name,$returned_slot)) { + &Apache::lonxml::debug("protoctor checked in"); + $slotstatus='CAN_ANSWER'; + } + if ( ($slotstatus eq 'NOT_IN_A_SLOT' || $slotstatus eq 'NEEDS_CHECKIN') && + $Apache::lonhomework::history{'resource.checkedin'}) { + return ('WAITING_FOR_GRADE'); + } + return ($slotstatus,$datemsg,$slot_name,$returned_slot); +} + # JB, 9/24/2002: Any changes in this function may require a change # in lonnavmaps::resource::getDateStatus. sub check_access { @@ -201,16 +291,16 @@ sub check_access { my $type; my $passed; - if ($ENV{'request.state'} eq "construct") { - if ($ENV{'form.problemstate'}) { - if ($ENV{'form.problemstate'} =~ /^CANNOT_ANSWER/) { - if ( ! ($ENV{'form.problemstate'} eq 'CANNOT_ANSWER_correct' && + if ($env{'request.state'} eq "construct") { + if ($env{'form.problemstate'}) { + if ($env{'form.problemstate'} =~ /^CANNOT_ANSWER/) { + if ( ! ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct' && lc($Apache::lonhomework::problemstatus) eq 'no')) { return ('CANNOT_ANSWER', &mt('is in this state due to author settings.')); } } else { - return ($ENV{'form.problemstate'}, + return ($env{'form.problemstate'}, &mt('is in this state due to author settings.')); } } @@ -223,7 +313,7 @@ sub check_access { &Apache::lonxml::debug("checking for part :$id:"); &Apache::lonxml::debug("time:".time); - if ($ENV{'request.state'} ne "construct") { + if ($env{'request.state'} ne "construct") { my $allowed=&check_ip_acc(&Apache::lonnet::EXT("resource.$id.acc")); if (!$allowed && ($Apache::lonhomework::browse ne 'F')) { $status='INVALID_ACCESS'; @@ -281,7 +371,7 @@ sub check_access { my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries"); if ( $tries eq '' ) { $tries = '0'; } if ( $maxtries eq '' && - $ENV{'request.state'} ne 'construct') { $maxtries = '2'; } + $env{'request.state'} ne 'construct') { $maxtries = '2'; } if ($maxtries && $tries >= $maxtries) { $status = 'CANNOT_ANSWER'; } # if (correct and show prob status) or excused then CANNOT_ANSWER if(($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/ @@ -292,7 +382,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=&seconds_to_human_length($interval); + } 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'); @@ -309,6 +418,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,'.'); @@ -319,10 +447,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," } @@ -336,20 +465,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"); @@ -357,28 +481,41 @@ sub showhashsubset { } sub setuppermissions { - $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$ENV{'request.filename'}); - my $viewgrades = &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}); + $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$env{'request.filename'}); + my $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}); if (! $viewgrades && - exists($ENV{'request.course.sec'}) && - $ENV{'request.course.sec'} !~ /^\s*$/) { - $viewgrades = &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}. - '/'.$ENV{'request.course.sec'}); + exists($env{'request.course.sec'}) && + $env{'request.course.sec'} !~ /^\s*$/) { + $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}. + '/'.$env{'request.course.sec'}); + } + $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"}); + } + my $modifygrades = &Apache::lonnet::allowed('mgr',$env{'request.course.id'}); + if (! $modifygrades && + exists($env{'request.course.sec'}) && + $env{'request.course.sec'} !~ /^\s*$/) { + $modifygrades = + &Apache::lonnet::allowed('mgr',$env{'request.course.id'}. + '/'.$env{'request.course.sec'}); } - $Apache::lonhomework::viewgrades = $viewgrades; - return '' + $Apache::lonhomework::modifygrades = $modifygrades; + return ''; } sub setupheader { my $request=$_[0]; - if ($ENV{'browser.mathml'}) { - &Apache::loncommon::content_type($request,'text/xml'); - } else { - &Apache::loncommon::content_type($request,'text/html'); - } + &Apache::loncommon::content_type($request,'text/html'); 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 '' @@ -393,7 +530,7 @@ sub handle_save_or_undo { &Apache::lonnet::correct_line_ends($result); - if ($ENV{'form.Undo'} eq &mt('undo')) { + if ($env{'form.Undo'} eq &mt('undo')) { my $error=0; if (!copy($file,$filetmp)) { $error=1; } if ((!$error) && (!copy($filebak,$file))) { $error=1; } @@ -430,11 +567,17 @@ sub handle_save_or_undo { sub analyze_header { my ($request) = @_; - my $result.=' + my $bodytag=''; + if ($env{'environment.remote'} eq 'off') { + $bodytag=&Apache::loncommon::bodytag(); + } + my $html=&Apache::lonxml::xmlbegin(); + my $result.=$html.' '.&mt("Analyzing a problem").' - '.&Apache::lonxml::message_location().' + '.$bodytag.&Apache::lonxml::message_location().' + &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'. + &Apache::structuretags::remember_problem_state().'
@@ -459,16 +602,17 @@ sub analyze { my $result; my %overall; my %allparts; - my $rndseed=$ENV{'form.rndseed'}; + my $rndseed=$env{'form.rndseed'}; &analyze_header($request); 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++) { + 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)); @@ -494,12 +638,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)). @@ -530,15 +674,15 @@ sub editxmlmode { " $file"); $problem=''; } - if (defined($ENV{'form.editxmltext'}) || defined($ENV{'form.Undo'})) { + if (defined($env{'form.editxmltext'}) || defined($env{'form.Undo'})) { my $error=&handle_save_or_undo($request,\$problem, - \$ENV{'form.editxmltext'}); + \$env{'form.editxmltext'}); if (!$error) { $problem=&Apache::lonnet::getfile($file); } } - &Apache::lonhomework::showhashsubset(\%ENV,'^form'); - if ( $ENV{'form.submit'} eq &mt('Submit Changes and View') ) { - &Apache::lonhomework::showhashsubset(\%ENV,'^form'); - $ENV{'form.problemmode'}='View'; + &Apache::lonhomework::showhashsubset(\%env,'^form'); + if ( $env{'form.submit'} eq &mt('Submit Changes and View') ) { + &Apache::lonhomework::showhashsubset(\%env,'^form'); + $env{'form.problemmode'}='View'; &renderpage($request,$file); } else { my ($rows,$cols) = &Apache::edit::textarea_sizes(\$problem); @@ -546,15 +690,20 @@ 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.=''. - &Apache::lonxml::message_location().' + my $bodytag=''; + if ($env{'environment.remote'} eq 'off') { + $bodytag=&Apache::loncommon::bodytag(); + } + my $html=&Apache::lonxml::xmlbegin(); + $result.=$html.$bodytag.&Apache::lonxml::message_location().' + &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'. + &Apache::structuretags::remember_problem_state().' @@ -564,7 +713,7 @@ sub editxmlmode {
' . $xml_help . ' -
'; &Apache::lonxml::add_messages(\$result); @@ -573,14 +722,24 @@ sub editxmlmode { return ''; } +# +# Render the page in whatever target desired. +# sub renderpage { my ($request,$file) = @_; my (@targets) = &get_target(); - &Apache::lonhomework::showhashsubset(\%ENV,'form.'); + &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) { @@ -592,7 +751,7 @@ sub renderpage { my $result = ''; if ($target eq 'analyze') { %Apache::lonhomework::analyze=(); } if ($target eq 'answer') { &showhash(%Apache::lonhomework::history); } - if ($target eq 'web') {&Apache::lonhomework::showhashsubset(\%ENV,'^form');} + if ($target eq 'web') {&Apache::lonhomework::showhashsubset(\%env,'^form');} &Apache::lonxml::debug("Should be parsing now"); $result = &Apache::lonxml::xmlparse($request, $target, $problem, @@ -652,14 +811,14 @@ sub newproblem { $extension=~s:^.*\.([\w]+)$:$1:; &Apache::lonxml::debug("Looking for :$extension:"); my $templatelist=&get_template_list('',$extension); - if ($ENV{'form.template'} && - $ENV{'form.template'} ne "Select a $extension template") { + if ($env{'form.template'} && + $env{'form.template'} ne "Select a $extension template") { use File::Copy; - my $file = &get_template_list($ENV{'form.template'},$extension); + my $file = &get_template_list($env{'form.template'},$extension); my $dest = &Apache::lonnet::filelocation("",$request->uri); copy($file,$dest); &renderpage($request,$dest); - } elsif($ENV{'form.newfile'} && !$templatelist) { + } elsif($env{'form.newfile'} && !$templatelist) { # I don't like hard-coded filenames but for now, this will work. use File::Copy; my $templatefilename = @@ -669,16 +828,17 @@ sub newproblem { copy($templatefilename,$dest); &renderpage($request,$dest); } else { - my $url=$request->uri; - my $shownurl=$url; + my $url=&HTML::Entities::encode($request->uri,'<>&"'); + my $shownurl=$url; $shownurl=~s-^/~-/priv/-; my $dest = &Apache::lonnet::filelocation("",$request->uri); my $errormsg; - if ($ENV{'form.newfile'}) { + if ($env{'form.newfile'}) { $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', @@ -709,7 +869,7 @@ ENDNEWPROBLEM sub view_or_edit_menu { my ($request) = @_; - my $url=$request->uri; + my $url=&HTML::Entities::encode($request->uri,'<>&"'); my %lt=&Apache::lonlocal::texthash( 'would' => 'Would you like to', 'view' => 'View', 'Edit' => 'edit', @@ -730,63 +890,59 @@ sub handler { #my $t0 = [&gettimeofday()]; my $request=$_[0]; - $Apache::lonxml::debug=$ENV{'user.debug'}; - 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:"); + $Apache::lonxml::debug=$env{'user.debug'}; + $env{'request.uri'}=$request->uri; + &setuppermissions(); # 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'})); - my $mode=$ENV{'form.problemmode'}->[-1]; - undef $ENV{'form.problemmode'}; - $ENV{'form.problemmode'}=$mode; + 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 - if ($ENV{'request.course.fn'} && !&Apache::lonnet::symbread()) { + 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' && - $ENV{'request.state'} ne "construct") { + $env{'request.state'} ne "construct") { #should know where we are, so ask 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 '') { - if ($ENV{'form.resetdata'} eq &mt('Reset Submissions') || - $ENV{'form.resetdata'} eq &mt('New Problem Variation') || - $ENV{'form.newrandomization'} eq &mt('New Randomization')) { + if ($env{'request.state'} eq "construct" || $symb eq '') { + if ($env{'form.resetdata'} eq &mt('Reset Submissions') || + $env{'form.resetdata'} eq &mt('New Problem Variation') || + $env{'form.newrandomization'} eq &mt('New Randomization')) { my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser(); &Apache::lonnet::tmpreset($symb,'',$domain,$name); &Apache::lonxml::debug("Attempt reset"); } } - if ($ENV{'request.state'} eq "construct") { + if ($env{'request.state'} eq "construct") { if ( -e $file ) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['problemmode']); - if (!(defined $ENV{'form.problemmode'})) { + if (!(defined $env{'form.problemmode'})) { #first visit to problem in construction space #&view_or_edit_menu($request); - $ENV{'form.problemmode'}='View'; + $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')) { + } elsif ($env{'form.problemmode'} eq &mt('Calculate answers')) { &analyze($request,$file); } else { &renderpage($request,$file);