--- loncom/homework/lonhomework.pm 2018/09/18 14:30:19 1.373 +++ loncom/homework/lonhomework.pm 2023/06/02 01:20:27 1.376 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.373 2018/09/18 14:30:19 raeburn Exp $ +# $Id: lonhomework.pm,v 1.376 2023/06/02 01:20:27 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -50,6 +50,8 @@ use Apache::chemresponse(); use Apache::functionplotresponse(); use Apache::drawimage(); use Apache::loncapamath(); +use Apache::loncourseuser(); +use Apache::grades(); use Apache::Constants qw(:common); use Apache::loncommon(); use Apache::lonparmset(); @@ -242,7 +244,8 @@ sub check_slot_access { $consumed_uniq = $slot{'uniqueperiod'}; if ($slot{'iptied'}) { $ipused = $Apache::lonhomework::history{"$checkin.ip"}; - unless (($ip ne '') && ($ipused eq $ip)) { + unless (($ip ne '') && + (($ipused eq $ip) || ($ENV{'REMOTE_ADDR'} eq '127.0.0.1'))) { $blockip = $slot{'iptied'}; $slot_name = $checkinslot; $returned_slot = \%slot; @@ -276,6 +279,12 @@ sub check_slot_access { 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); @@ -369,7 +378,7 @@ sub check_slot_access { $earlyout = 1; } } - if (($currtries == $maxtries) || ($is_correct)) { + if ($currtries == $maxtries) { $earlyout = 1; } else { $numgraded ++; @@ -788,6 +797,9 @@ sub setuppermissions { $env{'request.course.sec'} !~ /^\s*$/) { $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}. '/'.$env{'request.course.sec'}); + if ($viewgrades) { + $Apache::lonhomework::viewgradessec = $env{'request.course.sec'}; + } } $Apache::lonhomework::viewgrades = $viewgrades; @@ -805,6 +817,9 @@ sub setuppermissions { $modifygrades = &Apache::lonnet::allowed('mgr',$env{'request.course.id'}. '/'.$env{'request.course.sec'}); + if ($modifygrades) { + $Apache::lonhomework::modifygradessec = $env{'request.course.sec'}; + } } $Apache::lonhomework::modifygrades = $modifygrades; @@ -823,7 +838,9 @@ sub setuppermissions { sub unset_permissions { undef($Apache::lonhomework::queuegrade); undef($Apache::lonhomework::modifygrades); + undef($Apache::lonhomework::modifygradessec); undef($Apache::lonhomework::viewgrades); + undef($Apache::lonhomework::viewgradessec); undef($Apache::lonhomework::browse); } @@ -1271,7 +1288,7 @@ sub editxmlmode { # Render the page in whatever target desired. # sub renderpage { - my ($request,$file,$targets,$return_string,$donebuttonmsg) = @_; + my ($request,$file,$targets,$return_string,$donebuttonmsg,$viewasuser,$symb) = @_; my @targets = @{$targets || [&get_target()]}; &Apache::lonhomework::showhashsubset(\%env,'form.'); @@ -1312,6 +1329,10 @@ sub renderpage { if ($target eq 'answer') { &showhash(%Apache::lonhomework::history); } if ($target eq 'web') {&Apache::lonhomework::showhashsubset(\%env,'^form');} + if (($target eq 'web') && ($viewasuser ne '') && ($symb ne '')) { + $env{'request.user_in_effect'} = $viewasuser; + } + &Apache::lonxml::debug("Should be parsing now"); $result .= &Apache::lonxml::xmlparse($request, $target, $problem, &setup_vars($target),%mystyle); @@ -1337,15 +1358,23 @@ sub renderpage { #} # $request->print($result); $overall_result.=$result; + if (($target eq 'web') && ($viewasuser ne '') && ($symb ne '')) { + my ($vuname,$vudom) = split(/:/,$viewasuser); + $overall_result .= &Apache::grades::view_as_user($symb,$vuname,$vudom). + ''; + } # $request->rflush(); } + if (($target eq 'web') && ($viewasuser ne '') && ($symb ne '')) { + undef($env{'request.user_in_effect'}); + } #$request->print(":Result ends"); #my $td=&tv_interval($t0); } if (!$return_string) { &Apache::lonxml::add_messages(\$overall_result); $request->print($overall_result); - $request->rflush(); + $request->rflush(); } else { return $overall_result; } @@ -1667,16 +1696,40 @@ sub handler { } else { # Set the event timer to zero if the "done button" was clicked. The button is # part of the doneButton form created in lonmenu.pm - my ($donebuttonresult,$donemsg); + my ($donebuttonresult,$donemsg,$viewasuser); if ($symb && $env{'form.LC_interval_done'} eq 'true') { ($donebuttonresult,$donemsg) = &zero_timer($symb); undef($env{'form.LC_interval_done'}); undef($env{'form.LC_interval_done_proctorpass'}); } + if (($env{'form.LC_viewas'} ne '') && $symb && $env{'request.course.id'} && + ($Apache::lonhomework::viewgrades || $Apache::lonhomework::modifygrades)) { + if ($env{'form.LC_viewas'} =~ /^($match_username):($match_domain)$/) { + my ($possuname,$possudom) = ($1,$2); + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my ($canview,$posssec); + if ($env{'request.course.sec'} ne '') { + if ($Apache::lonhomework::modifygradessec eq $env{'request.course.sec'}) { + $canview = 'section'; + $posssec = $env{'request.course.sec'}; + } elsif ($Apache::lonhomework::viewgradessec eq $env{'request.course.sec'}) { + $canview = 'section'; + $posssec = $env{'request.course.sec'}; + } + } + my $crstype = &Apache::loncommon::course_type(); + if (&Apache::loncourseuser::is_course_user($possudom,$possuname,$cdom,$cnum, + $canview,$crstype,$posssec)) { + $viewasuser = $possuname.':'.$possudom; + } + } + undef($env{'form.LC_viewas'}); + } # just render the page normally outside of construction space &Apache::lonxml::debug("not construct"); undef(@Apache::lonhomework::ltipassback); - &renderpage($request,$file,undef,undef,$donemsg); + &renderpage($request,$file,undef,undef,$donemsg,$viewasuser,$symb); if (@Apache::lonhomework::ltipassback) { unless ($registered_cleanup) { my $handlers = $request->get_handlers('PerlCleanupHandler'); @@ -1877,17 +1930,19 @@ sub do_ltipassback { if (ref($item) eq 'HASH') { if ((ref($item->{'lti'}) eq 'HASH') && ($item->{'cid'} =~ /^($match_domain)_($match_courseid)$/)) { my ($cdom,$cnum) = ($1,$2); - my $ckey = $item->{'lti'}->{'key'}; - my $secret = $item->{'lti'}->{'secret'}; my $msgformat = $item->{'lti'}->{'passbackformat'}; my $sigmethod = 'HMAC-SHA1'; + my $ltinum = $item->{'ltinum'}; my $id = $item->{'pbid'}; my $url = $item->{'pburl'}; + my $type = $item->{'pbtype'}; my $scope = $item->{'scope'}; my $map = $item->{'ltimap'}; my $symb = $item->{'ltisymb'}; my $uname = $item->{'uname'}; my $udom = $item->{'udom'}; + my $keynum = $item->{'lti'}->{'cipher'}; + my $crsdef = $item->{'crsdef'}; my $scoretype = $item->{'format'}; my ($total,$possible); if ($scope eq 'resource') { @@ -1898,9 +1953,8 @@ sub do_ltipassback { } elsif ($scope eq 'course') { ($total,$possible) = &get_lti_score($uname,$udom); } - if (($ckey ne '') && ($secret ne '') && ($id ne '') && ($url ne '') && ($possible)) { - &LONCAPA::ltiutils::send_grade($id,$url,$ckey,$secret,$scoretype,$sigmethod, - $msgformat,$total,$possible); + if (($id ne '') && ($url ne '') && ($possible)) { + &LONCAPA::ltiutils::send_grade($cdom,$cnum,$crsdef,$type,$ltinum,$keynum,$id,$url,$scoretype,$sigmethod,$msgformat,$total,$possible); } } }