--- loncom/homework/lonhomework.pm 2019/02/19 15:38:36 1.344.2.8.4.3 +++ loncom/homework/lonhomework.pm 2020/01/15 05:14:17 1.344.2.10.2.1 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.344.2.8.4.3 2019/02/19 15:38:36 raeburn Exp $ +# $Id: lonhomework.pm,v 1.344.2.10.2.1 2020/01/15 05:14:17 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -235,6 +235,12 @@ sub check_slot_access { $Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass') { return ('SHOW_ANSWER'); } + } elsif (($type eq 'problem') && + ($Apache::lonhomework::browse eq 'F') && + ($ENV{'REMOTE_ADDR'} eq '127.0.0.1') && + ($env{'form.grade_courseid'} eq $env{'request.course.id'}) && + (&Apache::lonnet::allowed('mgr',$env{'request.course.id'}))) { + return ($status,$datemsg); } my $availablestudent = &Apache::lonnet::EXT("resource.0.availablestudent",$symb); @@ -260,7 +266,7 @@ sub check_slot_access { $num_usable_slots ++; if ($slot{'starttime'} < $now && $slot{'endtime'} > $now && - &Apache::loncommon::check_slotip_acc($slot{'ip'})) { + &Apache::loncommon::check_ip_acc($slot{'ip'})) { &Apache::lonxml::debug("$slot is good"); $slotstatus='NEEDS_CHECKIN'; $returned_slot=\%slot; @@ -311,7 +317,7 @@ sub check_slot_access { $earlyout = 1; } } - if (($currtries == $maxtries) || ($is_correct)) { + if ($currtries == $maxtries) { $earlyout = 1; } else { $numgraded ++; @@ -1194,7 +1200,7 @@ sub editxmlmode { # Render the page in whatever target desired. # sub renderpage { - my ($request,$file,$targets,$return_string) = @_; + my ($request,$file,$targets,$return_string,$donebuttonmsg) = @_; my @targets = @{$targets || [&get_target()]}; &Apache::lonhomework::showhashsubset(\%env,'form.'); @@ -1245,6 +1251,11 @@ sub renderpage { if ($target eq 'analyze') { $result=&Apache::lonnet::hashref2str(\%Apache::lonhomework::analyze); undef(%Apache::lonhomework::analyze); + } elsif ($target eq 'web') { + if ($donebuttonmsg) { + $result =~ s{}{}; + $result.= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($donebuttonmsg,1))."\n"; + } } #my $td=&tv_interval($t0); #if ( $Apache::lonxml::debug) { @@ -1468,32 +1479,61 @@ sub update_construct_style { sub zero_timer { my ($symb) = @_; my ($hastimeleft,$first_access,$now); - my @interval=&Apache::lonnet::EXT("resource.0.interval"); + my @interval=&Apache::lonnet::EXT("resource.0.interval",$symb); if (@interval > 1) { if ($interval[1] eq 'course') { - return; + return ('fail',&mt('Ending of timed events not supported for intervals set course-wide')); } else { my $now = time; my $first_access=&Apache::lonnet::get_first_access($interval[1],$symb); if ($first_access > 0) { - if ($first_access+$interval[0] > $now) { - my $done_time = $now - $first_access; - my $snum = 1; - if ($interval[1] eq 'map') { - $snum = 2; + my ($timelimit,$donesuffix) = split(/_/,$interval[0],2); + if ($donesuffix =~ /^done(?:|\:[^\:]+\:)(.*)$/) { + my ($dummy,$proctor,$secret) = split(/_/,$1); + if (($proctor) && ($secret ne '')) { + my $key = $env{'form.LC_interval_done_proctorpass'}; + $key =~ s/^\s+//; + $key =~ s/\s+$//; + if ($env{'form.LC_interval_done_proctorpass'} ne $secret) { + return ('fail', + &mt('Incorrect key entered by proctor')); + } + } + if ($first_access+$timelimit > $now) { + my $done_time = $now - $first_access; + my $snum = 1; + if ($interval[1] eq 'map') { + $snum = 2; + } + my $result = + &Apache::lonparmset::storeparm_by_symb_inner($symb,'0_interval', + $snum,$done_time, + 'date_interval', + $env{'user.name'}, + $env{'user.domain'}); + if ($result eq '') { + # Record action in "User Notes" + &Apache::lonmsg::store_instructor_comment( + 'Pressed Done button for symb:
'.$symb, + $env{'user.name'}, $env{'user.domain'}); + return ('ok'); + } else { + return ('fail',&mt('Error ending timed event: [_1]',$result)); + } + } else { + return ('fail',&mt('Timed event already ended')); } - my $result = - &Apache::lonparmset::storeparm_by_symb_inner($symb,'0_interval', - $snum,$done_time, - 'date_interval', - $env{'user.name'}, - $env{'user.domain'}); - return $result; + } else { + return ('fail',&mt('Timed event can not be ended before the time limit')); } + } else { + return ('fail',&mt('Timer not yet started for this timed event')); } } + } else { + return ('fail',&mt('No timer in use')); } - return; + return(); } sub handler { @@ -1552,14 +1592,16 @@ sub handler { } } else { # Set the event timer to zero if the "done button" was clicked. The button is - # part of the LCdoneButton form created in lonmenu.pm + # part of the doneButton form created in lonmenu.pm + my ($donebuttonresult,$donemsg); if ($symb && $env{'form.LC_interval_done'} eq 'true') { - &zero_timer($symb); + ($donebuttonresult,$donemsg) = &zero_timer($symb); undef($env{'form.LC_interval_done'}); + undef($env{'form.LC_interval_done_proctorpass'}); } # just render the page normally outside of construction space &Apache::lonxml::debug("not construct"); - &renderpage($request,$file); + &renderpage($request,$file,undef,undef,$donemsg); } #my $td=&tv_interval($t0); #&Apache::lonxml::debug("Spent $td seconds processing");