--- loncom/homework/lonhomework.pm 2009/03/26 18:21:24 1.308 +++ loncom/homework/lonhomework.pm 2011/11/14 00:20:39 1.330 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.308 2009/03/26 18:21:24 bisitz Exp $ +# $Id: lonhomework.pm,v 1.330 2011/11/14 00:20:39 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -47,6 +47,7 @@ use Apache::externalresponse(); use Apache::rankresponse(); use Apache::matchresponse(); use Apache::chemresponse(); +use Apache::functionplotresponse(); use Apache::drawimage(); use Apache::Constants qw(:common); use Apache::loncommon(); @@ -111,7 +112,11 @@ sub get_target { } elsif ( $env{'form.grade_target'} eq 'webgrade' && ($Apache::lonhomework::queuegrade eq 'F' )) { return ($env{'form.grade_target'}); - } + } elsif ($env{'form.grade_target'} eq 'answer') { + if ($env{'form.answer_output_mode'} eq 'tex') { + return ($env{'form.grade_target'}); + } + } if ($env{'form.webgrade'} && ($Apache::lonhomework::modifygrades eq 'F' || $Apache::lonhomework::queuegrade eq 'F' )) { @@ -124,43 +129,46 @@ sub get_target { return ('web'); } } elsif ($env{'request.state'} eq "construct") { +# +# We are in construction space, editing and testing problems +# if ( defined($env{'form.grade_target'}) ) { return ($env{'form.grade_target'}); } if ( defined($env{'form.preview'})) { if ( defined($env{'form.submitted'})) { +# +# We are doing a problem preview +# return ('grade', 'web'); } else { return ('web'); } } else { if ($env{'form.problemstate'} eq 'WEB_GRADE') { - #$env{'form.webgrade'} = 'yes'; return ('grade','webgrade','answer'); - } elsif (($env{'form.problemmode'} eq 'view') || - ($env{'form.problemmode'} eq 'discard')) { - 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 'edit') { - if ( $env{'form.submitted'} eq 'edit' ) { - if ( $env{'form.submitbutton'} eq &mt('Save and View') ) { - return ('modified','web','answer'); - } else { - return ('modified','no_output_web','edit'); - } - } else { - return ('no_output_web','edit'); - } + } elsif ($env{'form.problemmode'} eq 'view') { + return ('grade','web','answer'); + } elsif ($env{'form.problemmode'} eq 'saveview') { + return ('modified','web','answer'); + } elsif ($env{'form.problemmode'} eq 'discard') { + return ('web','answer'); + } elsif (($env{'form.problemmode'} eq 'saveedit') || + ($env{'form.problemmode'} eq 'undo')) { + return ('modified','no_output_web','edit'); + } elsif ($env{'form.problemmode'} eq 'edit') { + return ('no_output_web','edit'); } else { return ('web'); } - } + } +# +# End of Construction Space +# } +# +# Huh? We are nowhere, so do nothing. +# return (); } @@ -170,16 +178,6 @@ sub setup_vars { # return ';$external::target='.$target.';'; } -sub createmenu { - my ($which,$request)=@_; - if ($which eq 'grade') { - $request->print(''); - } -} - sub proctor_checked_in { my ($slot_name,$slot,$type)=@_; my @possible_proctors=split(",",$slot->{'proctor'}); @@ -265,8 +263,8 @@ sub check_slot_access { } if ($slotstatus eq 'NEEDS_CHECKIN' && &proctor_checked_in($slot_name,$returned_slot,$type)) { - &Apache::lonxml::debug("protoctor checked in"); - $slotstatus='CAN_ANSWER'; + &Apache::lonxml::debug("proctor checked in"); + $slotstatus=$status; } my ($is_correct,$got_grade,$checkedin); @@ -297,12 +295,15 @@ sub check_slot_access { return ('WAITING_FOR_GRADE'); } - # no slot is currently open, and has been checked in for this version - # previous slot is therefore CLOSED, so therefore the problem is + # Previously used slot is no longer open, and has been checked in for this version. + # However, the problem is not closed, and potentially, another slot might be + # used to gain access to it to work on it, until the due date is reached, and the + # problem then becomes CLOSED. Therefore return the slotstatus - + # (which will be NOT_IN_SLOT). if (!defined($slot_name) && $checkedin && $type eq 'problem') { - return ('CLOSED',$datemsg); + return ($slotstatus); } if ($slotstatus eq 'NOT_IN_A_SLOT' @@ -375,7 +376,12 @@ sub check_access { $date=&mt("can not be accessed from your location."); return($status,$date); } - + if ($env{'form.grade_imsexport'}) { + if (($env{'request.course.id'}) && + (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) { + return ('SHOW_ANSWER'); + } + } foreach my $temp ("opendate","duedate","answerdate") { $lastdate = $date; if ($temp eq 'duedate') { @@ -433,11 +439,14 @@ sub check_access { if ( $tries eq '' ) { $tries = '0'; } if ( $maxtries eq '' && $env{'request.state'} ne 'construct') { $maxtries = '2'; } + $Apache::lonhomework::results{'resource.'.$id.'.maxtries'}=$maxtries; 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/ && - &show_problem_status()) + &show_problem_status() + && + $Apache::lonhomework::history{"resource.$id.awarded"}==1) || $Apache::lonhomework::history{"resource.$id.solved"}=~/^excused/) { $status = 'CANNOT_ANSWER'; @@ -630,11 +639,12 @@ sub setupheader { 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 &mt('undo')) { + if (($env{'form.problemmode'} eq 'undo') || ($env{'form.problemmode'} eq 'undoxml')) { my $error=0; if (!&File::Copy::copy($file,$filetmp)) { $error=1; } if ((!$error) && (!&File::Copy::copy($filebak,$file))) { $error=1; } @@ -657,6 +667,7 @@ sub handle_save_or_undo { } } else { &Apache::lonnet::correct_line_ends($result); + my $fs=Apache::File->new(">$filebak"); if (defined($fs)) { print $fs $$problem; @@ -685,12 +696,24 @@ sub handle_save_or_undo { sub analyze_header { my ($request) = @_; my $js = &Apache::structuretags::setmode_javascript(); - my $result = - &Apache::loncommon::start_page('Analyzing a problem',$js); + # Breadcrumbs + my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), + 'text' => 'Construction Space'}, + {'href' => '', + 'text' => 'Problem Testing'}, + {'href' => '', + 'text' => 'Analyzing a problem'}]; + + my $result = + &Apache::loncommon::start_page('Analyzing a problem', + $js, + {'bread_crumbs' => $brcrum,}) + .&Apache::loncommon::head_subbox( + &Apache::loncommon::CSTR_pageheader()); $result .= &Apache::lonxml::message_location().' -
'; &Apache::lonxml::add_messages(\$result); @@ -777,7 +800,7 @@ sub analyze { } &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state, &mt('Analyzing Results')); - $request->print('' .&mt('Unable to find [_1]', ''.$file.'') - .''); + .'
'); $problem=''; } - if (defined($env{'form.editxmltext'}) || defined($env{'form.Undo'})) { + + if (($env{'form.problemmode'} eq 'saveeditxml') || + ($env{'form.problemmode'} eq 'saveviewxml') || + ($env{'form.problemmode'} eq 'undoxml')) { my $error=&handle_save_or_undo($request,\$problem, \$env{'form.editxmltext'}); if (!$error) { $problem=&Apache::lonnet::getfile($file); } } &Apache::lonhomework::showhashsubset(\%env,'^form'); - if ( $env{'form.submitbutton'} eq &mt('Save and View') ) { + if ($env{'form.problemmode'} eq 'saveviewxml') { &Apache::lonhomework::showhashsubset(\%env,'^form'); $env{'form.problemmode'}='view'; &renderpage($request,$file); @@ -908,47 +934,44 @@ sub editxmlmode { &Apache::loncommon::resize_textarea_js(). &Apache::structuretags::setmode_javascript(). &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); - my $only_body = ($env{'environment.remote'} eq 'off')? 0 : 1; - my $dragmath_button = - &Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); + + # Breadcrumbs + my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), + 'text' => 'Construction Space'}, + {'href' => '', + 'text' => 'Problem Editing'}]; + my $start_page = &Apache::loncommon::start_page(&mt("EditXML [_1]",$file),$js, {'no_auto_mt_title' => 1, - 'only_body' => $only_body, + 'only_body' => 0, 'add_entries' => { 'onresize' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')], 'onload' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')], - }}); - $result.=$start_page. - &renderpage($request,$file,['no_output_web'],1). - '