--- loncom/homework/lonhomework.pm 2018/05/15 04:59:14 1.371 +++ loncom/homework/lonhomework.pm 2023/11/17 17:02:21 1.380 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.371 2018/05/15 04:59:14 raeburn Exp $ +# $Id: lonhomework.pm,v 1.380 2023/11/17 17:02:21 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(); @@ -161,9 +163,19 @@ sub get_target { return ('web','answer'); } elsif (($env{'form.problemmode'} eq 'saveedit') || ($env{'form.problemmode'} eq 'undo')) { - return ('modified','no_output_web','edit'); + my %editors = &Apache::loncommon::permitted_editors(); + if ($editors{'edit'}) { + return ('modified','no_output_web','edit'); + } else { + return ('web'); + } } elsif ($env{'form.problemmode'} eq 'edit') { - return ('no_output_web','edit'); + my %editors = &Apache::loncommon::permitted_editors(); + if ($editors{'edit'}) { + return ('no_output_web','edit'); + } else { + return ('web'); + } } else { return ('web'); } @@ -242,7 +254,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; @@ -256,7 +269,7 @@ sub check_slot_access { } else { return ($status,$datemsg); } - } + } if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS' || @@ -266,7 +279,7 @@ sub check_slot_access { if ($env{'request.state'} eq "construct") { return ($status,$datemsg); } - + if ($type eq 'Task') { if ($checkedin && $Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass') { @@ -276,6 +289,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); @@ -362,16 +381,16 @@ sub check_slot_access { my $probstatus = &Apache::structuretags::get_problem_status($part); my $earlyout; unless (($probstatus eq 'no') || - ($probstatus eq 'no_feedback_ever')) { + ($probstatus eq 'no_feedback_ever')) { if ($Apache::lonhomework::history{"resource.$part.solved"} =~/^correct_/) { $numcorrect ++; } else { $earlyout = 1; } } - if (($currtries == $maxtries) || ($is_correct)) { + if ($currtries == $maxtries) { $earlyout = 1; - } else { + } else { $numgraded ++; } last if ($earlyout); @@ -788,6 +807,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 +827,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 +848,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); } @@ -925,8 +952,17 @@ sub analyze_header { my $js = &Apache::structuretags::setmode_javascript(); # Breadcrumbs - my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), - 'text' => 'Authoring Space'}, + my $text = 'Authoring Space'; + my $href = &Apache::loncommon::authorspace($request->uri); + if ($env{'request.course.id'}) { + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + if ($href eq "/priv/$cdom/$cnum/") { + $text = 'Course Authoring Space'; + } + } + my $brcrum = [{'href' => $href, + 'text' => $text}, {'href' => '', 'text' => 'Problem Testing'}, {'href' => '', @@ -938,18 +974,26 @@ sub analyze_header { {'bread_crumbs' => $brcrum,}) .&Apache::loncommon::head_subbox( &Apache::loncommon::CSTR_pageheader()); + my %lt = &Apache::lonlocal::texthash( + edit => 'Edit', + editxml => 'EditXML', + ); $result .= '
'; my $resource = $env{'request.ambiguous'}; - unless($env{'environment.nocodemirror'}){ + unless ($nocodemirror) { $result .= '